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);
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