drm/nouveau/nvif: use negative oclass identifier for internal classes
[pandora-kernel.git] / drivers / gpu / drm / nouveau / include / nvif / object.h
1 #ifndef __NVIF_OBJECT_H__
2 #define __NVIF_OBJECT_H__
3
4 #include <nvif/os.h>
5
6 struct nvif_object {
7         struct nvif_client *client;
8         u32 handle;
9         s32 oclass;
10         void *priv; /*XXX: hack */
11         struct {
12                 void __iomem *ptr;
13                 u32 size;
14         } map;
15 };
16
17 int  nvif_object_init(struct nvif_object *, u32 handle, s32 oclass, void *, u32,
18                       struct nvif_object *);
19 void nvif_object_fini(struct nvif_object *);
20 int  nvif_object_ioctl(struct nvif_object *, void *, u32, void **);
21 int  nvif_object_sclass(struct nvif_object *, s32 *, int);
22 u32  nvif_object_rd(struct nvif_object *, int, u64);
23 void nvif_object_wr(struct nvif_object *, int, u64, u32);
24 int  nvif_object_mthd(struct nvif_object *, u32, void *, u32);
25 int  nvif_object_map(struct nvif_object *);
26 void nvif_object_unmap(struct nvif_object *);
27
28 #define nvif_handle(a) (unsigned long)(void *)(a)
29 #define nvif_object(a) (a)->object
30
31 #define nvif_rd(a,f,b,c) ({                                                    \
32         struct nvif_object *_object = (a);                                     \
33         u32 _data;                                                             \
34         if (likely(_object->map.ptr))                                          \
35                 _data = f((u8 __iomem *)_object->map.ptr + (c));               \
36         else                                                                   \
37                 _data = nvif_object_rd(_object, (b), (c));                     \
38         _data;                                                                 \
39 })
40 #define nvif_wr(a,f,b,c,d) ({                                                  \
41         struct nvif_object *_object = (a);                                     \
42         if (likely(_object->map.ptr))                                          \
43                 f((d), (u8 __iomem *)_object->map.ptr + (c));                  \
44         else                                                                   \
45                 nvif_object_wr(_object, (b), (c), (d));                        \
46 })
47 #define nvif_rd08(a,b) ({ ((u8)nvif_rd((a), ioread8, 1, (b))); })
48 #define nvif_rd16(a,b) ({ ((u16)nvif_rd((a), ioread16_native, 2, (b))); })
49 #define nvif_rd32(a,b) ({ ((u32)nvif_rd((a), ioread32_native, 4, (b))); })
50 #define nvif_wr08(a,b,c) nvif_wr((a), iowrite8, 1, (b), (u8)(c))
51 #define nvif_wr16(a,b,c) nvif_wr((a), iowrite16_native, 2, (b), (u16)(c))
52 #define nvif_wr32(a,b,c) nvif_wr((a), iowrite32_native, 4, (b), (u32)(c))
53 #define nvif_mask(a,b,c,d) ({                                                  \
54         struct nvif_object *__object = (a);                                    \
55         u32 _addr = (b), _data = nvif_rd32(__object, _addr);                   \
56         nvif_wr32(__object, _addr, (_data & ~(c)) | (d));                      \
57         _data;                                                                 \
58 })
59
60 #define nvif_mthd(a,b,c,d) nvif_object_mthd((a), (b), (c), (d))
61
62 /*XXX*/
63 #include <core/object.h>
64 #define nvxx_object(a) ({                                                      \
65         struct nvif_object *_object = (a);                                     \
66         (struct nvkm_object *)_object->priv;                                   \
67 })
68 #endif