1 #ifndef __NOUVEAU_DEVICE_H__
2 #define __NOUVEAU_DEVICE_H__
4 #include <core/object.h>
5 #include <core/subdev.h>
6 #include <core/engine.h>
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
20 NVDEV_SUBDEV_DEVINIT_LAST = NVDEV_SUBDEV_I2C,
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.
42 NVDEV_ENGINE_DMAOBJ = NVDEV_ENGINE_FIRST,
64 struct nouveau_device {
65 struct nouveau_engine base;
66 struct list_head head;
69 struct platform_device *platformdev;
94 struct nouveau_oclass *oclass[NVDEV_SUBDEV_NR];
95 struct nouveau_object *subdev[NVDEV_SUBDEV_NR];
98 static inline struct nouveau_device *
101 struct nouveau_object *object = nv_object(obj);
102 struct nouveau_object *device = object;
105 device = device->engine;
107 device = device->parent;
109 #if CONFIG_NOUVEAU_DEBUG >= NV_DBG_PARANOIA
110 if (unlikely(!nv_iclass(device, NV_SUBDEV_CLASS) ||
111 (nv_hclass(device) & 0xff) != NVDEV_ENGINE_DEVICE)) {
112 nv_assert("BAD CAST -> NvDevice, 0x%08x 0x%08x",
113 nv_hclass(object), nv_hclass(device));
117 return (void *)device;
120 static inline struct nouveau_subdev *
121 nouveau_subdev(void *obj, int sub)
123 if (nv_device(obj)->subdev[sub])
124 return nv_subdev(nv_device(obj)->subdev[sub]);
128 static inline struct nouveau_engine *
129 nouveau_engine(void *obj, int sub)
131 struct nouveau_subdev *subdev = nouveau_subdev(obj, sub);
132 if (subdev && nv_iclass(subdev, NV_ENGINE_CLASS))
133 return nv_engine(subdev);
138 nv_device_match(struct nouveau_object *object, u16 dev, u16 ven, u16 sub)
140 struct nouveau_device *device = nv_device(object);
141 return device->pdev->device == dev &&
142 device->pdev->subsystem_vendor == ven &&
143 device->pdev->subsystem_device == sub;
147 nv_device_is_pci(struct nouveau_device *device)
149 return device->pdev != NULL;
152 static inline struct device *
153 nv_device_base(struct nouveau_device *device)
155 return nv_device_is_pci(device) ? &device->pdev->dev :
156 &device->platformdev->dev;
160 nv_device_resource_start(struct nouveau_device *device, unsigned int bar);
163 nv_device_resource_len(struct nouveau_device *device, unsigned int bar);
166 nv_device_map_page(struct nouveau_device *device, struct page *page);
169 nv_device_unmap_page(struct nouveau_device *device, dma_addr_t addr);
172 nv_device_get_irq(struct nouveau_device *device, bool stall);