Skip to content

Commit ca081ff

Browse files
author
Ben Skeggs
committed
drm/nouveau/gr/gf100-: generate golden context during first object alloc
Needed for GV100 (and only GV100 for some reason) for WFI_GOLDEN_SAVE. Signed-off-by: Ben Skeggs <[email protected]> Reviewed-by: Lyude Paul <[email protected]>
1 parent 1137502 commit ca081ff

File tree

3 files changed

+26
-49
lines changed

3 files changed

+26
-49
lines changed

drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf100.c

Lines changed: 14 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include <subdev/fb.h>
2727
#include <subdev/mc.h>
2828
#include <subdev/timer.h>
29+
#include <engine/fifo.h>
2930

3031
/*******************************************************************************
3132
* PGRAPH context register lists
@@ -1433,14 +1434,12 @@ gf100_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
14331434
#define CB_RESERVED 0x80000
14341435

14351436
int
1436-
gf100_grctx_generate(struct gf100_gr *gr)
1437+
gf100_grctx_generate(struct gf100_gr *gr, struct gf100_gr_chan *chan, struct nvkm_gpuobj *inst)
14371438
{
14381439
const struct gf100_grctx_func *grctx = gr->func->grctx;
14391440
struct nvkm_subdev *subdev = &gr->base.engine.subdev;
14401441
struct nvkm_device *device = subdev->device;
1441-
struct nvkm_memory *inst = NULL;
14421442
struct nvkm_memory *data = NULL;
1443-
struct nvkm_vmm *vmm = NULL;
14441443
struct nvkm_vma *ctx = NULL;
14451444
struct gf100_grctx info;
14461445
int ret, i;
@@ -1472,38 +1471,20 @@ gf100_grctx_generate(struct gf100_gr *gr)
14721471
/* Init SCC RAM. */
14731472
nvkm_wr32(device, 0x40802c, 0x00000001);
14741473

1475-
/* Allocate memory to for a "channel", which we'll use to generate
1476-
* the default context values.
1477-
*/
1478-
ret = nvkm_memory_new(device, NVKM_MEM_TARGET_INST,
1479-
0x1000, 0x1000, true, &inst);
1480-
if (ret)
1481-
goto done;
1482-
1483-
ret = nvkm_vmm_new(device, 0, 0, NULL, 0, NULL, "grctx", &vmm);
1484-
if (ret)
1485-
goto done;
1486-
1487-
vmm->debug = subdev->debug;
1488-
1489-
ret = nvkm_vmm_join(vmm, inst);
1490-
if (ret)
1491-
goto done;
1492-
1474+
/* Allocate memory to store context, and dummy global context buffers. */
14931475
ret = nvkm_memory_new(device, NVKM_MEM_TARGET_INST,
14941476
CB_RESERVED + gr->size, 0, true, &data);
14951477
if (ret)
14961478
goto done;
14971479

1498-
ret = nvkm_vmm_get(vmm, 0, nvkm_memory_size(data), &ctx);
1480+
ret = nvkm_vmm_get(chan->vmm, 0, nvkm_memory_size(data), &ctx);
14991481
if (ret)
15001482
goto done;
15011483

1502-
ret = nvkm_memory_map(data, 0, vmm, ctx, NULL, 0);
1484+
ret = nvkm_memory_map(data, 0, chan->vmm, ctx, NULL, 0);
15031485
if (ret)
15041486
goto done;
15051487

1506-
15071488
/* Setup context pointer. */
15081489
nvkm_kmap(inst);
15091490
nvkm_wo32(inst, 0x0210, lower_32_bits(ctx->addr + CB_RESERVED) | 4);
@@ -1518,11 +1499,11 @@ gf100_grctx_generate(struct gf100_gr *gr)
15181499
info.buffer_nr = 0;
15191500

15201501
/* Make channel current. */
1521-
addr = nvkm_memory_addr(inst) >> 12;
1502+
addr = inst->addr >> 12;
15221503
if (gr->firmware) {
15231504
ret = gf100_gr_fecs_bind_pointer(gr, 0x80000000 | addr);
15241505
if (ret)
1525-
goto done;
1506+
goto done_inst;
15261507

15271508
nvkm_kmap(data);
15281509
nvkm_wo32(data, 0x1c, 1);
@@ -1552,7 +1533,7 @@ gf100_grctx_generate(struct gf100_gr *gr)
15521533
break;
15531534
) < 0) {
15541535
ret = -EBUSY;
1555-
goto done;
1536+
goto done_inst;
15561537
}
15571538

15581539
gr->data = kmalloc(gr->size, GFP_KERNEL);
@@ -1566,12 +1547,14 @@ gf100_grctx_generate(struct gf100_gr *gr)
15661547
ret = -ENOMEM;
15671548
}
15681549

1550+
done_inst:
1551+
nvkm_kmap(inst);
1552+
nvkm_wo32(inst, 0x0210, 0);
1553+
nvkm_wo32(inst, 0x0214, 0);
1554+
nvkm_done(inst);
15691555
done:
1570-
nvkm_vmm_put(vmm, &ctx);
1556+
nvkm_vmm_put(chan->vmm, &ctx);
15711557
nvkm_memory_unref(&data);
1572-
nvkm_vmm_part(vmm, inst);
1573-
nvkm_vmm_unref(&vmm);
1574-
nvkm_memory_unref(&inst);
15751558
return ret;
15761559
}
15771560

drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf100.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ struct gf100_grctx_func {
8181
};
8282

8383
extern const struct gf100_grctx_func gf100_grctx;
84-
int gf100_grctx_generate(struct gf100_gr *);
84+
int gf100_grctx_generate(struct gf100_gr *, struct gf100_gr_chan *, struct nvkm_gpuobj *inst);
8585
void gf100_grctx_generate_main(struct gf100_gr *, struct gf100_grctx *);
8686
void gf100_grctx_generate_bundle(struct gf100_grctx *);
8787
void gf100_grctx_generate_pagepool(struct gf100_grctx *);

drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.c

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,17 @@ gf100_gr_chan_new(struct nvkm_gr *base, struct nvkm_fifo_chan *fifoch,
394394
chan->vmm = nvkm_vmm_ref(fifoch->vmm);
395395
*pobject = &chan->object;
396396

397+
/* Generate golden context image. */
398+
mutex_lock(&gr->fecs.mutex);
399+
if (gr->data == NULL) {
400+
ret = gf100_grctx_generate(gr, chan, fifoch->inst);
401+
if (ret) {
402+
nvkm_error(&base->engine.subdev, "failed to construct context\n");
403+
return ret;
404+
}
405+
}
406+
mutex_unlock(&gr->fecs.mutex);
407+
397408
/* allocate memory for a "mmio list" buffer that's used by the HUB
398409
* fuc to modify some per-context register settings on first load
399410
* of the context.
@@ -1763,15 +1774,6 @@ gf100_gr_init_ctxctl_ext(struct gf100_gr *gr)
17631774
return ret;
17641775
}
17651776

1766-
/* Generate golden context image. */
1767-
if (gr->data == NULL) {
1768-
int ret = gf100_grctx_generate(gr);
1769-
if (ret) {
1770-
nvkm_error(subdev, "failed to construct context\n");
1771-
return ret;
1772-
}
1773-
}
1774-
17751777
return 0;
17761778
}
17771779

@@ -1823,14 +1825,6 @@ gf100_gr_init_ctxctl_int(struct gf100_gr *gr)
18231825
}
18241826

18251827
gr->size = nvkm_rd32(device, 0x409804);
1826-
if (gr->data == NULL) {
1827-
int ret = gf100_grctx_generate(gr);
1828-
if (ret) {
1829-
nvkm_error(subdev, "failed to construct context\n");
1830-
return ret;
1831-
}
1832-
}
1833-
18341828
return 0;
18351829
}
18361830

0 commit comments

Comments
 (0)