1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef __NVKM_DEVICE_H__
3 #define __NVKM_DEVICE_H__
4 #include <core/event.h>
5 #include <core/object.h>
40 NVKM_ENGINE_CE_LAST
= NVKM_ENGINE_CE5
,
58 NVKM_ENGINE_NVENC_LAST
= NVKM_ENGINE_NVENC2
,
71 enum nvkm_device_type
{
79 const struct nvkm_device_func
*func
;
80 const struct nvkm_device_quirk
*quirk
;
82 enum nvkm_device_type type
;
88 struct list_head head
;
94 struct nvkm_event event
;
99 const struct nvkm_device_chip
*chip
;
118 struct notifier_block nb
;
121 struct nvkm_bar
*bar
;
122 struct nvkm_bios
*bios
;
123 struct nvkm_bus
*bus
;
124 struct nvkm_clk
*clk
;
125 struct nvkm_devinit
*devinit
;
127 struct nvkm_fuse
*fuse
;
128 struct nvkm_gpio
*gpio
;
129 struct nvkm_i2c
*i2c
;
130 struct nvkm_subdev
*ibus
;
131 struct nvkm_iccsense
*iccsense
;
132 struct nvkm_instmem
*imem
;
133 struct nvkm_ltc
*ltc
;
135 struct nvkm_mmu
*mmu
;
136 struct nvkm_subdev
*mxm
;
137 struct nvkm_pci
*pci
;
138 struct nvkm_pmu
*pmu
;
139 struct nvkm_secboot
*secboot
;
140 struct nvkm_therm
*therm
;
141 struct nvkm_timer
*timer
;
142 struct nvkm_top
*top
;
143 struct nvkm_volt
*volt
;
145 struct nvkm_engine
*bsp
;
146 struct nvkm_engine
*ce
[6];
147 struct nvkm_engine
*cipher
;
148 struct nvkm_disp
*disp
;
149 struct nvkm_dma
*dma
;
150 struct nvkm_fifo
*fifo
;
152 struct nvkm_engine
*ifb
;
153 struct nvkm_engine
*me
;
154 struct nvkm_engine
*mpeg
;
155 struct nvkm_engine
*msenc
;
156 struct nvkm_engine
*mspdec
;
157 struct nvkm_engine
*msppp
;
158 struct nvkm_engine
*msvld
;
159 struct nvkm_engine
*nvenc
[3];
160 struct nvkm_nvdec
*nvdec
;
162 struct nvkm_engine
*sec
;
163 struct nvkm_sec2
*sec2
;
165 struct nvkm_engine
*vic
;
166 struct nvkm_engine
*vp
;
169 struct nvkm_subdev
*nvkm_device_subdev(struct nvkm_device
*, int index
);
170 struct nvkm_engine
*nvkm_device_engine(struct nvkm_device
*, int index
);
172 struct nvkm_device_func
{
173 struct nvkm_device_pci
*(*pci
)(struct nvkm_device
*);
174 struct nvkm_device_tegra
*(*tegra
)(struct nvkm_device
*);
175 void *(*dtor
)(struct nvkm_device
*);
176 int (*preinit
)(struct nvkm_device
*);
177 int (*init
)(struct nvkm_device
*);
178 void (*fini
)(struct nvkm_device
*, bool suspend
);
179 resource_size_t (*resource_addr
)(struct nvkm_device
*, unsigned bar
);
180 resource_size_t (*resource_size
)(struct nvkm_device
*, unsigned bar
);
184 struct nvkm_device_quirk
{
189 struct nvkm_device_chip
{
192 int (*bar
)(struct nvkm_device
*, int idx
, struct nvkm_bar
**);
193 int (*bios
)(struct nvkm_device
*, int idx
, struct nvkm_bios
**);
194 int (*bus
)(struct nvkm_device
*, int idx
, struct nvkm_bus
**);
195 int (*clk
)(struct nvkm_device
*, int idx
, struct nvkm_clk
**);
196 int (*devinit
)(struct nvkm_device
*, int idx
, struct nvkm_devinit
**);
197 int (*fb
)(struct nvkm_device
*, int idx
, struct nvkm_fb
**);
198 int (*fuse
)(struct nvkm_device
*, int idx
, struct nvkm_fuse
**);
199 int (*gpio
)(struct nvkm_device
*, int idx
, struct nvkm_gpio
**);
200 int (*i2c
)(struct nvkm_device
*, int idx
, struct nvkm_i2c
**);
201 int (*ibus
)(struct nvkm_device
*, int idx
, struct nvkm_subdev
**);
202 int (*iccsense
)(struct nvkm_device
*, int idx
, struct nvkm_iccsense
**);
203 int (*imem
)(struct nvkm_device
*, int idx
, struct nvkm_instmem
**);
204 int (*ltc
)(struct nvkm_device
*, int idx
, struct nvkm_ltc
**);
205 int (*mc
)(struct nvkm_device
*, int idx
, struct nvkm_mc
**);
206 int (*mmu
)(struct nvkm_device
*, int idx
, struct nvkm_mmu
**);
207 int (*mxm
)(struct nvkm_device
*, int idx
, struct nvkm_subdev
**);
208 int (*pci
)(struct nvkm_device
*, int idx
, struct nvkm_pci
**);
209 int (*pmu
)(struct nvkm_device
*, int idx
, struct nvkm_pmu
**);
210 int (*secboot
)(struct nvkm_device
*, int idx
, struct nvkm_secboot
**);
211 int (*therm
)(struct nvkm_device
*, int idx
, struct nvkm_therm
**);
212 int (*timer
)(struct nvkm_device
*, int idx
, struct nvkm_timer
**);
213 int (*top
)(struct nvkm_device
*, int idx
, struct nvkm_top
**);
214 int (*volt
)(struct nvkm_device
*, int idx
, struct nvkm_volt
**);
216 int (*bsp
)(struct nvkm_device
*, int idx
, struct nvkm_engine
**);
217 int (*ce
[6] )(struct nvkm_device
*, int idx
, struct nvkm_engine
**);
218 int (*cipher
)(struct nvkm_device
*, int idx
, struct nvkm_engine
**);
219 int (*disp
)(struct nvkm_device
*, int idx
, struct nvkm_disp
**);
220 int (*dma
)(struct nvkm_device
*, int idx
, struct nvkm_dma
**);
221 int (*fifo
)(struct nvkm_device
*, int idx
, struct nvkm_fifo
**);
222 int (*gr
)(struct nvkm_device
*, int idx
, struct nvkm_gr
**);
223 int (*ifb
)(struct nvkm_device
*, int idx
, struct nvkm_engine
**);
224 int (*me
)(struct nvkm_device
*, int idx
, struct nvkm_engine
**);
225 int (*mpeg
)(struct nvkm_device
*, int idx
, struct nvkm_engine
**);
226 int (*msenc
)(struct nvkm_device
*, int idx
, struct nvkm_engine
**);
227 int (*mspdec
)(struct nvkm_device
*, int idx
, struct nvkm_engine
**);
228 int (*msppp
)(struct nvkm_device
*, int idx
, struct nvkm_engine
**);
229 int (*msvld
)(struct nvkm_device
*, int idx
, struct nvkm_engine
**);
230 int (*nvenc
[3])(struct nvkm_device
*, int idx
, struct nvkm_engine
**);
231 int (*nvdec
)(struct nvkm_device
*, int idx
, struct nvkm_nvdec
**);
232 int (*pm
)(struct nvkm_device
*, int idx
, struct nvkm_pm
**);
233 int (*sec
)(struct nvkm_device
*, int idx
, struct nvkm_engine
**);
234 int (*sec2
)(struct nvkm_device
*, int idx
, struct nvkm_sec2
**);
235 int (*sw
)(struct nvkm_device
*, int idx
, struct nvkm_sw
**);
236 int (*vic
)(struct nvkm_device
*, int idx
, struct nvkm_engine
**);
237 int (*vp
)(struct nvkm_device
*, int idx
, struct nvkm_engine
**);
240 struct nvkm_device
*nvkm_device_find(u64 name
);
241 int nvkm_device_list(u64
*name
, int size
);
243 /* privileged register interface accessor macros */
244 #define nvkm_rd08(d,a) ioread8((d)->pri + (a))
245 #define nvkm_rd16(d,a) ioread16_native((d)->pri + (a))
246 #define nvkm_rd32(d,a) ioread32_native((d)->pri + (a))
247 #define nvkm_wr08(d,a,v) iowrite8((v), (d)->pri + (a))
248 #define nvkm_wr16(d,a,v) iowrite16_native((v), (d)->pri + (a))
249 #define nvkm_wr32(d,a,v) iowrite32_native((v), (d)->pri + (a))
250 #define nvkm_mask(d,a,m,v) ({ \
251 struct nvkm_device *_device = (d); \
252 u32 _addr = (a), _temp = nvkm_rd32(_device, _addr); \
253 nvkm_wr32(_device, _addr, (_temp & ~(m)) | (v)); \
257 void nvkm_device_del(struct nvkm_device
**);
259 struct nvkm_device_oclass
{
260 int (*ctor
)(struct nvkm_device
*, const struct nvkm_oclass
*,
261 void *data
, u32 size
, struct nvkm_object
**);
262 struct nvkm_sclass base
;
265 extern const struct nvkm_sclass nvkm_udevice_sclass
;
268 #define nvdev_printk_(d,l,p,f,a...) do { \
269 const struct nvkm_device *_device = (d); \
270 if (_device->debug >= (l)) \
271 dev_##p(_device->dev, f, ##a); \
273 #define nvdev_printk(d,l,p,f,a...) nvdev_printk_((d), NV_DBG_##l, p, f, ##a)
274 #define nvdev_fatal(d,f,a...) nvdev_printk((d), FATAL, crit, f, ##a)
275 #define nvdev_error(d,f,a...) nvdev_printk((d), ERROR, err, f, ##a)
276 #define nvdev_warn(d,f,a...) nvdev_printk((d), WARN, notice, f, ##a)
277 #define nvdev_info(d,f,a...) nvdev_printk((d), INFO, info, f, ##a)
278 #define nvdev_debug(d,f,a...) nvdev_printk((d), DEBUG, info, f, ##a)
279 #define nvdev_trace(d,f,a...) nvdev_printk((d), TRACE, info, f, ##a)
280 #define nvdev_spam(d,f,a...) nvdev_printk((d), SPAM, dbg, f, ##a)