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