brintos

brintos / linux-shallow public Read only

0
0
Text · 16.0 KiB · b0e0c93 Raw
451 lines · c
1/*2 * Copyright 2010 Red Hat Inc.3 *4 * Permission is hereby granted, free of charge, to any person obtaining a5 * copy of this software and associated documentation files (the "Software"),6 * to deal in the Software without restriction, including without limitation7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,8 * and/or sell copies of the Software, and to permit persons to whom the9 * Software is furnished to do so, subject to the following conditions:10 *11 * The above copyright notice and this permission notice shall be included in12 * all copies or substantial portions of the Software.13 *14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR20 * OTHER DEALINGS IN THE SOFTWARE.21 *22 * Authors: Ben Skeggs23 */24#ifndef __GF100_GR_H__25#define __GF100_GR_H__26#define gf100_gr(p) container_of((p), struct gf100_gr, base)27#include "priv.h"28 29#include <core/gpuobj.h>30#include <subdev/ltc.h>31#include <subdev/mmu.h>32#include <engine/falcon.h>33 34struct nvkm_acr_lsfw;35 36#define GPC_MAX 3237#define TPC_MAX_PER_GPC 838#define TPC_MAX (GPC_MAX * TPC_MAX_PER_GPC)39 40#define ROP_BCAST(r)      (0x408800 + (r))41#define ROP_UNIT(u, r)    (0x410000 + (u) * 0x400 + (r))42#define GPC_BCAST(r)      (0x418000 + (r))43#define GPC_UNIT(t, r)    (0x500000 + (t) * 0x8000 + (r))44#define PPC_UNIT(t, m, r) (0x503000 + (t) * 0x8000 + (m) * 0x200 + (r))45#define TPC_UNIT(t, m, r) (0x504000 + (t) * 0x8000 + (m) * 0x800 + (r))46 47struct gf100_gr_zbc_color {48	u32 format;49	u32 ds[4];50	u32 l2[4];51};52 53struct gf100_gr_zbc_depth {54	u32 format;55	u32 ds;56	u32 l2;57};58 59struct gf100_gr_zbc_stencil {60	u32 format;61	u32 ds;62	u32 l2;63};64 65struct gf100_gr {66	const struct gf100_gr_func *func;67	struct nvkm_gr base;68 69	struct {70		struct nvkm_falcon falcon;71		struct nvkm_blob inst;72		struct nvkm_blob data;73 74		struct mutex mutex;75		u32 disable;76	} fecs;77 78	struct {79		struct nvkm_falcon falcon;80		struct nvkm_blob inst;81		struct nvkm_blob data;82	} gpccs;83 84	bool firmware;85 86	/*87	 * Used if the register packs are loaded from NVIDIA fw instead of88	 * using hardcoded arrays. To be allocated with vzalloc().89	 */90	struct gf100_gr_pack *sw_nonctx;91	struct gf100_gr_pack *sw_nonctx1;92	struct gf100_gr_pack *sw_nonctx2;93	struct gf100_gr_pack *sw_nonctx3;94	struct gf100_gr_pack *sw_nonctx4;95	struct gf100_gr_pack *sw_ctx;96	struct gf100_gr_pack *bundle;97	struct gf100_gr_pack *bundle_veid;98	struct gf100_gr_pack *bundle64;99	struct gf100_gr_pack *method;100 101	struct gf100_gr_zbc_color zbc_color[NVKM_LTC_MAX_ZBC_COLOR_CNT];102	struct gf100_gr_zbc_depth zbc_depth[NVKM_LTC_MAX_ZBC_DEPTH_CNT];103	struct gf100_gr_zbc_stencil zbc_stencil[NVKM_LTC_MAX_ZBC_DEPTH_CNT];104 105	u8 rop_nr;106	u8 gpc_nr;107	u8 tpc_nr[GPC_MAX];108	u8 tpc_max;109	u8 tpc_total;110	u8 ppc_nr[GPC_MAX];111	u8 ppc_mask[GPC_MAX];112	u8 ppc_tpc_mask[GPC_MAX][4];113	u8 ppc_tpc_nr[GPC_MAX][4];114	u8 ppc_tpc_min;115	u8 ppc_tpc_max;116	u8 ppc_total;117 118	struct nvkm_memory *pagepool;119	struct nvkm_memory *bundle_cb;120	struct nvkm_memory *attrib_cb;121	struct nvkm_memory *unknown;122 123	u8 screen_tile_row_offset;124	u8 tile[TPC_MAX];125 126	struct {127		u8 gpc;128		u8 tpc;129	} sm[TPC_MAX];130	u8 sm_nr;131 132	u32  size;133	u32 *data;134	u32 size_zcull;135	u32 size_pm;136};137 138int gf100_gr_fecs_bind_pointer(struct gf100_gr *, u32 inst);139int gf100_gr_fecs_wfi_golden_save(struct gf100_gr *, u32 inst);140 141struct gf100_gr_func_zbc {142	void (*clear_color)(struct gf100_gr *, int zbc);143	void (*clear_depth)(struct gf100_gr *, int zbc);144	int (*stencil_get)(struct gf100_gr *, int format,145			   const u32 ds, const u32 l2);146	void (*clear_stencil)(struct gf100_gr *, int zbc);147};148 149struct gf100_gr_func {150	int (*nonstall)(struct gf100_gr *);151	struct nvkm_intr *(*oneinit_intr)(struct gf100_gr *, enum nvkm_intr_type *);152	void (*oneinit_tiles)(struct gf100_gr *);153	int (*oneinit_sm_id)(struct gf100_gr *);154	int (*init)(struct gf100_gr *);155	void (*init_419bd8)(struct gf100_gr *);156	void (*init_gpc_mmu)(struct gf100_gr *);157	void (*init_r405a14)(struct gf100_gr *);158	void (*init_bios)(struct gf100_gr *);159	void (*init_vsc_stream_master)(struct gf100_gr *);160	void (*init_zcull)(struct gf100_gr *);161	void (*init_num_active_ltcs)(struct gf100_gr *);162	void (*init_rop_active_fbps)(struct gf100_gr *);163	void (*init_bios_2)(struct gf100_gr *);164	void (*init_swdx_pes_mask)(struct gf100_gr *);165	void (*init_fs)(struct gf100_gr *);166	void (*init_fecs_exceptions)(struct gf100_gr *);167	void (*init_40a790)(struct gf100_gr *);168	void (*init_ds_hww_esr_2)(struct gf100_gr *);169	void (*init_40601c)(struct gf100_gr *);170	void (*init_sked_hww_esr)(struct gf100_gr *);171	void (*init_419cc0)(struct gf100_gr *);172	void (*init_419eb4)(struct gf100_gr *);173	void (*init_419c9c)(struct gf100_gr *);174	void (*init_ppc_exceptions)(struct gf100_gr *);175	void (*init_tex_hww_esr)(struct gf100_gr *, int gpc, int tpc);176	void (*init_504430)(struct gf100_gr *, int gpc, int tpc);177	void (*init_shader_exceptions)(struct gf100_gr *, int gpc, int tpc);178	void (*init_rop_exceptions)(struct gf100_gr *);179	void (*init_exception2)(struct gf100_gr *);180	void (*init_400054)(struct gf100_gr *);181	void (*init_4188a4)(struct gf100_gr *);182	void (*trap_mp)(struct gf100_gr *, int gpc, int tpc);183	void (*set_hww_esr_report_mask)(struct gf100_gr *);184	const struct gf100_gr_pack *mmio;185	struct {186		struct gf100_gr_ucode *ucode;187		void (*reset)(struct gf100_gr *);188	} fecs;189	struct {190		struct gf100_gr_ucode *ucode;191		void (*reset)(struct gf100_gr *);192	} gpccs;193	int (*rops)(struct gf100_gr *);194	int gpc_nr;195	int tpc_nr;196	int ppc_nr;197	const struct gf100_grctx_func *grctx;198	const struct nvkm_therm_clkgate_pack *clkgate_pack;199	const struct gf100_gr_func_zbc *zbc;200	struct nvkm_sclass sclass[];201};202 203int gf100_gr_rops(struct gf100_gr *);204void gf100_gr_oneinit_tiles(struct gf100_gr *);205int gf100_gr_oneinit_sm_id(struct gf100_gr *);206int gf100_gr_init(struct gf100_gr *);207void gf100_gr_init_vsc_stream_master(struct gf100_gr *);208void gf100_gr_init_zcull(struct gf100_gr *);209void gf100_gr_init_num_active_ltcs(struct gf100_gr *);210void gf100_gr_init_fecs_exceptions(struct gf100_gr *);211void gf100_gr_init_40601c(struct gf100_gr *);212void gf100_gr_init_419cc0(struct gf100_gr *);213void gf100_gr_init_419eb4(struct gf100_gr *);214void gf100_gr_init_tex_hww_esr(struct gf100_gr *, int, int);215void gf100_gr_init_shader_exceptions(struct gf100_gr *, int, int);216void gf100_gr_init_rop_exceptions(struct gf100_gr *);217void gf100_gr_init_exception2(struct gf100_gr *);218void gf100_gr_init_400054(struct gf100_gr *);219void gf100_gr_init_num_tpc_per_gpc(struct gf100_gr *, bool, bool);220extern const struct gf100_gr_func_zbc gf100_gr_zbc;221void gf100_gr_fecs_reset(struct gf100_gr *);222 223void gf117_gr_init_zcull(struct gf100_gr *);224 225void gk104_gr_init_vsc_stream_master(struct gf100_gr *);226void gk104_gr_init_rop_active_fbps(struct gf100_gr *);227void gk104_gr_init_ppc_exceptions(struct gf100_gr *);228void gk104_gr_init_sked_hww_esr(struct gf100_gr *);229 230void gk110_gr_init_419eb4(struct gf100_gr *);231 232void gm107_gr_init_504430(struct gf100_gr *, int, int);233void gm107_gr_init_shader_exceptions(struct gf100_gr *, int, int);234void gm107_gr_init_400054(struct gf100_gr *);235 236int gk20a_gr_init(struct gf100_gr *);237int gk20a_gr_av_to_init_(struct nvkm_blob *, u8 count, u32 pitch, struct gf100_gr_pack **);238int gk20a_gr_av_to_init(struct nvkm_blob *, struct gf100_gr_pack **);239int gk20a_gr_aiv_to_init(struct nvkm_blob *, struct gf100_gr_pack **);240int gk20a_gr_av_to_method(struct nvkm_blob *, struct gf100_gr_pack **);241 242void gm200_gr_oneinit_tiles(struct gf100_gr *);243int gm200_gr_oneinit_sm_id(struct gf100_gr *);244int gm200_gr_rops(struct gf100_gr *);245void gm200_gr_init_num_active_ltcs(struct gf100_gr *);246void gm200_gr_init_ds_hww_esr_2(struct gf100_gr *);247 248void gp100_gr_init_rop_active_fbps(struct gf100_gr *);249void gp100_gr_init_fecs_exceptions(struct gf100_gr *);250void gp100_gr_init_shader_exceptions(struct gf100_gr *, int, int);251void gp100_gr_zbc_clear_color(struct gf100_gr *, int);252void gp100_gr_zbc_clear_depth(struct gf100_gr *, int);253extern const struct gf100_gr_func_zbc gp100_gr_zbc;254 255void gp102_gr_init_swdx_pes_mask(struct gf100_gr *);256extern const struct gf100_gr_func_zbc gp102_gr_zbc;257int gp102_gr_zbc_stencil_get(struct gf100_gr *, int, const u32, const u32);258void gp102_gr_zbc_clear_stencil(struct gf100_gr *, int);259 260extern const struct gf100_gr_func gp107_gr;261 262int gv100_gr_oneinit_sm_id(struct gf100_gr *);263u32 gv100_gr_nonpes_aware_tpc(struct gf100_gr *gr, u32 gpc, u32 tpc);264void gv100_gr_init_419bd8(struct gf100_gr *);265void gv100_gr_init_504430(struct gf100_gr *, int, int);266void gv100_gr_init_shader_exceptions(struct gf100_gr *, int, int);267void gv100_gr_init_4188a4(struct gf100_gr *);268void gv100_gr_trap_mp(struct gf100_gr *, int, int);269 270int tu102_gr_av_to_init_veid(struct nvkm_blob *, struct gf100_gr_pack **);271void tu102_gr_init_zcull(struct gf100_gr *);272void tu102_gr_init_fs(struct gf100_gr *);273void tu102_gr_init_fecs_exceptions(struct gf100_gr *);274 275#define gf100_gr_chan(p) container_of((p), struct gf100_gr_chan, object)276#include <core/object.h>277 278struct gf100_gr_chan {279	struct nvkm_object object;280	struct gf100_gr *gr;281	struct nvkm_vmm *vmm;282 283	struct nvkm_vma *pagepool;284	struct nvkm_vma *bundle_cb;285	struct nvkm_vma *attrib_cb;286	struct nvkm_vma *unknown;287 288	struct nvkm_memory *mmio;289	struct nvkm_vma *mmio_vma;290	int mmio_nr;291};292 293void gf100_gr_ctxctl_debug(struct gf100_gr *);294 295u64  gf100_gr_units(struct nvkm_gr *);296void gf100_gr_zbc_init(struct gf100_gr *);297 298extern const struct nvkm_object_func gf100_fermi;299 300struct gf100_gr_init {301	u32 addr;302	u8  count;303	u32 pitch;304	u64 data;305};306 307struct gf100_gr_pack {308	const struct gf100_gr_init *init;309	u32 type;310};311 312#define pack_for_each_init(init, pack, head)                                   \313	for (pack = head; pack && pack->init; pack++)                          \314		  for (init = pack->init; init && init->count; init++)315 316struct gf100_gr_ucode {317	struct nvkm_blob code;318	struct nvkm_blob data;319};320 321extern struct gf100_gr_ucode gf100_gr_fecs_ucode;322extern struct gf100_gr_ucode gf100_gr_gpccs_ucode;323 324extern struct gf100_gr_ucode gk110_gr_fecs_ucode;325extern struct gf100_gr_ucode gk110_gr_gpccs_ucode;326 327int  gf100_gr_wait_idle(struct gf100_gr *);328void gf100_gr_mmio(struct gf100_gr *, const struct gf100_gr_pack *);329void gf100_gr_icmd(struct gf100_gr *, const struct gf100_gr_pack *);330void gf100_gr_mthd(struct gf100_gr *, const struct gf100_gr_pack *);331int  gf100_gr_init_ctxctl(struct gf100_gr *);332 333/* register init value lists */334 335extern const struct gf100_gr_init gf100_gr_init_main_0[];336extern const struct gf100_gr_init gf100_gr_init_fe_0[];337extern const struct gf100_gr_init gf100_gr_init_pri_0[];338extern const struct gf100_gr_init gf100_gr_init_rstr2d_0[];339extern const struct gf100_gr_init gf100_gr_init_pd_0[];340extern const struct gf100_gr_init gf100_gr_init_ds_0[];341extern const struct gf100_gr_init gf100_gr_init_scc_0[];342extern const struct gf100_gr_init gf100_gr_init_prop_0[];343extern const struct gf100_gr_init gf100_gr_init_gpc_unk_0[];344extern const struct gf100_gr_init gf100_gr_init_setup_0[];345extern const struct gf100_gr_init gf100_gr_init_crstr_0[];346extern const struct gf100_gr_init gf100_gr_init_setup_1[];347extern const struct gf100_gr_init gf100_gr_init_zcull_0[];348extern const struct gf100_gr_init gf100_gr_init_gpm_0[];349extern const struct gf100_gr_init gf100_gr_init_gpc_unk_1[];350extern const struct gf100_gr_init gf100_gr_init_gcc_0[];351extern const struct gf100_gr_init gf100_gr_init_tpccs_0[];352extern const struct gf100_gr_init gf100_gr_init_tex_0[];353extern const struct gf100_gr_init gf100_gr_init_pe_0[];354extern const struct gf100_gr_init gf100_gr_init_l1c_0[];355extern const struct gf100_gr_init gf100_gr_init_wwdx_0[];356extern const struct gf100_gr_init gf100_gr_init_tpccs_1[];357extern const struct gf100_gr_init gf100_gr_init_mpc_0[];358extern const struct gf100_gr_init gf100_gr_init_be_0[];359extern const struct gf100_gr_init gf100_gr_init_fe_1[];360extern const struct gf100_gr_init gf100_gr_init_pe_1[];361void gf100_gr_init_gpc_mmu(struct gf100_gr *);362void gf100_gr_trap_mp(struct gf100_gr *, int, int);363extern const struct nvkm_bitfield gf100_mp_global_error[];364extern const struct nvkm_enum gf100_mp_warp_error[];365 366extern const struct gf100_gr_init gf104_gr_init_ds_0[];367extern const struct gf100_gr_init gf104_gr_init_tex_0[];368extern const struct gf100_gr_init gf104_gr_init_sm_0[];369 370extern const struct gf100_gr_init gf108_gr_init_gpc_unk_0[];371extern const struct gf100_gr_init gf108_gr_init_setup_1[];372 373extern const struct gf100_gr_init gf119_gr_init_pd_0[];374extern const struct gf100_gr_init gf119_gr_init_ds_0[];375extern const struct gf100_gr_init gf119_gr_init_prop_0[];376extern const struct gf100_gr_init gf119_gr_init_gpm_0[];377extern const struct gf100_gr_init gf119_gr_init_gpc_unk_1[];378extern const struct gf100_gr_init gf119_gr_init_tex_0[];379extern const struct gf100_gr_init gf119_gr_init_sm_0[];380extern const struct gf100_gr_init gf119_gr_init_fe_1[];381 382extern const struct gf100_gr_init gf117_gr_init_pes_0[];383extern const struct gf100_gr_init gf117_gr_init_wwdx_0[];384extern const struct gf100_gr_init gf117_gr_init_cbm_0[];385 386extern const struct gf100_gr_init gk104_gr_init_main_0[];387extern const struct gf100_gr_init gk104_gr_init_gpc_unk_2[];388extern const struct gf100_gr_init gk104_gr_init_tpccs_0[];389extern const struct gf100_gr_init gk104_gr_init_pe_0[];390extern const struct gf100_gr_init gk104_gr_init_be_0[];391extern const struct gf100_gr_pack gk104_gr_pack_mmio[];392 393extern const struct gf100_gr_init gk110_gr_init_fe_0[];394extern const struct gf100_gr_init gk110_gr_init_ds_0[];395extern const struct gf100_gr_init gk110_gr_init_sked_0[];396extern const struct gf100_gr_init gk110_gr_init_cwd_0[];397extern const struct gf100_gr_init gk110_gr_init_gpc_unk_1[];398extern const struct gf100_gr_init gk110_gr_init_tex_0[];399extern const struct gf100_gr_init gk110_gr_init_sm_0[];400 401extern const struct gf100_gr_init gk208_gr_init_gpc_unk_0[];402 403extern const struct gf100_gr_init gm107_gr_init_scc_0[];404extern const struct gf100_gr_init gm107_gr_init_prop_0[];405extern const struct gf100_gr_init gm107_gr_init_setup_1[];406extern const struct gf100_gr_init gm107_gr_init_zcull_0[];407extern const struct gf100_gr_init gm107_gr_init_gpc_unk_1[];408extern const struct gf100_gr_init gm107_gr_init_tex_0[];409extern const struct gf100_gr_init gm107_gr_init_l1c_0[];410extern const struct gf100_gr_init gm107_gr_init_wwdx_0[];411extern const struct gf100_gr_init gm107_gr_init_cbm_0[];412void gm107_gr_init_bios(struct gf100_gr *);413 414void gm200_gr_init_gpc_mmu(struct gf100_gr *);415 416struct gf100_gr_fwif {417	int version;418	int (*load)(struct gf100_gr *, int ver, const struct gf100_gr_fwif *);419	const struct gf100_gr_func *func;420	const struct nvkm_acr_lsf_func *fecs;421	const struct nvkm_acr_lsf_func *gpccs;422};423 424int gf100_gr_load(struct gf100_gr *, int, const struct gf100_gr_fwif *);425int gf100_gr_nofw(struct gf100_gr *, int, const struct gf100_gr_fwif *);426 427int gk20a_gr_load_sw(struct gf100_gr *, const char *path, int ver);428int gk20a_gr_load_net(struct gf100_gr *, const char *, const char *, int,429		      int (*)(struct nvkm_blob *, struct gf100_gr_pack **),430		      struct gf100_gr_pack **);431 432int gm200_gr_nofw(struct gf100_gr *, int, const struct gf100_gr_fwif *);433int gm200_gr_load(struct gf100_gr *, int, const struct gf100_gr_fwif *);434extern const struct nvkm_acr_lsf_func gm200_gr_gpccs_acr;435extern const struct nvkm_acr_lsf_func gm200_gr_fecs_acr;436 437extern const struct nvkm_acr_lsf_func gm20b_gr_fecs_acr;438void gm20b_gr_acr_bld_write(struct nvkm_acr *, u32, struct nvkm_acr_lsfw *);439void gm20b_gr_acr_bld_patch(struct nvkm_acr *, u32, s64);440 441extern const struct nvkm_acr_lsf_func gp108_gr_gpccs_acr;442extern const struct nvkm_acr_lsf_func gp108_gr_fecs_acr;443void gp108_gr_acr_bld_write(struct nvkm_acr *, u32, struct nvkm_acr_lsfw *);444void gp108_gr_acr_bld_patch(struct nvkm_acr *, u32, s64);445 446int gf100_gr_new_(const struct gf100_gr_fwif *, struct nvkm_device *, enum nvkm_subdev_type, int,447		  struct nvkm_gr **);448int r535_gr_new(const struct gf100_gr_func *, struct nvkm_device *, enum nvkm_subdev_type, int,449		struct nvkm_gr **);450#endif451