7 /* Supported class information, provided by the kernel */
8 struct nouveau_sclass
{
14 /* Client-provided array describing class versions that are desired.
16 * These are used to match against the kernel's list of supported classes.
18 struct nouveau_mclass
{
24 struct nouveau_object
{
25 struct nouveau_object
*parent
;
28 uint32_t length
; /* deprecated */
29 void *data
; /* deprecated */
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
*);
45 struct nouveau_object client
;
51 static inline struct nouveau_drm
*
52 nouveau_drm(struct nouveau_object
*obj
)
54 while (obj
&& obj
->parent
)
56 return (struct nouveau_drm
*)obj
;
59 int nouveau_drm_new(int fd
, struct nouveau_drm
**);
60 void nouveau_drm_del(struct nouveau_drm
**);
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 */
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
**);
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
);
82 int nouveau_device_wrap(int fd
, int close
, struct nouveau_device
**);
83 int nouveau_device_open(const char *busid
, struct nouveau_device
**);
85 struct nouveau_client
{
86 struct nouveau_device
*device
;
90 int nouveau_client_new(struct nouveau_device
*, struct nouveau_client
**);
91 void nouveau_client_del(struct nouveau_client
**);
93 union nouveau_bo_config
{
95 #define NV04_BO_16BPP 0x00000001
96 #define NV04_BO_32BPP 0x00000002
97 #define NV04_BO_ZETA 0x00000004
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
128 struct nouveau_device
*device
;
134 union nouveau_bo_config config
;
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 void nouveau_bo_make_global(struct nouveau_bo
*);
141 int nouveau_bo_wrap(struct nouveau_device
*, uint32_t handle
,
142 struct nouveau_bo
**);
143 int nouveau_bo_name_ref(struct nouveau_device
*v
, uint32_t name
,
144 struct nouveau_bo
**);
145 int nouveau_bo_name_get(struct nouveau_bo
*, uint32_t *name
);
146 void nouveau_bo_ref(struct nouveau_bo
*, struct nouveau_bo
**);
147 int nouveau_bo_map(struct nouveau_bo
*, uint32_t access
,
148 struct nouveau_client
*);
149 int nouveau_bo_wait(struct nouveau_bo
*, uint32_t access
,
150 struct nouveau_client
*);
151 int nouveau_bo_prime_handle_ref(struct nouveau_device
*, int prime_fd
,
152 struct nouveau_bo
**);
153 int nouveau_bo_set_prime(struct nouveau_bo
*, int *prime_fd
);
155 struct nouveau_list
{
156 struct nouveau_list
*prev
;
157 struct nouveau_list
*next
;
160 struct nouveau_bufref
{
161 struct nouveau_list thead
;
162 struct nouveau_bo
*bo
;
172 struct nouveau_bufctx
{
173 struct nouveau_client
*client
;
174 struct nouveau_list head
;
175 struct nouveau_list pending
;
176 struct nouveau_list current
;
180 int nouveau_bufctx_new(struct nouveau_client
*, int bins
,
181 struct nouveau_bufctx
**);
182 void nouveau_bufctx_del(struct nouveau_bufctx
**);
183 struct nouveau_bufref
*
184 nouveau_bufctx_refn(struct nouveau_bufctx
*, int bin
,
185 struct nouveau_bo
*, uint32_t flags
);
186 struct nouveau_bufref
*
187 nouveau_bufctx_mthd(struct nouveau_bufctx
*, int bin
, uint32_t packet
,
188 struct nouveau_bo
*, uint64_t data
, uint32_t flags
,
189 uint32_t vor
, uint32_t tor
);
190 void nouveau_bufctx_reset(struct nouveau_bufctx
*, int bin
);
192 struct nouveau_pushbuf_krec
;
193 struct nouveau_pushbuf
{
194 struct nouveau_client
*client
;
195 struct nouveau_object
*channel
;
196 struct nouveau_bufctx
*bufctx
;
197 void (*kick_notify
)(struct nouveau_pushbuf
*);
205 struct nouveau_pushbuf_refn
{
206 struct nouveau_bo
*bo
;
210 int nouveau_pushbuf_new(struct nouveau_client
*, struct nouveau_object
*chan
,
211 int nr
, uint32_t size
, bool immediate
,
212 struct nouveau_pushbuf
**);
213 void nouveau_pushbuf_del(struct nouveau_pushbuf
**);
214 int nouveau_pushbuf_space(struct nouveau_pushbuf
*, uint32_t dwords
,
215 uint32_t relocs
, uint32_t pushes
);
216 void nouveau_pushbuf_data(struct nouveau_pushbuf
*, struct nouveau_bo
*,
217 uint64_t offset
, uint64_t length
);
218 int nouveau_pushbuf_refn(struct nouveau_pushbuf
*,
219 struct nouveau_pushbuf_refn
*, int nr
);
220 /* Emits a reloc into the push buffer at the current position, you *must*
221 * have previously added the referenced buffer to a buffer context, and
222 * validated it against the current push buffer.
224 void nouveau_pushbuf_reloc(struct nouveau_pushbuf
*, struct nouveau_bo
*,
225 uint32_t data
, uint32_t flags
,
226 uint32_t vor
, uint32_t tor
);
227 int nouveau_pushbuf_validate(struct nouveau_pushbuf
*);
228 uint32_t nouveau_pushbuf_refd(struct nouveau_pushbuf
*, struct nouveau_bo
*);
229 int nouveau_pushbuf_kick(struct nouveau_pushbuf
*, struct nouveau_object
*chan
);
230 struct nouveau_bufctx
*
231 nouveau_pushbuf_bufctx(struct nouveau_pushbuf
*, struct nouveau_bufctx
*);
233 #define NOUVEAU_DEVICE_CLASS 0x80000000
234 #define NOUVEAU_FIFO_CHANNEL_CLASS 0x80000001
235 #define NOUVEAU_NOTIFIER_CLASS 0x80000002
237 struct nouveau_fifo
{
238 struct nouveau_object
*object
;
245 struct nouveau_fifo base
;
252 struct nouveau_fifo base
;
256 #define NVE0_FIFO_ENGINE_GR 0x00000001
257 #define NVE0_FIFO_ENGINE_VP 0x00000002
258 #define NVE0_FIFO_ENGINE_PPP 0x00000004
259 #define NVE0_FIFO_ENGINE_BSP 0x00000008
260 #define NVE0_FIFO_ENGINE_CE0 0x00000010
261 #define NVE0_FIFO_ENGINE_CE1 0x00000020
262 #define NVE0_FIFO_ENGINE_ENC 0x00000040
266 struct nouveau_fifo base
;
273 struct nouveau_object
*object
;
279 nouveau_check_dead_channel(struct nouveau_drm
*, struct nouveau_object
*chan
);