nouveau.h revision e88f27b3
1e88f27b3Smrg#ifndef __NOUVEAU_H__
2e88f27b3Smrg#define __NOUVEAU_H__
3e88f27b3Smrg
4e88f27b3Smrg#include <stdint.h>
5e88f27b3Smrg#include <stdbool.h>
6e88f27b3Smrg
7e88f27b3Smrg#define NOUVEAU_DEVICE_CLASS       0x80000000
8e88f27b3Smrg#define NOUVEAU_FIFO_CHANNEL_CLASS 0x80000001
9e88f27b3Smrg#define NOUVEAU_NOTIFIER_CLASS     0x80000002
10e88f27b3Smrg#define NOUVEAU_PARENT_CLASS       0xffffffff
11e88f27b3Smrg
12e88f27b3Smrgstruct nouveau_list {
13e88f27b3Smrg	struct nouveau_list *prev;
14e88f27b3Smrg	struct nouveau_list *next;
15e88f27b3Smrg};
16e88f27b3Smrg
17e88f27b3Smrgstruct nouveau_object {
18e88f27b3Smrg	struct nouveau_object *parent;
19e88f27b3Smrg	uint64_t handle;
20e88f27b3Smrg	uint32_t oclass;
21e88f27b3Smrg	uint32_t length;
22e88f27b3Smrg	void *data;
23e88f27b3Smrg};
24e88f27b3Smrg
25e88f27b3Smrgstruct nouveau_fifo {
26e88f27b3Smrg	struct nouveau_object *object;
27e88f27b3Smrg	uint32_t channel;
28e88f27b3Smrg	uint32_t pushbuf;
29e88f27b3Smrg	uint64_t unused1[3];
30e88f27b3Smrg};
31e88f27b3Smrg
32e88f27b3Smrgstruct nv04_fifo {
33e88f27b3Smrg	struct nouveau_fifo base;
34e88f27b3Smrg	uint32_t vram;
35e88f27b3Smrg	uint32_t gart;
36e88f27b3Smrg	uint32_t notify;
37e88f27b3Smrg};
38e88f27b3Smrg
39e88f27b3Smrgstruct nvc0_fifo {
40e88f27b3Smrg	struct nouveau_fifo base;
41e88f27b3Smrg	uint32_t notify;
42e88f27b3Smrg};
43e88f27b3Smrg
44e88f27b3Smrg#define NVE0_FIFO_ENGINE_GR  0x00000001
45e88f27b3Smrg#define NVE0_FIFO_ENGINE_VP  0x00000002
46e88f27b3Smrg#define NVE0_FIFO_ENGINE_PPP 0x00000004
47e88f27b3Smrg#define NVE0_FIFO_ENGINE_BSP 0x00000008
48e88f27b3Smrg#define NVE0_FIFO_ENGINE_CE0 0x00000010
49e88f27b3Smrg#define NVE0_FIFO_ENGINE_CE1 0x00000020
50e88f27b3Smrg#define NVE0_FIFO_ENGINE_ENC 0x00000040
51e88f27b3Smrg
52e88f27b3Smrgstruct nve0_fifo {
53e88f27b3Smrg	struct {
54e88f27b3Smrg		struct nouveau_fifo base;
55e88f27b3Smrg		uint32_t notify;
56e88f27b3Smrg	};
57e88f27b3Smrg	uint32_t engine;
58e88f27b3Smrg};
59e88f27b3Smrg
60e88f27b3Smrgstruct nv04_notify {
61e88f27b3Smrg	struct nouveau_object *object;
62e88f27b3Smrg	uint32_t offset;
63e88f27b3Smrg	uint32_t length;
64e88f27b3Smrg};
65e88f27b3Smrg
66e88f27b3Smrgint  nouveau_object_new(struct nouveau_object *parent, uint64_t handle,
67e88f27b3Smrg			uint32_t oclass, void *data, uint32_t length,
68e88f27b3Smrg			struct nouveau_object **);
69e88f27b3Smrgvoid nouveau_object_del(struct nouveau_object **);
70e88f27b3Smrgvoid *nouveau_object_find(struct nouveau_object *, uint32_t parent_class);
71e88f27b3Smrg
72e88f27b3Smrgstruct nouveau_device {
73e88f27b3Smrg	struct nouveau_object object;
74e88f27b3Smrg	int fd;
75e88f27b3Smrg	uint32_t lib_version;
76e88f27b3Smrg	uint32_t drm_version;
77e88f27b3Smrg	uint32_t chipset;
78e88f27b3Smrg	uint64_t vram_size;
79e88f27b3Smrg	uint64_t gart_size;
80e88f27b3Smrg	uint64_t vram_limit;
81e88f27b3Smrg	uint64_t gart_limit;
82e88f27b3Smrg};
83e88f27b3Smrg
84e88f27b3Smrgint  nouveau_device_wrap(int fd, int close, struct nouveau_device **);
85e88f27b3Smrgint  nouveau_device_open(const char *busid, struct nouveau_device **);
86e88f27b3Smrgvoid nouveau_device_del(struct nouveau_device **);
87e88f27b3Smrgint  nouveau_getparam(struct nouveau_device *, uint64_t param, uint64_t *value);
88e88f27b3Smrgint  nouveau_setparam(struct nouveau_device *, uint64_t param, uint64_t value);
89e88f27b3Smrg
90e88f27b3Smrgstruct nouveau_client {
91e88f27b3Smrg	struct nouveau_device *device;
92e88f27b3Smrg	int id;
93e88f27b3Smrg};
94e88f27b3Smrg
95e88f27b3Smrgint  nouveau_client_new(struct nouveau_device *, struct nouveau_client **);
96e88f27b3Smrgvoid nouveau_client_del(struct nouveau_client **);
97e88f27b3Smrg
98e88f27b3Smrgunion nouveau_bo_config {
99e88f27b3Smrg	struct {
100e88f27b3Smrg#define NV04_BO_16BPP 0x00000001
101e88f27b3Smrg#define NV04_BO_32BPP 0x00000002
102e88f27b3Smrg#define NV04_BO_ZETA  0x00000004
103e88f27b3Smrg		uint32_t surf_flags;
104e88f27b3Smrg		uint32_t surf_pitch;
105e88f27b3Smrg	} nv04;
106e88f27b3Smrg	struct {
107e88f27b3Smrg		uint32_t memtype;
108e88f27b3Smrg		uint32_t tile_mode;
109e88f27b3Smrg	} nv50;
110e88f27b3Smrg	struct {
111e88f27b3Smrg		uint32_t memtype;
112e88f27b3Smrg		uint32_t tile_mode;
113e88f27b3Smrg	} nvc0;
114e88f27b3Smrg	uint32_t data[8];
115e88f27b3Smrg};
116e88f27b3Smrg
117e88f27b3Smrg#define NOUVEAU_BO_VRAM    0x00000001
118e88f27b3Smrg#define NOUVEAU_BO_GART    0x00000002
119e88f27b3Smrg#define NOUVEAU_BO_APER   (NOUVEAU_BO_VRAM | NOUVEAU_BO_GART)
120e88f27b3Smrg#define NOUVEAU_BO_RD      0x00000100
121e88f27b3Smrg#define NOUVEAU_BO_WR      0x00000200
122e88f27b3Smrg#define NOUVEAU_BO_RDWR   (NOUVEAU_BO_RD | NOUVEAU_BO_WR)
123e88f27b3Smrg#define NOUVEAU_BO_NOBLOCK 0x00000400
124e88f27b3Smrg#define NOUVEAU_BO_LOW     0x00001000
125e88f27b3Smrg#define NOUVEAU_BO_HIGH    0x00002000
126e88f27b3Smrg#define NOUVEAU_BO_OR      0x00004000
127e88f27b3Smrg#define NOUVEAU_BO_MAP     0x80000000
128e88f27b3Smrg#define NOUVEAU_BO_CONTIG  0x40000000
129e88f27b3Smrg#define NOUVEAU_BO_NOSNOOP 0x20000000
130e88f27b3Smrg
131e88f27b3Smrgstruct nouveau_bo {
132e88f27b3Smrg	struct nouveau_device *device;
133e88f27b3Smrg	uint32_t handle;
134e88f27b3Smrg	uint64_t size;
135e88f27b3Smrg	uint32_t flags;
136e88f27b3Smrg	uint64_t offset;
137e88f27b3Smrg	void *map;
138e88f27b3Smrg	union nouveau_bo_config config;
139e88f27b3Smrg};
140e88f27b3Smrg
141e88f27b3Smrgint  nouveau_bo_new(struct nouveau_device *, uint32_t flags, uint32_t align,
142e88f27b3Smrg		    uint64_t size, union nouveau_bo_config *,
143e88f27b3Smrg		    struct nouveau_bo **);
144e88f27b3Smrgint  nouveau_bo_wrap(struct nouveau_device *, uint32_t handle,
145e88f27b3Smrg		     struct nouveau_bo **);
146e88f27b3Smrgint  nouveau_bo_name_ref(struct nouveau_device *dev, uint32_t name,
147e88f27b3Smrg			 struct nouveau_bo **);
148e88f27b3Smrgint  nouveau_bo_name_get(struct nouveau_bo *, uint32_t *name);
149e88f27b3Smrgvoid nouveau_bo_ref(struct nouveau_bo *, struct nouveau_bo **);
150e88f27b3Smrgint  nouveau_bo_map(struct nouveau_bo *, uint32_t access,
151e88f27b3Smrg		    struct nouveau_client *);
152e88f27b3Smrgint  nouveau_bo_wait(struct nouveau_bo *, uint32_t access,
153e88f27b3Smrg		     struct nouveau_client *);
154e88f27b3Smrgint  nouveau_bo_prime_handle_ref(struct nouveau_device *dev, int prime_fd,
155e88f27b3Smrg				 struct nouveau_bo **);
156e88f27b3Smrgint  nouveau_bo_set_prime(struct nouveau_bo *bo, int *prime_fd);
157e88f27b3Smrg
158e88f27b3Smrgstruct nouveau_bufref {
159e88f27b3Smrg	struct nouveau_list thead;
160e88f27b3Smrg	struct nouveau_bo *bo;
161e88f27b3Smrg	uint32_t packet;
162e88f27b3Smrg	uint32_t flags;
163e88f27b3Smrg	uint32_t data;
164e88f27b3Smrg	uint32_t vor;
165e88f27b3Smrg	uint32_t tor;
166e88f27b3Smrg	uint32_t priv_data;
167e88f27b3Smrg	void *priv;
168e88f27b3Smrg};
169e88f27b3Smrg
170e88f27b3Smrgstruct nouveau_bufctx {
171e88f27b3Smrg	struct nouveau_client *client;
172e88f27b3Smrg	struct nouveau_list head;
173e88f27b3Smrg	struct nouveau_list pending;
174e88f27b3Smrg	struct nouveau_list current;
175e88f27b3Smrg	int relocs;
176e88f27b3Smrg};
177e88f27b3Smrg
178e88f27b3Smrgint  nouveau_bufctx_new(struct nouveau_client *, int bins,
179e88f27b3Smrg			struct nouveau_bufctx **);
180e88f27b3Smrgvoid nouveau_bufctx_del(struct nouveau_bufctx **);
181e88f27b3Smrgstruct nouveau_bufref *
182e88f27b3Smrgnouveau_bufctx_refn(struct nouveau_bufctx *, int bin,
183e88f27b3Smrg		    struct nouveau_bo *, uint32_t flags);
184e88f27b3Smrgstruct nouveau_bufref *
185e88f27b3Smrgnouveau_bufctx_mthd(struct nouveau_bufctx *, int bin,  uint32_t packet,
186e88f27b3Smrg		    struct nouveau_bo *, uint64_t data, uint32_t flags,
187e88f27b3Smrg		    uint32_t vor, uint32_t tor);
188e88f27b3Smrgvoid nouveau_bufctx_reset(struct nouveau_bufctx *, int bin);
189e88f27b3Smrg
190e88f27b3Smrgstruct nouveau_pushbuf_krec;
191e88f27b3Smrgstruct nouveau_pushbuf {
192e88f27b3Smrg	struct nouveau_client *client;
193e88f27b3Smrg	struct nouveau_object *channel;
194e88f27b3Smrg	struct nouveau_bufctx *bufctx;
195e88f27b3Smrg	void (*kick_notify)(struct nouveau_pushbuf *);
196e88f27b3Smrg	void *user_priv;
197e88f27b3Smrg	uint32_t rsvd_kick;
198e88f27b3Smrg	uint32_t flags;
199e88f27b3Smrg	uint32_t *cur;
200e88f27b3Smrg	uint32_t *end;
201e88f27b3Smrg};
202e88f27b3Smrg
203e88f27b3Smrgstruct nouveau_pushbuf_refn {
204e88f27b3Smrg	struct nouveau_bo *bo;
205e88f27b3Smrg	uint32_t flags;
206e88f27b3Smrg};
207e88f27b3Smrg
208e88f27b3Smrgint  nouveau_pushbuf_new(struct nouveau_client *, struct nouveau_object *channel,
209e88f27b3Smrg			 int nr, uint32_t size, bool immediate,
210e88f27b3Smrg			 struct nouveau_pushbuf **);
211e88f27b3Smrgvoid nouveau_pushbuf_del(struct nouveau_pushbuf **);
212e88f27b3Smrgint  nouveau_pushbuf_space(struct nouveau_pushbuf *, uint32_t dwords,
213e88f27b3Smrg			   uint32_t relocs, uint32_t pushes);
214e88f27b3Smrgvoid nouveau_pushbuf_data(struct nouveau_pushbuf *, struct nouveau_bo *,
215e88f27b3Smrg			  uint64_t offset, uint64_t length);
216e88f27b3Smrgint  nouveau_pushbuf_refn(struct nouveau_pushbuf *,
217e88f27b3Smrg			  struct nouveau_pushbuf_refn *, int nr);
218e88f27b3Smrg/* Emits a reloc into the push buffer at the current position, you *must*
219e88f27b3Smrg * have previously added the referenced buffer to a buffer context, and
220e88f27b3Smrg * validated it against the current push buffer.
221e88f27b3Smrg */
222e88f27b3Smrgvoid nouveau_pushbuf_reloc(struct nouveau_pushbuf *, struct nouveau_bo *,
223e88f27b3Smrg			   uint32_t data, uint32_t flags,
224e88f27b3Smrg			   uint32_t vor, uint32_t tor);
225e88f27b3Smrgint  nouveau_pushbuf_validate(struct nouveau_pushbuf *);
226e88f27b3Smrguint32_t nouveau_pushbuf_refd(struct nouveau_pushbuf *, struct nouveau_bo *);
227e88f27b3Smrgint  nouveau_pushbuf_kick(struct nouveau_pushbuf *, struct nouveau_object *channel);
228e88f27b3Smrgstruct nouveau_bufctx *
229e88f27b3Smrgnouveau_pushbuf_bufctx(struct nouveau_pushbuf *, struct nouveau_bufctx *);
230e88f27b3Smrg
231e88f27b3Smrg#endif
232