Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
device.h
Go to the documentation of this file.
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 
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  */
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  */
38 
54 
56 };
57 
60  struct list_head head;
61 
62  struct pci_dev *pdev;
64 
65  const char *cfgopt;
66  const char *dbgopt;
67  const char *name;
68  const char *cname;
69 
70  enum {
71  NV_04 = 0x04,
72  NV_10 = 0x10,
73  NV_20 = 0x20,
74  NV_30 = 0x30,
75  NV_40 = 0x40,
76  NV_50 = 0x50,
77  NV_C0 = 0xc0,
78  NV_D0 = 0xd0,
79  NV_E0 = 0xe0,
80  } card_type;
83 
86 };
87 
88 static inline struct nouveau_device *
89 nv_device(void *obj)
90 {
91  struct nouveau_object *object = nv_object(obj);
92  struct nouveau_object *device = object;
93 
94  if (device->engine)
95  device = device->engine;
96  if (device->parent)
97  device = device->parent;
98 
99 #if CONFIG_NOUVEAU_DEBUG >= NV_DBG_PARANOIA
100  if (unlikely(!nv_iclass(device, NV_SUBDEV_CLASS) ||
101  (nv_hclass(device) & 0xff) != NVDEV_SUBDEV_DEVICE)) {
102  nv_assert("BAD CAST -> NvDevice, 0x%08x 0x%08x",
103  nv_hclass(object), nv_hclass(device));
104  }
105 #endif
106 
107  return (void *)device;
108 }
109 
110 static inline struct nouveau_subdev *
111 nouveau_subdev(void *obj, int sub)
112 {
113  if (nv_device(obj)->subdev[sub])
114  return nv_subdev(nv_device(obj)->subdev[sub]);
115  return NULL;
116 }
117 
118 static inline struct nouveau_engine *
119 nouveau_engine(void *obj, int sub)
120 {
121  struct nouveau_subdev *subdev = nouveau_subdev(obj, sub);
122  if (subdev && nv_iclass(subdev, NV_ENGINE_CLASS))
123  return nv_engine(subdev);
124  return NULL;
125 }
126 
127 static inline bool
128 nv_device_match(struct nouveau_object *object, u16 dev, u16 ven, u16 sub)
129 {
130  struct nouveau_device *device = nv_device(object);
131  return device->pdev->device == dev &&
132  device->pdev->subsystem_vendor == ven &&
133  device->pdev->subsystem_device == sub;
134 }
135 
136 #endif