• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef __NOUVEAU_DEVICE_H__
2 #define __NOUVEAU_DEVICE_H__
3 
4 #include <core/object.h>
5 #include <core/subdev.h>
6 #include <core/engine.h>
7 #include <core/event.h>
8 
9 enum nv_subdev_type {
10 	NVDEV_ENGINE_DEVICE,
11 	NVDEV_SUBDEV_VBIOS,
12 
13 	/* All subdevs from DEVINIT to DEVINIT_LAST will be created before
14 	 * *any* of them are initialised.  This subdev category is used
15 	 * for any subdevs that the VBIOS init table parsing may call out
16 	 * to during POST.
17 	 */
18 	NVDEV_SUBDEV_DEVINIT,
19 	NVDEV_SUBDEV_GPIO,
20 	NVDEV_SUBDEV_I2C,
21 	NVDEV_SUBDEV_DEVINIT_LAST = NVDEV_SUBDEV_I2C,
22 
23 	/* This grouping of subdevs are initialised right after they've
24 	 * been created, and are allowed to assume any subdevs in the
25 	 * list above them exist and have been initialised.
26 	 */
27 	NVDEV_SUBDEV_FUSE,
28 	NVDEV_SUBDEV_MXM,
29 	NVDEV_SUBDEV_MC,
30 	NVDEV_SUBDEV_BUS,
31 	NVDEV_SUBDEV_TIMER,
32 	NVDEV_SUBDEV_FB,
33 	NVDEV_SUBDEV_LTC,
34 	NVDEV_SUBDEV_IBUS,
35 	NVDEV_SUBDEV_INSTMEM,
36 	NVDEV_SUBDEV_VM,
37 	NVDEV_SUBDEV_BAR,
38 	NVDEV_SUBDEV_PWR,
39 	NVDEV_SUBDEV_VOLT,
40 	NVDEV_SUBDEV_THERM,
41 	NVDEV_SUBDEV_CLOCK,
42 
43 	NVDEV_ENGINE_FIRST,
44 	NVDEV_ENGINE_DMAOBJ = NVDEV_ENGINE_FIRST,
45 	NVDEV_ENGINE_IFB,
46 	NVDEV_ENGINE_FIFO,
47 	NVDEV_ENGINE_SW,
48 	NVDEV_ENGINE_GR,
49 	NVDEV_ENGINE_MPEG,
50 	NVDEV_ENGINE_ME,
51 	NVDEV_ENGINE_VP,
52 	NVDEV_ENGINE_CRYPT,
53 	NVDEV_ENGINE_BSP,
54 	NVDEV_ENGINE_PPP,
55 	NVDEV_ENGINE_COPY0,
56 	NVDEV_ENGINE_COPY1,
57 	NVDEV_ENGINE_COPY2,
58 	NVDEV_ENGINE_VIC,
59 	NVDEV_ENGINE_VENC,
60 	NVDEV_ENGINE_DISP,
61 	NVDEV_ENGINE_PERFMON,
62 
63 	NVDEV_SUBDEV_NR,
64 };
65 
66 struct nouveau_device {
67 	struct nouveau_engine base;
68 	struct list_head head;
69 
70 	struct pci_dev *pdev;
71 	struct platform_device *platformdev;
72 	u64 handle;
73 
74 	struct nvkm_event event;
75 
76 	const char *cfgopt;
77 	const char *dbgopt;
78 	const char *name;
79 	const char *cname;
80 	u64 disable_mask;
81 
82 	enum {
83 		NV_04    = 0x04,
84 		NV_10    = 0x10,
85 		NV_11    = 0x11,
86 		NV_20    = 0x20,
87 		NV_30    = 0x30,
88 		NV_40    = 0x40,
89 		NV_50    = 0x50,
90 		NV_C0    = 0xc0,
91 		NV_E0    = 0xe0,
92 		GM100    = 0x110,
93 	} card_type;
94 	u32 chipset;
95 	u32 crystal;
96 
97 	struct nouveau_oclass *oclass[NVDEV_SUBDEV_NR];
98 	struct nouveau_object *subdev[NVDEV_SUBDEV_NR];
99 
100 	struct {
101 		struct notifier_block nb;
102 	} acpi;
103 };
104 
105 int nouveau_device_list(u64 *name, int size);
106 
107 static inline struct nouveau_device *
nv_device(void * obj)108 nv_device(void *obj)
109 {
110 	struct nouveau_object *object = nv_object(obj);
111 	struct nouveau_object *device = object;
112 
113 	if (device->engine)
114 		device = device->engine;
115 	if (device->parent)
116 		device = device->parent;
117 
118 #if CONFIG_NOUVEAU_DEBUG >= NV_DBG_PARANOIA
119 	if (unlikely(!nv_iclass(device, NV_SUBDEV_CLASS) ||
120 		     (nv_hclass(device) & 0xff) != NVDEV_ENGINE_DEVICE)) {
121 		nv_assert("BAD CAST -> NvDevice, 0x%08x 0x%08x",
122 			  nv_hclass(object), nv_hclass(device));
123 	}
124 #endif
125 
126 	return (void *)device;
127 }
128 
129 static inline struct nouveau_subdev *
nouveau_subdev(void * obj,int sub)130 nouveau_subdev(void *obj, int sub)
131 {
132 	if (nv_device(obj)->subdev[sub])
133 		return nv_subdev(nv_device(obj)->subdev[sub]);
134 	return NULL;
135 }
136 
137 static inline struct nouveau_engine *
nouveau_engine(void * obj,int sub)138 nouveau_engine(void *obj, int sub)
139 {
140 	struct nouveau_subdev *subdev = nouveau_subdev(obj, sub);
141 	if (subdev && nv_iclass(subdev, NV_ENGINE_CLASS))
142 		return nv_engine(subdev);
143 	return NULL;
144 }
145 
146 static inline bool
nv_device_match(struct nouveau_object * object,u16 dev,u16 ven,u16 sub)147 nv_device_match(struct nouveau_object *object, u16 dev, u16 ven, u16 sub)
148 {
149 	struct nouveau_device *device = nv_device(object);
150 	return device->pdev->device == dev &&
151 	       device->pdev->subsystem_vendor == ven &&
152 	       device->pdev->subsystem_device == sub;
153 }
154 
155 static inline bool
nv_device_is_pci(struct nouveau_device * device)156 nv_device_is_pci(struct nouveau_device *device)
157 {
158 	return device->pdev != NULL;
159 }
160 
161 static inline struct device *
nv_device_base(struct nouveau_device * device)162 nv_device_base(struct nouveau_device *device)
163 {
164 	return nv_device_is_pci(device) ? &device->pdev->dev :
165 					  &device->platformdev->dev;
166 }
167 
168 resource_size_t
169 nv_device_resource_start(struct nouveau_device *device, unsigned int bar);
170 
171 resource_size_t
172 nv_device_resource_len(struct nouveau_device *device, unsigned int bar);
173 
174 int
175 nv_device_get_irq(struct nouveau_device *device, bool stall);
176 
177 #endif
178