drm/nouveau/subdev: track type+instance separately
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>
This commit is contained in:
parent
9c28abb7db
commit
65a279c1a9
@ -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,
|
||||
|
@ -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 *);
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user