drm/nouveau/gr/gf100-: move fecs bind_pointer into a function
authorBen Skeggs <bskeggs@redhat.com>
Tue, 12 Feb 2019 12:28:13 +0000 (22:28 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Tue, 19 Feb 2019 23:00:00 +0000 (09:00 +1000)
Makes the code somewhat less magic.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf100.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.h

index e813a3f8ea93dc3820a6824e4f6183ca8f0c6bfa..85f2d1e950e82dbdff10b588b79bb1246dccf08e 100644 (file)
@@ -1523,13 +1523,9 @@ gf100_grctx_generate(struct gf100_gr *gr)
        /* Make channel current. */
        addr = nvkm_memory_addr(inst) >> 12;
        if (gr->firmware) {
-               nvkm_wr32(device, 0x409840, 0x00000030);
-               nvkm_wr32(device, 0x409500, 0x80000000 | addr);
-               nvkm_wr32(device, 0x409504, 0x00000003);
-               nvkm_msec(device, 2000,
-                       if (nvkm_rd32(device, 0x409800) & 0x00000010)
-                               break;
-               );
+               ret = gf100_gr_fecs_bind_pointer(gr, 0x80000000 | addr);
+               if (ret)
+                       goto done;
 
                nvkm_kmap(data);
                nvkm_wo32(data, 0x1c, 1);
index 5ab6468b25f46028cd9f5eda394034445b722d8a..0a38007ad17ed52b160bbed2de8ae176d86e61ab 100644 (file)
@@ -715,6 +715,25 @@ gf100_gr_pack_mmio[] = {
  * 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
 gf100_gr_fecs_set_reglist_virtual_address(struct gf100_gr *gr, u64 addr)
 {
index 8fda190736149188da102861af270787c2700f86..abed68276effaa15dc362fba15a4c4d6536faf56 100644 (file)
@@ -138,6 +138,8 @@ int gf100_gr_new_(const struct gf100_gr_func *, struct nvkm_device *,
                  int, 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 {
        void (*clear_color)(struct gf100_gr *, int zbc);
        void (*clear_depth)(struct gf100_gr *, int zbc);