Commit 6762510b authored by Ben Skeggs's avatar Ben Skeggs

drm/nouveau/gr/gf100-: call FECS WFI_GOLDEN_SAVE method

This won't work on Ampere, and, it's questionable whether we should have
been using our FW's method of storing the golden context image with NV's
firmware to begin with.
Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
Reviewed-by: default avatarLyude Paul <lyude@redhat.com>
parent 6c55b594
...@@ -1496,17 +1496,25 @@ gf100_grctx_generate(struct gf100_gr *gr, struct gf100_gr_chan *chan, struct nvk ...@@ -1496,17 +1496,25 @@ gf100_grctx_generate(struct gf100_gr *gr, struct gf100_gr_chan *chan, struct nvk
grctx->main(chan); grctx->main(chan);
/* Trigger a context unload by unsetting the "next channel valid" bit if (!gr->firmware) {
* and faking a context switch interrupt. /* Trigger a context unload by unsetting the "next channel valid" bit
*/ * and faking a context switch interrupt.
nvkm_mask(device, 0x409b04, 0x80000000, 0x00000000); */
nvkm_wr32(device, 0x409000, 0x00000100); nvkm_mask(device, 0x409b04, 0x80000000, 0x00000000);
if (nvkm_msec(device, 2000, nvkm_wr32(device, 0x409000, 0x00000100);
if (!(nvkm_rd32(device, 0x409b00) & 0x80000000)) if (nvkm_msec(device, 2000,
break; if (!(nvkm_rd32(device, 0x409b00) & 0x80000000))
) < 0) { break;
ret = -EBUSY; ) < 0) {
goto done_inst; ret = -EBUSY;
goto done_inst;
}
} else {
ret = gf100_gr_fecs_wfi_golden_save(gr, 0x80000000 | addr);
if (ret)
goto done_inst;
nvkm_mask(device, 0x409b00, 0x80000000, 0x00000000);
} }
gr->data = kmalloc(gr->size, GFP_KERNEL); gr->data = kmalloc(gr->size, GFP_KERNEL);
......
...@@ -796,6 +796,25 @@ gf100_gr_fecs_stop_ctxsw(struct nvkm_gr *base) ...@@ -796,6 +796,25 @@ gf100_gr_fecs_stop_ctxsw(struct nvkm_gr *base)
return ret; return ret;
} }
int
gf100_gr_fecs_wfi_golden_save(struct gf100_gr *gr, u32 inst)
{
struct nvkm_device *device = gr->base.engine.subdev.device;
nvkm_mask(device, 0x409800, 0x00000003, 0x00000000);
nvkm_wr32(device, 0x409500, inst);
nvkm_wr32(device, 0x409504, 0x00000009);
nvkm_msec(device, 2000,
u32 stat = nvkm_rd32(device, 0x409800);
if (stat & 0x00000002)
return -EIO;
if (stat & 0x00000001)
return 0;
);
return -ETIMEDOUT;
}
int int
gf100_gr_fecs_bind_pointer(struct gf100_gr *gr, u32 inst) gf100_gr_fecs_bind_pointer(struct gf100_gr *gr, u32 inst)
{ {
......
...@@ -129,6 +129,7 @@ struct gf100_gr { ...@@ -129,6 +129,7 @@ struct gf100_gr {
}; };
int gf100_gr_fecs_bind_pointer(struct gf100_gr *, u32 inst); int gf100_gr_fecs_bind_pointer(struct gf100_gr *, u32 inst);
int gf100_gr_fecs_wfi_golden_save(struct gf100_gr *, u32 inst);
struct gf100_gr_func_zbc { struct gf100_gr_func_zbc {
void (*clear_color)(struct gf100_gr *, int zbc); void (*clear_color)(struct gf100_gr *, int zbc);
......
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