Commit e93e198d authored by Ben Skeggs's avatar Ben Skeggs

drm/nouveau/fifo/gk104-: use device info from top subdev

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 56d06fa2
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include <core/enum.h> #include <core/enum.h>
#include <core/gpuobj.h> #include <core/gpuobj.h>
#include <subdev/bar.h> #include <subdev/bar.h>
#include <subdev/top.h>
#include <engine/sw.h> #include <engine/sw.h>
#include <nvif/class.h> #include <nvif/class.h>
...@@ -665,7 +666,9 @@ gk104_fifo_oneinit(struct nvkm_fifo *base) ...@@ -665,7 +666,9 @@ gk104_fifo_oneinit(struct nvkm_fifo *base)
struct gk104_fifo *fifo = gk104_fifo(base); struct gk104_fifo *fifo = gk104_fifo(base);
struct nvkm_subdev *subdev = &fifo->base.engine.subdev; struct nvkm_subdev *subdev = &fifo->base.engine.subdev;
struct nvkm_device *device = subdev->device; struct nvkm_device *device = subdev->device;
int ret, i; struct nvkm_top *top = device->top;
int engn, runl, pbid, ret, i, j;
enum nvkm_devidx engidx;
u32 *map; u32 *map;
/* Determine number of PBDMAs by checking valid enable bits. */ /* Determine number of PBDMAs by checking valid enable bits. */
...@@ -680,86 +683,26 @@ gk104_fifo_oneinit(struct nvkm_fifo *base) ...@@ -680,86 +683,26 @@ gk104_fifo_oneinit(struct nvkm_fifo *base)
for (i = 0; i < fifo->pbdma_nr; i++) for (i = 0; i < fifo->pbdma_nr; i++)
map[i] = nvkm_rd32(device, 0x002390 + (i * 0x04)); map[i] = nvkm_rd32(device, 0x002390 + (i * 0x04));
/* Read device topology from HW. */ /* Determine runlist configuration from topology device info. */
for (i = 0; i < 64; i++) { i = 0;
int type = -1, pbid = -1, engidx = -1; while ((int)(engidx = nvkm_top_engine(top, i++, &runl, &engn)) >= 0) {
int engn = -1, runl = -1, intr = -1, mcen = -1;
int fault = -1, j;
u32 data, addr = 0;
do {
data = nvkm_rd32(device, 0x022700 + (i * 0x04));
nvkm_trace(subdev, "%02x: %08x\n", i, data);
switch (data & 0x00000003) {
case 0x00000000: /* NOT_VALID */
continue;
case 0x00000001: /* DATA */
addr = (data & 0x00fff000);
fault = (data & 0x000000f8) >> 3;
break;
case 0x00000002: /* ENUM */
if (data & 0x00000020)
engn = (data & 0x3c000000) >> 26;
if (data & 0x00000010)
runl = (data & 0x01e00000) >> 21;
if (data & 0x00000008)
intr = (data & 0x000f8000) >> 15;
if (data & 0x00000004)
mcen = (data & 0x00003e00) >> 9;
break;
case 0x00000003: /* ENGINE_TYPE */
type = (data & 0x7ffffffc) >> 2;
break;
}
} while ((data & 0x80000000) && ++i < 64);
if (!data)
continue;
/* Determine which PBDMA handles requests for this engine. */ /* Determine which PBDMA handles requests for this engine. */
for (j = 0; runl >= 0 && j < fifo->pbdma_nr; j++) { for (j = 0, pbid = -1; j < fifo->pbdma_nr; j++) {
if (map[j] & (1 << runl)) { if (map[j] & (1 << runl)) {
pbid = j; pbid = j;
break; break;
} }
} }
/* Translate engine type to NVKM engine identifier. */ nvkm_debug(subdev, "engine %2d: runlist %2d pbdma %2d\n",
switch (type) { engn, runl, pbid);
case 0x00000000: engidx = NVKM_ENGINE_GR; break;
case 0x00000001: engidx = NVKM_ENGINE_CE0; break;
case 0x00000002: engidx = NVKM_ENGINE_CE1; break;
case 0x00000003: engidx = NVKM_ENGINE_CE2; break;
case 0x00000008: engidx = NVKM_ENGINE_MSPDEC; break;
case 0x00000009: engidx = NVKM_ENGINE_MSPPP; break;
case 0x0000000a: engidx = NVKM_ENGINE_MSVLD; break;
case 0x0000000b: engidx = NVKM_ENGINE_MSENC; break;
case 0x0000000c: engidx = NVKM_ENGINE_VIC; break;
case 0x0000000d: engidx = NVKM_ENGINE_SEC; break;
case 0x0000000e: engidx = NVKM_ENGINE_NVENC0; break;
case 0x0000000f: engidx = NVKM_ENGINE_NVENC1; break;
case 0x00000010: engidx = NVKM_ENGINE_NVDEC; break;
break;
default:
break;
}
nvkm_debug(subdev, "%02x (%8s): engine %2d runlist %2d " fifo->engine[engn].engine = nvkm_device_engine(device, engidx);
"pbdma %2d intr %2d reset %2d " fifo->engine[engn].runl = runl;
"fault %2d addr %06x\n", type, fifo->engine[engn].pbid = pbid;
engidx < 0 ? NULL : nvkm_subdev_name[engidx], fifo->engine_nr = max(fifo->engine_nr, engn + 1);
engn, runl, pbid, intr, mcen, fault, addr); fifo->runlist[runl].engm |= 1 << engn;
fifo->runlist_nr = max(fifo->runlist_nr, runl + 1);
/* Mark the engine as supported if everything checks out. */
if (engn >= 0 && runl >= 0) {
fifo->engine[engn].engine = engidx < 0 ? NULL :
nvkm_device_engine(device, engidx);
fifo->engine[engn].runl = runl;
fifo->engine[engn].pbid = pbid;
fifo->engine_nr = max(fifo->engine_nr, engn + 1);
fifo->runlist[runl].engm |= 1 << engn;
fifo->runlist_nr = max(fifo->runlist_nr, runl + 1);
}
} }
kfree(map); kfree(map);
......
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