1b7019ac5SIlia Mirkin /* SPDX-License-Identifier: MIT */ 25025407bSBen Skeggs #ifndef __NVKM_SUBDEV_H__ 35025407bSBen Skeggs #define __NVKM_SUBDEV_H__ 468f3f702SBen Skeggs #include <core/device.h> 5c39f472eSBen Skeggs 6*65a279c1SBen Skeggs enum nvkm_subdev_type { 7*65a279c1SBen Skeggs NVKM_SUBDEV_PCI, 8*65a279c1SBen Skeggs NVKM_SUBDEV_VBIOS, 9*65a279c1SBen Skeggs NVKM_SUBDEV_DEVINIT, 10*65a279c1SBen Skeggs NVKM_SUBDEV_TOP, 11*65a279c1SBen Skeggs NVKM_SUBDEV_IBUS, 12*65a279c1SBen Skeggs NVKM_SUBDEV_GPIO, 13*65a279c1SBen Skeggs NVKM_SUBDEV_I2C, 14*65a279c1SBen Skeggs NVKM_SUBDEV_FUSE, 15*65a279c1SBen Skeggs NVKM_SUBDEV_MXM, 16*65a279c1SBen Skeggs NVKM_SUBDEV_MC, 17*65a279c1SBen Skeggs NVKM_SUBDEV_BUS, 18*65a279c1SBen Skeggs NVKM_SUBDEV_TIMER, 19*65a279c1SBen Skeggs NVKM_SUBDEV_INSTMEM, 20*65a279c1SBen Skeggs NVKM_SUBDEV_FB, 21*65a279c1SBen Skeggs NVKM_SUBDEV_LTC, 22*65a279c1SBen Skeggs NVKM_SUBDEV_MMU, 23*65a279c1SBen Skeggs NVKM_SUBDEV_BAR, 24*65a279c1SBen Skeggs NVKM_SUBDEV_FAULT, 25*65a279c1SBen Skeggs NVKM_SUBDEV_ACR, 26*65a279c1SBen Skeggs NVKM_SUBDEV_PMU, 27*65a279c1SBen Skeggs NVKM_SUBDEV_VOLT, 28*65a279c1SBen Skeggs NVKM_SUBDEV_ICCSENSE, 29*65a279c1SBen Skeggs NVKM_SUBDEV_THERM, 30*65a279c1SBen Skeggs NVKM_SUBDEV_CLK, 31*65a279c1SBen Skeggs NVKM_SUBDEV_GSP, 32*65a279c1SBen Skeggs 33*65a279c1SBen Skeggs NVKM_ENGINE_BSP, 34*65a279c1SBen Skeggs 35*65a279c1SBen Skeggs NVKM_ENGINE_CE0, 36*65a279c1SBen Skeggs NVKM_ENGINE_CE = NVKM_ENGINE_CE0, 37*65a279c1SBen Skeggs NVKM_ENGINE_CE1, 38*65a279c1SBen Skeggs NVKM_ENGINE_CE2, 39*65a279c1SBen Skeggs NVKM_ENGINE_CE3, 40*65a279c1SBen Skeggs NVKM_ENGINE_CE4, 41*65a279c1SBen Skeggs NVKM_ENGINE_CE5, 42*65a279c1SBen Skeggs NVKM_ENGINE_CE6, 43*65a279c1SBen Skeggs NVKM_ENGINE_CE7, 44*65a279c1SBen Skeggs NVKM_ENGINE_CE8, 45*65a279c1SBen Skeggs NVKM_ENGINE_CE_LAST = NVKM_ENGINE_CE8, 46*65a279c1SBen Skeggs 47*65a279c1SBen Skeggs NVKM_ENGINE_CIPHER, 48*65a279c1SBen Skeggs NVKM_ENGINE_DISP, 49*65a279c1SBen Skeggs NVKM_ENGINE_DMAOBJ, 50*65a279c1SBen Skeggs NVKM_ENGINE_FIFO, 51*65a279c1SBen Skeggs NVKM_ENGINE_GR, 52*65a279c1SBen Skeggs NVKM_ENGINE_IFB, 53*65a279c1SBen Skeggs NVKM_ENGINE_ME, 54*65a279c1SBen Skeggs NVKM_ENGINE_MPEG, 55*65a279c1SBen Skeggs NVKM_ENGINE_MSENC, 56*65a279c1SBen Skeggs NVKM_ENGINE_MSPDEC, 57*65a279c1SBen Skeggs NVKM_ENGINE_MSPPP, 58*65a279c1SBen Skeggs NVKM_ENGINE_MSVLD, 59*65a279c1SBen Skeggs 60*65a279c1SBen Skeggs NVKM_ENGINE_NVENC0, 61*65a279c1SBen Skeggs NVKM_ENGINE_NVENC = NVKM_ENGINE_NVENC0, 62*65a279c1SBen Skeggs NVKM_ENGINE_NVENC1, 63*65a279c1SBen Skeggs NVKM_ENGINE_NVENC2, 64*65a279c1SBen Skeggs NVKM_ENGINE_NVENC_LAST = NVKM_ENGINE_NVENC2, 65*65a279c1SBen Skeggs 66*65a279c1SBen Skeggs NVKM_ENGINE_NVDEC0, 67*65a279c1SBen Skeggs NVKM_ENGINE_NVDEC = NVKM_ENGINE_NVDEC0, 68*65a279c1SBen Skeggs NVKM_ENGINE_NVDEC1, 69*65a279c1SBen Skeggs NVKM_ENGINE_NVDEC2, 70*65a279c1SBen Skeggs NVKM_ENGINE_NVDEC_LAST = NVKM_ENGINE_NVDEC2, 71*65a279c1SBen Skeggs 72*65a279c1SBen Skeggs NVKM_ENGINE_PM, 73*65a279c1SBen Skeggs NVKM_ENGINE_SEC, 74*65a279c1SBen Skeggs NVKM_ENGINE_SEC2, 75*65a279c1SBen Skeggs NVKM_ENGINE_SW, 76*65a279c1SBen Skeggs NVKM_ENGINE_VIC, 77*65a279c1SBen Skeggs NVKM_ENGINE_VP, 78*65a279c1SBen Skeggs 79*65a279c1SBen Skeggs NVKM_SUBDEV_NR 80*65a279c1SBen Skeggs }; 81*65a279c1SBen Skeggs 825025407bSBen Skeggs struct nvkm_subdev { 83f0290215SBen Skeggs const struct nvkm_subdev_func *func; 84d351b856SBen Skeggs struct nvkm_device *device; 8568f3f702SBen Skeggs enum nvkm_devidx index; 86*65a279c1SBen Skeggs enum nvkm_subdev_type type; 87*65a279c1SBen Skeggs int inst; 889c28abb7SBen Skeggs char name[16]; 89c39f472eSBen Skeggs u32 debug; 9054d10db1SBen Skeggs struct list_head head; 91c39f472eSBen Skeggs 9268f3f702SBen Skeggs bool oneinit; 93c39f472eSBen Skeggs }; 94c39f472eSBen Skeggs 95f0290215SBen Skeggs struct nvkm_subdev_func { 96f0290215SBen Skeggs void *(*dtor)(struct nvkm_subdev *); 97f0290215SBen Skeggs int (*preinit)(struct nvkm_subdev *); 98f0290215SBen Skeggs int (*oneinit)(struct nvkm_subdev *); 99c5c9127bSBen Skeggs int (*info)(struct nvkm_subdev *, u64 mthd, u64 *data); 100f0290215SBen Skeggs int (*init)(struct nvkm_subdev *); 101f0290215SBen Skeggs int (*fini)(struct nvkm_subdev *, bool suspend); 102f0290215SBen Skeggs void (*intr)(struct nvkm_subdev *); 103f0290215SBen Skeggs }; 104f0290215SBen Skeggs 1059c28abb7SBen Skeggs extern const char *nvkm_subdev_type[NVKM_SUBDEV_NR]; 106f02ca842SBen Skeggs int nvkm_subdev_new_(const struct nvkm_subdev_func *, struct nvkm_device *, 107f02ca842SBen Skeggs int index, struct nvkm_subdev **); 108*65a279c1SBen Skeggs void nvkm_subdev_ctor_(const struct nvkm_subdev_func *, bool old, struct nvkm_device *, 109*65a279c1SBen Skeggs enum nvkm_subdev_type, int inst, struct nvkm_subdev *); 110*65a279c1SBen Skeggs #define nvkm_subdev_ctor_o(f,d,i, s) nvkm_subdev_ctor_((f), true, (d), (i), -1 , (s)) 111*65a279c1SBen Skeggs #define nvkm_subdev_ctor_n(f,d,t,i,s) nvkm_subdev_ctor_((f), false, (d), (t), (i), (s)) 112*65a279c1SBen Skeggs #define nvkm_subdev_ctor__(_1,_2,_3,_4,_5,IMPL,...) IMPL 113*65a279c1SBen Skeggs #define nvkm_subdev_ctor(A...) nvkm_subdev_ctor__(A, nvkm_subdev_ctor_n, nvkm_subdev_ctor_o)(A) 114f0290215SBen Skeggs void nvkm_subdev_del(struct nvkm_subdev **); 115f0290215SBen Skeggs int nvkm_subdev_preinit(struct nvkm_subdev *); 116f0290215SBen Skeggs int nvkm_subdev_init(struct nvkm_subdev *); 117f0290215SBen Skeggs int nvkm_subdev_fini(struct nvkm_subdev *, bool suspend); 118c5c9127bSBen Skeggs int nvkm_subdev_info(struct nvkm_subdev *, u64, u64 *); 119f0290215SBen Skeggs void nvkm_subdev_intr(struct nvkm_subdev *); 120f0290215SBen Skeggs 1216594363bSBen Skeggs /* subdev logging */ 1226594363bSBen Skeggs #define nvkm_printk_(s,l,p,f,a...) do { \ 123c1fcb148SAlexandre Courbot const struct nvkm_subdev *_subdev = (s); \ 1249c28abb7SBen Skeggs if (CONFIG_NOUVEAU_DEBUG >= (l) && _subdev->debug >= (l)) \ 1259c28abb7SBen Skeggs dev_##p(_subdev->device->dev, "%s: "f, _subdev->name, ##a); \ 126c39f472eSBen Skeggs } while(0) 1276594363bSBen Skeggs #define nvkm_printk(s,l,p,f,a...) nvkm_printk_((s), NV_DBG_##l, p, f, ##a) 1286594363bSBen Skeggs #define nvkm_fatal(s,f,a...) nvkm_printk((s), FATAL, crit, f, ##a) 1296594363bSBen Skeggs #define nvkm_error(s,f,a...) nvkm_printk((s), ERROR, err, f, ##a) 1306594363bSBen Skeggs #define nvkm_warn(s,f,a...) nvkm_printk((s), WARN, notice, f, ##a) 1316594363bSBen Skeggs #define nvkm_info(s,f,a...) nvkm_printk((s), INFO, info, f, ##a) 1326594363bSBen Skeggs #define nvkm_debug(s,f,a...) nvkm_printk((s), DEBUG, info, f, ##a) 1336594363bSBen Skeggs #define nvkm_trace(s,f,a...) nvkm_printk((s), TRACE, info, f, ##a) 1346594363bSBen Skeggs #define nvkm_spam(s,f,a...) nvkm_printk((s), SPAM, dbg, f, ##a) 135c39f472eSBen Skeggs #endif 136