]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/gpu/drm/nouveau/core/include/core/device.h
eb31bb206eaa5c7e23d1f09b8bf5e4d33ad4e714
[karo-tx-linux.git] / drivers / gpu / drm / nouveau / core / include / core / device.h
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
8 enum nv_subdev_type {
9         NVDEV_ENGINE_DEVICE,
10         NVDEV_SUBDEV_VBIOS,
11
12         /* All subdevs from DEVINIT to DEVINIT_LAST will be created before
13          * *any* of them are initialised.  This subdev category is used
14          * for any subdevs that the VBIOS init table parsing may call out
15          * to during POST.
16          */
17         NVDEV_SUBDEV_DEVINIT,
18         NVDEV_SUBDEV_GPIO,
19         NVDEV_SUBDEV_I2C,
20         NVDEV_SUBDEV_DEVINIT_LAST = NVDEV_SUBDEV_I2C,
21
22         /* This grouping of subdevs are initialised right after they've
23          * been created, and are allowed to assume any subdevs in the
24          * list above them exist and have been initialised.
25          */
26         NVDEV_SUBDEV_MXM,
27         NVDEV_SUBDEV_MC,
28         NVDEV_SUBDEV_BUS,
29         NVDEV_SUBDEV_TIMER,
30         NVDEV_SUBDEV_FB,
31         NVDEV_SUBDEV_LTCG,
32         NVDEV_SUBDEV_IBUS,
33         NVDEV_SUBDEV_INSTMEM,
34         NVDEV_SUBDEV_VM,
35         NVDEV_SUBDEV_BAR,
36         NVDEV_SUBDEV_PWR,
37         NVDEV_SUBDEV_VOLT,
38         NVDEV_SUBDEV_THERM,
39         NVDEV_SUBDEV_CLOCK,
40
41         NVDEV_ENGINE_FIRST,
42         NVDEV_ENGINE_DMAOBJ = NVDEV_ENGINE_FIRST,
43         NVDEV_ENGINE_IFB,
44         NVDEV_ENGINE_FIFO,
45         NVDEV_ENGINE_SW,
46         NVDEV_ENGINE_GR,
47         NVDEV_ENGINE_MPEG,
48         NVDEV_ENGINE_ME,
49         NVDEV_ENGINE_VP,
50         NVDEV_ENGINE_CRYPT,
51         NVDEV_ENGINE_BSP,
52         NVDEV_ENGINE_PPP,
53         NVDEV_ENGINE_COPY0,
54         NVDEV_ENGINE_COPY1,
55         NVDEV_ENGINE_COPY2,
56         NVDEV_ENGINE_VIC,
57         NVDEV_ENGINE_VENC,
58         NVDEV_ENGINE_DISP,
59         NVDEV_ENGINE_PERFMON,
60
61         NVDEV_SUBDEV_NR,
62 };
63
64 struct nouveau_device {
65         struct nouveau_engine base;
66         struct list_head head;
67
68         struct pci_dev *pdev;
69         u64 handle;
70
71         const char *cfgopt;
72         const char *dbgopt;
73         const char *name;
74         const char *cname;
75         u64 disable_mask;
76
77         enum {
78                 NV_04    = 0x04,
79                 NV_10    = 0x10,
80                 NV_11    = 0x11,
81                 NV_20    = 0x20,
82                 NV_30    = 0x30,
83                 NV_40    = 0x40,
84                 NV_50    = 0x50,
85                 NV_C0    = 0xc0,
86                 NV_D0    = 0xd0,
87                 NV_E0    = 0xe0,
88         } card_type;
89         u32 chipset;
90         u32 crystal;
91
92         struct nouveau_oclass *oclass[NVDEV_SUBDEV_NR];
93         struct nouveau_object *subdev[NVDEV_SUBDEV_NR];
94 };
95
96 static inline struct nouveau_device *
97 nv_device(void *obj)
98 {
99         struct nouveau_object *object = nv_object(obj);
100         struct nouveau_object *device = object;
101
102         if (device->engine)
103                 device = device->engine;
104         if (device->parent)
105                 device = device->parent;
106
107 #if CONFIG_NOUVEAU_DEBUG >= NV_DBG_PARANOIA
108         if (unlikely(!nv_iclass(device, NV_SUBDEV_CLASS) ||
109                      (nv_hclass(device) & 0xff) != NVDEV_ENGINE_DEVICE)) {
110                 nv_assert("BAD CAST -> NvDevice, 0x%08x 0x%08x",
111                           nv_hclass(object), nv_hclass(device));
112         }
113 #endif
114
115         return (void *)device;
116 }
117
118 static inline struct nouveau_subdev *
119 nouveau_subdev(void *obj, int sub)
120 {
121         if (nv_device(obj)->subdev[sub])
122                 return nv_subdev(nv_device(obj)->subdev[sub]);
123         return NULL;
124 }
125
126 static inline struct nouveau_engine *
127 nouveau_engine(void *obj, int sub)
128 {
129         struct nouveau_subdev *subdev = nouveau_subdev(obj, sub);
130         if (subdev && nv_iclass(subdev, NV_ENGINE_CLASS))
131                 return nv_engine(subdev);
132         return NULL;
133 }
134
135 static inline bool
136 nv_device_match(struct nouveau_object *object, u16 dev, u16 ven, u16 sub)
137 {
138         struct nouveau_device *device = nv_device(object);
139         return device->pdev->device == dev &&
140                device->pdev->subsystem_vendor == ven &&
141                device->pdev->subsystem_device == sub;
142 }
143
144 #endif