1 #ifndef __NVKM_DEVICE_H__
2 #define __NVKM_DEVICE_H__
3 #include <core/engine.h>
4 #include <core/event.h>
5 
6 struct nvkm_device {
7 	struct nvkm_engine engine;
8 	struct list_head head;
9 
10 	struct pci_dev *pdev;
11 	struct platform_device *platformdev;
12 	u64 handle;
13 
14 	struct nvkm_event event;
15 
16 	const char *cfgopt;
17 	const char *dbgopt;
18 	const char *name;
19 	const char *cname;
20 	u64 disable_mask;
21 
22 	enum {
23 		NV_04    = 0x04,
24 		NV_10    = 0x10,
25 		NV_11    = 0x11,
26 		NV_20    = 0x20,
27 		NV_30    = 0x30,
28 		NV_40    = 0x40,
29 		NV_50    = 0x50,
30 		NV_C0    = 0xc0,
31 		NV_E0    = 0xe0,
32 		GM100    = 0x110,
33 	} card_type;
34 	u32 chipset;
35 	u8  chiprev;
36 	u32 crystal;
37 
38 	struct nvkm_oclass *oclass[NVDEV_SUBDEV_NR];
39 	struct nvkm_object *subdev[NVDEV_SUBDEV_NR];
40 
41 	struct {
42 		struct notifier_block nb;
43 	} acpi;
44 };
45 
46 struct nvkm_device *nvkm_device_find(u64 name);
47 int nvkm_device_list(u64 *name, int size);
48 
49 struct nvkm_device *nv_device(void *obj);
50 
51 static inline bool
nv_device_match(struct nvkm_object * object,u16 dev,u16 ven,u16 sub)52 nv_device_match(struct nvkm_object *object, u16 dev, u16 ven, u16 sub)
53 {
54 	struct nvkm_device *device = nv_device(object);
55 	return device->pdev->device == dev &&
56 	       device->pdev->subsystem_vendor == ven &&
57 	       device->pdev->subsystem_device == sub;
58 }
59 
60 static inline bool
nv_device_is_pci(struct nvkm_device * device)61 nv_device_is_pci(struct nvkm_device *device)
62 {
63 	return device->pdev != NULL;
64 }
65 
66 static inline bool
nv_device_is_cpu_coherent(struct nvkm_device * device)67 nv_device_is_cpu_coherent(struct nvkm_device *device)
68 {
69 	return (!IS_ENABLED(CONFIG_ARM) && nv_device_is_pci(device));
70 }
71 
72 static inline struct device *
nv_device_base(struct nvkm_device * device)73 nv_device_base(struct nvkm_device *device)
74 {
75 	return nv_device_is_pci(device) ? &device->pdev->dev :
76 					  &device->platformdev->dev;
77 }
78 
79 resource_size_t
80 nv_device_resource_start(struct nvkm_device *device, unsigned int bar);
81 
82 resource_size_t
83 nv_device_resource_len(struct nvkm_device *device, unsigned int bar);
84 
85 int
86 nv_device_get_irq(struct nvkm_device *device, bool stall);
87 
88 struct platform_device;
89 
90 enum nv_bus_type {
91 	NVKM_BUS_PCI,
92 	NVKM_BUS_PLATFORM,
93 };
94 
95 #define nvkm_device_create(p,t,n,s,c,d,u)                                   \
96 	nvkm_device_create_((void *)(p), (t), (n), (s), (c), (d),           \
97 			       sizeof(**u), (void **)u)
98 int  nvkm_device_create_(void *, enum nv_bus_type type, u64 name,
99 			    const char *sname, const char *cfg, const char *dbg,
100 			    int, void **);
101 #endif
102