Home | History | Annotate | Line # | Download | only in nvif
      1 /*	$NetBSD: device.h,v 1.3 2021/12/18 23:45:33 riastradh Exp $	*/
      2 
      3 /* SPDX-License-Identifier: MIT */
      4 #ifndef __NVIF_DEVICE_H__
      5 #define __NVIF_DEVICE_H__
      6 
      7 #include <nvif/object.h>
      8 #include <nvif/cl0080.h>
      9 #include <nvif/user.h>
     10 
     11 struct nvif_device {
     12 	struct nvif_object object;
     13 	struct nv_device_info_v0 info;
     14 
     15 	struct nvif_fifo_runlist {
     16 		u64 engines;
     17 	} *runlist;
     18 	int runlists;
     19 
     20 	struct nvif_user user;
     21 };
     22 
     23 int  nvif_device_init(struct nvif_object *, u32 handle, s32 oclass, void *, u32,
     24 		      struct nvif_device *);
     25 void nvif_device_fini(struct nvif_device *);
     26 u64  nvif_device_time(struct nvif_device *);
     27 
     28 /* Delay based on GPU time (ie. PTIMER).
     29  *
     30  * Will return -ETIMEDOUT unless the loop was terminated with 'break',
     31  * where it will return the number of nanoseconds taken instead.
     32  */
     33 #define nvif_nsec(d,n,cond...) ({                                              \
     34 	struct nvif_device *_device = (d);                                     \
     35 	u64 _nsecs = (n), _time0 = nvif_device_time(_device);                  \
     36 	s64 _taken = 0;                                                        \
     37                                                                                \
     38 	do {                                                                   \
     39 		cond                                                           \
     40 	} while (_taken = nvif_device_time(_device) - _time0, _taken < _nsecs);\
     41                                                                                \
     42 	if (_taken >= _nsecs)                                                  \
     43 		_taken = -ETIMEDOUT;                                           \
     44 	_taken;                                                                \
     45 })
     46 #define nvif_usec(d,u,cond...) nvif_nsec((d), (u) * 1000, ##cond)
     47 #define nvif_msec(d,m,cond...) nvif_usec((d), (m) * 1000, ##cond)
     48 
     49 /*XXX*/
     50 #include <subdev/bios.h>
     51 #include <subdev/fb.h>
     52 #include <subdev/bar.h>
     53 #include <subdev/gpio.h>
     54 #include <subdev/clk.h>
     55 #include <subdev/i2c.h>
     56 #include <subdev/timer.h>
     57 #include <subdev/therm.h>
     58 #include <subdev/pci.h>
     59 
     60 #define nvxx_device(a) ({                                                      \
     61 	struct nvif_device *_device = (a);                                     \
     62 	struct {                                                               \
     63 		struct nvkm_object object;                                     \
     64 		struct nvkm_device *device;                                    \
     65 	} *_udevice = _device->object.priv;                                    \
     66 	_udevice->device;                                                      \
     67 })
     68 #define nvxx_bios(a) nvxx_device(a)->bios
     69 #define nvxx_fb(a) nvxx_device(a)->fb
     70 #define nvxx_gpio(a) nvxx_device(a)->gpio
     71 #define nvxx_clk(a) nvxx_device(a)->clk
     72 #define nvxx_i2c(a) nvxx_device(a)->i2c
     73 #define nvxx_iccsense(a) nvxx_device(a)->iccsense
     74 #define nvxx_therm(a) nvxx_device(a)->therm
     75 #define nvxx_volt(a) nvxx_device(a)->volt
     76 
     77 #include <engine/fifo.h>
     78 #include <engine/gr.h>
     79 
     80 #define nvxx_gr(a) nvxx_device(a)->gr
     81 #endif
     82