gf100.h 11.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/*
 * Copyright 2010 Red Hat Inc.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 * OTHER DEALINGS IN THE SOFTWARE.
 *
 * Authors: Ben Skeggs
 */
24 25
#ifndef __GF100_GR_H__
#define __GF100_GR_H__
26 27
#define gf100_gr(p) container_of((p), struct gf100_gr, base)
#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 34

#define GPC_MAX 32
35 36
#define TPC_MAX_PER_GPC 8
#define TPC_MAX (GPC_MAX * TPC_MAX_PER_GPC)
37 38 39 40 41 42 43 44 45 46 47

#define ROP_BCAST(r)      (0x408800 + (r))
#define ROP_UNIT(u, r)    (0x410000 + (u) * 0x400 + (r))
#define GPC_BCAST(r)      (0x418000 + (r))
#define GPC_UNIT(t, r)    (0x500000 + (t) * 0x8000 + (r))
#define PPC_UNIT(t, m, r) (0x503000 + (t) * 0x8000 + (m) * 0x200 + (r))
#define TPC_UNIT(t, m, r) (0x504000 + (t) * 0x8000 + (m) * 0x800 + (r))

struct gf100_gr_data {
	u32 size;
	u32 align;
48
	bool priv;
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
};

struct gf100_gr_mmio {
	u32 addr;
	u32 data;
	u32 shift;
	int buffer;
};

struct gf100_gr_fuc {
	u32 *data;
	u32  size;
};

struct gf100_gr_zbc_color {
	u32 format;
	u32 ds[4];
	u32 l2[4];
};

struct gf100_gr_zbc_depth {
	u32 format;
	u32 ds;
	u32 l2;
};

B
Ben Skeggs 已提交
75
struct gf100_gr {
76
	const struct gf100_gr_func *func;
77
	struct nvkm_gr base;
78

79 80
	struct nvkm_falcon *fecs;
	struct nvkm_falcon *gpccs;
81 82 83 84 85 86
	struct gf100_gr_fuc fuc409c;
	struct gf100_gr_fuc fuc409d;
	struct gf100_gr_fuc fuc41ac;
	struct gf100_gr_fuc fuc41ad;
	bool firmware;

87 88
	/*
	 * Used if the register packs are loaded from NVIDIA fw instead of
89
	 * using hardcoded arrays. To be allocated with vzalloc().
90 91 92 93 94 95
	 */
	struct gf100_gr_pack *fuc_sw_nonctx;
	struct gf100_gr_pack *fuc_sw_ctx;
	struct gf100_gr_pack *fuc_bundle;
	struct gf100_gr_pack *fuc_method;

96 97 98 99 100 101 102 103
	struct gf100_gr_zbc_color zbc_color[NVKM_LTC_MAX_ZBC_CNT];
	struct gf100_gr_zbc_depth zbc_depth[NVKM_LTC_MAX_ZBC_CNT];

	u8 rop_nr;
	u8 gpc_nr;
	u8 tpc_nr[GPC_MAX];
	u8 tpc_total;
	u8 ppc_nr[GPC_MAX];
104
	u8 ppc_mask[GPC_MAX];
105 106 107 108 109 110 111
	u8 ppc_tpc_nr[GPC_MAX][4];

	struct gf100_gr_data mmio_data[4];
	struct gf100_gr_mmio mmio_list[4096/8];
	u32  size;
	u32 *data;

112
	u8 screen_tile_row_offset;
113 114
};

115 116 117 118 119 120
int gf100_gr_ctor(const struct gf100_gr_func *, struct nvkm_device *,
		  int, struct gf100_gr *);
int gf100_gr_new_(const struct gf100_gr_func *, struct nvkm_device *,
		  int, struct nvkm_gr **);
void *gf100_gr_dtor(struct nvkm_gr *);

121
struct gf100_gr_func {
122 123 124
	void (*dtor)(struct gf100_gr *);
	int (*init)(struct gf100_gr *);
	void (*init_gpc_mmu)(struct gf100_gr *);
125
	void (*init_r405a14)(struct gf100_gr *);
126
	void (*init_bios)(struct gf100_gr *);
127
	void (*init_vsc_stream_master)(struct gf100_gr *);
128
	void (*init_zcull)(struct gf100_gr *);
129
	void (*init_num_active_ltcs)(struct gf100_gr *);
130
	void (*init_rop_active_fbps)(struct gf100_gr *);
131
	void (*init_bios_2)(struct gf100_gr *);
132
	void (*init_swdx_pes_mask)(struct gf100_gr *);
133
	void (*init_fecs_exceptions)(struct gf100_gr *);
134
	void (*init_ds_hww_esr_2)(struct gf100_gr *);
135
	void (*init_40601c)(struct gf100_gr *);
136
	void (*init_sked_hww_esr)(struct gf100_gr *);
137
	void (*init_419cc0)(struct gf100_gr *);
138
	void (*init_419eb4)(struct gf100_gr *);
139
	void (*init_ppc_exceptions)(struct gf100_gr *);
140 141 142 143 144 145 146 147
	void (*set_hww_esr_report_mask)(struct gf100_gr *);
	const struct gf100_gr_pack *mmio;
	struct {
		struct gf100_gr_ucode *ucode;
	} fecs;
	struct {
		struct gf100_gr_ucode *ucode;
	} gpccs;
148
	int (*rops)(struct gf100_gr *);
149
	int ppc_nr;
150
	const struct gf100_grctx_func *grctx;
151
	const struct nvkm_therm_clkgate_pack *clkgate_pack;
152 153 154
	struct nvkm_sclass sclass[];
};

155
int gf100_gr_rops(struct gf100_gr *);
156 157
int gf100_gr_init(struct gf100_gr *);
void gf100_gr_init_vsc_stream_master(struct gf100_gr *);
158
void gf100_gr_init_zcull(struct gf100_gr *);
159
void gf100_gr_init_num_active_ltcs(struct gf100_gr *);
160
void gf100_gr_init_fecs_exceptions(struct gf100_gr *);
161
void gf100_gr_init_40601c(struct gf100_gr *);
162
void gf100_gr_init_419cc0(struct gf100_gr *);
163
void gf100_gr_init_419eb4(struct gf100_gr *);
164 165

void gf117_gr_init_zcull(struct gf100_gr *);
166 167

int gk104_gr_init(struct gf100_gr *);
168
void gk104_gr_init_vsc_stream_master(struct gf100_gr *);
169
void gk104_gr_init_rop_active_fbps(struct gf100_gr *);
170
void gk104_gr_init_ppc_exceptions(struct gf100_gr *);
171
void gk104_gr_init_sked_hww_esr(struct gf100_gr *);
172

173 174
void gk110_gr_init_419eb4(struct gf100_gr *);

175 176
int gk20a_gr_init(struct gf100_gr *);

177
int gm200_gr_rops(struct gf100_gr *);
178
void gm200_gr_init_num_active_ltcs(struct gf100_gr *);
179
void gm200_gr_init_ds_hww_esr_2(struct gf100_gr *);
180

181 182
int gp100_gr_init(struct gf100_gr *);
void gp100_gr_init_rop_active_fbps(struct gf100_gr *);
183
void gp100_gr_init_fecs_exceptions(struct gf100_gr *);
184

185 186
void gp102_gr_init_swdx_pes_mask(struct gf100_gr *);

187
#define gf100_gr_chan(p) container_of((p), struct gf100_gr_chan, object)
188
#include <core/object.h>
189

190
struct gf100_gr_chan {
191 192
	struct nvkm_object object;
	struct gf100_gr *gr;
193
	struct nvkm_vmm *vmm;
194

195
	struct nvkm_memory *mmio;
196
	struct nvkm_vma *mmio_vma;
197
	int mmio_nr;
198

199
	struct {
200
		struct nvkm_memory *mem;
201
		struct nvkm_vma *vma;
202 203 204
	} data[4];
};

B
Ben Skeggs 已提交
205
void gf100_gr_ctxctl_debug(struct gf100_gr *);
206

207
void gf100_gr_dtor_fw(struct gf100_gr_fuc *);
B
Ben Skeggs 已提交
208
int  gf100_gr_ctor_fw(struct gf100_gr *, const char *,
209
		      struct gf100_gr_fuc *);
210
u64  gf100_gr_units(struct nvkm_gr *);
B
Ben Skeggs 已提交
211
void gf100_gr_zbc_init(struct gf100_gr *);
212

213
extern const struct nvkm_object_func gf100_fermi;
214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241

struct gf100_gr_init {
	u32 addr;
	u8  count;
	u8  pitch;
	u32 data;
};

struct gf100_gr_pack {
	const struct gf100_gr_init *init;
	u32 type;
};

#define pack_for_each_init(init, pack, head)                                   \
	for (pack = head; pack && pack->init; pack++)                          \
		  for (init = pack->init; init && init->count; init++)

struct gf100_gr_ucode {
	struct gf100_gr_fuc code;
	struct gf100_gr_fuc data;
};

extern struct gf100_gr_ucode gf100_gr_fecs_ucode;
extern struct gf100_gr_ucode gf100_gr_gpccs_ucode;

extern struct gf100_gr_ucode gk110_gr_fecs_ucode;
extern struct gf100_gr_ucode gk110_gr_gpccs_ucode;

B
Ben Skeggs 已提交
242 243 244 245 246
int  gf100_gr_wait_idle(struct gf100_gr *);
void gf100_gr_mmio(struct gf100_gr *, const struct gf100_gr_pack *);
void gf100_gr_icmd(struct gf100_gr *, const struct gf100_gr_pack *);
void gf100_gr_mthd(struct gf100_gr *, const struct gf100_gr_pack *);
int  gf100_gr_init_ctxctl(struct gf100_gr *);
247

248 249 250 251 252 253 254 255
/* external bundles loading functions */
int gk20a_gr_av_to_init(struct gf100_gr *, const char *,
			struct gf100_gr_pack **);
int gk20a_gr_aiv_to_init(struct gf100_gr *, const char *,
			 struct gf100_gr_pack **);
int gk20a_gr_av_to_method(struct gf100_gr *, const char *,
			  struct gf100_gr_pack **);

256 257 258
int gm200_gr_new_(const struct gf100_gr_func *, struct nvkm_device *, int,
		  struct nvkm_gr **);

259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286
/* register init value lists */

extern const struct gf100_gr_init gf100_gr_init_main_0[];
extern const struct gf100_gr_init gf100_gr_init_fe_0[];
extern const struct gf100_gr_init gf100_gr_init_pri_0[];
extern const struct gf100_gr_init gf100_gr_init_rstr2d_0[];
extern const struct gf100_gr_init gf100_gr_init_pd_0[];
extern const struct gf100_gr_init gf100_gr_init_ds_0[];
extern const struct gf100_gr_init gf100_gr_init_scc_0[];
extern const struct gf100_gr_init gf100_gr_init_prop_0[];
extern const struct gf100_gr_init gf100_gr_init_gpc_unk_0[];
extern const struct gf100_gr_init gf100_gr_init_setup_0[];
extern const struct gf100_gr_init gf100_gr_init_crstr_0[];
extern const struct gf100_gr_init gf100_gr_init_setup_1[];
extern const struct gf100_gr_init gf100_gr_init_zcull_0[];
extern const struct gf100_gr_init gf100_gr_init_gpm_0[];
extern const struct gf100_gr_init gf100_gr_init_gpc_unk_1[];
extern const struct gf100_gr_init gf100_gr_init_gcc_0[];
extern const struct gf100_gr_init gf100_gr_init_tpccs_0[];
extern const struct gf100_gr_init gf100_gr_init_tex_0[];
extern const struct gf100_gr_init gf100_gr_init_pe_0[];
extern const struct gf100_gr_init gf100_gr_init_l1c_0[];
extern const struct gf100_gr_init gf100_gr_init_wwdx_0[];
extern const struct gf100_gr_init gf100_gr_init_tpccs_1[];
extern const struct gf100_gr_init gf100_gr_init_mpc_0[];
extern const struct gf100_gr_init gf100_gr_init_be_0[];
extern const struct gf100_gr_init gf100_gr_init_fe_1[];
extern const struct gf100_gr_init gf100_gr_init_pe_1[];
287
void gf100_gr_init_gpc_mmu(struct gf100_gr *);
288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323

extern const struct gf100_gr_init gf104_gr_init_ds_0[];
extern const struct gf100_gr_init gf104_gr_init_tex_0[];
extern const struct gf100_gr_init gf104_gr_init_sm_0[];

extern const struct gf100_gr_init gf108_gr_init_gpc_unk_0[];
extern const struct gf100_gr_init gf108_gr_init_setup_1[];

extern const struct gf100_gr_init gf119_gr_init_pd_0[];
extern const struct gf100_gr_init gf119_gr_init_ds_0[];
extern const struct gf100_gr_init gf119_gr_init_prop_0[];
extern const struct gf100_gr_init gf119_gr_init_gpm_0[];
extern const struct gf100_gr_init gf119_gr_init_gpc_unk_1[];
extern const struct gf100_gr_init gf119_gr_init_tex_0[];
extern const struct gf100_gr_init gf119_gr_init_sm_0[];
extern const struct gf100_gr_init gf119_gr_init_fe_1[];

extern const struct gf100_gr_init gf117_gr_init_pes_0[];
extern const struct gf100_gr_init gf117_gr_init_wwdx_0[];
extern const struct gf100_gr_init gf117_gr_init_cbm_0[];

extern const struct gf100_gr_init gk104_gr_init_main_0[];
extern const struct gf100_gr_init gk104_gr_init_tpccs_0[];
extern const struct gf100_gr_init gk104_gr_init_pe_0[];
extern const struct gf100_gr_init gk104_gr_init_be_0[];
extern const struct gf100_gr_pack gk104_gr_pack_mmio[];

extern const struct gf100_gr_init gk110_gr_init_fe_0[];
extern const struct gf100_gr_init gk110_gr_init_ds_0[];
extern const struct gf100_gr_init gk110_gr_init_sked_0[];
extern const struct gf100_gr_init gk110_gr_init_cwd_0[];
extern const struct gf100_gr_init gk110_gr_init_gpc_unk_1[];
extern const struct gf100_gr_init gk110_gr_init_tex_0[];
extern const struct gf100_gr_init gk110_gr_init_sm_0[];

extern const struct gf100_gr_init gk208_gr_init_gpc_unk_0[];
324 325 326 327 328 329 330 331 332 333

extern const struct gf100_gr_init gm107_gr_init_scc_0[];
extern const struct gf100_gr_init gm107_gr_init_prop_0[];
extern const struct gf100_gr_init gm107_gr_init_setup_1[];
extern const struct gf100_gr_init gm107_gr_init_zcull_0[];
extern const struct gf100_gr_init gm107_gr_init_gpc_unk_1[];
extern const struct gf100_gr_init gm107_gr_init_tex_0[];
extern const struct gf100_gr_init gm107_gr_init_l1c_0[];
extern const struct gf100_gr_init gm107_gr_init_wwdx_0[];
extern const struct gf100_gr_init gm107_gr_init_cbm_0[];
B
Ben Skeggs 已提交
334
void gm107_gr_init_bios(struct gf100_gr *);
335 336

void gm200_gr_init_gpc_mmu(struct gf100_gr *);
337
#endif