1292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs#ifndef __NOUVEAU_H__
2292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs#define __NOUVEAU_H__
3292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs
4292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs#include <stdint.h>
5292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs#include <stdbool.h>
6292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs
7f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs/* Supported class information, provided by the kernel */
8f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggsstruct nouveau_sclass {
9f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs	int32_t oclass;
10f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs	int minver;
11f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs	int maxver;
12f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs};
13292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs
14f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs/* Client-provided array describing class versions that are desired.
15f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs *
16f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs * These are used to match against the kernel's list of supported classes.
17f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs */
18f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggsstruct nouveau_mclass {
19f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs	int32_t oclass;
20f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs	int version;
21f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs	void *data;
22292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs};
23292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs
24292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggsstruct nouveau_object {
25292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	struct nouveau_object *parent;
26292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	uint64_t handle;
27292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	uint32_t oclass;
28f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs	uint32_t length;	/* deprecated */
29f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs	void *data;		/* deprecated */
30292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs};
31292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs
32f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggsint nouveau_object_new(struct nouveau_object *parent, uint64_t handle,
33f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs		       uint32_t oclass, void *data, uint32_t length,
34f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs		       struct nouveau_object **);
35f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggsvoid nouveau_object_del(struct nouveau_object **);
36f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggsint nouveau_object_mthd(struct nouveau_object *, uint32_t mthd,
37f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs			void *data, uint32_t size);
38f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggsint nouveau_object_sclass_get(struct nouveau_object *,
39f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs			      struct nouveau_sclass **);
40f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggsvoid nouveau_object_sclass_put(struct nouveau_sclass **);
41f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggsint nouveau_object_mclass(struct nouveau_object *,
42f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs			  const struct nouveau_mclass *);
43f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs
44b845d61de93c762f73463a67a634ecb1ae8c4c35Ben Skeggsstruct nouveau_drm {
45b845d61de93c762f73463a67a634ecb1ae8c4c35Ben Skeggs	struct nouveau_object client;
46b845d61de93c762f73463a67a634ecb1ae8c4c35Ben Skeggs	int fd;
47b845d61de93c762f73463a67a634ecb1ae8c4c35Ben Skeggs	uint32_t version;
48b845d61de93c762f73463a67a634ecb1ae8c4c35Ben Skeggs	bool nvif;
49b845d61de93c762f73463a67a634ecb1ae8c4c35Ben Skeggs};
50b845d61de93c762f73463a67a634ecb1ae8c4c35Ben Skeggs
51b845d61de93c762f73463a67a634ecb1ae8c4c35Ben Skeggsstatic inline struct nouveau_drm *
52b845d61de93c762f73463a67a634ecb1ae8c4c35Ben Skeggsnouveau_drm(struct nouveau_object *obj)
53b845d61de93c762f73463a67a634ecb1ae8c4c35Ben Skeggs{
54b845d61de93c762f73463a67a634ecb1ae8c4c35Ben Skeggs	while (obj && obj->parent)
55b845d61de93c762f73463a67a634ecb1ae8c4c35Ben Skeggs		obj = obj->parent;
56b845d61de93c762f73463a67a634ecb1ae8c4c35Ben Skeggs	return (struct nouveau_drm *)obj;
57b845d61de93c762f73463a67a634ecb1ae8c4c35Ben Skeggs}
58b845d61de93c762f73463a67a634ecb1ae8c4c35Ben Skeggs
59b845d61de93c762f73463a67a634ecb1ae8c4c35Ben Skeggsint nouveau_drm_new(int fd, struct nouveau_drm **);
60b845d61de93c762f73463a67a634ecb1ae8c4c35Ben Skeggsvoid nouveau_drm_del(struct nouveau_drm **);
61b845d61de93c762f73463a67a634ecb1ae8c4c35Ben Skeggs
62292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggsstruct nouveau_device {
63292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	struct nouveau_object object;
64f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs	int fd;			/* deprecated */
65f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs	uint32_t lib_version;	/* deprecated */
66f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs	uint32_t drm_version;	/* deprecated */
67292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	uint32_t chipset;
68292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	uint64_t vram_size;
69292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	uint64_t gart_size;
70292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	uint64_t vram_limit;
71292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	uint64_t gart_limit;
72292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs};
73292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs
74f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggsint nouveau_device_new(struct nouveau_object *parent, int32_t oclass,
75f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs		       void *data, uint32_t size, struct nouveau_device **);
76292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggsvoid nouveau_device_del(struct nouveau_device **);
77f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs
78f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggsint nouveau_getparam(struct nouveau_device *, uint64_t param, uint64_t *value);
79f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggsint nouveau_setparam(struct nouveau_device *, uint64_t param, uint64_t value);
80f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs
81f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs/* deprecated */
82f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggsint nouveau_device_wrap(int fd, int close, struct nouveau_device **);
83f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggsint nouveau_device_open(const char *busid, struct nouveau_device **);
84292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs
85292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggsstruct nouveau_client {
86292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	struct nouveau_device *device;
87292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	int id;
88292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs};
89292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs
90f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggsint nouveau_client_new(struct nouveau_device *, struct nouveau_client **);
91292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggsvoid nouveau_client_del(struct nouveau_client **);
92292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs
93292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggsunion nouveau_bo_config {
94292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	struct {
95292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs#define NV04_BO_16BPP 0x00000001
96292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs#define NV04_BO_32BPP 0x00000002
97292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs#define NV04_BO_ZETA  0x00000004
98292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs		uint32_t surf_flags;
99292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs		uint32_t surf_pitch;
100292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	} nv04;
101292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	struct {
102292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs		uint32_t memtype;
103292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs		uint32_t tile_mode;
104292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	} nv50;
105292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	struct {
106292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs		uint32_t memtype;
107292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs		uint32_t tile_mode;
108292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	} nvc0;
109292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	uint32_t data[8];
110292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs};
111292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs
112292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs#define NOUVEAU_BO_VRAM    0x00000001
113292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs#define NOUVEAU_BO_GART    0x00000002
114292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs#define NOUVEAU_BO_APER   (NOUVEAU_BO_VRAM | NOUVEAU_BO_GART)
115292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs#define NOUVEAU_BO_RD      0x00000100
116292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs#define NOUVEAU_BO_WR      0x00000200
117292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs#define NOUVEAU_BO_RDWR   (NOUVEAU_BO_RD | NOUVEAU_BO_WR)
118292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs#define NOUVEAU_BO_NOBLOCK 0x00000400
119292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs#define NOUVEAU_BO_LOW     0x00001000
120292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs#define NOUVEAU_BO_HIGH    0x00002000
121292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs#define NOUVEAU_BO_OR      0x00004000
122292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs#define NOUVEAU_BO_MAP     0x80000000
123292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs#define NOUVEAU_BO_CONTIG  0x40000000
124292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs#define NOUVEAU_BO_NOSNOOP 0x20000000
125a1acffd4e0968ffa65b673163574188a00c9ab7eAlexandre Courbot#define NOUVEAU_BO_COHERENT 0x10000000
126292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs
127292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggsstruct nouveau_bo {
128292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	struct nouveau_device *device;
129292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	uint32_t handle;
130292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	uint64_t size;
131292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	uint32_t flags;
132292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	uint64_t offset;
133292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	void *map;
134292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	union nouveau_bo_config config;
135292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs};
136292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs
137f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggsint nouveau_bo_new(struct nouveau_device *, uint32_t flags, uint32_t align,
138f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs		   uint64_t size, union nouveau_bo_config *,
139f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs		   struct nouveau_bo **);
140f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggsint nouveau_bo_wrap(struct nouveau_device *, uint32_t handle,
141292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs		    struct nouveau_bo **);
142f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggsint nouveau_bo_name_ref(struct nouveau_device *v, uint32_t name,
143f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs			struct nouveau_bo **);
144f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggsint nouveau_bo_name_get(struct nouveau_bo *, uint32_t *name);
145292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggsvoid nouveau_bo_ref(struct nouveau_bo *, struct nouveau_bo **);
146f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggsint nouveau_bo_map(struct nouveau_bo *, uint32_t access,
147f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs		   struct nouveau_client *);
148f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggsint nouveau_bo_wait(struct nouveau_bo *, uint32_t access,
149292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs		    struct nouveau_client *);
150f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggsint nouveau_bo_prime_handle_ref(struct nouveau_device *, int prime_fd,
151f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs				struct nouveau_bo **);
152f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggsint nouveau_bo_set_prime(struct nouveau_bo *, int *prime_fd);
153f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs
154f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggsstruct nouveau_list {
155f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs	struct nouveau_list *prev;
156f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs	struct nouveau_list *next;
157f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs};
158292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs
159292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggsstruct nouveau_bufref {
160292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	struct nouveau_list thead;
161292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	struct nouveau_bo *bo;
162292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	uint32_t packet;
163292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	uint32_t flags;
164292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	uint32_t data;
165292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	uint32_t vor;
166292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	uint32_t tor;
167292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	uint32_t priv_data;
168292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	void *priv;
169292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs};
170292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs
171292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggsstruct nouveau_bufctx {
172292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	struct nouveau_client *client;
173292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	struct nouveau_list head;
174292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	struct nouveau_list pending;
175292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	struct nouveau_list current;
176292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	int relocs;
177292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs};
178292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs
179f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggsint nouveau_bufctx_new(struct nouveau_client *, int bins,
180f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs		       struct nouveau_bufctx **);
181292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggsvoid nouveau_bufctx_del(struct nouveau_bufctx **);
182292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggsstruct nouveau_bufref *
183292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggsnouveau_bufctx_refn(struct nouveau_bufctx *, int bin,
184292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs		    struct nouveau_bo *, uint32_t flags);
185292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggsstruct nouveau_bufref *
186292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggsnouveau_bufctx_mthd(struct nouveau_bufctx *, int bin,  uint32_t packet,
187292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs		    struct nouveau_bo *, uint64_t data, uint32_t flags,
188292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs		    uint32_t vor, uint32_t tor);
189292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggsvoid nouveau_bufctx_reset(struct nouveau_bufctx *, int bin);
190292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs
191292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggsstruct nouveau_pushbuf_krec;
192292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggsstruct nouveau_pushbuf {
193292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	struct nouveau_client *client;
194292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	struct nouveau_object *channel;
195292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	struct nouveau_bufctx *bufctx;
196292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	void (*kick_notify)(struct nouveau_pushbuf *);
197292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	void *user_priv;
198292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	uint32_t rsvd_kick;
199292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	uint32_t flags;
200292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	uint32_t *cur;
201292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	uint32_t *end;
202292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs};
203292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs
204292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggsstruct nouveau_pushbuf_refn {
205292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	struct nouveau_bo *bo;
206292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs	uint32_t flags;
207292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs};
208292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs
209f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggsint nouveau_pushbuf_new(struct nouveau_client *, struct nouveau_object *chan,
210f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs			int nr, uint32_t size, bool immediate,
211f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs			struct nouveau_pushbuf **);
212292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggsvoid nouveau_pushbuf_del(struct nouveau_pushbuf **);
213f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggsint nouveau_pushbuf_space(struct nouveau_pushbuf *, uint32_t dwords,
214f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs			  uint32_t relocs, uint32_t pushes);
215292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggsvoid nouveau_pushbuf_data(struct nouveau_pushbuf *, struct nouveau_bo *,
216292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs			  uint64_t offset, uint64_t length);
217f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggsint nouveau_pushbuf_refn(struct nouveau_pushbuf *,
218f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs			 struct nouveau_pushbuf_refn *, int nr);
219292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs/* Emits a reloc into the push buffer at the current position, you *must*
220292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs * have previously added the referenced buffer to a buffer context, and
221292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs * validated it against the current push buffer.
222292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs */
223292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggsvoid nouveau_pushbuf_reloc(struct nouveau_pushbuf *, struct nouveau_bo *,
224292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs			   uint32_t data, uint32_t flags,
225292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs			   uint32_t vor, uint32_t tor);
226f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggsint nouveau_pushbuf_validate(struct nouveau_pushbuf *);
227292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggsuint32_t nouveau_pushbuf_refd(struct nouveau_pushbuf *, struct nouveau_bo *);
228f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggsint nouveau_pushbuf_kick(struct nouveau_pushbuf *, struct nouveau_object *chan);
229292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggsstruct nouveau_bufctx *
230292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggsnouveau_pushbuf_bufctx(struct nouveau_pushbuf *, struct nouveau_bufctx *);
231292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs
232f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs#define NOUVEAU_DEVICE_CLASS       0x80000000
233f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs#define NOUVEAU_FIFO_CHANNEL_CLASS 0x80000001
234f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs#define NOUVEAU_NOTIFIER_CLASS     0x80000002
235f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs
236f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggsstruct nouveau_fifo {
237f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs	struct nouveau_object *object;
238f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs	uint32_t channel;
239f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs	uint32_t pushbuf;
240f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs	uint64_t unused1[3];
241f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs};
242f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs
243f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggsstruct nv04_fifo {
244f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs	struct nouveau_fifo base;
245f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs	uint32_t vram;
246f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs	uint32_t gart;
247f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs	uint32_t notify;
248f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs};
249f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs
250f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggsstruct nvc0_fifo {
251f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs	struct nouveau_fifo base;
252f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs	uint32_t notify;
253f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs};
254f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs
255f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs#define NVE0_FIFO_ENGINE_GR  0x00000001
256f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs#define NVE0_FIFO_ENGINE_VP  0x00000002
257f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs#define NVE0_FIFO_ENGINE_PPP 0x00000004
258f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs#define NVE0_FIFO_ENGINE_BSP 0x00000008
259f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs#define NVE0_FIFO_ENGINE_CE0 0x00000010
260f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs#define NVE0_FIFO_ENGINE_CE1 0x00000020
261f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs#define NVE0_FIFO_ENGINE_ENC 0x00000040
262f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs
263f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggsstruct nve0_fifo {
264f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs	struct {
265f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs		struct nouveau_fifo base;
266f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs		uint32_t notify;
267f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs	};
268f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs	uint32_t engine;
269f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs};
270f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs
271f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggsstruct nv04_notify {
272f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs	struct nouveau_object *object;
273f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs	uint32_t offset;
274f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs	uint32_t length;
275f208f2afdee6222ea8f6692a6ec4381cc999eb05Ben Skeggs};
276292da616fe1f936ca78a3fa8e1b1b19883e343b6Ben Skeggs#endif
277