OSDN Git Service

tests: drop redundant and slow `random` test
[android-x86/external-libdrm.git] / nouveau / nouveau.h
1 #ifndef __NOUVEAU_H__
2 #define __NOUVEAU_H__
3
4 #include <stdint.h>
5 #include <stdbool.h>
6
7 /* Supported class information, provided by the kernel */
8 struct nouveau_sclass {
9         int32_t oclass;
10         int minver;
11         int maxver;
12 };
13
14 /* Client-provided array describing class versions that are desired.
15  *
16  * These are used to match against the kernel's list of supported classes.
17  */
18 struct nouveau_mclass {
19         int32_t oclass;
20         int version;
21         void *data;
22 };
23
24 struct nouveau_object {
25         struct nouveau_object *parent;
26         uint64_t handle;
27         uint32_t oclass;
28         uint32_t length;        /* deprecated */
29         void *data;             /* deprecated */
30 };
31
32 int nouveau_object_new(struct nouveau_object *parent, uint64_t handle,
33                        uint32_t oclass, void *data, uint32_t length,
34                        struct nouveau_object **);
35 void nouveau_object_del(struct nouveau_object **);
36 int nouveau_object_mthd(struct nouveau_object *, uint32_t mthd,
37                         void *data, uint32_t size);
38 int nouveau_object_sclass_get(struct nouveau_object *,
39                               struct nouveau_sclass **);
40 void nouveau_object_sclass_put(struct nouveau_sclass **);
41 int nouveau_object_mclass(struct nouveau_object *,
42                           const struct nouveau_mclass *);
43
44 struct nouveau_drm {
45         struct nouveau_object client;
46         int fd;
47         uint32_t version;
48         bool nvif;
49 };
50
51 static inline struct nouveau_drm *
52 nouveau_drm(struct nouveau_object *obj)
53 {
54         while (obj && obj->parent)
55                 obj = obj->parent;
56         return (struct nouveau_drm *)obj;
57 }
58
59 int nouveau_drm_new(int fd, struct nouveau_drm **);
60 void nouveau_drm_del(struct nouveau_drm **);
61
62 struct nouveau_device {
63         struct nouveau_object object;
64         int fd;                 /* deprecated */
65         uint32_t lib_version;   /* deprecated */
66         uint32_t drm_version;   /* deprecated */
67         uint32_t chipset;
68         uint64_t vram_size;
69         uint64_t gart_size;
70         uint64_t vram_limit;
71         uint64_t gart_limit;
72 };
73
74 int nouveau_device_new(struct nouveau_object *parent, int32_t oclass,
75                        void *data, uint32_t size, struct nouveau_device **);
76 void nouveau_device_del(struct nouveau_device **);
77
78 int nouveau_getparam(struct nouveau_device *, uint64_t param, uint64_t *value);
79 int nouveau_setparam(struct nouveau_device *, uint64_t param, uint64_t value);
80
81 /* deprecated */
82 int nouveau_device_wrap(int fd, int close, struct nouveau_device **);
83 int nouveau_device_open(const char *busid, struct nouveau_device **);
84
85 struct nouveau_client {
86         struct nouveau_device *device;
87         int id;
88 };
89
90 int nouveau_client_new(struct nouveau_device *, struct nouveau_client **);
91 void nouveau_client_del(struct nouveau_client **);
92
93 union nouveau_bo_config {
94         struct {
95 #define NV04_BO_16BPP 0x00000001
96 #define NV04_BO_32BPP 0x00000002
97 #define NV04_BO_ZETA  0x00000004
98                 uint32_t surf_flags;
99                 uint32_t surf_pitch;
100         } nv04;
101         struct {
102                 uint32_t memtype;
103                 uint32_t tile_mode;
104         } nv50;
105         struct {
106                 uint32_t memtype;
107                 uint32_t tile_mode;
108         } nvc0;
109         uint32_t data[8];
110 };
111
112 #define NOUVEAU_BO_VRAM    0x00000001
113 #define NOUVEAU_BO_GART    0x00000002
114 #define NOUVEAU_BO_APER   (NOUVEAU_BO_VRAM | NOUVEAU_BO_GART)
115 #define NOUVEAU_BO_RD      0x00000100
116 #define NOUVEAU_BO_WR      0x00000200
117 #define NOUVEAU_BO_RDWR   (NOUVEAU_BO_RD | NOUVEAU_BO_WR)
118 #define NOUVEAU_BO_NOBLOCK 0x00000400
119 #define NOUVEAU_BO_LOW     0x00001000
120 #define NOUVEAU_BO_HIGH    0x00002000
121 #define NOUVEAU_BO_OR      0x00004000
122 #define NOUVEAU_BO_MAP     0x80000000
123 #define NOUVEAU_BO_CONTIG  0x40000000
124 #define NOUVEAU_BO_NOSNOOP 0x20000000
125 #define NOUVEAU_BO_COHERENT 0x10000000
126
127 struct nouveau_bo {
128         struct nouveau_device *device;
129         uint32_t handle;
130         uint64_t size;
131         uint32_t flags;
132         uint64_t offset;
133         void *map;
134         union nouveau_bo_config config;
135 };
136
137 int nouveau_bo_new(struct nouveau_device *, uint32_t flags, uint32_t align,
138                    uint64_t size, union nouveau_bo_config *,
139                    struct nouveau_bo **);
140 int nouveau_bo_wrap(struct nouveau_device *, uint32_t handle,
141                     struct nouveau_bo **);
142 int nouveau_bo_name_ref(struct nouveau_device *v, uint32_t name,
143                         struct nouveau_bo **);
144 int nouveau_bo_name_get(struct nouveau_bo *, uint32_t *name);
145 void nouveau_bo_ref(struct nouveau_bo *, struct nouveau_bo **);
146 int nouveau_bo_map(struct nouveau_bo *, uint32_t access,
147                    struct nouveau_client *);
148 int nouveau_bo_wait(struct nouveau_bo *, uint32_t access,
149                     struct nouveau_client *);
150 int nouveau_bo_prime_handle_ref(struct nouveau_device *, int prime_fd,
151                                 struct nouveau_bo **);
152 int nouveau_bo_set_prime(struct nouveau_bo *, int *prime_fd);
153
154 struct nouveau_list {
155         struct nouveau_list *prev;
156         struct nouveau_list *next;
157 };
158
159 struct nouveau_bufref {
160         struct nouveau_list thead;
161         struct nouveau_bo *bo;
162         uint32_t packet;
163         uint32_t flags;
164         uint32_t data;
165         uint32_t vor;
166         uint32_t tor;
167         uint32_t priv_data;
168         void *priv;
169 };
170
171 struct nouveau_bufctx {
172         struct nouveau_client *client;
173         struct nouveau_list head;
174         struct nouveau_list pending;
175         struct nouveau_list current;
176         int relocs;
177 };
178
179 int nouveau_bufctx_new(struct nouveau_client *, int bins,
180                        struct nouveau_bufctx **);
181 void nouveau_bufctx_del(struct nouveau_bufctx **);
182 struct nouveau_bufref *
183 nouveau_bufctx_refn(struct nouveau_bufctx *, int bin,
184                     struct nouveau_bo *, uint32_t flags);
185 struct nouveau_bufref *
186 nouveau_bufctx_mthd(struct nouveau_bufctx *, int bin,  uint32_t packet,
187                     struct nouveau_bo *, uint64_t data, uint32_t flags,
188                     uint32_t vor, uint32_t tor);
189 void nouveau_bufctx_reset(struct nouveau_bufctx *, int bin);
190
191 struct nouveau_pushbuf_krec;
192 struct nouveau_pushbuf {
193         struct nouveau_client *client;
194         struct nouveau_object *channel;
195         struct nouveau_bufctx *bufctx;
196         void (*kick_notify)(struct nouveau_pushbuf *);
197         void *user_priv;
198         uint32_t rsvd_kick;
199         uint32_t flags;
200         uint32_t *cur;
201         uint32_t *end;
202 };
203
204 struct nouveau_pushbuf_refn {
205         struct nouveau_bo *bo;
206         uint32_t flags;
207 };
208
209 int nouveau_pushbuf_new(struct nouveau_client *, struct nouveau_object *chan,
210                         int nr, uint32_t size, bool immediate,
211                         struct nouveau_pushbuf **);
212 void nouveau_pushbuf_del(struct nouveau_pushbuf **);
213 int nouveau_pushbuf_space(struct nouveau_pushbuf *, uint32_t dwords,
214                           uint32_t relocs, uint32_t pushes);
215 void nouveau_pushbuf_data(struct nouveau_pushbuf *, struct nouveau_bo *,
216                           uint64_t offset, uint64_t length);
217 int nouveau_pushbuf_refn(struct nouveau_pushbuf *,
218                          struct nouveau_pushbuf_refn *, int nr);
219 /* Emits a reloc into the push buffer at the current position, you *must*
220  * have previously added the referenced buffer to a buffer context, and
221  * validated it against the current push buffer.
222  */
223 void nouveau_pushbuf_reloc(struct nouveau_pushbuf *, struct nouveau_bo *,
224                            uint32_t data, uint32_t flags,
225                            uint32_t vor, uint32_t tor);
226 int nouveau_pushbuf_validate(struct nouveau_pushbuf *);
227 uint32_t nouveau_pushbuf_refd(struct nouveau_pushbuf *, struct nouveau_bo *);
228 int nouveau_pushbuf_kick(struct nouveau_pushbuf *, struct nouveau_object *chan);
229 struct nouveau_bufctx *
230 nouveau_pushbuf_bufctx(struct nouveau_pushbuf *, struct nouveau_bufctx *);
231
232 #define NOUVEAU_DEVICE_CLASS       0x80000000
233 #define NOUVEAU_FIFO_CHANNEL_CLASS 0x80000001
234 #define NOUVEAU_NOTIFIER_CLASS     0x80000002
235
236 struct nouveau_fifo {
237         struct nouveau_object *object;
238         uint32_t channel;
239         uint32_t pushbuf;
240         uint64_t unused1[3];
241 };
242
243 struct nv04_fifo {
244         struct nouveau_fifo base;
245         uint32_t vram;
246         uint32_t gart;
247         uint32_t notify;
248 };
249
250 struct nvc0_fifo {
251         struct nouveau_fifo base;
252         uint32_t notify;
253 };
254
255 #define NVE0_FIFO_ENGINE_GR  0x00000001
256 #define NVE0_FIFO_ENGINE_VP  0x00000002
257 #define NVE0_FIFO_ENGINE_PPP 0x00000004
258 #define NVE0_FIFO_ENGINE_BSP 0x00000008
259 #define NVE0_FIFO_ENGINE_CE0 0x00000010
260 #define NVE0_FIFO_ENGINE_CE1 0x00000020
261 #define NVE0_FIFO_ENGINE_ENC 0x00000040
262
263 struct nve0_fifo {
264         struct {
265                 struct nouveau_fifo base;
266                 uint32_t notify;
267         };
268         uint32_t engine;
269 };
270
271 struct nv04_notify {
272         struct nouveau_object *object;
273         uint32_t offset;
274         uint32_t length;
275 };
276 #endif