From 0381cea8c4e01f7108354a160b79f15210eae992 Mon Sep 17 00:00:00 2001 From: Ben Skeggs Date: Mon, 8 Feb 2021 11:23:56 +1000 Subject: [PATCH] drm/nouveau/fifo/gk104-: switch dev_top fault handling to type+inst Signed-off-by: Ben Skeggs Reviewed-by: Lyude Paul --- .../gpu/drm/nouveau/include/nvkm/subdev/top.h | 3 +-- .../gpu/drm/nouveau/nvkm/engine/fifo/gk104.c | 18 ++++++++--------- .../gpu/drm/nouveau/nvkm/engine/fifo/tu102.c | 20 ++++++++----------- .../gpu/drm/nouveau/nvkm/subdev/top/base.c | 7 +++---- .../gpu/drm/nouveau/nvkm/subdev/top/gk104.c | 2 +- 5 files changed, 21 insertions(+), 29 deletions(-) diff --git a/drivers/gpu/drm/nouveau/include/nvkm/subdev/top.h b/drivers/gpu/drm/nouveau/include/nvkm/subdev/top.h index ea82b5db7c432..a642f5c4ac457 100644 --- a/drivers/gpu/drm/nouveau/include/nvkm/subdev/top.h +++ b/drivers/gpu/drm/nouveau/include/nvkm/subdev/top.h @@ -12,7 +12,6 @@ struct nvkm_top { struct nvkm_top_device { enum nvkm_subdev_type type; int inst; - enum nvkm_devidx index; u32 addr; int fault; int engine; @@ -26,7 +25,7 @@ u32 nvkm_top_addr(struct nvkm_device *, enum nvkm_subdev_type, int); u32 nvkm_top_reset(struct nvkm_device *, enum nvkm_subdev_type, int); u32 nvkm_top_intr_mask(struct nvkm_device *, enum nvkm_subdev_type, int); int nvkm_top_fault_id(struct nvkm_device *, enum nvkm_subdev_type, int); -enum nvkm_devidx nvkm_top_fault(struct nvkm_device *, int fault); +struct nvkm_subdev *nvkm_top_fault(struct nvkm_device *, int fault); int gk104_top_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_top **); #endif diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk104.c b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk104.c index fc6603b5a6e48..8266b9b4585fd 100644 --- a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk104.c +++ b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk104.c @@ -483,7 +483,8 @@ gk104_fifo_fault(struct nvkm_fifo *base, struct nvkm_fault_data *info) struct nvkm_engine *engine = NULL; struct nvkm_fifo_chan *chan; unsigned long flags; - char ct[8] = "HUB/", en[16] = ""; + const char *en = ""; + char ct[8] = "HUB/"; er = nvkm_enum_find(fifo->func->fault.reason, info->reason); ee = nvkm_enum_find(fifo->func->fault.engine, info->engine); @@ -513,17 +514,14 @@ gk104_fifo_fault(struct nvkm_fifo *base, struct nvkm_fault_data *info) } if (ee == NULL) { - enum nvkm_devidx engidx = nvkm_top_fault(device, info->engine); - if (engidx < NVKM_SUBDEV_NR) { - const char *src = nvkm_subdev_type[engidx]; - char *dst = en; - do { - *dst++ = toupper(*src++); - } while(*src); - engine = nvkm_device_engine(device, engidx, 0); + struct nvkm_subdev *subdev = nvkm_top_fault(device, info->engine); + if (subdev) { + if (subdev->func == &nvkm_engine) + engine = container_of(subdev, typeof(*engine), subdev); + en = engine->subdev.name; } } else { - snprintf(en, sizeof(en), "%s", ee->name); + en = ee->name; } spin_lock_irqsave(&fifo->base.lock, flags); diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/tu102.c b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/tu102.c index 1bc6b25d9e3bc..e417044cc3474 100644 --- a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/tu102.c +++ b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/tu102.c @@ -278,7 +278,8 @@ tu102_fifo_fault(struct nvkm_fifo *base, struct nvkm_fault_data *info) struct nvkm_engine *engine = NULL; struct nvkm_fifo_chan *chan; unsigned long flags; - char ct[8] = "HUB/", en[16] = ""; + const char *en = ""; + char ct[8] = "HUB/"; int engn; er = nvkm_enum_find(fifo->func->fault.reason, info->reason); @@ -309,19 +310,14 @@ tu102_fifo_fault(struct nvkm_fifo *base, struct nvkm_fault_data *info) } if (ee == NULL) { - enum nvkm_devidx engidx = nvkm_top_fault(device, info->engine); - - if (engidx < NVKM_SUBDEV_NR) { - const char *src = nvkm_subdev_type[engidx]; - char *dst = en; - - do { - *dst++ = toupper(*src++); - } while (*src); - engine = nvkm_device_engine(device, engidx, 0); + struct nvkm_subdev *subdev = nvkm_top_fault(device, info->engine); + if (subdev) { + if (subdev->func == &nvkm_engine) + engine = container_of(subdev, typeof(*engine), subdev); + en = engine->subdev.name; } } else { - snprintf(en, sizeof(en), "%s", ee->name); + en = ee->name; } spin_lock_irqsave(&fifo->base.lock, flags); diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/top/base.c b/drivers/gpu/drm/nouveau/nvkm/subdev/top/base.c index c34046803e0d1..28d0789f50fec 100644 --- a/drivers/gpu/drm/nouveau/nvkm/subdev/top/base.c +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/top/base.c @@ -30,7 +30,6 @@ nvkm_top_device_new(struct nvkm_top *top) if (info) { info->type = NVKM_SUBDEV_NR; info->inst = -1; - info->index = NVKM_SUBDEV_NR; info->addr = 0; info->fault = -1; info->engine = -1; @@ -104,7 +103,7 @@ nvkm_top_fault_id(struct nvkm_device *device, enum nvkm_subdev_type type, int in return -ENOENT; } -enum nvkm_devidx +struct nvkm_subdev * nvkm_top_fault(struct nvkm_device *device, int fault) { struct nvkm_top *top = device->top; @@ -112,10 +111,10 @@ nvkm_top_fault(struct nvkm_device *device, int fault) list_for_each_entry(info, &top->device, head) { if (info->fault == fault) - return info->index; + return nvkm_device_subdev(device, info->type, info->inst); } - return NVKM_SUBDEV_NR; + return NULL; } static int diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/top/gk104.c b/drivers/gpu/drm/nouveau/nvkm/subdev/top/gk104.c index 4bf0740293cdc..870f926ec35fe 100644 --- a/drivers/gpu/drm/nouveau/nvkm/subdev/top/gk104.c +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/top/gk104.c @@ -70,7 +70,7 @@ gk104_top_oneinit(struct nvkm_top *top) continue; /* Translate engine type to NVKM engine identifier. */ -#define I_(T,I) do { info->type = (T); info->inst = (I); info->index = (T) + (I); } while(0) +#define I_(T,I) do { info->type = (T); info->inst = (I); } while(0) #define O_(T,I) do { WARN_ON(inst); I_(T, I); } while (0) switch (type) { case 0x00000000: O_(NVKM_ENGINE_GR , 0); break; -- 2.39.5