OSDN Git Service

drm/nouveau/subdev: track type+instance separately
authorBen Skeggs <bskeggs@redhat.com>
Sat, 25 Jul 2020 06:40:07 +0000 (16:40 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Thu, 11 Feb 2021 00:14:28 +0000 (10:14 +1000)
We use subdev id bitmasks (as a u64) in a number of places, and GA100 adds
enough new engine instances that we run out of bits.  We could alias IDs of
engines that no longer exist, but it's cleaner for a number of reasons to
just split the subdev index into a subdev type, and instance ID instead.

Just a lot more painful to do.

This magics up the values for old-style subdev constructors, and provides a
way to incrementally transition each subdev to the new style.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Reviewed-by: Lyude Paul <lyude@redhat.com>
drivers/gpu/drm/nouveau/include/nvkm/core/device.h
drivers/gpu/drm/nouveau/include/nvkm/core/subdev.h
drivers/gpu/drm/nouveau/nvkm/core/subdev.c

index 3ede84c..a1c7219 100644 (file)
@@ -4,78 +4,7 @@
 #include <core/oclass.h>
 #include <core/event.h>
 
-enum nvkm_devidx {
-       NVKM_SUBDEV_PCI,
-       NVKM_SUBDEV_VBIOS,
-       NVKM_SUBDEV_DEVINIT,
-       NVKM_SUBDEV_TOP,
-       NVKM_SUBDEV_IBUS,
-       NVKM_SUBDEV_GPIO,
-       NVKM_SUBDEV_I2C,
-       NVKM_SUBDEV_FUSE,
-       NVKM_SUBDEV_MXM,
-       NVKM_SUBDEV_MC,
-       NVKM_SUBDEV_BUS,
-       NVKM_SUBDEV_TIMER,
-       NVKM_SUBDEV_INSTMEM,
-       NVKM_SUBDEV_FB,
-       NVKM_SUBDEV_LTC,
-       NVKM_SUBDEV_MMU,
-       NVKM_SUBDEV_BAR,
-       NVKM_SUBDEV_FAULT,
-       NVKM_SUBDEV_ACR,
-       NVKM_SUBDEV_PMU,
-       NVKM_SUBDEV_VOLT,
-       NVKM_SUBDEV_ICCSENSE,
-       NVKM_SUBDEV_THERM,
-       NVKM_SUBDEV_CLK,
-       NVKM_SUBDEV_GSP,
-
-       NVKM_ENGINE_BSP,
-
-       NVKM_ENGINE_CE0,
-       NVKM_ENGINE_CE1,
-       NVKM_ENGINE_CE2,
-       NVKM_ENGINE_CE3,
-       NVKM_ENGINE_CE4,
-       NVKM_ENGINE_CE5,
-       NVKM_ENGINE_CE6,
-       NVKM_ENGINE_CE7,
-       NVKM_ENGINE_CE8,
-       NVKM_ENGINE_CE_LAST = NVKM_ENGINE_CE8,
-
-       NVKM_ENGINE_CIPHER,
-       NVKM_ENGINE_DISP,
-       NVKM_ENGINE_DMAOBJ,
-       NVKM_ENGINE_FIFO,
-       NVKM_ENGINE_GR,
-       NVKM_ENGINE_IFB,
-       NVKM_ENGINE_ME,
-       NVKM_ENGINE_MPEG,
-       NVKM_ENGINE_MSENC,
-       NVKM_ENGINE_MSPDEC,
-       NVKM_ENGINE_MSPPP,
-       NVKM_ENGINE_MSVLD,
-
-       NVKM_ENGINE_NVENC0,
-       NVKM_ENGINE_NVENC1,
-       NVKM_ENGINE_NVENC2,
-       NVKM_ENGINE_NVENC_LAST = NVKM_ENGINE_NVENC2,
-
-       NVKM_ENGINE_NVDEC0,
-       NVKM_ENGINE_NVDEC1,
-       NVKM_ENGINE_NVDEC2,
-       NVKM_ENGINE_NVDEC_LAST = NVKM_ENGINE_NVDEC2,
-
-       NVKM_ENGINE_PM,
-       NVKM_ENGINE_SEC,
-       NVKM_ENGINE_SEC2,
-       NVKM_ENGINE_SW,
-       NVKM_ENGINE_VIC,
-       NVKM_ENGINE_VP,
-
-       NVKM_SUBDEV_NR
-};
+#define nvkm_devidx nvkm_subdev_type
 
 enum nvkm_device_type {
        NVKM_DEVICE_PCI,
index beb447c..a37f711 100644 (file)
@@ -3,10 +3,88 @@
 #define __NVKM_SUBDEV_H__
 #include <core/device.h>
 
+enum nvkm_subdev_type {
+       NVKM_SUBDEV_PCI,
+       NVKM_SUBDEV_VBIOS,
+       NVKM_SUBDEV_DEVINIT,
+       NVKM_SUBDEV_TOP,
+       NVKM_SUBDEV_IBUS,
+       NVKM_SUBDEV_GPIO,
+       NVKM_SUBDEV_I2C,
+       NVKM_SUBDEV_FUSE,
+       NVKM_SUBDEV_MXM,
+       NVKM_SUBDEV_MC,
+       NVKM_SUBDEV_BUS,
+       NVKM_SUBDEV_TIMER,
+       NVKM_SUBDEV_INSTMEM,
+       NVKM_SUBDEV_FB,
+       NVKM_SUBDEV_LTC,
+       NVKM_SUBDEV_MMU,
+       NVKM_SUBDEV_BAR,
+       NVKM_SUBDEV_FAULT,
+       NVKM_SUBDEV_ACR,
+       NVKM_SUBDEV_PMU,
+       NVKM_SUBDEV_VOLT,
+       NVKM_SUBDEV_ICCSENSE,
+       NVKM_SUBDEV_THERM,
+       NVKM_SUBDEV_CLK,
+       NVKM_SUBDEV_GSP,
+
+       NVKM_ENGINE_BSP,
+
+       NVKM_ENGINE_CE0,
+       NVKM_ENGINE_CE = NVKM_ENGINE_CE0,
+       NVKM_ENGINE_CE1,
+       NVKM_ENGINE_CE2,
+       NVKM_ENGINE_CE3,
+       NVKM_ENGINE_CE4,
+       NVKM_ENGINE_CE5,
+       NVKM_ENGINE_CE6,
+       NVKM_ENGINE_CE7,
+       NVKM_ENGINE_CE8,
+       NVKM_ENGINE_CE_LAST = NVKM_ENGINE_CE8,
+
+       NVKM_ENGINE_CIPHER,
+       NVKM_ENGINE_DISP,
+       NVKM_ENGINE_DMAOBJ,
+       NVKM_ENGINE_FIFO,
+       NVKM_ENGINE_GR,
+       NVKM_ENGINE_IFB,
+       NVKM_ENGINE_ME,
+       NVKM_ENGINE_MPEG,
+       NVKM_ENGINE_MSENC,
+       NVKM_ENGINE_MSPDEC,
+       NVKM_ENGINE_MSPPP,
+       NVKM_ENGINE_MSVLD,
+
+       NVKM_ENGINE_NVENC0,
+       NVKM_ENGINE_NVENC = NVKM_ENGINE_NVENC0,
+       NVKM_ENGINE_NVENC1,
+       NVKM_ENGINE_NVENC2,
+       NVKM_ENGINE_NVENC_LAST = NVKM_ENGINE_NVENC2,
+
+       NVKM_ENGINE_NVDEC0,
+       NVKM_ENGINE_NVDEC = NVKM_ENGINE_NVDEC0,
+       NVKM_ENGINE_NVDEC1,
+       NVKM_ENGINE_NVDEC2,
+       NVKM_ENGINE_NVDEC_LAST = NVKM_ENGINE_NVDEC2,
+
+       NVKM_ENGINE_PM,
+       NVKM_ENGINE_SEC,
+       NVKM_ENGINE_SEC2,
+       NVKM_ENGINE_SW,
+       NVKM_ENGINE_VIC,
+       NVKM_ENGINE_VP,
+
+       NVKM_SUBDEV_NR
+};
+
 struct nvkm_subdev {
        const struct nvkm_subdev_func *func;
        struct nvkm_device *device;
        enum nvkm_devidx index;
+       enum nvkm_subdev_type type;
+       int inst;
        char name[16];
        u32 debug;
        struct list_head head;
@@ -27,8 +105,12 @@ struct nvkm_subdev_func {
 extern const char *nvkm_subdev_type[NVKM_SUBDEV_NR];
 int nvkm_subdev_new_(const struct nvkm_subdev_func *, struct nvkm_device *,
                     int index, struct nvkm_subdev **);
-void nvkm_subdev_ctor(const struct nvkm_subdev_func *, struct nvkm_device *,
-                     int index, struct nvkm_subdev *);
+void nvkm_subdev_ctor_(const struct nvkm_subdev_func *, bool old, struct nvkm_device *,
+                      enum nvkm_subdev_type, int inst, struct nvkm_subdev *);
+#define nvkm_subdev_ctor_o(f,d,i,  s) nvkm_subdev_ctor_((f),  true, (d), (i), -1 , (s))
+#define nvkm_subdev_ctor_n(f,d,t,i,s) nvkm_subdev_ctor_((f), false, (d), (t), (i), (s))
+#define nvkm_subdev_ctor__(_1,_2,_3,_4,_5,IMPL,...) IMPL
+#define nvkm_subdev_ctor(A...) nvkm_subdev_ctor__(A, nvkm_subdev_ctor_n, nvkm_subdev_ctor_o)(A)
 void nvkm_subdev_del(struct nvkm_subdev **);
 int  nvkm_subdev_preinit(struct nvkm_subdev *);
 int  nvkm_subdev_init(struct nvkm_subdev *);
index 7759e6e..12a13d6 100644 (file)
@@ -208,14 +208,40 @@ nvkm_subdev_del(struct nvkm_subdev **psubdev)
 }
 
 void
-nvkm_subdev_ctor(const struct nvkm_subdev_func *func,
-                struct nvkm_device *device, int index,
+nvkm_subdev_ctor_(const struct nvkm_subdev_func *func, bool old,
+                struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
                 struct nvkm_subdev *subdev)
 {
        subdev->func = func;
        subdev->device = device;
-       subdev->index = index;
-       strscpy(subdev->name, nvkm_subdev_type[index], sizeof(subdev->name));
+       subdev->type = type;
+       subdev->inst = inst < 0 ? 0 : inst;
+       subdev->index = type + subdev->inst;
+
+       if (old) {
+               switch (subdev->type) {
+               case NVKM_ENGINE_CE0 ... NVKM_ENGINE_CE_LAST:
+                       subdev->type = NVKM_ENGINE_CE;
+                       subdev->inst = subdev->index - NVKM_ENGINE_CE0;
+                       break;
+               case NVKM_ENGINE_NVENC0 ... NVKM_ENGINE_NVENC_LAST:
+                       subdev->type = NVKM_ENGINE_NVENC;
+                       subdev->inst = subdev->index - NVKM_ENGINE_NVENC0;
+                       break;
+               case NVKM_ENGINE_NVDEC0 ... NVKM_ENGINE_NVDEC_LAST:
+                       subdev->type = NVKM_ENGINE_NVDEC;
+                       subdev->inst = subdev->index - NVKM_ENGINE_NVDEC0;
+                       break;
+               default:
+                       break;
+               }
+               inst = -1;
+       }
+
+       if (inst >= 0)
+               snprintf(subdev->name, sizeof(subdev->name), "%s%d", nvkm_subdev_type[type], inst);
+       else
+               strscpy(subdev->name, nvkm_subdev_type[type], sizeof(subdev->name));
        subdev->debug = nvkm_dbgopt(device->dbgopt, subdev->name);
        list_add_tail(&subdev->head, &device->subdev);
 }