Commit b7f713b8 authored by Ben Skeggs's avatar Ben Skeggs

drm/nouveau/gr/gf100-: move fecs bind_pointer into a function

Makes the code somewhat less magic.
Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 8c7db768
...@@ -1523,13 +1523,9 @@ gf100_grctx_generate(struct gf100_gr *gr) ...@@ -1523,13 +1523,9 @@ gf100_grctx_generate(struct gf100_gr *gr)
/* Make channel current. */ /* Make channel current. */
addr = nvkm_memory_addr(inst) >> 12; addr = nvkm_memory_addr(inst) >> 12;
if (gr->firmware) { if (gr->firmware) {
nvkm_wr32(device, 0x409840, 0x00000030); ret = gf100_gr_fecs_bind_pointer(gr, 0x80000000 | addr);
nvkm_wr32(device, 0x409500, 0x80000000 | addr); if (ret)
nvkm_wr32(device, 0x409504, 0x00000003); goto done;
nvkm_msec(device, 2000,
if (nvkm_rd32(device, 0x409800) & 0x00000010)
break;
);
nvkm_kmap(data); nvkm_kmap(data);
nvkm_wo32(data, 0x1c, 1); nvkm_wo32(data, 0x1c, 1);
......
...@@ -715,6 +715,25 @@ gf100_gr_pack_mmio[] = { ...@@ -715,6 +715,25 @@ gf100_gr_pack_mmio[] = {
* PGRAPH engine/subdev functions * PGRAPH engine/subdev functions
******************************************************************************/ ******************************************************************************/
int
gf100_gr_fecs_bind_pointer(struct gf100_gr *gr, u32 inst)
{
struct nvkm_device *device = gr->base.engine.subdev.device;
nvkm_wr32(device, 0x409840, 0x00000030);
nvkm_wr32(device, 0x409500, inst);
nvkm_wr32(device, 0x409504, 0x00000003);
nvkm_msec(device, 2000,
u32 stat = nvkm_rd32(device, 0x409800);
if (stat & 0x00000020)
return -EIO;
if (stat & 0x00000010)
return 0;
);
return -ETIMEDOUT;
}
static int static int
gf100_gr_fecs_set_reglist_virtual_address(struct gf100_gr *gr, u64 addr) gf100_gr_fecs_set_reglist_virtual_address(struct gf100_gr *gr, u64 addr)
{ {
......
...@@ -138,6 +138,8 @@ int gf100_gr_new_(const struct gf100_gr_func *, struct nvkm_device *, ...@@ -138,6 +138,8 @@ int gf100_gr_new_(const struct gf100_gr_func *, struct nvkm_device *,
int, struct nvkm_gr **); int, struct nvkm_gr **);
void *gf100_gr_dtor(struct nvkm_gr *); void *gf100_gr_dtor(struct nvkm_gr *);
int gf100_gr_fecs_bind_pointer(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);
void (*clear_depth)(struct gf100_gr *, int zbc); void (*clear_depth)(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