Commit 02917aa3 authored by Ben Skeggs's avatar Ben Skeggs

drm/nouveau/gr/gf100-: virtualise init_zcull

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 2fe5ff63
...@@ -1930,6 +1930,34 @@ gf100_gr_init_gpc_mmu(struct gf100_gr *gr) ...@@ -1930,6 +1930,34 @@ gf100_gr_init_gpc_mmu(struct gf100_gr *gr)
nvkm_wr32(device, 0x4188b8, nvkm_memory_addr(fb->mmu_rd) >> 8); nvkm_wr32(device, 0x4188b8, nvkm_memory_addr(fb->mmu_rd) >> 8);
} }
void
gf100_gr_init_zcull(struct gf100_gr *gr)
{
struct nvkm_device *device = gr->base.engine.subdev.device;
const u32 magicgpc918 = DIV_ROUND_UP(0x00800000, gr->tpc_total);
u32 data[TPC_MAX / 8] = {};
u8 tpcnr[GPC_MAX];
int gpc, tpc;
int i;
memcpy(tpcnr, gr->tpc_nr, sizeof(gr->tpc_nr));
for (i = 0, gpc = -1; i < gr->tpc_total; i++) {
do {
gpc = (gpc + 1) % gr->gpc_nr;
} while (!tpcnr[gpc]);
tpc = gr->tpc_nr[gpc] - tpcnr[gpc]--;
data[i / 8] |= tpc << ((i % 8) * 4);
}
nvkm_wr32(device, GPC_BCAST(0x0980), data[0]);
nvkm_wr32(device, GPC_BCAST(0x0984), data[1]);
nvkm_wr32(device, GPC_BCAST(0x0988), data[2]);
nvkm_wr32(device, GPC_BCAST(0x098c), data[3]);
nvkm_wr32(device, GPC_BCAST(0x1bd4), magicgpc918);
}
void void
gf100_gr_init_vsc_stream_master(struct gf100_gr *gr) gf100_gr_init_vsc_stream_master(struct gf100_gr *gr)
{ {
...@@ -1941,11 +1969,7 @@ int ...@@ -1941,11 +1969,7 @@ int
gf100_gr_init(struct gf100_gr *gr) gf100_gr_init(struct gf100_gr *gr)
{ {
struct nvkm_device *device = gr->base.engine.subdev.device; struct nvkm_device *device = gr->base.engine.subdev.device;
const u32 magicgpc918 = DIV_ROUND_UP(0x00800000, gr->tpc_total);
u32 data[TPC_MAX / 8] = {};
u8 tpcnr[GPC_MAX];
int gpc, tpc, rop; int gpc, tpc, rop;
int i;
gr->func->init_gpc_mmu(gr); gr->func->init_gpc_mmu(gr);
...@@ -1964,34 +1988,7 @@ gf100_gr_init(struct gf100_gr *gr) ...@@ -1964,34 +1988,7 @@ gf100_gr_init(struct gf100_gr *gr)
gr->func->init_bios(gr); gr->func->init_bios(gr);
gr->func->init_vsc_stream_master(gr); gr->func->init_vsc_stream_master(gr);
gr->func->init_zcull(gr);
memcpy(tpcnr, gr->tpc_nr, sizeof(gr->tpc_nr));
for (i = 0, gpc = -1; i < gr->tpc_total; i++) {
do {
gpc = (gpc + 1) % gr->gpc_nr;
} while (!tpcnr[gpc]);
tpc = gr->tpc_nr[gpc] - tpcnr[gpc]--;
data[i / 8] |= tpc << ((i % 8) * 4);
}
nvkm_wr32(device, GPC_BCAST(0x0980), data[0]);
nvkm_wr32(device, GPC_BCAST(0x0984), data[1]);
nvkm_wr32(device, GPC_BCAST(0x0988), data[2]);
nvkm_wr32(device, GPC_BCAST(0x098c), data[3]);
for (gpc = 0; gpc < gr->gpc_nr; gpc++) {
nvkm_wr32(device, GPC_UNIT(gpc, 0x0914),
gr->screen_tile_row_offset << 8 | gr->tpc_nr[gpc]);
nvkm_wr32(device, GPC_UNIT(gpc, 0x0910), 0x00040000 |
gr->tpc_total);
nvkm_wr32(device, GPC_UNIT(gpc, 0x0918), magicgpc918);
}
if (device->chipset != 0xd7)
nvkm_wr32(device, GPC_BCAST(0x1bd4), magicgpc918);
else
nvkm_wr32(device, GPC_BCAST(0x3fd4), magicgpc918);
nvkm_wr32(device, GPC_BCAST(0x08ac), nvkm_rd32(device, 0x100800)); nvkm_wr32(device, GPC_BCAST(0x08ac), nvkm_rd32(device, 0x100800));
...@@ -2076,6 +2073,7 @@ gf100_gr = { ...@@ -2076,6 +2073,7 @@ gf100_gr = {
.init = gf100_gr_init, .init = gf100_gr_init,
.init_gpc_mmu = gf100_gr_init_gpc_mmu, .init_gpc_mmu = gf100_gr_init_gpc_mmu,
.init_vsc_stream_master = gf100_gr_init_vsc_stream_master, .init_vsc_stream_master = gf100_gr_init_vsc_stream_master,
.init_zcull = gf100_gr_init_zcull,
.mmio = gf100_gr_pack_mmio, .mmio = gf100_gr_pack_mmio,
.fecs.ucode = &gf100_gr_fecs_ucode, .fecs.ucode = &gf100_gr_fecs_ucode,
.gpccs.ucode = &gf100_gr_gpccs_ucode, .gpccs.ucode = &gf100_gr_gpccs_ucode,
......
...@@ -125,6 +125,7 @@ struct gf100_gr_func { ...@@ -125,6 +125,7 @@ struct gf100_gr_func {
void (*init_r405a14)(struct gf100_gr *); void (*init_r405a14)(struct gf100_gr *);
void (*init_bios)(struct gf100_gr *); void (*init_bios)(struct gf100_gr *);
void (*init_vsc_stream_master)(struct gf100_gr *); void (*init_vsc_stream_master)(struct gf100_gr *);
void (*init_zcull)(struct gf100_gr *);
void (*init_rop_active_fbps)(struct gf100_gr *); void (*init_rop_active_fbps)(struct gf100_gr *);
void (*init_ppc_exceptions)(struct gf100_gr *); void (*init_ppc_exceptions)(struct gf100_gr *);
void (*init_swdx_pes_mask)(struct gf100_gr *); void (*init_swdx_pes_mask)(struct gf100_gr *);
...@@ -147,6 +148,9 @@ struct gf100_gr_func { ...@@ -147,6 +148,9 @@ struct gf100_gr_func {
int gf100_gr_rops(struct gf100_gr *); int gf100_gr_rops(struct gf100_gr *);
int gf100_gr_init(struct gf100_gr *); int gf100_gr_init(struct gf100_gr *);
void gf100_gr_init_vsc_stream_master(struct gf100_gr *); void gf100_gr_init_vsc_stream_master(struct gf100_gr *);
void gf100_gr_init_zcull(struct gf100_gr *);
void gf117_gr_init_zcull(struct gf100_gr *);
int gk104_gr_init(struct gf100_gr *); int gk104_gr_init(struct gf100_gr *);
void gk104_gr_init_vsc_stream_master(struct gf100_gr *); void gk104_gr_init_vsc_stream_master(struct gf100_gr *);
......
...@@ -117,6 +117,7 @@ gf104_gr = { ...@@ -117,6 +117,7 @@ gf104_gr = {
.init = gf100_gr_init, .init = gf100_gr_init,
.init_gpc_mmu = gf100_gr_init_gpc_mmu, .init_gpc_mmu = gf100_gr_init_gpc_mmu,
.init_vsc_stream_master = gf100_gr_init_vsc_stream_master, .init_vsc_stream_master = gf100_gr_init_vsc_stream_master,
.init_zcull = gf100_gr_init_zcull,
.mmio = gf104_gr_pack_mmio, .mmio = gf104_gr_pack_mmio,
.fecs.ucode = &gf100_gr_fecs_ucode, .fecs.ucode = &gf100_gr_fecs_ucode,
.gpccs.ucode = &gf100_gr_gpccs_ucode, .gpccs.ucode = &gf100_gr_gpccs_ucode,
......
...@@ -115,6 +115,7 @@ gf108_gr = { ...@@ -115,6 +115,7 @@ gf108_gr = {
.init_gpc_mmu = gf100_gr_init_gpc_mmu, .init_gpc_mmu = gf100_gr_init_gpc_mmu,
.init_r405a14 = gf108_gr_init_r405a14, .init_r405a14 = gf108_gr_init_r405a14,
.init_vsc_stream_master = gf100_gr_init_vsc_stream_master, .init_vsc_stream_master = gf100_gr_init_vsc_stream_master,
.init_zcull = gf100_gr_init_zcull,
.mmio = gf108_gr_pack_mmio, .mmio = gf108_gr_pack_mmio,
.fecs.ucode = &gf100_gr_fecs_ucode, .fecs.ucode = &gf100_gr_fecs_ucode,
.gpccs.ucode = &gf100_gr_gpccs_ucode, .gpccs.ucode = &gf100_gr_gpccs_ucode,
......
...@@ -89,6 +89,7 @@ gf110_gr = { ...@@ -89,6 +89,7 @@ gf110_gr = {
.init = gf100_gr_init, .init = gf100_gr_init,
.init_gpc_mmu = gf100_gr_init_gpc_mmu, .init_gpc_mmu = gf100_gr_init_gpc_mmu,
.init_vsc_stream_master = gf100_gr_init_vsc_stream_master, .init_vsc_stream_master = gf100_gr_init_vsc_stream_master,
.init_zcull = gf100_gr_init_zcull,
.mmio = gf110_gr_pack_mmio, .mmio = gf110_gr_pack_mmio,
.fecs.ucode = &gf100_gr_fecs_ucode, .fecs.ucode = &gf100_gr_fecs_ucode,
.gpccs.ucode = &gf100_gr_gpccs_ucode, .gpccs.ucode = &gf100_gr_gpccs_ucode,
......
...@@ -120,11 +120,40 @@ gf117_gr_gpccs_ucode = { ...@@ -120,11 +120,40 @@ gf117_gr_gpccs_ucode = {
.data.size = sizeof(gf117_grgpc_data), .data.size = sizeof(gf117_grgpc_data),
}; };
void
gf117_gr_init_zcull(struct gf100_gr *gr)
{
struct nvkm_device *device = gr->base.engine.subdev.device;
const u32 magicgpc918 = DIV_ROUND_UP(0x00800000, gr->tpc_total);
u32 data[TPC_MAX / 8] = {};
u8 tpcnr[GPC_MAX];
int gpc, tpc;
int i;
memcpy(tpcnr, gr->tpc_nr, sizeof(gr->tpc_nr));
for (i = 0, gpc = -1; i < gr->tpc_total; i++) {
do {
gpc = (gpc + 1) % gr->gpc_nr;
} while (!tpcnr[gpc]);
tpc = gr->tpc_nr[gpc] - tpcnr[gpc]--;
data[i / 8] |= tpc << ((i % 8) * 4);
}
nvkm_wr32(device, GPC_BCAST(0x0980), data[0]);
nvkm_wr32(device, GPC_BCAST(0x0984), data[1]);
nvkm_wr32(device, GPC_BCAST(0x0988), data[2]);
nvkm_wr32(device, GPC_BCAST(0x098c), data[3]);
nvkm_wr32(device, GPC_BCAST(0x3fd4), magicgpc918);
}
static const struct gf100_gr_func static const struct gf100_gr_func
gf117_gr = { gf117_gr = {
.init = gf100_gr_init, .init = gf100_gr_init,
.init_gpc_mmu = gf100_gr_init_gpc_mmu, .init_gpc_mmu = gf100_gr_init_gpc_mmu,
.init_vsc_stream_master = gf100_gr_init_vsc_stream_master, .init_vsc_stream_master = gf100_gr_init_vsc_stream_master,
.init_zcull = gf117_gr_init_zcull,
.mmio = gf117_gr_pack_mmio, .mmio = gf117_gr_pack_mmio,
.fecs.ucode = &gf117_gr_fecs_ucode, .fecs.ucode = &gf117_gr_fecs_ucode,
.gpccs.ucode = &gf117_gr_gpccs_ucode, .gpccs.ucode = &gf117_gr_gpccs_ucode,
......
...@@ -180,6 +180,7 @@ gf119_gr = { ...@@ -180,6 +180,7 @@ gf119_gr = {
.init = gf100_gr_init, .init = gf100_gr_init,
.init_gpc_mmu = gf100_gr_init_gpc_mmu, .init_gpc_mmu = gf100_gr_init_gpc_mmu,
.init_vsc_stream_master = gf100_gr_init_vsc_stream_master, .init_vsc_stream_master = gf100_gr_init_vsc_stream_master,
.init_zcull = gf100_gr_init_zcull,
.mmio = gf119_gr_pack_mmio, .mmio = gf119_gr_pack_mmio,
.fecs.ucode = &gf100_gr_fecs_ucode, .fecs.ucode = &gf100_gr_fecs_ucode,
.gpccs.ucode = &gf100_gr_gpccs_ucode, .gpccs.ucode = &gf100_gr_gpccs_ucode,
......
...@@ -415,11 +415,7 @@ int ...@@ -415,11 +415,7 @@ int
gk104_gr_init(struct gf100_gr *gr) gk104_gr_init(struct gf100_gr *gr)
{ {
struct nvkm_device *device = gr->base.engine.subdev.device; struct nvkm_device *device = gr->base.engine.subdev.device;
const u32 magicgpc918 = DIV_ROUND_UP(0x00800000, gr->tpc_total);
u32 data[TPC_MAX / 8] = {};
u8 tpcnr[GPC_MAX];
int gpc, tpc, rop; int gpc, tpc, rop;
int i;
gr->func->init_gpc_mmu(gr); gr->func->init_gpc_mmu(gr);
...@@ -429,32 +425,8 @@ gk104_gr_init(struct gf100_gr *gr) ...@@ -429,32 +425,8 @@ gk104_gr_init(struct gf100_gr *gr)
gr->func->clkgate_pack); gr->func->clkgate_pack);
gr->func->init_vsc_stream_master(gr); gr->func->init_vsc_stream_master(gr);
gr->func->init_zcull(gr);
memset(data, 0x00, sizeof(data));
memcpy(tpcnr, gr->tpc_nr, sizeof(gr->tpc_nr));
for (i = 0, gpc = -1; i < gr->tpc_total; i++) {
do {
gpc = (gpc + 1) % gr->gpc_nr;
} while (!tpcnr[gpc]);
tpc = gr->tpc_nr[gpc] - tpcnr[gpc]--;
data[i / 8] |= tpc << ((i % 8) * 4);
}
nvkm_wr32(device, GPC_BCAST(0x0980), data[0]);
nvkm_wr32(device, GPC_BCAST(0x0984), data[1]);
nvkm_wr32(device, GPC_BCAST(0x0988), data[2]);
nvkm_wr32(device, GPC_BCAST(0x098c), data[3]);
for (gpc = 0; gpc < gr->gpc_nr; gpc++) {
nvkm_wr32(device, GPC_UNIT(gpc, 0x0914),
gr->screen_tile_row_offset << 8 | gr->tpc_nr[gpc]);
nvkm_wr32(device, GPC_UNIT(gpc, 0x0910), 0x00040000 |
gr->tpc_total);
nvkm_wr32(device, GPC_UNIT(gpc, 0x0918), magicgpc918);
}
nvkm_wr32(device, GPC_BCAST(0x3fd4), magicgpc918);
nvkm_wr32(device, GPC_BCAST(0x08ac), nvkm_rd32(device, 0x100800)); nvkm_wr32(device, GPC_BCAST(0x08ac), nvkm_rd32(device, 0x100800));
gr->func->init_rop_active_fbps(gr); gr->func->init_rop_active_fbps(gr);
...@@ -544,6 +516,7 @@ gk104_gr = { ...@@ -544,6 +516,7 @@ gk104_gr = {
.init = gk104_gr_init, .init = gk104_gr_init,
.init_gpc_mmu = gf100_gr_init_gpc_mmu, .init_gpc_mmu = gf100_gr_init_gpc_mmu,
.init_vsc_stream_master = gk104_gr_init_vsc_stream_master, .init_vsc_stream_master = gk104_gr_init_vsc_stream_master,
.init_zcull = gf117_gr_init_zcull,
.init_rop_active_fbps = gk104_gr_init_rop_active_fbps, .init_rop_active_fbps = gk104_gr_init_rop_active_fbps,
.init_ppc_exceptions = gk104_gr_init_ppc_exceptions, .init_ppc_exceptions = gk104_gr_init_ppc_exceptions,
.mmio = gk104_gr_pack_mmio, .mmio = gk104_gr_pack_mmio,
......
...@@ -339,6 +339,7 @@ gk110_gr = { ...@@ -339,6 +339,7 @@ gk110_gr = {
.init = gk104_gr_init, .init = gk104_gr_init,
.init_gpc_mmu = gf100_gr_init_gpc_mmu, .init_gpc_mmu = gf100_gr_init_gpc_mmu,
.init_vsc_stream_master = gk104_gr_init_vsc_stream_master, .init_vsc_stream_master = gk104_gr_init_vsc_stream_master,
.init_zcull = gf117_gr_init_zcull,
.init_rop_active_fbps = gk104_gr_init_rop_active_fbps, .init_rop_active_fbps = gk104_gr_init_rop_active_fbps,
.init_ppc_exceptions = gk104_gr_init_ppc_exceptions, .init_ppc_exceptions = gk104_gr_init_ppc_exceptions,
.mmio = gk110_gr_pack_mmio, .mmio = gk110_gr_pack_mmio,
......
...@@ -105,6 +105,7 @@ gk110b_gr = { ...@@ -105,6 +105,7 @@ gk110b_gr = {
.init = gk104_gr_init, .init = gk104_gr_init,
.init_gpc_mmu = gf100_gr_init_gpc_mmu, .init_gpc_mmu = gf100_gr_init_gpc_mmu,
.init_vsc_stream_master = gk104_gr_init_vsc_stream_master, .init_vsc_stream_master = gk104_gr_init_vsc_stream_master,
.init_zcull = gf117_gr_init_zcull,
.init_rop_active_fbps = gk104_gr_init_rop_active_fbps, .init_rop_active_fbps = gk104_gr_init_rop_active_fbps,
.init_ppc_exceptions = gk104_gr_init_ppc_exceptions, .init_ppc_exceptions = gk104_gr_init_ppc_exceptions,
.mmio = gk110b_gr_pack_mmio, .mmio = gk110b_gr_pack_mmio,
......
...@@ -164,6 +164,7 @@ gk208_gr = { ...@@ -164,6 +164,7 @@ gk208_gr = {
.init = gk104_gr_init, .init = gk104_gr_init,
.init_gpc_mmu = gf100_gr_init_gpc_mmu, .init_gpc_mmu = gf100_gr_init_gpc_mmu,
.init_vsc_stream_master = gk104_gr_init_vsc_stream_master, .init_vsc_stream_master = gk104_gr_init_vsc_stream_master,
.init_zcull = gf117_gr_init_zcull,
.init_rop_active_fbps = gk104_gr_init_rop_active_fbps, .init_rop_active_fbps = gk104_gr_init_rop_active_fbps,
.init_ppc_exceptions = gk104_gr_init_ppc_exceptions, .init_ppc_exceptions = gk104_gr_init_ppc_exceptions,
.mmio = gk208_gr_pack_mmio, .mmio = gk208_gr_pack_mmio,
......
...@@ -219,11 +219,7 @@ int ...@@ -219,11 +219,7 @@ int
gk20a_gr_init(struct gf100_gr *gr) gk20a_gr_init(struct gf100_gr *gr)
{ {
struct nvkm_device *device = gr->base.engine.subdev.device; struct nvkm_device *device = gr->base.engine.subdev.device;
const u32 magicgpc918 = DIV_ROUND_UP(0x00800000, gr->tpc_total); int ret;
u32 data[TPC_MAX / 8] = {};
u8 tpcnr[GPC_MAX];
int gpc, tpc;
int ret, i;
/* Clear SCC RAM */ /* Clear SCC RAM */
nvkm_wr32(device, 0x40802c, 0x1); nvkm_wr32(device, 0x40802c, 0x1);
...@@ -246,31 +242,7 @@ gk20a_gr_init(struct gf100_gr *gr) ...@@ -246,31 +242,7 @@ gk20a_gr_init(struct gf100_gr *gr)
nvkm_mask(device, 0x503018, 0x1, 0x1); nvkm_mask(device, 0x503018, 0x1, 0x1);
/* Zcull init */ /* Zcull init */
memset(data, 0x00, sizeof(data)); gr->func->init_zcull(gr);
memcpy(tpcnr, gr->tpc_nr, sizeof(gr->tpc_nr));
for (i = 0, gpc = -1; i < gr->tpc_total; i++) {
do {
gpc = (gpc + 1) % gr->gpc_nr;
} while (!tpcnr[gpc]);
tpc = gr->tpc_nr[gpc] - tpcnr[gpc]--;
data[i / 8] |= tpc << ((i % 8) * 4);
}
nvkm_wr32(device, GPC_BCAST(0x0980), data[0]);
nvkm_wr32(device, GPC_BCAST(0x0984), data[1]);
nvkm_wr32(device, GPC_BCAST(0x0988), data[2]);
nvkm_wr32(device, GPC_BCAST(0x098c), data[3]);
for (gpc = 0; gpc < gr->gpc_nr; gpc++) {
nvkm_wr32(device, GPC_UNIT(gpc, 0x0914),
gr->screen_tile_row_offset << 8 | gr->tpc_nr[gpc]);
nvkm_wr32(device, GPC_UNIT(gpc, 0x0910), 0x00040000 |
gr->tpc_total);
nvkm_wr32(device, GPC_UNIT(gpc, 0x0918), magicgpc918);
}
nvkm_wr32(device, GPC_BCAST(0x3fd4), magicgpc918);
gr->func->init_rop_active_fbps(gr); gr->func->init_rop_active_fbps(gr);
...@@ -311,6 +283,7 @@ gk20a_gr_init(struct gf100_gr *gr) ...@@ -311,6 +283,7 @@ gk20a_gr_init(struct gf100_gr *gr)
static const struct gf100_gr_func static const struct gf100_gr_func
gk20a_gr = { gk20a_gr = {
.init = gk20a_gr_init, .init = gk20a_gr_init,
.init_zcull = gf117_gr_init_zcull,
.init_rop_active_fbps = gk104_gr_init_rop_active_fbps, .init_rop_active_fbps = gk104_gr_init_rop_active_fbps,
.set_hww_esr_report_mask = gk20a_gr_set_hww_esr_report_mask, .set_hww_esr_report_mask = gk20a_gr_set_hww_esr_report_mask,
.rops = gf100_gr_rops, .rops = gf100_gr_rops,
......
...@@ -325,11 +325,7 @@ static int ...@@ -325,11 +325,7 @@ static int
gm107_gr_init(struct gf100_gr *gr) gm107_gr_init(struct gf100_gr *gr)
{ {
struct nvkm_device *device = gr->base.engine.subdev.device; struct nvkm_device *device = gr->base.engine.subdev.device;
const u32 magicgpc918 = DIV_ROUND_UP(0x00800000, gr->tpc_total);
u32 data[TPC_MAX / 8] = {};
u8 tpcnr[GPC_MAX];
int gpc, tpc, rop; int gpc, tpc, rop;
int i;
gr->func->init_gpc_mmu(gr); gr->func->init_gpc_mmu(gr);
...@@ -338,32 +334,8 @@ gm107_gr_init(struct gf100_gr *gr) ...@@ -338,32 +334,8 @@ gm107_gr_init(struct gf100_gr *gr)
gr->func->init_bios(gr); gr->func->init_bios(gr);
gr->func->init_vsc_stream_master(gr); gr->func->init_vsc_stream_master(gr);
gr->func->init_zcull(gr);
memset(data, 0x00, sizeof(data));
memcpy(tpcnr, gr->tpc_nr, sizeof(gr->tpc_nr));
for (i = 0, gpc = -1; i < gr->tpc_total; i++) {
do {
gpc = (gpc + 1) % gr->gpc_nr;
} while (!tpcnr[gpc]);
tpc = gr->tpc_nr[gpc] - tpcnr[gpc]--;
data[i / 8] |= tpc << ((i % 8) * 4);
}
nvkm_wr32(device, GPC_BCAST(0x0980), data[0]);
nvkm_wr32(device, GPC_BCAST(0x0984), data[1]);
nvkm_wr32(device, GPC_BCAST(0x0988), data[2]);
nvkm_wr32(device, GPC_BCAST(0x098c), data[3]);
for (gpc = 0; gpc < gr->gpc_nr; gpc++) {
nvkm_wr32(device, GPC_UNIT(gpc, 0x0914),
gr->screen_tile_row_offset << 8 | gr->tpc_nr[gpc]);
nvkm_wr32(device, GPC_UNIT(gpc, 0x0910), 0x00040000 |
gr->tpc_total);
nvkm_wr32(device, GPC_UNIT(gpc, 0x0918), magicgpc918);
}
nvkm_wr32(device, GPC_BCAST(0x3fd4), magicgpc918);
nvkm_wr32(device, GPC_BCAST(0x08ac), nvkm_rd32(device, 0x100800)); nvkm_wr32(device, GPC_BCAST(0x08ac), nvkm_rd32(device, 0x100800));
gr->func->init_rop_active_fbps(gr); gr->func->init_rop_active_fbps(gr);
...@@ -453,6 +425,7 @@ gm107_gr = { ...@@ -453,6 +425,7 @@ gm107_gr = {
.init_gpc_mmu = gm107_gr_init_gpc_mmu, .init_gpc_mmu = gm107_gr_init_gpc_mmu,
.init_bios = gm107_gr_init_bios, .init_bios = gm107_gr_init_bios,
.init_vsc_stream_master = gk104_gr_init_vsc_stream_master, .init_vsc_stream_master = gk104_gr_init_vsc_stream_master,
.init_zcull = gf117_gr_init_zcull,
.init_rop_active_fbps = gk104_gr_init_rop_active_fbps, .init_rop_active_fbps = gk104_gr_init_rop_active_fbps,
.init_ppc_exceptions = gk104_gr_init_ppc_exceptions, .init_ppc_exceptions = gk104_gr_init_ppc_exceptions,
.mmio = gm107_gr_pack_mmio, .mmio = gm107_gr_pack_mmio,
......
...@@ -65,11 +65,7 @@ static int ...@@ -65,11 +65,7 @@ static int
gm200_gr_init(struct gf100_gr *gr) gm200_gr_init(struct gf100_gr *gr)
{ {
struct nvkm_device *device = gr->base.engine.subdev.device; struct nvkm_device *device = gr->base.engine.subdev.device;
const u32 magicgpc918 = DIV_ROUND_UP(0x00800000, gr->tpc_total);
u32 data[TPC_MAX / 8] = {};
u8 tpcnr[GPC_MAX];
int gpc, tpc, rop; int gpc, tpc, rop;
int i;
gr->func->init_gpc_mmu(gr); gr->func->init_gpc_mmu(gr);
...@@ -78,32 +74,8 @@ gm200_gr_init(struct gf100_gr *gr) ...@@ -78,32 +74,8 @@ gm200_gr_init(struct gf100_gr *gr)
gr->func->init_bios(gr); gr->func->init_bios(gr);
gr->func->init_vsc_stream_master(gr); gr->func->init_vsc_stream_master(gr);
gr->func->init_zcull(gr);
memset(data, 0x00, sizeof(data));
memcpy(tpcnr, gr->tpc_nr, sizeof(gr->tpc_nr));
for (i = 0, gpc = -1; i < gr->tpc_total; i++) {
do {
gpc = (gpc + 1) % gr->gpc_nr;
} while (!tpcnr[gpc]);
tpc = gr->tpc_nr[gpc] - tpcnr[gpc]--;
data[i / 8] |= tpc << ((i % 8) * 4);
}
nvkm_wr32(device, GPC_BCAST(0x0980), data[0]);
nvkm_wr32(device, GPC_BCAST(0x0984), data[1]);
nvkm_wr32(device, GPC_BCAST(0x0988), data[2]);
nvkm_wr32(device, GPC_BCAST(0x098c), data[3]);
for (gpc = 0; gpc < gr->gpc_nr; gpc++) {
nvkm_wr32(device, GPC_UNIT(gpc, 0x0914),
gr->screen_tile_row_offset << 8 | gr->tpc_nr[gpc]);
nvkm_wr32(device, GPC_UNIT(gpc, 0x0910), 0x00040000 |
gr->tpc_total);
nvkm_wr32(device, GPC_UNIT(gpc, 0x0918), magicgpc918);
}
nvkm_wr32(device, GPC_BCAST(0x3fd4), magicgpc918);
nvkm_wr32(device, GPC_BCAST(0x08ac), nvkm_rd32(device, 0x100800)); nvkm_wr32(device, GPC_BCAST(0x08ac), nvkm_rd32(device, 0x100800));
nvkm_wr32(device, GPC_BCAST(0x033c), nvkm_rd32(device, 0x100804)); nvkm_wr32(device, GPC_BCAST(0x033c), nvkm_rd32(device, 0x100804));
...@@ -212,6 +184,7 @@ gm200_gr = { ...@@ -212,6 +184,7 @@ gm200_gr = {
.init_gpc_mmu = gm200_gr_init_gpc_mmu, .init_gpc_mmu = gm200_gr_init_gpc_mmu,
.init_bios = gm107_gr_init_bios, .init_bios = gm107_gr_init_bios,
.init_vsc_stream_master = gk104_gr_init_vsc_stream_master, .init_vsc_stream_master = gk104_gr_init_vsc_stream_master,
.init_zcull = gf117_gr_init_zcull,
.init_rop_active_fbps = gm200_gr_init_rop_active_fbps, .init_rop_active_fbps = gm200_gr_init_rop_active_fbps,
.init_ppc_exceptions = gk104_gr_init_ppc_exceptions, .init_ppc_exceptions = gk104_gr_init_ppc_exceptions,
.rops = gm200_gr_rops, .rops = gm200_gr_rops,
......
...@@ -65,6 +65,7 @@ gm20b_gr_set_hww_esr_report_mask(struct gf100_gr *gr) ...@@ -65,6 +65,7 @@ gm20b_gr_set_hww_esr_report_mask(struct gf100_gr *gr)
static const struct gf100_gr_func static const struct gf100_gr_func
gm20b_gr = { gm20b_gr = {
.init = gk20a_gr_init, .init = gk20a_gr_init,
.init_zcull = gf117_gr_init_zcull,
.init_gpc_mmu = gm20b_gr_init_gpc_mmu, .init_gpc_mmu = gm20b_gr_init_gpc_mmu,
.init_rop_active_fbps = gk104_gr_init_rop_active_fbps, .init_rop_active_fbps = gk104_gr_init_rop_active_fbps,
.set_hww_esr_report_mask = gm20b_gr_set_hww_esr_report_mask, .set_hww_esr_report_mask = gm20b_gr_set_hww_esr_report_mask,
......
...@@ -53,43 +53,15 @@ int ...@@ -53,43 +53,15 @@ int
gp100_gr_init(struct gf100_gr *gr) gp100_gr_init(struct gf100_gr *gr)
{ {
struct nvkm_device *device = gr->base.engine.subdev.device; struct nvkm_device *device = gr->base.engine.subdev.device;
const u32 magicgpc918 = DIV_ROUND_UP(0x00800000, gr->tpc_total);
u32 data[TPC_MAX / 8] = {};
u8 tpcnr[GPC_MAX];
int gpc, tpc, rop; int gpc, tpc, rop;
int i;
gr->func->init_gpc_mmu(gr); gr->func->init_gpc_mmu(gr);
gf100_gr_mmio(gr, gr->fuc_sw_nonctx); gf100_gr_mmio(gr, gr->fuc_sw_nonctx);
gr->func->init_vsc_stream_master(gr); gr->func->init_vsc_stream_master(gr);
gr->func->init_zcull(gr);
memset(data, 0x00, sizeof(data));
memcpy(tpcnr, gr->tpc_nr, sizeof(gr->tpc_nr));
for (i = 0, gpc = -1; i < gr->tpc_total; i++) {
do {
gpc = (gpc + 1) % gr->gpc_nr;
} while (!tpcnr[gpc]);
tpc = gr->tpc_nr[gpc] - tpcnr[gpc]--;
data[i / 8] |= tpc << ((i % 8) * 4);
}
nvkm_wr32(device, GPC_BCAST(0x0980), data[0]);
nvkm_wr32(device, GPC_BCAST(0x0984), data[1]);
nvkm_wr32(device, GPC_BCAST(0x0988), data[2]);
nvkm_wr32(device, GPC_BCAST(0x098c), data[3]);
for (gpc = 0; gpc < gr->gpc_nr; gpc++) {
nvkm_wr32(device, GPC_UNIT(gpc, 0x0914),
gr->screen_tile_row_offset << 8 | gr->tpc_nr[gpc]);
nvkm_wr32(device, GPC_UNIT(gpc, 0x0910), 0x00040000 |
gr->tpc_total);
nvkm_wr32(device, GPC_UNIT(gpc, 0x0918), magicgpc918);
}
nvkm_wr32(device, GPC_BCAST(0x3fd4), magicgpc918);
gr->func->init_num_active_ltcs(gr); gr->func->init_num_active_ltcs(gr);
gr->func->init_rop_active_fbps(gr); gr->func->init_rop_active_fbps(gr);
...@@ -161,6 +133,7 @@ gp100_gr = { ...@@ -161,6 +133,7 @@ gp100_gr = {
.init = gp100_gr_init, .init = gp100_gr_init,
.init_gpc_mmu = gm200_gr_init_gpc_mmu, .init_gpc_mmu = gm200_gr_init_gpc_mmu,
.init_vsc_stream_master = gk104_gr_init_vsc_stream_master, .init_vsc_stream_master = gk104_gr_init_vsc_stream_master,
.init_zcull = gf117_gr_init_zcull,
.init_rop_active_fbps = gp100_gr_init_rop_active_fbps, .init_rop_active_fbps = gp100_gr_init_rop_active_fbps,
.init_ppc_exceptions = gk104_gr_init_ppc_exceptions, .init_ppc_exceptions = gk104_gr_init_ppc_exceptions,
.init_num_active_ltcs = gp100_gr_init_num_active_ltcs, .init_num_active_ltcs = gp100_gr_init_num_active_ltcs,
......
...@@ -45,6 +45,7 @@ gp102_gr = { ...@@ -45,6 +45,7 @@ gp102_gr = {
.init = gp100_gr_init, .init = gp100_gr_init,
.init_gpc_mmu = gm200_gr_init_gpc_mmu, .init_gpc_mmu = gm200_gr_init_gpc_mmu,
.init_vsc_stream_master = gk104_gr_init_vsc_stream_master, .init_vsc_stream_master = gk104_gr_init_vsc_stream_master,
.init_zcull = gf117_gr_init_zcull,
.init_rop_active_fbps = gp100_gr_init_rop_active_fbps, .init_rop_active_fbps = gp100_gr_init_rop_active_fbps,
.init_ppc_exceptions = gk104_gr_init_ppc_exceptions, .init_ppc_exceptions = gk104_gr_init_ppc_exceptions,
.init_swdx_pes_mask = gp102_gr_init_swdx_pes_mask, .init_swdx_pes_mask = gp102_gr_init_swdx_pes_mask,
......
...@@ -31,6 +31,7 @@ gp107_gr = { ...@@ -31,6 +31,7 @@ gp107_gr = {
.init = gp100_gr_init, .init = gp100_gr_init,
.init_gpc_mmu = gm200_gr_init_gpc_mmu, .init_gpc_mmu = gm200_gr_init_gpc_mmu,
.init_vsc_stream_master = gk104_gr_init_vsc_stream_master, .init_vsc_stream_master = gk104_gr_init_vsc_stream_master,
.init_zcull = gf117_gr_init_zcull,
.init_rop_active_fbps = gp100_gr_init_rop_active_fbps, .init_rop_active_fbps = gp100_gr_init_rop_active_fbps,
.init_ppc_exceptions = gk104_gr_init_ppc_exceptions, .init_ppc_exceptions = gk104_gr_init_ppc_exceptions,
.init_swdx_pes_mask = gp102_gr_init_swdx_pes_mask, .init_swdx_pes_mask = gp102_gr_init_swdx_pes_mask,
......
...@@ -38,6 +38,7 @@ gp10b_gr = { ...@@ -38,6 +38,7 @@ gp10b_gr = {
.init = gp100_gr_init, .init = gp100_gr_init,
.init_gpc_mmu = gm200_gr_init_gpc_mmu, .init_gpc_mmu = gm200_gr_init_gpc_mmu,
.init_vsc_stream_master = gk104_gr_init_vsc_stream_master, .init_vsc_stream_master = gk104_gr_init_vsc_stream_master,
.init_zcull = gf117_gr_init_zcull,
.init_rop_active_fbps = gp100_gr_init_rop_active_fbps, .init_rop_active_fbps = gp100_gr_init_rop_active_fbps,
.init_ppc_exceptions = gk104_gr_init_ppc_exceptions, .init_ppc_exceptions = gk104_gr_init_ppc_exceptions,
.init_num_active_ltcs = gp10b_gr_init_num_active_ltcs, .init_num_active_ltcs = gp10b_gr_init_num_active_ltcs,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment