提交 67cfbfdf 编写于 作者: B Ben Skeggs

drm/gf100-/gr: unhardcode attribute cb config

Signed-off-by: NBen Skeggs <bskeggs@redhat.com>
上级 b81146b0
...@@ -82,7 +82,7 @@ gk110b_grctx_oclass = &(struct nvc0_grctx_oclass) { ...@@ -82,7 +82,7 @@ gk110b_grctx_oclass = &(struct nvc0_grctx_oclass) {
.wr32 = _nouveau_graph_context_wr32, .wr32 = _nouveau_graph_context_wr32,
}, },
.main = nve4_grctx_generate_main, .main = nve4_grctx_generate_main,
.mods = nvf0_grctx_generate_mods, .mods = nve4_grctx_generate_mods,
.unkn = nve4_grctx_generate_unkn, .unkn = nve4_grctx_generate_unkn,
.hub = nvf0_grctx_pack_hub, .hub = nvf0_grctx_pack_hub,
.gpc = nvf0_grctx_pack_gpc, .gpc = nvf0_grctx_pack_gpc,
...@@ -97,4 +97,9 @@ gk110b_grctx_oclass = &(struct nvc0_grctx_oclass) { ...@@ -97,4 +97,9 @@ gk110b_grctx_oclass = &(struct nvc0_grctx_oclass) {
.bundle_token_limit = 0x600, .bundle_token_limit = 0x600,
.pagepool = nve4_grctx_generate_pagepool, .pagepool = nve4_grctx_generate_pagepool,
.pagepool_size = 0x8000, .pagepool_size = 0x8000,
.attrib = nvd7_grctx_generate_attrib,
.attrib_nr_max = 0x324,
.attrib_nr = 0x218,
.alpha_nr_max = 0x7ff,
.alpha_nr = 0x648,
}.base; }.base;
...@@ -56,4 +56,9 @@ gk20a_grctx_oclass = &(struct nvc0_grctx_oclass) { ...@@ -56,4 +56,9 @@ gk20a_grctx_oclass = &(struct nvc0_grctx_oclass) {
.bundle_token_limit = 0x100, .bundle_token_limit = 0x100,
.pagepool = nve4_grctx_generate_pagepool, .pagepool = nve4_grctx_generate_pagepool,
.pagepool_size = 0x8000, .pagepool_size = 0x8000,
.attrib = nvd7_grctx_generate_attrib,
.attrib_nr_max = 0x240,
.attrib_nr = 0x240,
.alpha_nr_max = 0x648 + (0x648 / 2),
.alpha_nr = 0x648,
}.base; }.base;
...@@ -891,29 +891,47 @@ gm107_grctx_generate_pagepool(struct nvc0_grctx *info) ...@@ -891,29 +891,47 @@ gm107_grctx_generate_pagepool(struct nvc0_grctx *info)
} }
static void static void
gm107_grctx_generate_attrib(struct nvc0_grctx *info)
{
struct nvc0_graph_priv *priv = info->priv;
const struct nvc0_grctx_oclass *impl = (void *)nvc0_grctx_impl(priv);
const u32 alpha = impl->alpha_nr;
const u32 attrib = impl->attrib_nr;
const u32 size = 0x20 * (impl->attrib_nr_max + impl->alpha_nr_max);
const u32 access = NV_MEM_ACCESS_RW;
const int s = 12;
const int b = mmio_vram(info, size * priv->tpc_total, (1 << s), access);
const int max_batches = 0xffff;
u32 bo = 0;
u32 ao = bo + impl->attrib_nr_max * priv->tpc_total;
int gpc, ppc, n = 0;
mmio_refn(info, 0x418810, 0x80000000, s, b);
mmio_refn(info, 0x419848, 0x10000000, s, b);
mmio_refn(info, 0x419c2c, 0x10000000, s, b);
mmio_wr32(info, 0x405830, (attrib << 16) | alpha);
mmio_wr32(info, 0x4064c4, ((alpha / 4) << 16) | max_batches);
for (gpc = 0; gpc < priv->gpc_nr; gpc++) {
for (ppc = 0; ppc < priv->ppc_nr[gpc]; ppc++, n++) {
const u32 as = alpha * priv->ppc_tpc_nr[gpc][ppc];
const u32 bs = attrib * priv->ppc_tpc_nr[gpc][ppc];
const u32 u = 0x418ea0 + (n * 0x04);
const u32 o = PPC_UNIT(gpc, ppc, 0);
mmio_wr32(info, o + 0xc0, bs);
mmio_wr32(info, o + 0xf4, bo);
bo += impl->attrib_nr_max * priv->ppc_tpc_nr[gpc][ppc];
mmio_wr32(info, o + 0xe4, as);
mmio_wr32(info, o + 0xf8, ao);
ao += impl->alpha_nr_max * priv->ppc_tpc_nr[gpc][ppc];
mmio_wr32(info, u, (0x715 /*XXX*/ << 16) | bs);
}
}
}
void
gm107_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info) gm107_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
{ {
mmio_data(0x200000, 0x1000, NV_MEM_ACCESS_RW);
mmio_list(0x418810, 0x80000000, 12, 2);
mmio_list(0x419848, 0x10000000, 12, 2);
mmio_list(0x419c2c, 0x10000000, 12, 2);
mmio_list(0x405830, 0x0aa01000, 0, 0);
mmio_list(0x4064c4, 0x0400ffff, 0, 0);
/*XXX*/
mmio_list(0x5030c0, 0x00001540, 0, 0);
mmio_list(0x5030f4, 0x00000000, 0, 0);
mmio_list(0x5030e4, 0x00002000, 0, 0);
mmio_list(0x5030f8, 0x00003fc0, 0, 0);
mmio_list(0x418ea0, 0x07151540, 0, 0);
mmio_list(0x5032c0, 0x00001540, 0, 0);
mmio_list(0x5032f4, 0x00001fe0, 0, 0);
mmio_list(0x5032e4, 0x00002000, 0, 0);
mmio_list(0x5032f8, 0x00006fc0, 0, 0);
mmio_list(0x418ea4, 0x07151540, 0, 0);
} }
static void static void
...@@ -952,6 +970,7 @@ gm107_grctx_generate_main(struct nvc0_graph_priv *priv, struct nvc0_grctx *info) ...@@ -952,6 +970,7 @@ gm107_grctx_generate_main(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
oclass->bundle(info); oclass->bundle(info);
oclass->pagepool(info); oclass->pagepool(info);
oclass->attrib(info);
oclass->mods(priv, info); oclass->mods(priv, info);
oclass->unkn(priv); oclass->unkn(priv);
...@@ -1012,4 +1031,9 @@ gm107_grctx_oclass = &(struct nvc0_grctx_oclass) { ...@@ -1012,4 +1031,9 @@ gm107_grctx_oclass = &(struct nvc0_grctx_oclass) {
.bundle_token_limit = 0x2c0, .bundle_token_limit = 0x2c0,
.pagepool = gm107_grctx_generate_pagepool, .pagepool = gm107_grctx_generate_pagepool,
.pagepool_size = 0x8000, .pagepool_size = 0x8000,
.attrib = gm107_grctx_generate_attrib,
.attrib_nr_max = 0xff0,
.attrib_nr = 0xaa0,
.alpha_nr_max = 0x1800,
.alpha_nr = 0x1000,
}.base; }.base;
...@@ -534,31 +534,6 @@ nv108_grctx_pack_ppc[] = { ...@@ -534,31 +534,6 @@ nv108_grctx_pack_ppc[] = {
static void static void
nv108_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info) nv108_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
{ {
u32 magic[GPC_MAX][2];
u32 offset;
int gpc;
mmio_data(0x060000, 0x1000, NV_MEM_ACCESS_RW);
mmio_list(0x418810, 0x80000000, 12, 2);
mmio_list(0x419848, 0x10000000, 12, 2);
mmio_list(0x405830, 0x02180648, 0, 0);
mmio_list(0x4064c4, 0x0192ffff, 0, 0);
for (gpc = 0, offset = 0; gpc < priv->gpc_nr; gpc++) {
u16 magic0 = 0x0218 * priv->tpc_nr[gpc];
u16 magic1 = 0x0648 * priv->tpc_nr[gpc];
magic[gpc][0] = 0x10000000 | (magic0 << 16) | offset;
magic[gpc][1] = 0x00000000 | (magic1 << 16);
offset += 0x0324 * priv->tpc_nr[gpc];
}
for (gpc = 0; gpc < priv->gpc_nr; gpc++) {
mmio_list(GPC_UNIT(gpc, 0x30c0), magic[gpc][0], 0, 0);
mmio_list(GPC_UNIT(gpc, 0x30e4), magic[gpc][1] | offset, 0, 0);
offset += 0x07ff * priv->tpc_nr[gpc];
}
mmio_list(0x17e91c, 0x0b040a0b, 0, 0); mmio_list(0x17e91c, 0x0b040a0b, 0, 0);
mmio_list(0x17e920, 0x00090d08, 0, 0); mmio_list(0x17e920, 0x00090d08, 0, 0);
} }
...@@ -590,4 +565,9 @@ nv108_grctx_oclass = &(struct nvc0_grctx_oclass) { ...@@ -590,4 +565,9 @@ nv108_grctx_oclass = &(struct nvc0_grctx_oclass) {
.bundle_token_limit = 0x200, .bundle_token_limit = 0x200,
.pagepool = nve4_grctx_generate_pagepool, .pagepool = nve4_grctx_generate_pagepool,
.pagepool_size = 0x8000, .pagepool_size = 0x8000,
.attrib = nvd7_grctx_generate_attrib,
.attrib_nr_max = 0x324,
.attrib_nr = 0x218,
.alpha_nr_max = 0x7ff,
.alpha_nr = 0x648,
}.base; }.base;
...@@ -1047,27 +1047,37 @@ nvc0_grctx_generate_pagepool(struct nvc0_grctx *info) ...@@ -1047,27 +1047,37 @@ nvc0_grctx_generate_pagepool(struct nvc0_grctx *info)
} }
void void
nvc0_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info) nvc0_grctx_generate_attrib(struct nvc0_grctx *info)
{ {
struct nvc0_graph_priv *priv = info->priv;
const struct nvc0_grctx_oclass *impl = nvc0_grctx_impl(priv);
const u32 attrib = impl->attrib_nr;
const u32 size = 0x20 * (impl->attrib_nr_max + impl->alpha_nr_max);
const u32 access = NV_MEM_ACCESS_RW;
const int s = 12;
const int b = mmio_vram(info, size * priv->tpc_total, (1 << s), access);
int gpc, tpc; int gpc, tpc;
u32 offset; u32 bo = 0;
mmio_data(0x060000, 0x1000, NV_MEM_ACCESS_RW);
mmio_list(0x418810, 0x80000000, 12, 2); mmio_refn(info, 0x418810, 0x80000000, s, b);
mmio_list(0x419848, 0x10000000, 12, 2); mmio_refn(info, 0x419848, 0x10000000, s, b);
mmio_wr32(info, 0x405830, (attrib << 16));
mmio_list(0x405830, 0x02180000, 0, 0); for (gpc = 0; gpc < priv->gpc_nr; gpc++) {
for (gpc = 0, offset = 0; gpc < priv->gpc_nr; gpc++) {
for (tpc = 0; tpc < priv->tpc_nr[gpc]; tpc++) { for (tpc = 0; tpc < priv->tpc_nr[gpc]; tpc++) {
u32 addr = TPC_UNIT(gpc, tpc, 0x0520); const u32 o = TPC_UNIT(gpc, tpc, 0x0520);
mmio_list(addr, 0x02180000 | offset, 0, 0); mmio_skip(info, o, (attrib << 16) | ++bo);
offset += 0x0324; mmio_wr32(info, o, (attrib << 16) | --bo);
bo += impl->attrib_nr_max;
} }
} }
} }
void
nvc0_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
{
}
void void
nvc0_grctx_generate_unkn(struct nvc0_graph_priv *priv) nvc0_grctx_generate_unkn(struct nvc0_graph_priv *priv)
{ {
...@@ -1236,6 +1246,7 @@ nvc0_grctx_generate_main(struct nvc0_graph_priv *priv, struct nvc0_grctx *info) ...@@ -1236,6 +1246,7 @@ nvc0_grctx_generate_main(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
oclass->bundle(info); oclass->bundle(info);
oclass->pagepool(info); oclass->pagepool(info);
oclass->attrib(info);
oclass->mods(priv, info); oclass->mods(priv, info);
oclass->unkn(priv); oclass->unkn(priv);
...@@ -1376,4 +1387,7 @@ nvc0_grctx_oclass = &(struct nvc0_grctx_oclass) { ...@@ -1376,4 +1387,7 @@ nvc0_grctx_oclass = &(struct nvc0_grctx_oclass) {
.bundle_size = 0x1800, .bundle_size = 0x1800,
.pagepool = nvc0_grctx_generate_pagepool, .pagepool = nvc0_grctx_generate_pagepool,
.pagepool_size = 0x8000, .pagepool_size = 0x8000,
.attrib = nvc0_grctx_generate_attrib,
.attrib_nr_max = 0x324,
.attrib_nr = 0x218,
}.base; }.base;
...@@ -47,6 +47,12 @@ struct nvc0_grctx_oclass { ...@@ -47,6 +47,12 @@ struct nvc0_grctx_oclass {
/* pagepool */ /* pagepool */
void (*pagepool)(struct nvc0_grctx *); void (*pagepool)(struct nvc0_grctx *);
u32 pagepool_size; u32 pagepool_size;
/* attribute(/alpha) circular buffer */
void (*attrib)(struct nvc0_grctx *);
u32 attrib_nr_max;
u32 attrib_nr;
u32 alpha_nr_max;
u32 alpha_nr;
}; };
static inline const struct nvc0_grctx_oclass * static inline const struct nvc0_grctx_oclass *
...@@ -60,6 +66,7 @@ int nvc0_grctx_generate(struct nvc0_graph_priv *); ...@@ -60,6 +66,7 @@ int nvc0_grctx_generate(struct nvc0_graph_priv *);
void nvc0_grctx_generate_main(struct nvc0_graph_priv *, struct nvc0_grctx *); void nvc0_grctx_generate_main(struct nvc0_graph_priv *, struct nvc0_grctx *);
void nvc0_grctx_generate_bundle(struct nvc0_grctx *); void nvc0_grctx_generate_bundle(struct nvc0_grctx *);
void nvc0_grctx_generate_pagepool(struct nvc0_grctx *); void nvc0_grctx_generate_pagepool(struct nvc0_grctx *);
void nvc0_grctx_generate_attrib(struct nvc0_grctx *);
void nvc0_grctx_generate_mods(struct nvc0_graph_priv *, struct nvc0_grctx *); void nvc0_grctx_generate_mods(struct nvc0_graph_priv *, struct nvc0_grctx *);
void nvc0_grctx_generate_unkn(struct nvc0_graph_priv *); void nvc0_grctx_generate_unkn(struct nvc0_graph_priv *);
void nvc0_grctx_generate_tpcid(struct nvc0_graph_priv *); void nvc0_grctx_generate_tpcid(struct nvc0_graph_priv *);
...@@ -69,12 +76,16 @@ void nvc0_grctx_generate_r418bb8(struct nvc0_graph_priv *); ...@@ -69,12 +76,16 @@ void nvc0_grctx_generate_r418bb8(struct nvc0_graph_priv *);
void nvc0_grctx_generate_r406800(struct nvc0_graph_priv *); void nvc0_grctx_generate_r406800(struct nvc0_graph_priv *);
extern struct nouveau_oclass *nvc1_grctx_oclass; extern struct nouveau_oclass *nvc1_grctx_oclass;
void nvc1_grctx_generate_attrib(struct nvc0_grctx *);
void nvc1_grctx_generate_mods(struct nvc0_graph_priv *, struct nvc0_grctx *); void nvc1_grctx_generate_mods(struct nvc0_graph_priv *, struct nvc0_grctx *);
void nvc1_grctx_generate_unkn(struct nvc0_graph_priv *); void nvc1_grctx_generate_unkn(struct nvc0_graph_priv *);
extern struct nouveau_oclass *nvc4_grctx_oclass; extern struct nouveau_oclass *nvc4_grctx_oclass;
extern struct nouveau_oclass *nvc8_grctx_oclass; extern struct nouveau_oclass *nvc8_grctx_oclass;
extern struct nouveau_oclass *nvd7_grctx_oclass; extern struct nouveau_oclass *nvd7_grctx_oclass;
void nvd7_grctx_generate_attrib(struct nvc0_grctx *);
extern struct nouveau_oclass *nvd9_grctx_oclass; extern struct nouveau_oclass *nvd9_grctx_oclass;
extern struct nouveau_oclass *nve4_grctx_oclass; extern struct nouveau_oclass *nve4_grctx_oclass;
...@@ -86,8 +97,6 @@ void nve4_grctx_generate_mods(struct nvc0_graph_priv *, struct nvc0_grctx *); ...@@ -86,8 +97,6 @@ void nve4_grctx_generate_mods(struct nvc0_graph_priv *, struct nvc0_grctx *);
void nve4_grctx_generate_unkn(struct nvc0_graph_priv *); void nve4_grctx_generate_unkn(struct nvc0_graph_priv *);
void nve4_grctx_generate_r418bb8(struct nvc0_graph_priv *); void nve4_grctx_generate_r418bb8(struct nvc0_graph_priv *);
void nvf0_grctx_generate_mods(struct nvc0_graph_priv *, struct nvc0_grctx *);
extern struct nouveau_oclass *nvf0_grctx_oclass; extern struct nouveau_oclass *nvf0_grctx_oclass;
extern struct nouveau_oclass *gk110b_grctx_oclass; extern struct nouveau_oclass *gk110b_grctx_oclass;
extern struct nouveau_oclass *nv108_grctx_oclass; extern struct nouveau_oclass *nv108_grctx_oclass;
......
...@@ -727,32 +727,47 @@ nvc1_grctx_pack_tpc[] = { ...@@ -727,32 +727,47 @@ nvc1_grctx_pack_tpc[] = {
******************************************************************************/ ******************************************************************************/
void void
nvc1_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info) nvc1_grctx_generate_attrib(struct nvc0_grctx *info)
{ {
struct nvc0_graph_priv *priv = info->priv;
const struct nvc0_grctx_oclass *impl = nvc0_grctx_impl(priv);
const u32 alpha = impl->alpha_nr;
const u32 beta = impl->attrib_nr;
const u32 size = 0x20 * (impl->attrib_nr_max + impl->alpha_nr_max);
const u32 access = NV_MEM_ACCESS_RW;
const int s = 12;
const int b = mmio_vram(info, size * priv->tpc_total, (1 << s), access);
const int timeslice_mode = 1;
const int max_batches = 0xffff;
u32 bo = 0;
u32 ao = bo + impl->attrib_nr_max * priv->tpc_total;
int gpc, tpc; int gpc, tpc;
u32 offset;
mmio_data(0x060000, 0x1000, NV_MEM_ACCESS_RW);
mmio_list(0x418810, 0x80000000, 12, 2);
mmio_list(0x419848, 0x10000000, 12, 2);
mmio_list(0x405830, 0x02180218, 0, 0); mmio_refn(info, 0x418810, 0x80000000, s, b);
mmio_list(0x4064c4, 0x0086ffff, 0, 0); mmio_refn(info, 0x419848, 0x10000000, s, b);
mmio_wr32(info, 0x405830, (beta << 16) | alpha);
mmio_wr32(info, 0x4064c4, ((alpha / 4) << 16) | max_batches);
for (gpc = 0, offset = 0; gpc < priv->gpc_nr; gpc++) { for (gpc = 0; gpc < priv->gpc_nr; gpc++) {
for (tpc = 0; tpc < priv->tpc_nr[gpc]; tpc++) { for (tpc = 0; tpc < priv->tpc_nr[gpc]; tpc++) {
u32 addr = TPC_UNIT(gpc, tpc, 0x0520); const u32 a = alpha;
mmio_list(addr, 0x12180000 | offset, 0, 0); const u32 b = beta;
offset += 0x0324; const u32 t = timeslice_mode;
} const u32 o = TPC_UNIT(gpc, tpc, 0x500);
for (tpc = 0; tpc < priv->tpc_nr[gpc]; tpc++) { mmio_skip(info, o + 0x20, (t << 28) | (b << 16) | ++bo);
u32 addr = TPC_UNIT(gpc, tpc, 0x0544); mmio_wr32(info, o + 0x20, (t << 28) | (b << 16) | --bo);
mmio_list(addr, 0x02180000 | offset, 0, 0); bo += impl->attrib_nr_max;
offset += 0x0324; mmio_wr32(info, o + 0x44, (a << 16) | ao);
ao += impl->alpha_nr_max;
} }
} }
} }
void
nvc1_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
{
}
void void
nvc1_grctx_generate_unkn(struct nvc0_graph_priv *priv) nvc1_grctx_generate_unkn(struct nvc0_graph_priv *priv)
{ {
...@@ -788,4 +803,9 @@ nvc1_grctx_oclass = &(struct nvc0_grctx_oclass) { ...@@ -788,4 +803,9 @@ nvc1_grctx_oclass = &(struct nvc0_grctx_oclass) {
.bundle_size = 0x1800, .bundle_size = 0x1800,
.pagepool = nvc0_grctx_generate_pagepool, .pagepool = nvc0_grctx_generate_pagepool,
.pagepool_size = 0x8000, .pagepool_size = 0x8000,
.attrib = nvc1_grctx_generate_attrib,
.attrib_nr_max = 0x324,
.attrib_nr = 0x218,
.alpha_nr_max = 0x324,
.alpha_nr = 0x218,
}.base; }.base;
...@@ -104,4 +104,7 @@ nvc4_grctx_oclass = &(struct nvc0_grctx_oclass) { ...@@ -104,4 +104,7 @@ nvc4_grctx_oclass = &(struct nvc0_grctx_oclass) {
.bundle_size = 0x1800, .bundle_size = 0x1800,
.pagepool = nvc0_grctx_generate_pagepool, .pagepool = nvc0_grctx_generate_pagepool,
.pagepool_size = 0x8000, .pagepool_size = 0x8000,
.attrib = nvc0_grctx_generate_attrib,
.attrib_nr_max = 0x324,
.attrib_nr = 0x218,
}.base; }.base;
...@@ -355,4 +355,7 @@ nvc8_grctx_oclass = &(struct nvc0_grctx_oclass) { ...@@ -355,4 +355,7 @@ nvc8_grctx_oclass = &(struct nvc0_grctx_oclass) {
.bundle_size = 0x1800, .bundle_size = 0x1800,
.pagepool = nvc0_grctx_generate_pagepool, .pagepool = nvc0_grctx_generate_pagepool,
.pagepool_size = 0x8000, .pagepool_size = 0x8000,
.attrib = nvc0_grctx_generate_attrib,
.attrib_nr_max = 0x324,
.attrib_nr = 0x218,
}.base; }.base;
...@@ -177,33 +177,46 @@ nvd7_grctx_pack_ppc[] = { ...@@ -177,33 +177,46 @@ nvd7_grctx_pack_ppc[] = {
* PGRAPH context implementation * PGRAPH context implementation
******************************************************************************/ ******************************************************************************/
static void void
nvd7_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info) nvd7_grctx_generate_attrib(struct nvc0_grctx *info)
{ {
u32 magic[GPC_MAX][2]; struct nvc0_graph_priv *priv = info->priv;
u32 offset; const struct nvc0_grctx_oclass *impl = nvc0_grctx_impl(priv);
int gpc; const u32 alpha = impl->alpha_nr;
const u32 beta = impl->attrib_nr;
const u32 size = 0x20 * (impl->attrib_nr_max + impl->alpha_nr_max);
const u32 access = NV_MEM_ACCESS_RW;
const int s = 12;
const int b = mmio_vram(info, size * priv->tpc_total, (1 << s), access);
const int timeslice_mode = 1;
const int max_batches = 0xffff;
u32 bo = 0;
u32 ao = bo + impl->attrib_nr_max * priv->tpc_total;
int gpc, ppc;
mmio_data(0x060000, 0x1000, NV_MEM_ACCESS_RW); mmio_refn(info, 0x418810, 0x80000000, s, b);
mmio_list(0x418810, 0x80000000, 12, 2); mmio_refn(info, 0x419848, 0x10000000, s, b);
mmio_list(0x419848, 0x10000000, 12, 2); mmio_wr32(info, 0x405830, (beta << 16) | alpha);
mmio_wr32(info, 0x4064c4, ((alpha / 4) << 16) | max_batches);
mmio_list(0x405830, 0x02180324, 0, 0);
mmio_list(0x4064c4, 0x00c9ffff, 0, 0);
for (gpc = 0, offset = 0; gpc < priv->gpc_nr; gpc++) {
u16 magic0 = 0x0218 * priv->tpc_nr[gpc];
u16 magic1 = 0x0324 * priv->tpc_nr[gpc];
magic[gpc][0] = 0x10000000 | (magic0 << 16) | offset;
magic[gpc][1] = 0x00000000 | (magic1 << 16);
offset += 0x0324 * priv->tpc_nr[gpc];
}
for (gpc = 0; gpc < priv->gpc_nr; gpc++) { for (gpc = 0; gpc < priv->gpc_nr; gpc++) {
mmio_list(GPC_UNIT(gpc, 0x30c0), magic[gpc][0], 0, 0); for (ppc = 0; ppc < priv->ppc_nr[gpc]; ppc++) {
mmio_list(GPC_UNIT(gpc, 0x30e4), magic[gpc][1] | offset, 0, 0); const u32 a = alpha * priv->ppc_tpc_nr[gpc][ppc];
offset += 0x07ff * priv->tpc_nr[gpc]; const u32 b = beta * priv->ppc_tpc_nr[gpc][ppc];
const u32 t = timeslice_mode;
const u32 o = PPC_UNIT(gpc, ppc, 0);
mmio_skip(info, o + 0xc0, (t << 28) | (b << 16) | ++bo);
mmio_wr32(info, o + 0xc0, (t << 28) | (b << 16) | --bo);
bo += impl->attrib_nr_max * priv->ppc_tpc_nr[gpc][ppc];
mmio_wr32(info, o + 0xe4, (a << 16) | ao);
ao += impl->alpha_nr_max * priv->ppc_tpc_nr[gpc][ppc];
}
} }
}
static void
nvd7_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
{
mmio_list(0x17e91c, 0x03060609, 0, 0); /* different from kepler */ mmio_list(0x17e91c, 0x03060609, 0, 0); /* different from kepler */
} }
...@@ -225,6 +238,7 @@ nvd7_grctx_generate_main(struct nvc0_graph_priv *priv, struct nvc0_grctx *info) ...@@ -225,6 +238,7 @@ nvd7_grctx_generate_main(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
oclass->bundle(info); oclass->bundle(info);
oclass->pagepool(info); oclass->pagepool(info);
oclass->attrib(info);
oclass->mods(priv, info); oclass->mods(priv, info);
oclass->unkn(priv); oclass->unkn(priv);
...@@ -268,4 +282,9 @@ nvd7_grctx_oclass = &(struct nvc0_grctx_oclass) { ...@@ -268,4 +282,9 @@ nvd7_grctx_oclass = &(struct nvc0_grctx_oclass) {
.bundle_size = 0x1800, .bundle_size = 0x1800,
.pagepool = nvc0_grctx_generate_pagepool, .pagepool = nvc0_grctx_generate_pagepool,
.pagepool_size = 0x8000, .pagepool_size = 0x8000,
.attrib = nvd7_grctx_generate_attrib,
.attrib_nr_max = 0x324,
.attrib_nr = 0x218,
.alpha_nr_max = 0x7ff,
.alpha_nr = 0x324,
}.base; }.base;
...@@ -523,4 +523,9 @@ nvd9_grctx_oclass = &(struct nvc0_grctx_oclass) { ...@@ -523,4 +523,9 @@ nvd9_grctx_oclass = &(struct nvc0_grctx_oclass) {
.bundle_size = 0x1800, .bundle_size = 0x1800,
.pagepool = nvc0_grctx_generate_pagepool, .pagepool = nvc0_grctx_generate_pagepool,
.pagepool_size = 0x8000, .pagepool_size = 0x8000,
.attrib = nvc1_grctx_generate_attrib,
.attrib_nr_max = 0x324,
.attrib_nr = 0x218,
.alpha_nr_max = 0x324,
.alpha_nr = 0x218,
}.base; }.base;
...@@ -872,31 +872,6 @@ nve4_grctx_generate_pagepool(struct nvc0_grctx *info) ...@@ -872,31 +872,6 @@ nve4_grctx_generate_pagepool(struct nvc0_grctx *info)
void void
nve4_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info) nve4_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
{ {
u32 magic[GPC_MAX][2];
u32 offset;
int gpc;
mmio_data(0x060000, 0x1000, NV_MEM_ACCESS_RW);
mmio_list(0x418810, 0x80000000, 12, 2);
mmio_list(0x419848, 0x10000000, 12, 2);
mmio_list(0x405830, 0x02180648, 0, 0);
mmio_list(0x4064c4, 0x0192ffff, 0, 0);
for (gpc = 0, offset = 0; gpc < priv->gpc_nr; gpc++) {
u16 magic0 = 0x0218 * priv->tpc_nr[gpc];
u16 magic1 = 0x0648 * priv->tpc_nr[gpc];
magic[gpc][0] = 0x10000000 | (magic0 << 16) | offset;
magic[gpc][1] = 0x00000000 | (magic1 << 16);
offset += 0x0324 * priv->tpc_nr[gpc];
}
for (gpc = 0; gpc < priv->gpc_nr; gpc++) {
mmio_list(GPC_UNIT(gpc, 0x30c0), magic[gpc][0], 0, 0);
mmio_list(GPC_UNIT(gpc, 0x30e4), magic[gpc][1] | offset, 0, 0);
offset += 0x07ff * priv->tpc_nr[gpc];
}
mmio_list(0x17e91c, 0x06060609, 0, 0); mmio_list(0x17e91c, 0x06060609, 0, 0);
mmio_list(0x17e920, 0x00090a05, 0, 0); mmio_list(0x17e920, 0x00090a05, 0, 0);
} }
...@@ -988,6 +963,7 @@ nve4_grctx_generate_main(struct nvc0_graph_priv *priv, struct nvc0_grctx *info) ...@@ -988,6 +963,7 @@ nve4_grctx_generate_main(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
oclass->bundle(info); oclass->bundle(info);
oclass->pagepool(info); oclass->pagepool(info);
oclass->attrib(info);
oclass->mods(priv, info); oclass->mods(priv, info);
oclass->unkn(priv); oclass->unkn(priv);
...@@ -1045,4 +1021,9 @@ nve4_grctx_oclass = &(struct nvc0_grctx_oclass) { ...@@ -1045,4 +1021,9 @@ nve4_grctx_oclass = &(struct nvc0_grctx_oclass) {
.bundle_token_limit = 0x600, .bundle_token_limit = 0x600,
.pagepool = nve4_grctx_generate_pagepool, .pagepool = nve4_grctx_generate_pagepool,
.pagepool_size = 0x8000, .pagepool_size = 0x8000,
.attrib = nvd7_grctx_generate_attrib,
.attrib_nr_max = 0x324,
.attrib_nr = 0x218,
.alpha_nr_max = 0x7ff,
.alpha_nr = 0x648,
}.base; }.base;
...@@ -809,46 +809,6 @@ nvf0_grctx_pack_ppc[] = { ...@@ -809,46 +809,6 @@ nvf0_grctx_pack_ppc[] = {
* PGRAPH context implementation * PGRAPH context implementation
******************************************************************************/ ******************************************************************************/
void
nvf0_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
{
u32 magic[GPC_MAX][4];
u32 offset;
int gpc;
mmio_data(0x060000, 0x1000, NV_MEM_ACCESS_RW);
mmio_list(0x418810, 0x80000000, 12, 2);
mmio_list(0x419848, 0x10000000, 12, 2);
mmio_list(0x405830, 0x02180648, 0, 0);
mmio_list(0x4064c4, 0x0192ffff, 0, 0);
for (gpc = 0, offset = 0; gpc < priv->gpc_nr; gpc++) {
u16 magic0 = 0x0218 * (priv->tpc_nr[gpc] - 1);
u16 magic1 = 0x0648 * (priv->tpc_nr[gpc] - 1);
u16 magic2 = 0x0218;
u16 magic3 = 0x0648;
magic[gpc][0] = 0x10000000 | (magic0 << 16) | offset;
magic[gpc][1] = 0x00000000 | (magic1 << 16);
offset += 0x0324 * (priv->tpc_nr[gpc] - 1);
magic[gpc][2] = 0x10000000 | (magic2 << 16) | offset;
magic[gpc][3] = 0x00000000 | (magic3 << 16);
offset += 0x0324;
}
for (gpc = 0; gpc < priv->gpc_nr; gpc++) {
mmio_list(GPC_UNIT(gpc, 0x30c0), magic[gpc][0], 0, 0);
mmio_list(GPC_UNIT(gpc, 0x30e4), magic[gpc][1] | offset, 0, 0);
offset += 0x07ff * (priv->tpc_nr[gpc] - 1);
mmio_list(GPC_UNIT(gpc, 0x32c0), magic[gpc][2], 0, 0);
mmio_list(GPC_UNIT(gpc, 0x32e4), magic[gpc][3] | offset, 0, 0);
offset += 0x07ff;
}
mmio_list(0x17e91c, 0x06060609, 0, 0);
mmio_list(0x17e920, 0x00090a05, 0, 0);
}
struct nouveau_oclass * struct nouveau_oclass *
nvf0_grctx_oclass = &(struct nvc0_grctx_oclass) { nvf0_grctx_oclass = &(struct nvc0_grctx_oclass) {
.base.handle = NV_ENGCTX(GR, 0xf0), .base.handle = NV_ENGCTX(GR, 0xf0),
...@@ -861,7 +821,7 @@ nvf0_grctx_oclass = &(struct nvc0_grctx_oclass) { ...@@ -861,7 +821,7 @@ nvf0_grctx_oclass = &(struct nvc0_grctx_oclass) {
.wr32 = _nouveau_graph_context_wr32, .wr32 = _nouveau_graph_context_wr32,
}, },
.main = nve4_grctx_generate_main, .main = nve4_grctx_generate_main,
.mods = nvf0_grctx_generate_mods, .mods = nve4_grctx_generate_mods,
.unkn = nve4_grctx_generate_unkn, .unkn = nve4_grctx_generate_unkn,
.hub = nvf0_grctx_pack_hub, .hub = nvf0_grctx_pack_hub,
.gpc = nvf0_grctx_pack_gpc, .gpc = nvf0_grctx_pack_gpc,
...@@ -876,4 +836,9 @@ nvf0_grctx_oclass = &(struct nvc0_grctx_oclass) { ...@@ -876,4 +836,9 @@ nvf0_grctx_oclass = &(struct nvc0_grctx_oclass) {
.bundle_token_limit = 0x7c0, .bundle_token_limit = 0x7c0,
.pagepool = nve4_grctx_generate_pagepool, .pagepool = nve4_grctx_generate_pagepool,
.pagepool_size = 0x8000, .pagepool_size = 0x8000,
.attrib = nvd7_grctx_generate_attrib,
.attrib_nr_max = 0x324,
.attrib_nr = 0x218,
.alpha_nr_max = 0x7ff,
.alpha_nr = 0x648,
}.base; }.base;
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册