summaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorBen Skeggs2015-08-20 06:54:05 +0200
committerBen Skeggs2015-08-28 04:40:06 +0200
commit741d778ea0dde26a345717f1843407760f02fe03 (patch)
tree284e76d56659e8b8b476e8004294f4e3630996fb /drivers/gpu
parentdrm/nouveau/subdev: add direct pointer to nvkm_device (diff)
downloadkernel-qcow2-linux-741d778ea0dde26a345717f1843407760f02fe03.tar.gz
kernel-qcow2-linux-741d778ea0dde26a345717f1843407760f02fe03.tar.xz
kernel-qcow2-linux-741d778ea0dde26a345717f1843407760f02fe03.zip
drm/nouveau/device: add direct pointers to subdevs from nvkm_device
Will be used in upcoming commits to remove the need for lookup/runtime type-checking functions when accessing foreign subdevs. Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/nouveau/include/nvkm/core/device.h40
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/engine/device/base.c63
2 files changed, 96 insertions, 7 deletions
diff --git a/drivers/gpu/drm/nouveau/include/nvkm/core/device.h b/drivers/gpu/drm/nouveau/include/nvkm/core/device.h
index 5983b307e127..a3037f7d128d 100644
--- a/drivers/gpu/drm/nouveau/include/nvkm/core/device.h
+++ b/drivers/gpu/drm/nouveau/include/nvkm/core/device.h
@@ -41,6 +41,46 @@ struct nvkm_device {
struct {
struct notifier_block nb;
} acpi;
+
+ struct nvkm_bar *bar;
+ struct nvkm_bios *bios;
+ struct nvkm_bus *bus;
+ struct nvkm_clk *clk;
+ struct nvkm_devinit *devinit;
+ struct nvkm_fb *fb;
+ struct nvkm_fuse *fuse;
+ struct nvkm_gpio *gpio;
+ struct nvkm_i2c *i2c;
+ struct nvkm_subdev *ibus;
+ struct nvkm_instmem *imem;
+ struct nvkm_ltc *ltc;
+ struct nvkm_mc *mc;
+ struct nvkm_mmu *mmu;
+ struct nvkm_subdev *mxm;
+ struct nvkm_pmu *pmu;
+ struct nvkm_therm *therm;
+ struct nvkm_timer *timer;
+ struct nvkm_volt *volt;
+
+ struct nvkm_engine *bsp;
+ struct nvkm_engine *ce[3];
+ struct nvkm_engine *cipher;
+ struct nvkm_disp *disp;
+ struct nvkm_dmaeng *dma;
+ struct nvkm_fifo *fifo;
+ struct nvkm_gr *gr;
+ struct nvkm_engine *ifb;
+ struct nvkm_engine *me;
+ struct nvkm_engine *mpeg;
+ struct nvkm_engine *msenc;
+ struct nvkm_engine *mspdec;
+ struct nvkm_engine *msppp;
+ struct nvkm_engine *msvld;
+ struct nvkm_pm *pm;
+ struct nvkm_engine *sec;
+ struct nvkm_sw *sw;
+ struct nvkm_engine *vic;
+ struct nvkm_engine *vp;
};
struct nvkm_device *nvkm_device_find(u64 name);
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c b/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c
index 0f6ce3749e14..2bceecc9c1e0 100644
--- a/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c
@@ -463,14 +463,63 @@ nvkm_devobj_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
continue;
}
- ret = nvkm_object_ctor(nv_object(device), NULL, oclass,
- NULL, i, &devobj->subdev[i]);
- if (ret == -ENODEV)
+#define _(s,m) case s: \
+ ret = nvkm_object_ctor(nv_object(device), NULL, oclass, NULL, \
+ (s), (struct nvkm_object **)&device->m);\
+ if (ret == -ENODEV) \
+ continue; \
+ if (ret) \
+ return ret; \
+ devobj->subdev[s] = (struct nvkm_object *)device->m; \
+ device->subdev[s] = devobj->subdev[s]; \
+ break
+
+ switch (i) {
+ _(NVDEV_SUBDEV_BAR , bar);
+ _(NVDEV_SUBDEV_VBIOS , bios);
+ _(NVDEV_SUBDEV_BUS , bus);
+ _(NVDEV_SUBDEV_CLK , clk);
+ _(NVDEV_SUBDEV_DEVINIT, devinit);
+ _(NVDEV_SUBDEV_FB , fb);
+ _(NVDEV_SUBDEV_FUSE , fuse);
+ _(NVDEV_SUBDEV_GPIO , gpio);
+ _(NVDEV_SUBDEV_I2C , i2c);
+ _(NVDEV_SUBDEV_IBUS , ibus);
+ _(NVDEV_SUBDEV_INSTMEM, imem);
+ _(NVDEV_SUBDEV_LTC , ltc);
+ _(NVDEV_SUBDEV_MC , mc);
+ _(NVDEV_SUBDEV_MMU , mmu);
+ _(NVDEV_SUBDEV_MXM , mxm);
+ _(NVDEV_SUBDEV_PMU , pmu);
+ _(NVDEV_SUBDEV_THERM , therm);
+ _(NVDEV_SUBDEV_TIMER , timer);
+ _(NVDEV_SUBDEV_VOLT , volt);
+ _(NVDEV_ENGINE_BSP , bsp);
+ _(NVDEV_ENGINE_CE0 , ce[0]);
+ _(NVDEV_ENGINE_CE1 , ce[1]);
+ _(NVDEV_ENGINE_CE2 , ce[2]);
+ _(NVDEV_ENGINE_CIPHER , cipher);
+ _(NVDEV_ENGINE_DISP , disp);
+ _(NVDEV_ENGINE_DMAOBJ , dma);
+ _(NVDEV_ENGINE_FIFO , fifo);
+ _(NVDEV_ENGINE_GR , gr);
+ _(NVDEV_ENGINE_IFB , ifb);
+ _(NVDEV_ENGINE_ME , me);
+ _(NVDEV_ENGINE_MPEG , mpeg);
+ _(NVDEV_ENGINE_MSENC , msenc);
+ _(NVDEV_ENGINE_MSPDEC , mspdec);
+ _(NVDEV_ENGINE_MSPPP , msppp);
+ _(NVDEV_ENGINE_MSVLD , msvld);
+ _(NVDEV_ENGINE_PM , pm);
+ _(NVDEV_ENGINE_SEC , sec);
+ _(NVDEV_ENGINE_SW , sw);
+ _(NVDEV_ENGINE_VIC , vic);
+ _(NVDEV_ENGINE_VP , vp);
+ default:
+ WARN_ON(1);
continue;
- if (ret)
- return ret;
-
- device->subdev[i] = devobj->subdev[i];
+ }
+#undef _
/* note: can't init *any* subdevs until devinit has been run
* due to not knowing exactly what the vbios init tables will