xref: /openbmc/linux/include/uapi/drm/radeon_drm.h (revision 6db26a94)
1718dceddSDavid Howells /* radeon_drm.h -- Public header for the radeon driver -*- linux-c -*-
2718dceddSDavid Howells  *
3718dceddSDavid Howells  * Copyright 2000 Precision Insight, Inc., Cedar Park, Texas.
4718dceddSDavid Howells  * Copyright 2000 VA Linux Systems, Inc., Fremont, California.
5718dceddSDavid Howells  * Copyright 2002 Tungsten Graphics, Inc., Cedar Park, Texas.
6718dceddSDavid Howells  * All rights reserved.
7718dceddSDavid Howells  *
8718dceddSDavid Howells  * Permission is hereby granted, free of charge, to any person obtaining a
9718dceddSDavid Howells  * copy of this software and associated documentation files (the "Software"),
10718dceddSDavid Howells  * to deal in the Software without restriction, including without limitation
11718dceddSDavid Howells  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12718dceddSDavid Howells  * and/or sell copies of the Software, and to permit persons to whom the
13718dceddSDavid Howells  * Software is furnished to do so, subject to the following conditions:
14718dceddSDavid Howells  *
15718dceddSDavid Howells  * The above copyright notice and this permission notice (including the next
16718dceddSDavid Howells  * paragraph) shall be included in all copies or substantial portions of the
17718dceddSDavid Howells  * Software.
18718dceddSDavid Howells  *
19718dceddSDavid Howells  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20718dceddSDavid Howells  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21718dceddSDavid Howells  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
22718dceddSDavid Howells  * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
23718dceddSDavid Howells  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
24718dceddSDavid Howells  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25718dceddSDavid Howells  * DEALINGS IN THE SOFTWARE.
26718dceddSDavid Howells  *
27718dceddSDavid Howells  * Authors:
28718dceddSDavid Howells  *    Kevin E. Martin <martin@valinux.com>
29718dceddSDavid Howells  *    Gareth Hughes <gareth@valinux.com>
30718dceddSDavid Howells  *    Keith Whitwell <keith@tungstengraphics.com>
31718dceddSDavid Howells  */
32718dceddSDavid Howells 
33718dceddSDavid Howells #ifndef __RADEON_DRM_H__
34718dceddSDavid Howells #define __RADEON_DRM_H__
35718dceddSDavid Howells 
36e13af53eSMichel Dänzer #include "drm.h"
37718dceddSDavid Howells 
386db26a94SEmil Velikov #if defined(__cplusplus)
396db26a94SEmil Velikov extern "C" {
406db26a94SEmil Velikov #endif
416db26a94SEmil Velikov 
42718dceddSDavid Howells /* WARNING: If you change any of these defines, make sure to change the
43718dceddSDavid Howells  * defines in the X server file (radeon_sarea.h)
44718dceddSDavid Howells  */
45718dceddSDavid Howells #ifndef __RADEON_SAREA_DEFINES__
46718dceddSDavid Howells #define __RADEON_SAREA_DEFINES__
47718dceddSDavid Howells 
48718dceddSDavid Howells /* Old style state flags, required for sarea interface (1.1 and 1.2
49718dceddSDavid Howells  * clears) and 1.2 drm_vertex2 ioctl.
50718dceddSDavid Howells  */
51718dceddSDavid Howells #define RADEON_UPLOAD_CONTEXT		0x00000001
52718dceddSDavid Howells #define RADEON_UPLOAD_VERTFMT		0x00000002
53718dceddSDavid Howells #define RADEON_UPLOAD_LINE		0x00000004
54718dceddSDavid Howells #define RADEON_UPLOAD_BUMPMAP		0x00000008
55718dceddSDavid Howells #define RADEON_UPLOAD_MASKS		0x00000010
56718dceddSDavid Howells #define RADEON_UPLOAD_VIEWPORT		0x00000020
57718dceddSDavid Howells #define RADEON_UPLOAD_SETUP		0x00000040
58718dceddSDavid Howells #define RADEON_UPLOAD_TCL		0x00000080
59718dceddSDavid Howells #define RADEON_UPLOAD_MISC		0x00000100
60718dceddSDavid Howells #define RADEON_UPLOAD_TEX0		0x00000200
61718dceddSDavid Howells #define RADEON_UPLOAD_TEX1		0x00000400
62718dceddSDavid Howells #define RADEON_UPLOAD_TEX2		0x00000800
63718dceddSDavid Howells #define RADEON_UPLOAD_TEX0IMAGES	0x00001000
64718dceddSDavid Howells #define RADEON_UPLOAD_TEX1IMAGES	0x00002000
65718dceddSDavid Howells #define RADEON_UPLOAD_TEX2IMAGES	0x00004000
66718dceddSDavid Howells #define RADEON_UPLOAD_CLIPRECTS		0x00008000	/* handled client-side */
67718dceddSDavid Howells #define RADEON_REQUIRE_QUIESCENCE	0x00010000
68718dceddSDavid Howells #define RADEON_UPLOAD_ZBIAS		0x00020000	/* version 1.2 and newer */
69718dceddSDavid Howells #define RADEON_UPLOAD_ALL		0x003effff
70718dceddSDavid Howells #define RADEON_UPLOAD_CONTEXT_ALL       0x003e01ff
71718dceddSDavid Howells 
72718dceddSDavid Howells /* New style per-packet identifiers for use in cmd_buffer ioctl with
73718dceddSDavid Howells  * the RADEON_EMIT_PACKET command.  Comments relate new packets to old
74718dceddSDavid Howells  * state bits and the packet size:
75718dceddSDavid Howells  */
76718dceddSDavid Howells #define RADEON_EMIT_PP_MISC                         0	/* context/7 */
77718dceddSDavid Howells #define RADEON_EMIT_PP_CNTL                         1	/* context/3 */
78718dceddSDavid Howells #define RADEON_EMIT_RB3D_COLORPITCH                 2	/* context/1 */
79718dceddSDavid Howells #define RADEON_EMIT_RE_LINE_PATTERN                 3	/* line/2 */
80718dceddSDavid Howells #define RADEON_EMIT_SE_LINE_WIDTH                   4	/* line/1 */
81718dceddSDavid Howells #define RADEON_EMIT_PP_LUM_MATRIX                   5	/* bumpmap/1 */
82718dceddSDavid Howells #define RADEON_EMIT_PP_ROT_MATRIX_0                 6	/* bumpmap/2 */
83718dceddSDavid Howells #define RADEON_EMIT_RB3D_STENCILREFMASK             7	/* masks/3 */
84718dceddSDavid Howells #define RADEON_EMIT_SE_VPORT_XSCALE                 8	/* viewport/6 */
85718dceddSDavid Howells #define RADEON_EMIT_SE_CNTL                         9	/* setup/2 */
86718dceddSDavid Howells #define RADEON_EMIT_SE_CNTL_STATUS                  10	/* setup/1 */
87718dceddSDavid Howells #define RADEON_EMIT_RE_MISC                         11	/* misc/1 */
88718dceddSDavid Howells #define RADEON_EMIT_PP_TXFILTER_0                   12	/* tex0/6 */
89718dceddSDavid Howells #define RADEON_EMIT_PP_BORDER_COLOR_0               13	/* tex0/1 */
90718dceddSDavid Howells #define RADEON_EMIT_PP_TXFILTER_1                   14	/* tex1/6 */
91718dceddSDavid Howells #define RADEON_EMIT_PP_BORDER_COLOR_1               15	/* tex1/1 */
92718dceddSDavid Howells #define RADEON_EMIT_PP_TXFILTER_2                   16	/* tex2/6 */
93718dceddSDavid Howells #define RADEON_EMIT_PP_BORDER_COLOR_2               17	/* tex2/1 */
94718dceddSDavid Howells #define RADEON_EMIT_SE_ZBIAS_FACTOR                 18	/* zbias/2 */
95718dceddSDavid Howells #define RADEON_EMIT_SE_TCL_OUTPUT_VTX_FMT           19	/* tcl/11 */
96718dceddSDavid Howells #define RADEON_EMIT_SE_TCL_MATERIAL_EMMISSIVE_RED   20	/* material/17 */
97718dceddSDavid Howells #define R200_EMIT_PP_TXCBLEND_0                     21	/* tex0/4 */
98718dceddSDavid Howells #define R200_EMIT_PP_TXCBLEND_1                     22	/* tex1/4 */
99718dceddSDavid Howells #define R200_EMIT_PP_TXCBLEND_2                     23	/* tex2/4 */
100718dceddSDavid Howells #define R200_EMIT_PP_TXCBLEND_3                     24	/* tex3/4 */
101718dceddSDavid Howells #define R200_EMIT_PP_TXCBLEND_4                     25	/* tex4/4 */
102718dceddSDavid Howells #define R200_EMIT_PP_TXCBLEND_5                     26	/* tex5/4 */
103718dceddSDavid Howells #define R200_EMIT_PP_TXCBLEND_6                     27	/* /4 */
104718dceddSDavid Howells #define R200_EMIT_PP_TXCBLEND_7                     28	/* /4 */
105718dceddSDavid Howells #define R200_EMIT_TCL_LIGHT_MODEL_CTL_0             29	/* tcl/7 */
106718dceddSDavid Howells #define R200_EMIT_TFACTOR_0                         30	/* tf/7 */
107718dceddSDavid Howells #define R200_EMIT_VTX_FMT_0                         31	/* vtx/5 */
108718dceddSDavid Howells #define R200_EMIT_VAP_CTL                           32	/* vap/1 */
109718dceddSDavid Howells #define R200_EMIT_MATRIX_SELECT_0                   33	/* msl/5 */
110718dceddSDavid Howells #define R200_EMIT_TEX_PROC_CTL_2                    34	/* tcg/5 */
111718dceddSDavid Howells #define R200_EMIT_TCL_UCP_VERT_BLEND_CTL            35	/* tcl/1 */
112718dceddSDavid Howells #define R200_EMIT_PP_TXFILTER_0                     36	/* tex0/6 */
113718dceddSDavid Howells #define R200_EMIT_PP_TXFILTER_1                     37	/* tex1/6 */
114718dceddSDavid Howells #define R200_EMIT_PP_TXFILTER_2                     38	/* tex2/6 */
115718dceddSDavid Howells #define R200_EMIT_PP_TXFILTER_3                     39	/* tex3/6 */
116718dceddSDavid Howells #define R200_EMIT_PP_TXFILTER_4                     40	/* tex4/6 */
117718dceddSDavid Howells #define R200_EMIT_PP_TXFILTER_5                     41	/* tex5/6 */
118718dceddSDavid Howells #define R200_EMIT_PP_TXOFFSET_0                     42	/* tex0/1 */
119718dceddSDavid Howells #define R200_EMIT_PP_TXOFFSET_1                     43	/* tex1/1 */
120718dceddSDavid Howells #define R200_EMIT_PP_TXOFFSET_2                     44	/* tex2/1 */
121718dceddSDavid Howells #define R200_EMIT_PP_TXOFFSET_3                     45	/* tex3/1 */
122718dceddSDavid Howells #define R200_EMIT_PP_TXOFFSET_4                     46	/* tex4/1 */
123718dceddSDavid Howells #define R200_EMIT_PP_TXOFFSET_5                     47	/* tex5/1 */
124718dceddSDavid Howells #define R200_EMIT_VTE_CNTL                          48	/* vte/1 */
125718dceddSDavid Howells #define R200_EMIT_OUTPUT_VTX_COMP_SEL               49	/* vtx/1 */
126718dceddSDavid Howells #define R200_EMIT_PP_TAM_DEBUG3                     50	/* tam/1 */
127718dceddSDavid Howells #define R200_EMIT_PP_CNTL_X                         51	/* cst/1 */
128718dceddSDavid Howells #define R200_EMIT_RB3D_DEPTHXY_OFFSET               52	/* cst/1 */
129718dceddSDavid Howells #define R200_EMIT_RE_AUX_SCISSOR_CNTL               53	/* cst/1 */
130718dceddSDavid Howells #define R200_EMIT_RE_SCISSOR_TL_0                   54	/* cst/2 */
131718dceddSDavid Howells #define R200_EMIT_RE_SCISSOR_TL_1                   55	/* cst/2 */
132718dceddSDavid Howells #define R200_EMIT_RE_SCISSOR_TL_2                   56	/* cst/2 */
133718dceddSDavid Howells #define R200_EMIT_SE_VAP_CNTL_STATUS                57	/* cst/1 */
134718dceddSDavid Howells #define R200_EMIT_SE_VTX_STATE_CNTL                 58	/* cst/1 */
135718dceddSDavid Howells #define R200_EMIT_RE_POINTSIZE                      59	/* cst/1 */
136718dceddSDavid Howells #define R200_EMIT_TCL_INPUT_VTX_VECTOR_ADDR_0       60	/* cst/4 */
137718dceddSDavid Howells #define R200_EMIT_PP_CUBIC_FACES_0                  61
138718dceddSDavid Howells #define R200_EMIT_PP_CUBIC_OFFSETS_0                62
139718dceddSDavid Howells #define R200_EMIT_PP_CUBIC_FACES_1                  63
140718dceddSDavid Howells #define R200_EMIT_PP_CUBIC_OFFSETS_1                64
141718dceddSDavid Howells #define R200_EMIT_PP_CUBIC_FACES_2                  65
142718dceddSDavid Howells #define R200_EMIT_PP_CUBIC_OFFSETS_2                66
143718dceddSDavid Howells #define R200_EMIT_PP_CUBIC_FACES_3                  67
144718dceddSDavid Howells #define R200_EMIT_PP_CUBIC_OFFSETS_3                68
145718dceddSDavid Howells #define R200_EMIT_PP_CUBIC_FACES_4                  69
146718dceddSDavid Howells #define R200_EMIT_PP_CUBIC_OFFSETS_4                70
147718dceddSDavid Howells #define R200_EMIT_PP_CUBIC_FACES_5                  71
148718dceddSDavid Howells #define R200_EMIT_PP_CUBIC_OFFSETS_5                72
149718dceddSDavid Howells #define RADEON_EMIT_PP_TEX_SIZE_0                   73
150718dceddSDavid Howells #define RADEON_EMIT_PP_TEX_SIZE_1                   74
151718dceddSDavid Howells #define RADEON_EMIT_PP_TEX_SIZE_2                   75
152718dceddSDavid Howells #define R200_EMIT_RB3D_BLENDCOLOR                   76
153718dceddSDavid Howells #define R200_EMIT_TCL_POINT_SPRITE_CNTL             77
154718dceddSDavid Howells #define RADEON_EMIT_PP_CUBIC_FACES_0                78
155718dceddSDavid Howells #define RADEON_EMIT_PP_CUBIC_OFFSETS_T0             79
156718dceddSDavid Howells #define RADEON_EMIT_PP_CUBIC_FACES_1                80
157718dceddSDavid Howells #define RADEON_EMIT_PP_CUBIC_OFFSETS_T1             81
158718dceddSDavid Howells #define RADEON_EMIT_PP_CUBIC_FACES_2                82
159718dceddSDavid Howells #define RADEON_EMIT_PP_CUBIC_OFFSETS_T2             83
160718dceddSDavid Howells #define R200_EMIT_PP_TRI_PERF_CNTL                  84
161718dceddSDavid Howells #define R200_EMIT_PP_AFS_0                          85
162718dceddSDavid Howells #define R200_EMIT_PP_AFS_1                          86
163718dceddSDavid Howells #define R200_EMIT_ATF_TFACTOR                       87
164718dceddSDavid Howells #define R200_EMIT_PP_TXCTLALL_0                     88
165718dceddSDavid Howells #define R200_EMIT_PP_TXCTLALL_1                     89
166718dceddSDavid Howells #define R200_EMIT_PP_TXCTLALL_2                     90
167718dceddSDavid Howells #define R200_EMIT_PP_TXCTLALL_3                     91
168718dceddSDavid Howells #define R200_EMIT_PP_TXCTLALL_4                     92
169718dceddSDavid Howells #define R200_EMIT_PP_TXCTLALL_5                     93
170718dceddSDavid Howells #define R200_EMIT_VAP_PVS_CNTL                      94
171718dceddSDavid Howells #define RADEON_MAX_STATE_PACKETS                    95
172718dceddSDavid Howells 
173718dceddSDavid Howells /* Commands understood by cmd_buffer ioctl.  More can be added but
174718dceddSDavid Howells  * obviously these can't be removed or changed:
175718dceddSDavid Howells  */
176718dceddSDavid Howells #define RADEON_CMD_PACKET      1	/* emit one of the register packets above */
177718dceddSDavid Howells #define RADEON_CMD_SCALARS     2	/* emit scalar data */
178718dceddSDavid Howells #define RADEON_CMD_VECTORS     3	/* emit vector data */
179718dceddSDavid Howells #define RADEON_CMD_DMA_DISCARD 4	/* discard current dma buf */
180718dceddSDavid Howells #define RADEON_CMD_PACKET3     5	/* emit hw packet */
181718dceddSDavid Howells #define RADEON_CMD_PACKET3_CLIP 6	/* emit hw packet wrapped in cliprects */
182718dceddSDavid Howells #define RADEON_CMD_SCALARS2     7	/* r200 stopgap */
183718dceddSDavid Howells #define RADEON_CMD_WAIT         8	/* emit hw wait commands -- note:
184718dceddSDavid Howells 					 *  doesn't make the cpu wait, just
185718dceddSDavid Howells 					 *  the graphics hardware */
186718dceddSDavid Howells #define RADEON_CMD_VECLINEAR	9       /* another r200 stopgap */
187718dceddSDavid Howells 
188718dceddSDavid Howells typedef union {
189718dceddSDavid Howells 	int i;
190718dceddSDavid Howells 	struct {
191718dceddSDavid Howells 		unsigned char cmd_type, pad0, pad1, pad2;
192718dceddSDavid Howells 	} header;
193718dceddSDavid Howells 	struct {
194718dceddSDavid Howells 		unsigned char cmd_type, packet_id, pad0, pad1;
195718dceddSDavid Howells 	} packet;
196718dceddSDavid Howells 	struct {
197718dceddSDavid Howells 		unsigned char cmd_type, offset, stride, count;
198718dceddSDavid Howells 	} scalars;
199718dceddSDavid Howells 	struct {
200718dceddSDavid Howells 		unsigned char cmd_type, offset, stride, count;
201718dceddSDavid Howells 	} vectors;
202718dceddSDavid Howells 	struct {
203718dceddSDavid Howells 		unsigned char cmd_type, addr_lo, addr_hi, count;
204718dceddSDavid Howells 	} veclinear;
205718dceddSDavid Howells 	struct {
206718dceddSDavid Howells 		unsigned char cmd_type, buf_idx, pad0, pad1;
207718dceddSDavid Howells 	} dma;
208718dceddSDavid Howells 	struct {
209718dceddSDavid Howells 		unsigned char cmd_type, flags, pad0, pad1;
210718dceddSDavid Howells 	} wait;
211718dceddSDavid Howells } drm_radeon_cmd_header_t;
212718dceddSDavid Howells 
213718dceddSDavid Howells #define RADEON_WAIT_2D  0x1
214718dceddSDavid Howells #define RADEON_WAIT_3D  0x2
215718dceddSDavid Howells 
216718dceddSDavid Howells /* Allowed parameters for R300_CMD_PACKET3
217718dceddSDavid Howells  */
218718dceddSDavid Howells #define R300_CMD_PACKET3_CLEAR		0
219718dceddSDavid Howells #define R300_CMD_PACKET3_RAW		1
220718dceddSDavid Howells 
221718dceddSDavid Howells /* Commands understood by cmd_buffer ioctl for R300.
222718dceddSDavid Howells  * The interface has not been stabilized, so some of these may be removed
223718dceddSDavid Howells  * and eventually reordered before stabilization.
224718dceddSDavid Howells  */
225718dceddSDavid Howells #define R300_CMD_PACKET0		1
226718dceddSDavid Howells #define R300_CMD_VPU			2	/* emit vertex program upload */
227718dceddSDavid Howells #define R300_CMD_PACKET3		3	/* emit a packet3 */
228718dceddSDavid Howells #define R300_CMD_END3D			4	/* emit sequence ending 3d rendering */
229718dceddSDavid Howells #define R300_CMD_CP_DELAY		5
230718dceddSDavid Howells #define R300_CMD_DMA_DISCARD		6
231718dceddSDavid Howells #define R300_CMD_WAIT			7
232718dceddSDavid Howells #	define R300_WAIT_2D		0x1
233718dceddSDavid Howells #	define R300_WAIT_3D		0x2
234718dceddSDavid Howells /* these two defines are DOING IT WRONG - however
235718dceddSDavid Howells  * we have userspace which relies on using these.
236718dceddSDavid Howells  * The wait interface is backwards compat new
237718dceddSDavid Howells  * code should use the NEW_WAIT defines below
238718dceddSDavid Howells  * THESE ARE NOT BIT FIELDS
239718dceddSDavid Howells  */
240718dceddSDavid Howells #	define R300_WAIT_2D_CLEAN	0x3
241718dceddSDavid Howells #	define R300_WAIT_3D_CLEAN	0x4
242718dceddSDavid Howells 
243718dceddSDavid Howells #	define R300_NEW_WAIT_2D_3D	0x3
244718dceddSDavid Howells #	define R300_NEW_WAIT_2D_2D_CLEAN	0x4
245718dceddSDavid Howells #	define R300_NEW_WAIT_3D_3D_CLEAN	0x6
246718dceddSDavid Howells #	define R300_NEW_WAIT_2D_2D_CLEAN_3D_3D_CLEAN	0x8
247718dceddSDavid Howells 
248718dceddSDavid Howells #define R300_CMD_SCRATCH		8
249718dceddSDavid Howells #define R300_CMD_R500FP                 9
250718dceddSDavid Howells 
251718dceddSDavid Howells typedef union {
252718dceddSDavid Howells 	unsigned int u;
253718dceddSDavid Howells 	struct {
254718dceddSDavid Howells 		unsigned char cmd_type, pad0, pad1, pad2;
255718dceddSDavid Howells 	} header;
256718dceddSDavid Howells 	struct {
257718dceddSDavid Howells 		unsigned char cmd_type, count, reglo, reghi;
258718dceddSDavid Howells 	} packet0;
259718dceddSDavid Howells 	struct {
260718dceddSDavid Howells 		unsigned char cmd_type, count, adrlo, adrhi;
261718dceddSDavid Howells 	} vpu;
262718dceddSDavid Howells 	struct {
263718dceddSDavid Howells 		unsigned char cmd_type, packet, pad0, pad1;
264718dceddSDavid Howells 	} packet3;
265718dceddSDavid Howells 	struct {
266718dceddSDavid Howells 		unsigned char cmd_type, packet;
267718dceddSDavid Howells 		unsigned short count;	/* amount of packet2 to emit */
268718dceddSDavid Howells 	} delay;
269718dceddSDavid Howells 	struct {
270718dceddSDavid Howells 		unsigned char cmd_type, buf_idx, pad0, pad1;
271718dceddSDavid Howells 	} dma;
272718dceddSDavid Howells 	struct {
273718dceddSDavid Howells 		unsigned char cmd_type, flags, pad0, pad1;
274718dceddSDavid Howells 	} wait;
275718dceddSDavid Howells 	struct {
276718dceddSDavid Howells 		unsigned char cmd_type, reg, n_bufs, flags;
277718dceddSDavid Howells 	} scratch;
278718dceddSDavid Howells 	struct {
279718dceddSDavid Howells 		unsigned char cmd_type, count, adrlo, adrhi_flags;
280718dceddSDavid Howells 	} r500fp;
281718dceddSDavid Howells } drm_r300_cmd_header_t;
282718dceddSDavid Howells 
283718dceddSDavid Howells #define RADEON_FRONT			0x1
284718dceddSDavid Howells #define RADEON_BACK			0x2
285718dceddSDavid Howells #define RADEON_DEPTH			0x4
286718dceddSDavid Howells #define RADEON_STENCIL			0x8
287718dceddSDavid Howells #define RADEON_CLEAR_FASTZ		0x80000000
288718dceddSDavid Howells #define RADEON_USE_HIERZ		0x40000000
289718dceddSDavid Howells #define RADEON_USE_COMP_ZBUF		0x20000000
290718dceddSDavid Howells 
291718dceddSDavid Howells #define R500FP_CONSTANT_TYPE  (1 << 1)
292718dceddSDavid Howells #define R500FP_CONSTANT_CLAMP (1 << 2)
293718dceddSDavid Howells 
294718dceddSDavid Howells /* Primitive types
295718dceddSDavid Howells  */
296718dceddSDavid Howells #define RADEON_POINTS			0x1
297718dceddSDavid Howells #define RADEON_LINES			0x2
298718dceddSDavid Howells #define RADEON_LINE_STRIP		0x3
299718dceddSDavid Howells #define RADEON_TRIANGLES		0x4
300718dceddSDavid Howells #define RADEON_TRIANGLE_FAN		0x5
301718dceddSDavid Howells #define RADEON_TRIANGLE_STRIP		0x6
302718dceddSDavid Howells 
303718dceddSDavid Howells /* Vertex/indirect buffer size
304718dceddSDavid Howells  */
305718dceddSDavid Howells #define RADEON_BUFFER_SIZE		65536
306718dceddSDavid Howells 
307718dceddSDavid Howells /* Byte offsets for indirect buffer data
308718dceddSDavid Howells  */
309718dceddSDavid Howells #define RADEON_INDEX_PRIM_OFFSET	20
310718dceddSDavid Howells 
311718dceddSDavid Howells #define RADEON_SCRATCH_REG_OFFSET	32
312718dceddSDavid Howells 
313718dceddSDavid Howells #define R600_SCRATCH_REG_OFFSET         256
314718dceddSDavid Howells 
315718dceddSDavid Howells #define RADEON_NR_SAREA_CLIPRECTS	12
316718dceddSDavid Howells 
317718dceddSDavid Howells /* There are 2 heaps (local/GART).  Each region within a heap is a
318718dceddSDavid Howells  * minimum of 64k, and there are at most 64 of them per heap.
319718dceddSDavid Howells  */
320718dceddSDavid Howells #define RADEON_LOCAL_TEX_HEAP		0
321718dceddSDavid Howells #define RADEON_GART_TEX_HEAP		1
322718dceddSDavid Howells #define RADEON_NR_TEX_HEAPS		2
323718dceddSDavid Howells #define RADEON_NR_TEX_REGIONS		64
324718dceddSDavid Howells #define RADEON_LOG_TEX_GRANULARITY	16
325718dceddSDavid Howells 
326718dceddSDavid Howells #define RADEON_MAX_TEXTURE_LEVELS	12
327718dceddSDavid Howells #define RADEON_MAX_TEXTURE_UNITS	3
328718dceddSDavid Howells 
329718dceddSDavid Howells #define RADEON_MAX_SURFACES		8
330718dceddSDavid Howells 
331718dceddSDavid Howells /* Blits have strict offset rules.  All blit offset must be aligned on
332718dceddSDavid Howells  * a 1K-byte boundary.
333718dceddSDavid Howells  */
334718dceddSDavid Howells #define RADEON_OFFSET_SHIFT             10
335718dceddSDavid Howells #define RADEON_OFFSET_ALIGN             (1 << RADEON_OFFSET_SHIFT)
336718dceddSDavid Howells #define RADEON_OFFSET_MASK              (RADEON_OFFSET_ALIGN - 1)
337718dceddSDavid Howells 
338718dceddSDavid Howells #endif				/* __RADEON_SAREA_DEFINES__ */
339718dceddSDavid Howells 
340718dceddSDavid Howells typedef struct {
341718dceddSDavid Howells 	unsigned int red;
342718dceddSDavid Howells 	unsigned int green;
343718dceddSDavid Howells 	unsigned int blue;
344718dceddSDavid Howells 	unsigned int alpha;
345718dceddSDavid Howells } radeon_color_regs_t;
346718dceddSDavid Howells 
347718dceddSDavid Howells typedef struct {
348718dceddSDavid Howells 	/* Context state */
349718dceddSDavid Howells 	unsigned int pp_misc;	/* 0x1c14 */
350718dceddSDavid Howells 	unsigned int pp_fog_color;
351718dceddSDavid Howells 	unsigned int re_solid_color;
352718dceddSDavid Howells 	unsigned int rb3d_blendcntl;
353718dceddSDavid Howells 	unsigned int rb3d_depthoffset;
354718dceddSDavid Howells 	unsigned int rb3d_depthpitch;
355718dceddSDavid Howells 	unsigned int rb3d_zstencilcntl;
356718dceddSDavid Howells 
357718dceddSDavid Howells 	unsigned int pp_cntl;	/* 0x1c38 */
358718dceddSDavid Howells 	unsigned int rb3d_cntl;
359718dceddSDavid Howells 	unsigned int rb3d_coloroffset;
360718dceddSDavid Howells 	unsigned int re_width_height;
361718dceddSDavid Howells 	unsigned int rb3d_colorpitch;
362718dceddSDavid Howells 	unsigned int se_cntl;
363718dceddSDavid Howells 
364718dceddSDavid Howells 	/* Vertex format state */
365718dceddSDavid Howells 	unsigned int se_coord_fmt;	/* 0x1c50 */
366718dceddSDavid Howells 
367718dceddSDavid Howells 	/* Line state */
368718dceddSDavid Howells 	unsigned int re_line_pattern;	/* 0x1cd0 */
369718dceddSDavid Howells 	unsigned int re_line_state;
370718dceddSDavid Howells 
371718dceddSDavid Howells 	unsigned int se_line_width;	/* 0x1db8 */
372718dceddSDavid Howells 
373718dceddSDavid Howells 	/* Bumpmap state */
374718dceddSDavid Howells 	unsigned int pp_lum_matrix;	/* 0x1d00 */
375718dceddSDavid Howells 
376718dceddSDavid Howells 	unsigned int pp_rot_matrix_0;	/* 0x1d58 */
377718dceddSDavid Howells 	unsigned int pp_rot_matrix_1;
378718dceddSDavid Howells 
379718dceddSDavid Howells 	/* Mask state */
380718dceddSDavid Howells 	unsigned int rb3d_stencilrefmask;	/* 0x1d7c */
381718dceddSDavid Howells 	unsigned int rb3d_ropcntl;
382718dceddSDavid Howells 	unsigned int rb3d_planemask;
383718dceddSDavid Howells 
384718dceddSDavid Howells 	/* Viewport state */
385718dceddSDavid Howells 	unsigned int se_vport_xscale;	/* 0x1d98 */
386718dceddSDavid Howells 	unsigned int se_vport_xoffset;
387718dceddSDavid Howells 	unsigned int se_vport_yscale;
388718dceddSDavid Howells 	unsigned int se_vport_yoffset;
389718dceddSDavid Howells 	unsigned int se_vport_zscale;
390718dceddSDavid Howells 	unsigned int se_vport_zoffset;
391718dceddSDavid Howells 
392718dceddSDavid Howells 	/* Setup state */
393718dceddSDavid Howells 	unsigned int se_cntl_status;	/* 0x2140 */
394718dceddSDavid Howells 
395718dceddSDavid Howells 	/* Misc state */
396718dceddSDavid Howells 	unsigned int re_top_left;	/* 0x26c0 */
397718dceddSDavid Howells 	unsigned int re_misc;
398718dceddSDavid Howells } drm_radeon_context_regs_t;
399718dceddSDavid Howells 
400718dceddSDavid Howells typedef struct {
401718dceddSDavid Howells 	/* Zbias state */
402718dceddSDavid Howells 	unsigned int se_zbias_factor;	/* 0x1dac */
403718dceddSDavid Howells 	unsigned int se_zbias_constant;
404718dceddSDavid Howells } drm_radeon_context2_regs_t;
405718dceddSDavid Howells 
406718dceddSDavid Howells /* Setup registers for each texture unit
407718dceddSDavid Howells  */
408718dceddSDavid Howells typedef struct {
409718dceddSDavid Howells 	unsigned int pp_txfilter;
410718dceddSDavid Howells 	unsigned int pp_txformat;
411718dceddSDavid Howells 	unsigned int pp_txoffset;
412718dceddSDavid Howells 	unsigned int pp_txcblend;
413718dceddSDavid Howells 	unsigned int pp_txablend;
414718dceddSDavid Howells 	unsigned int pp_tfactor;
415718dceddSDavid Howells 	unsigned int pp_border_color;
416718dceddSDavid Howells } drm_radeon_texture_regs_t;
417718dceddSDavid Howells 
418718dceddSDavid Howells typedef struct {
419718dceddSDavid Howells 	unsigned int start;
420718dceddSDavid Howells 	unsigned int finish;
421718dceddSDavid Howells 	unsigned int prim:8;
422718dceddSDavid Howells 	unsigned int stateidx:8;
423718dceddSDavid Howells 	unsigned int numverts:16;	/* overloaded as offset/64 for elt prims */
424718dceddSDavid Howells 	unsigned int vc_format;	/* vertex format */
425718dceddSDavid Howells } drm_radeon_prim_t;
426718dceddSDavid Howells 
427718dceddSDavid Howells typedef struct {
428718dceddSDavid Howells 	drm_radeon_context_regs_t context;
429718dceddSDavid Howells 	drm_radeon_texture_regs_t tex[RADEON_MAX_TEXTURE_UNITS];
430718dceddSDavid Howells 	drm_radeon_context2_regs_t context2;
431718dceddSDavid Howells 	unsigned int dirty;
432718dceddSDavid Howells } drm_radeon_state_t;
433718dceddSDavid Howells 
434718dceddSDavid Howells typedef struct {
435718dceddSDavid Howells 	/* The channel for communication of state information to the
436718dceddSDavid Howells 	 * kernel on firing a vertex buffer with either of the
437718dceddSDavid Howells 	 * obsoleted vertex/index ioctls.
438718dceddSDavid Howells 	 */
439718dceddSDavid Howells 	drm_radeon_context_regs_t context_state;
440718dceddSDavid Howells 	drm_radeon_texture_regs_t tex_state[RADEON_MAX_TEXTURE_UNITS];
441718dceddSDavid Howells 	unsigned int dirty;
442718dceddSDavid Howells 	unsigned int vertsize;
443718dceddSDavid Howells 	unsigned int vc_format;
444718dceddSDavid Howells 
445718dceddSDavid Howells 	/* The current cliprects, or a subset thereof.
446718dceddSDavid Howells 	 */
447718dceddSDavid Howells 	struct drm_clip_rect boxes[RADEON_NR_SAREA_CLIPRECTS];
448718dceddSDavid Howells 	unsigned int nbox;
449718dceddSDavid Howells 
450718dceddSDavid Howells 	/* Counters for client-side throttling of rendering clients.
451718dceddSDavid Howells 	 */
452718dceddSDavid Howells 	unsigned int last_frame;
453718dceddSDavid Howells 	unsigned int last_dispatch;
454718dceddSDavid Howells 	unsigned int last_clear;
455718dceddSDavid Howells 
456718dceddSDavid Howells 	struct drm_tex_region tex_list[RADEON_NR_TEX_HEAPS][RADEON_NR_TEX_REGIONS +
457718dceddSDavid Howells 						       1];
458718dceddSDavid Howells 	unsigned int tex_age[RADEON_NR_TEX_HEAPS];
459718dceddSDavid Howells 	int ctx_owner;
460718dceddSDavid Howells 	int pfState;		/* number of 3d windows (0,1,2ormore) */
461718dceddSDavid Howells 	int pfCurrentPage;	/* which buffer is being displayed? */
462718dceddSDavid Howells 	int crtc2_base;		/* CRTC2 frame offset */
463718dceddSDavid Howells 	int tiling_enabled;	/* set by drm, read by 2d + 3d clients */
464718dceddSDavid Howells } drm_radeon_sarea_t;
465718dceddSDavid Howells 
466718dceddSDavid Howells /* WARNING: If you change any of these defines, make sure to change the
467718dceddSDavid Howells  * defines in the Xserver file (xf86drmRadeon.h)
468718dceddSDavid Howells  *
469718dceddSDavid Howells  * KW: actually it's illegal to change any of this (backwards compatibility).
470718dceddSDavid Howells  */
471718dceddSDavid Howells 
472718dceddSDavid Howells /* Radeon specific ioctls
473718dceddSDavid Howells  * The device specific ioctl range is 0x40 to 0x79.
474718dceddSDavid Howells  */
475718dceddSDavid Howells #define DRM_RADEON_CP_INIT    0x00
476718dceddSDavid Howells #define DRM_RADEON_CP_START   0x01
477718dceddSDavid Howells #define DRM_RADEON_CP_STOP    0x02
478718dceddSDavid Howells #define DRM_RADEON_CP_RESET   0x03
479718dceddSDavid Howells #define DRM_RADEON_CP_IDLE    0x04
480718dceddSDavid Howells #define DRM_RADEON_RESET      0x05
481718dceddSDavid Howells #define DRM_RADEON_FULLSCREEN 0x06
482718dceddSDavid Howells #define DRM_RADEON_SWAP       0x07
483718dceddSDavid Howells #define DRM_RADEON_CLEAR      0x08
484718dceddSDavid Howells #define DRM_RADEON_VERTEX     0x09
485718dceddSDavid Howells #define DRM_RADEON_INDICES    0x0A
486718dceddSDavid Howells #define DRM_RADEON_NOT_USED
487718dceddSDavid Howells #define DRM_RADEON_STIPPLE    0x0C
488718dceddSDavid Howells #define DRM_RADEON_INDIRECT   0x0D
489718dceddSDavid Howells #define DRM_RADEON_TEXTURE    0x0E
490718dceddSDavid Howells #define DRM_RADEON_VERTEX2    0x0F
491718dceddSDavid Howells #define DRM_RADEON_CMDBUF     0x10
492718dceddSDavid Howells #define DRM_RADEON_GETPARAM   0x11
493718dceddSDavid Howells #define DRM_RADEON_FLIP       0x12
494718dceddSDavid Howells #define DRM_RADEON_ALLOC      0x13
495718dceddSDavid Howells #define DRM_RADEON_FREE       0x14
496718dceddSDavid Howells #define DRM_RADEON_INIT_HEAP  0x15
497718dceddSDavid Howells #define DRM_RADEON_IRQ_EMIT   0x16
498718dceddSDavid Howells #define DRM_RADEON_IRQ_WAIT   0x17
499718dceddSDavid Howells #define DRM_RADEON_CP_RESUME  0x18
500718dceddSDavid Howells #define DRM_RADEON_SETPARAM   0x19
501718dceddSDavid Howells #define DRM_RADEON_SURF_ALLOC 0x1a
502718dceddSDavid Howells #define DRM_RADEON_SURF_FREE  0x1b
503718dceddSDavid Howells /* KMS ioctl */
504718dceddSDavid Howells #define DRM_RADEON_GEM_INFO		0x1c
505718dceddSDavid Howells #define DRM_RADEON_GEM_CREATE		0x1d
506718dceddSDavid Howells #define DRM_RADEON_GEM_MMAP		0x1e
507718dceddSDavid Howells #define DRM_RADEON_GEM_PREAD		0x21
508718dceddSDavid Howells #define DRM_RADEON_GEM_PWRITE		0x22
509718dceddSDavid Howells #define DRM_RADEON_GEM_SET_DOMAIN	0x23
510718dceddSDavid Howells #define DRM_RADEON_GEM_WAIT_IDLE	0x24
511718dceddSDavid Howells #define DRM_RADEON_CS			0x26
512718dceddSDavid Howells #define DRM_RADEON_INFO			0x27
513718dceddSDavid Howells #define DRM_RADEON_GEM_SET_TILING	0x28
514718dceddSDavid Howells #define DRM_RADEON_GEM_GET_TILING	0x29
515718dceddSDavid Howells #define DRM_RADEON_GEM_BUSY		0x2a
516718dceddSDavid Howells #define DRM_RADEON_GEM_VA		0x2b
517bda72d58SMarek Olšák #define DRM_RADEON_GEM_OP		0x2c
518f72a113aSChristian König #define DRM_RADEON_GEM_USERPTR		0x2d
519718dceddSDavid Howells 
520718dceddSDavid Howells #define DRM_IOCTL_RADEON_CP_INIT    DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_CP_INIT, drm_radeon_init_t)
521718dceddSDavid Howells #define DRM_IOCTL_RADEON_CP_START   DRM_IO(  DRM_COMMAND_BASE + DRM_RADEON_CP_START)
522718dceddSDavid Howells #define DRM_IOCTL_RADEON_CP_STOP    DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_CP_STOP, drm_radeon_cp_stop_t)
523718dceddSDavid Howells #define DRM_IOCTL_RADEON_CP_RESET   DRM_IO(  DRM_COMMAND_BASE + DRM_RADEON_CP_RESET)
524718dceddSDavid Howells #define DRM_IOCTL_RADEON_CP_IDLE    DRM_IO(  DRM_COMMAND_BASE + DRM_RADEON_CP_IDLE)
525718dceddSDavid Howells #define DRM_IOCTL_RADEON_RESET      DRM_IO(  DRM_COMMAND_BASE + DRM_RADEON_RESET)
526718dceddSDavid Howells #define DRM_IOCTL_RADEON_FULLSCREEN DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_FULLSCREEN, drm_radeon_fullscreen_t)
527718dceddSDavid Howells #define DRM_IOCTL_RADEON_SWAP       DRM_IO(  DRM_COMMAND_BASE + DRM_RADEON_SWAP)
528718dceddSDavid Howells #define DRM_IOCTL_RADEON_CLEAR      DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_CLEAR, drm_radeon_clear_t)
529718dceddSDavid Howells #define DRM_IOCTL_RADEON_VERTEX     DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_VERTEX, drm_radeon_vertex_t)
530718dceddSDavid Howells #define DRM_IOCTL_RADEON_INDICES    DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_INDICES, drm_radeon_indices_t)
531718dceddSDavid Howells #define DRM_IOCTL_RADEON_STIPPLE    DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_STIPPLE, drm_radeon_stipple_t)
532718dceddSDavid Howells #define DRM_IOCTL_RADEON_INDIRECT   DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_INDIRECT, drm_radeon_indirect_t)
533718dceddSDavid Howells #define DRM_IOCTL_RADEON_TEXTURE    DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_TEXTURE, drm_radeon_texture_t)
534718dceddSDavid Howells #define DRM_IOCTL_RADEON_VERTEX2    DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_VERTEX2, drm_radeon_vertex2_t)
535718dceddSDavid Howells #define DRM_IOCTL_RADEON_CMDBUF     DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_CMDBUF, drm_radeon_cmd_buffer_t)
536718dceddSDavid Howells #define DRM_IOCTL_RADEON_GETPARAM   DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GETPARAM, drm_radeon_getparam_t)
537718dceddSDavid Howells #define DRM_IOCTL_RADEON_FLIP       DRM_IO(  DRM_COMMAND_BASE + DRM_RADEON_FLIP)
538718dceddSDavid Howells #define DRM_IOCTL_RADEON_ALLOC      DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_ALLOC, drm_radeon_mem_alloc_t)
539718dceddSDavid Howells #define DRM_IOCTL_RADEON_FREE       DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_FREE, drm_radeon_mem_free_t)
540718dceddSDavid Howells #define DRM_IOCTL_RADEON_INIT_HEAP  DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_INIT_HEAP, drm_radeon_mem_init_heap_t)
541718dceddSDavid Howells #define DRM_IOCTL_RADEON_IRQ_EMIT   DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_IRQ_EMIT, drm_radeon_irq_emit_t)
542718dceddSDavid Howells #define DRM_IOCTL_RADEON_IRQ_WAIT   DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_IRQ_WAIT, drm_radeon_irq_wait_t)
543718dceddSDavid Howells #define DRM_IOCTL_RADEON_CP_RESUME  DRM_IO(  DRM_COMMAND_BASE + DRM_RADEON_CP_RESUME)
544718dceddSDavid Howells #define DRM_IOCTL_RADEON_SETPARAM   DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_SETPARAM, drm_radeon_setparam_t)
545718dceddSDavid Howells #define DRM_IOCTL_RADEON_SURF_ALLOC DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_SURF_ALLOC, drm_radeon_surface_alloc_t)
546718dceddSDavid Howells #define DRM_IOCTL_RADEON_SURF_FREE  DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_SURF_FREE, drm_radeon_surface_free_t)
547718dceddSDavid Howells /* KMS */
548718dceddSDavid Howells #define DRM_IOCTL_RADEON_GEM_INFO	DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_INFO, struct drm_radeon_gem_info)
549718dceddSDavid Howells #define DRM_IOCTL_RADEON_GEM_CREATE	DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_CREATE, struct drm_radeon_gem_create)
550718dceddSDavid Howells #define DRM_IOCTL_RADEON_GEM_MMAP	DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_MMAP, struct drm_radeon_gem_mmap)
551718dceddSDavid Howells #define DRM_IOCTL_RADEON_GEM_PREAD	DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_PREAD, struct drm_radeon_gem_pread)
552718dceddSDavid Howells #define DRM_IOCTL_RADEON_GEM_PWRITE	DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_PWRITE, struct drm_radeon_gem_pwrite)
553718dceddSDavid Howells #define DRM_IOCTL_RADEON_GEM_SET_DOMAIN	DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_SET_DOMAIN, struct drm_radeon_gem_set_domain)
554718dceddSDavid Howells #define DRM_IOCTL_RADEON_GEM_WAIT_IDLE	DRM_IOW(DRM_COMMAND_BASE + DRM_RADEON_GEM_WAIT_IDLE, struct drm_radeon_gem_wait_idle)
555718dceddSDavid Howells #define DRM_IOCTL_RADEON_CS		DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_CS, struct drm_radeon_cs)
556718dceddSDavid Howells #define DRM_IOCTL_RADEON_INFO		DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_INFO, struct drm_radeon_info)
557718dceddSDavid Howells #define DRM_IOCTL_RADEON_GEM_SET_TILING	DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_SET_TILING, struct drm_radeon_gem_set_tiling)
558718dceddSDavid Howells #define DRM_IOCTL_RADEON_GEM_GET_TILING	DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_GET_TILING, struct drm_radeon_gem_get_tiling)
559718dceddSDavid Howells #define DRM_IOCTL_RADEON_GEM_BUSY	DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_BUSY, struct drm_radeon_gem_busy)
560718dceddSDavid Howells #define DRM_IOCTL_RADEON_GEM_VA		DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_VA, struct drm_radeon_gem_va)
561bda72d58SMarek Olšák #define DRM_IOCTL_RADEON_GEM_OP		DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_OP, struct drm_radeon_gem_op)
562f72a113aSChristian König #define DRM_IOCTL_RADEON_GEM_USERPTR	DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_USERPTR, struct drm_radeon_gem_userptr)
563718dceddSDavid Howells 
564718dceddSDavid Howells typedef struct drm_radeon_init {
565718dceddSDavid Howells 	enum {
566718dceddSDavid Howells 		RADEON_INIT_CP = 0x01,
567718dceddSDavid Howells 		RADEON_CLEANUP_CP = 0x02,
568718dceddSDavid Howells 		RADEON_INIT_R200_CP = 0x03,
569718dceddSDavid Howells 		RADEON_INIT_R300_CP = 0x04,
570718dceddSDavid Howells 		RADEON_INIT_R600_CP = 0x05
571718dceddSDavid Howells 	} func;
572718dceddSDavid Howells 	unsigned long sarea_priv_offset;
573718dceddSDavid Howells 	int is_pci;
574718dceddSDavid Howells 	int cp_mode;
575718dceddSDavid Howells 	int gart_size;
576718dceddSDavid Howells 	int ring_size;
577718dceddSDavid Howells 	int usec_timeout;
578718dceddSDavid Howells 
579718dceddSDavid Howells 	unsigned int fb_bpp;
580718dceddSDavid Howells 	unsigned int front_offset, front_pitch;
581718dceddSDavid Howells 	unsigned int back_offset, back_pitch;
582718dceddSDavid Howells 	unsigned int depth_bpp;
583718dceddSDavid Howells 	unsigned int depth_offset, depth_pitch;
584718dceddSDavid Howells 
585718dceddSDavid Howells 	unsigned long fb_offset;
586718dceddSDavid Howells 	unsigned long mmio_offset;
587718dceddSDavid Howells 	unsigned long ring_offset;
588718dceddSDavid Howells 	unsigned long ring_rptr_offset;
589718dceddSDavid Howells 	unsigned long buffers_offset;
590718dceddSDavid Howells 	unsigned long gart_textures_offset;
591718dceddSDavid Howells } drm_radeon_init_t;
592718dceddSDavid Howells 
593718dceddSDavid Howells typedef struct drm_radeon_cp_stop {
594718dceddSDavid Howells 	int flush;
595718dceddSDavid Howells 	int idle;
596718dceddSDavid Howells } drm_radeon_cp_stop_t;
597718dceddSDavid Howells 
598718dceddSDavid Howells typedef struct drm_radeon_fullscreen {
599718dceddSDavid Howells 	enum {
600718dceddSDavid Howells 		RADEON_INIT_FULLSCREEN = 0x01,
601718dceddSDavid Howells 		RADEON_CLEANUP_FULLSCREEN = 0x02
602718dceddSDavid Howells 	} func;
603718dceddSDavid Howells } drm_radeon_fullscreen_t;
604718dceddSDavid Howells 
605718dceddSDavid Howells #define CLEAR_X1	0
606718dceddSDavid Howells #define CLEAR_Y1	1
607718dceddSDavid Howells #define CLEAR_X2	2
608718dceddSDavid Howells #define CLEAR_Y2	3
609718dceddSDavid Howells #define CLEAR_DEPTH	4
610718dceddSDavid Howells 
611718dceddSDavid Howells typedef union drm_radeon_clear_rect {
612718dceddSDavid Howells 	float f[5];
613718dceddSDavid Howells 	unsigned int ui[5];
614718dceddSDavid Howells } drm_radeon_clear_rect_t;
615718dceddSDavid Howells 
616718dceddSDavid Howells typedef struct drm_radeon_clear {
617718dceddSDavid Howells 	unsigned int flags;
618718dceddSDavid Howells 	unsigned int clear_color;
619718dceddSDavid Howells 	unsigned int clear_depth;
620718dceddSDavid Howells 	unsigned int color_mask;
621718dceddSDavid Howells 	unsigned int depth_mask;	/* misnamed field:  should be stencil */
622718dceddSDavid Howells 	drm_radeon_clear_rect_t __user *depth_boxes;
623718dceddSDavid Howells } drm_radeon_clear_t;
624718dceddSDavid Howells 
625718dceddSDavid Howells typedef struct drm_radeon_vertex {
626718dceddSDavid Howells 	int prim;
627718dceddSDavid Howells 	int idx;		/* Index of vertex buffer */
628718dceddSDavid Howells 	int count;		/* Number of vertices in buffer */
629718dceddSDavid Howells 	int discard;		/* Client finished with buffer? */
630718dceddSDavid Howells } drm_radeon_vertex_t;
631718dceddSDavid Howells 
632718dceddSDavid Howells typedef struct drm_radeon_indices {
633718dceddSDavid Howells 	int prim;
634718dceddSDavid Howells 	int idx;
635718dceddSDavid Howells 	int start;
636718dceddSDavid Howells 	int end;
637718dceddSDavid Howells 	int discard;		/* Client finished with buffer? */
638718dceddSDavid Howells } drm_radeon_indices_t;
639718dceddSDavid Howells 
640718dceddSDavid Howells /* v1.2 - obsoletes drm_radeon_vertex and drm_radeon_indices
641718dceddSDavid Howells  *      - allows multiple primitives and state changes in a single ioctl
642718dceddSDavid Howells  *      - supports driver change to emit native primitives
643718dceddSDavid Howells  */
644718dceddSDavid Howells typedef struct drm_radeon_vertex2 {
645718dceddSDavid Howells 	int idx;		/* Index of vertex buffer */
646718dceddSDavid Howells 	int discard;		/* Client finished with buffer? */
647718dceddSDavid Howells 	int nr_states;
648718dceddSDavid Howells 	drm_radeon_state_t __user *state;
649718dceddSDavid Howells 	int nr_prims;
650718dceddSDavid Howells 	drm_radeon_prim_t __user *prim;
651718dceddSDavid Howells } drm_radeon_vertex2_t;
652718dceddSDavid Howells 
653718dceddSDavid Howells /* v1.3 - obsoletes drm_radeon_vertex2
654718dceddSDavid Howells  *      - allows arbitrarily large cliprect list
655718dceddSDavid Howells  *      - allows updating of tcl packet, vector and scalar state
656718dceddSDavid Howells  *      - allows memory-efficient description of state updates
657718dceddSDavid Howells  *      - allows state to be emitted without a primitive
658718dceddSDavid Howells  *           (for clears, ctx switches)
659718dceddSDavid Howells  *      - allows more than one dma buffer to be referenced per ioctl
660718dceddSDavid Howells  *      - supports tcl driver
661718dceddSDavid Howells  *      - may be extended in future versions with new cmd types, packets
662718dceddSDavid Howells  */
663718dceddSDavid Howells typedef struct drm_radeon_cmd_buffer {
664718dceddSDavid Howells 	int bufsz;
665718dceddSDavid Howells 	char __user *buf;
666718dceddSDavid Howells 	int nbox;
667718dceddSDavid Howells 	struct drm_clip_rect __user *boxes;
668718dceddSDavid Howells } drm_radeon_cmd_buffer_t;
669718dceddSDavid Howells 
670718dceddSDavid Howells typedef struct drm_radeon_tex_image {
671718dceddSDavid Howells 	unsigned int x, y;	/* Blit coordinates */
672718dceddSDavid Howells 	unsigned int width, height;
673718dceddSDavid Howells 	const void __user *data;
674718dceddSDavid Howells } drm_radeon_tex_image_t;
675718dceddSDavid Howells 
676718dceddSDavid Howells typedef struct drm_radeon_texture {
677718dceddSDavid Howells 	unsigned int offset;
678718dceddSDavid Howells 	int pitch;
679718dceddSDavid Howells 	int format;
680718dceddSDavid Howells 	int width;		/* Texture image coordinates */
681718dceddSDavid Howells 	int height;
682718dceddSDavid Howells 	drm_radeon_tex_image_t __user *image;
683718dceddSDavid Howells } drm_radeon_texture_t;
684718dceddSDavid Howells 
685718dceddSDavid Howells typedef struct drm_radeon_stipple {
686718dceddSDavid Howells 	unsigned int __user *mask;
687718dceddSDavid Howells } drm_radeon_stipple_t;
688718dceddSDavid Howells 
689718dceddSDavid Howells typedef struct drm_radeon_indirect {
690718dceddSDavid Howells 	int idx;
691718dceddSDavid Howells 	int start;
692718dceddSDavid Howells 	int end;
693718dceddSDavid Howells 	int discard;
694718dceddSDavid Howells } drm_radeon_indirect_t;
695718dceddSDavid Howells 
696718dceddSDavid Howells /* enum for card type parameters */
697718dceddSDavid Howells #define RADEON_CARD_PCI 0
698718dceddSDavid Howells #define RADEON_CARD_AGP 1
699718dceddSDavid Howells #define RADEON_CARD_PCIE 2
700718dceddSDavid Howells 
701718dceddSDavid Howells /* 1.3: An ioctl to get parameters that aren't available to the 3d
702718dceddSDavid Howells  * client any other way.
703718dceddSDavid Howells  */
704718dceddSDavid Howells #define RADEON_PARAM_GART_BUFFER_OFFSET    1	/* card offset of 1st GART buffer */
705718dceddSDavid Howells #define RADEON_PARAM_LAST_FRAME            2
706718dceddSDavid Howells #define RADEON_PARAM_LAST_DISPATCH         3
707718dceddSDavid Howells #define RADEON_PARAM_LAST_CLEAR            4
708718dceddSDavid Howells /* Added with DRM version 1.6. */
709718dceddSDavid Howells #define RADEON_PARAM_IRQ_NR                5
710718dceddSDavid Howells #define RADEON_PARAM_GART_BASE             6	/* card offset of GART base */
711718dceddSDavid Howells /* Added with DRM version 1.8. */
712718dceddSDavid Howells #define RADEON_PARAM_REGISTER_HANDLE       7	/* for drmMap() */
713718dceddSDavid Howells #define RADEON_PARAM_STATUS_HANDLE         8
714718dceddSDavid Howells #define RADEON_PARAM_SAREA_HANDLE          9
715718dceddSDavid Howells #define RADEON_PARAM_GART_TEX_HANDLE       10
716718dceddSDavid Howells #define RADEON_PARAM_SCRATCH_OFFSET        11
717718dceddSDavid Howells #define RADEON_PARAM_CARD_TYPE             12
718718dceddSDavid Howells #define RADEON_PARAM_VBLANK_CRTC           13   /* VBLANK CRTC */
719718dceddSDavid Howells #define RADEON_PARAM_FB_LOCATION           14   /* FB location */
720718dceddSDavid Howells #define RADEON_PARAM_NUM_GB_PIPES          15   /* num GB pipes */
721718dceddSDavid Howells #define RADEON_PARAM_DEVICE_ID             16
722718dceddSDavid Howells #define RADEON_PARAM_NUM_Z_PIPES           17   /* num Z pipes */
723718dceddSDavid Howells 
724718dceddSDavid Howells typedef struct drm_radeon_getparam {
725718dceddSDavid Howells 	int param;
726718dceddSDavid Howells 	void __user *value;
727718dceddSDavid Howells } drm_radeon_getparam_t;
728718dceddSDavid Howells 
729718dceddSDavid Howells /* 1.6: Set up a memory manager for regions of shared memory:
730718dceddSDavid Howells  */
731718dceddSDavid Howells #define RADEON_MEM_REGION_GART 1
732718dceddSDavid Howells #define RADEON_MEM_REGION_FB   2
733718dceddSDavid Howells 
734718dceddSDavid Howells typedef struct drm_radeon_mem_alloc {
735718dceddSDavid Howells 	int region;
736718dceddSDavid Howells 	int alignment;
737718dceddSDavid Howells 	int size;
738718dceddSDavid Howells 	int __user *region_offset;	/* offset from start of fb or GART */
739718dceddSDavid Howells } drm_radeon_mem_alloc_t;
740718dceddSDavid Howells 
741718dceddSDavid Howells typedef struct drm_radeon_mem_free {
742718dceddSDavid Howells 	int region;
743718dceddSDavid Howells 	int region_offset;
744718dceddSDavid Howells } drm_radeon_mem_free_t;
745718dceddSDavid Howells 
746718dceddSDavid Howells typedef struct drm_radeon_mem_init_heap {
747718dceddSDavid Howells 	int region;
748718dceddSDavid Howells 	int size;
749718dceddSDavid Howells 	int start;
750718dceddSDavid Howells } drm_radeon_mem_init_heap_t;
751718dceddSDavid Howells 
752718dceddSDavid Howells /* 1.6: Userspace can request & wait on irq's:
753718dceddSDavid Howells  */
754718dceddSDavid Howells typedef struct drm_radeon_irq_emit {
755718dceddSDavid Howells 	int __user *irq_seq;
756718dceddSDavid Howells } drm_radeon_irq_emit_t;
757718dceddSDavid Howells 
758718dceddSDavid Howells typedef struct drm_radeon_irq_wait {
759718dceddSDavid Howells 	int irq_seq;
760718dceddSDavid Howells } drm_radeon_irq_wait_t;
761718dceddSDavid Howells 
762718dceddSDavid Howells /* 1.10: Clients tell the DRM where they think the framebuffer is located in
763718dceddSDavid Howells  * the card's address space, via a new generic ioctl to set parameters
764718dceddSDavid Howells  */
765718dceddSDavid Howells 
766718dceddSDavid Howells typedef struct drm_radeon_setparam {
767718dceddSDavid Howells 	unsigned int param;
768718dceddSDavid Howells 	__s64 value;
769718dceddSDavid Howells } drm_radeon_setparam_t;
770718dceddSDavid Howells 
771718dceddSDavid Howells #define RADEON_SETPARAM_FB_LOCATION    1	/* determined framebuffer location */
772718dceddSDavid Howells #define RADEON_SETPARAM_SWITCH_TILING  2	/* enable/disable color tiling */
773718dceddSDavid Howells #define RADEON_SETPARAM_PCIGART_LOCATION 3	/* PCI Gart Location */
774718dceddSDavid Howells #define RADEON_SETPARAM_NEW_MEMMAP 4		/* Use new memory map */
775718dceddSDavid Howells #define RADEON_SETPARAM_PCIGART_TABLE_SIZE 5    /* PCI GART Table Size */
776718dceddSDavid Howells #define RADEON_SETPARAM_VBLANK_CRTC 6           /* VBLANK CRTC */
777718dceddSDavid Howells /* 1.14: Clients can allocate/free a surface
778718dceddSDavid Howells  */
779718dceddSDavid Howells typedef struct drm_radeon_surface_alloc {
780718dceddSDavid Howells 	unsigned int address;
781718dceddSDavid Howells 	unsigned int size;
782718dceddSDavid Howells 	unsigned int flags;
783718dceddSDavid Howells } drm_radeon_surface_alloc_t;
784718dceddSDavid Howells 
785718dceddSDavid Howells typedef struct drm_radeon_surface_free {
786718dceddSDavid Howells 	unsigned int address;
787718dceddSDavid Howells } drm_radeon_surface_free_t;
788718dceddSDavid Howells 
789718dceddSDavid Howells #define	DRM_RADEON_VBLANK_CRTC1		1
790718dceddSDavid Howells #define	DRM_RADEON_VBLANK_CRTC2		2
791718dceddSDavid Howells 
792718dceddSDavid Howells /*
793718dceddSDavid Howells  * Kernel modesetting world below.
794718dceddSDavid Howells  */
795718dceddSDavid Howells #define RADEON_GEM_DOMAIN_CPU		0x1
796718dceddSDavid Howells #define RADEON_GEM_DOMAIN_GTT		0x2
797718dceddSDavid Howells #define RADEON_GEM_DOMAIN_VRAM		0x4
798718dceddSDavid Howells 
799718dceddSDavid Howells struct drm_radeon_gem_info {
80031b4dfe2SMikko Rapeli 	__u64	gart_size;
80131b4dfe2SMikko Rapeli 	__u64	vram_size;
80231b4dfe2SMikko Rapeli 	__u64	vram_visible;
803718dceddSDavid Howells };
804718dceddSDavid Howells 
80577497f27SMichel Dänzer #define RADEON_GEM_NO_BACKING_STORE	(1 << 0)
80677497f27SMichel Dänzer #define RADEON_GEM_GTT_UC		(1 << 1)
80777497f27SMichel Dänzer #define RADEON_GEM_GTT_WC		(1 << 2)
808c8584039SMichel Dänzer /* BO is expected to be accessed by the CPU */
809c8584039SMichel Dänzer #define RADEON_GEM_CPU_ACCESS		(1 << 3)
810f266f04dSAlex Deucher /* CPU access is not expected to work for this BO */
811f266f04dSAlex Deucher #define RADEON_GEM_NO_CPU_ACCESS	(1 << 4)
812718dceddSDavid Howells 
813718dceddSDavid Howells struct drm_radeon_gem_create {
81431b4dfe2SMikko Rapeli 	__u64	size;
81531b4dfe2SMikko Rapeli 	__u64	alignment;
81631b4dfe2SMikko Rapeli 	__u32	handle;
81731b4dfe2SMikko Rapeli 	__u32	initial_domain;
81831b4dfe2SMikko Rapeli 	__u32	flags;
819718dceddSDavid Howells };
820718dceddSDavid Howells 
821f72a113aSChristian König /*
822f72a113aSChristian König  * This is not a reliable API and you should expect it to fail for any
823f72a113aSChristian König  * number of reasons and have fallback path that do not use userptr to
824f72a113aSChristian König  * perform any operation.
825f72a113aSChristian König  */
826f72a113aSChristian König #define RADEON_GEM_USERPTR_READONLY	(1 << 0)
827ddd00e33SChristian König #define RADEON_GEM_USERPTR_ANONONLY	(1 << 1)
8282a84a447SChristian König #define RADEON_GEM_USERPTR_VALIDATE	(1 << 2)
829341cb9e4SChristian König #define RADEON_GEM_USERPTR_REGISTER	(1 << 3)
830f72a113aSChristian König 
831f72a113aSChristian König struct drm_radeon_gem_userptr {
83231b4dfe2SMikko Rapeli 	__u64		addr;
83331b4dfe2SMikko Rapeli 	__u64		size;
83431b4dfe2SMikko Rapeli 	__u32		flags;
83531b4dfe2SMikko Rapeli 	__u32		handle;
836f72a113aSChristian König };
837f72a113aSChristian König 
838718dceddSDavid Howells #define RADEON_TILING_MACRO				0x1
839718dceddSDavid Howells #define RADEON_TILING_MICRO				0x2
840718dceddSDavid Howells #define RADEON_TILING_SWAP_16BIT			0x4
841718dceddSDavid Howells #define RADEON_TILING_SWAP_32BIT			0x8
842718dceddSDavid Howells /* this object requires a surface when mapped - i.e. front buffer */
843718dceddSDavid Howells #define RADEON_TILING_SURFACE				0x10
844718dceddSDavid Howells #define RADEON_TILING_MICRO_SQUARE			0x20
845718dceddSDavid Howells #define RADEON_TILING_EG_BANKW_SHIFT			8
846718dceddSDavid Howells #define RADEON_TILING_EG_BANKW_MASK			0xf
847718dceddSDavid Howells #define RADEON_TILING_EG_BANKH_SHIFT			12
848718dceddSDavid Howells #define RADEON_TILING_EG_BANKH_MASK			0xf
849718dceddSDavid Howells #define RADEON_TILING_EG_MACRO_TILE_ASPECT_SHIFT	16
850718dceddSDavid Howells #define RADEON_TILING_EG_MACRO_TILE_ASPECT_MASK		0xf
851718dceddSDavid Howells #define RADEON_TILING_EG_TILE_SPLIT_SHIFT		24
852718dceddSDavid Howells #define RADEON_TILING_EG_TILE_SPLIT_MASK		0xf
853718dceddSDavid Howells #define RADEON_TILING_EG_STENCIL_TILE_SPLIT_SHIFT	28
854718dceddSDavid Howells #define RADEON_TILING_EG_STENCIL_TILE_SPLIT_MASK	0xf
855718dceddSDavid Howells 
856718dceddSDavid Howells struct drm_radeon_gem_set_tiling {
85731b4dfe2SMikko Rapeli 	__u32	handle;
85831b4dfe2SMikko Rapeli 	__u32	tiling_flags;
85931b4dfe2SMikko Rapeli 	__u32	pitch;
860718dceddSDavid Howells };
861718dceddSDavid Howells 
862718dceddSDavid Howells struct drm_radeon_gem_get_tiling {
86331b4dfe2SMikko Rapeli 	__u32	handle;
86431b4dfe2SMikko Rapeli 	__u32	tiling_flags;
86531b4dfe2SMikko Rapeli 	__u32	pitch;
866718dceddSDavid Howells };
867718dceddSDavid Howells 
868718dceddSDavid Howells struct drm_radeon_gem_mmap {
86931b4dfe2SMikko Rapeli 	__u32	handle;
87031b4dfe2SMikko Rapeli 	__u32	pad;
87131b4dfe2SMikko Rapeli 	__u64	offset;
87231b4dfe2SMikko Rapeli 	__u64	size;
87331b4dfe2SMikko Rapeli 	__u64	addr_ptr;
874718dceddSDavid Howells };
875718dceddSDavid Howells 
876718dceddSDavid Howells struct drm_radeon_gem_set_domain {
87731b4dfe2SMikko Rapeli 	__u32	handle;
87831b4dfe2SMikko Rapeli 	__u32	read_domains;
87931b4dfe2SMikko Rapeli 	__u32	write_domain;
880718dceddSDavid Howells };
881718dceddSDavid Howells 
882718dceddSDavid Howells struct drm_radeon_gem_wait_idle {
88331b4dfe2SMikko Rapeli 	__u32	handle;
88431b4dfe2SMikko Rapeli 	__u32	pad;
885718dceddSDavid Howells };
886718dceddSDavid Howells 
887718dceddSDavid Howells struct drm_radeon_gem_busy {
88831b4dfe2SMikko Rapeli 	__u32	handle;
88931b4dfe2SMikko Rapeli 	__u32        domain;
890718dceddSDavid Howells };
891718dceddSDavid Howells 
892718dceddSDavid Howells struct drm_radeon_gem_pread {
893718dceddSDavid Howells 	/** Handle for the object being read. */
89431b4dfe2SMikko Rapeli 	__u32 handle;
89531b4dfe2SMikko Rapeli 	__u32 pad;
896718dceddSDavid Howells 	/** Offset into the object to read from */
89731b4dfe2SMikko Rapeli 	__u64 offset;
898718dceddSDavid Howells 	/** Length of data to read */
89931b4dfe2SMikko Rapeli 	__u64 size;
900718dceddSDavid Howells 	/** Pointer to write the data into. */
901718dceddSDavid Howells 	/* void *, but pointers are not 32/64 compatible */
90231b4dfe2SMikko Rapeli 	__u64 data_ptr;
903718dceddSDavid Howells };
904718dceddSDavid Howells 
905718dceddSDavid Howells struct drm_radeon_gem_pwrite {
906718dceddSDavid Howells 	/** Handle for the object being written to. */
90731b4dfe2SMikko Rapeli 	__u32 handle;
90831b4dfe2SMikko Rapeli 	__u32 pad;
909718dceddSDavid Howells 	/** Offset into the object to write to */
91031b4dfe2SMikko Rapeli 	__u64 offset;
911718dceddSDavid Howells 	/** Length of data to write */
91231b4dfe2SMikko Rapeli 	__u64 size;
913718dceddSDavid Howells 	/** Pointer to read the data from. */
914718dceddSDavid Howells 	/* void *, but pointers are not 32/64 compatible */
91531b4dfe2SMikko Rapeli 	__u64 data_ptr;
916718dceddSDavid Howells };
917718dceddSDavid Howells 
918bda72d58SMarek Olšák /* Sets or returns a value associated with a buffer. */
919bda72d58SMarek Olšák struct drm_radeon_gem_op {
92031b4dfe2SMikko Rapeli 	__u32	handle; /* buffer */
92131b4dfe2SMikko Rapeli 	__u32	op;     /* RADEON_GEM_OP_* */
92231b4dfe2SMikko Rapeli 	__u64	value;  /* input or return value */
923bda72d58SMarek Olšák };
924bda72d58SMarek Olšák 
925bda72d58SMarek Olšák #define RADEON_GEM_OP_GET_INITIAL_DOMAIN	0
926bda72d58SMarek Olšák #define RADEON_GEM_OP_SET_INITIAL_DOMAIN	1
927bda72d58SMarek Olšák 
928718dceddSDavid Howells #define RADEON_VA_MAP			1
929718dceddSDavid Howells #define RADEON_VA_UNMAP			2
930718dceddSDavid Howells 
931718dceddSDavid Howells #define RADEON_VA_RESULT_OK		0
932718dceddSDavid Howells #define RADEON_VA_RESULT_ERROR		1
933718dceddSDavid Howells #define RADEON_VA_RESULT_VA_EXIST	2
934718dceddSDavid Howells 
935718dceddSDavid Howells #define RADEON_VM_PAGE_VALID		(1 << 0)
936718dceddSDavid Howells #define RADEON_VM_PAGE_READABLE		(1 << 1)
937718dceddSDavid Howells #define RADEON_VM_PAGE_WRITEABLE	(1 << 2)
938718dceddSDavid Howells #define RADEON_VM_PAGE_SYSTEM		(1 << 3)
939718dceddSDavid Howells #define RADEON_VM_PAGE_SNOOPED		(1 << 4)
940718dceddSDavid Howells 
941718dceddSDavid Howells struct drm_radeon_gem_va {
94231b4dfe2SMikko Rapeli 	__u32		handle;
94331b4dfe2SMikko Rapeli 	__u32		operation;
94431b4dfe2SMikko Rapeli 	__u32		vm_id;
94531b4dfe2SMikko Rapeli 	__u32		flags;
94631b4dfe2SMikko Rapeli 	__u64		offset;
947718dceddSDavid Howells };
948718dceddSDavid Howells 
949718dceddSDavid Howells #define RADEON_CHUNK_ID_RELOCS	0x01
950718dceddSDavid Howells #define RADEON_CHUNK_ID_IB	0x02
951718dceddSDavid Howells #define RADEON_CHUNK_ID_FLAGS	0x03
952718dceddSDavid Howells #define RADEON_CHUNK_ID_CONST_IB	0x04
953718dceddSDavid Howells 
954718dceddSDavid Howells /* The first dword of RADEON_CHUNK_ID_FLAGS is a uint32 of these flags: */
955718dceddSDavid Howells #define RADEON_CS_KEEP_TILING_FLAGS 0x01
956718dceddSDavid Howells #define RADEON_CS_USE_VM            0x02
95757f57083SMarek Olšák #define RADEON_CS_END_OF_FRAME      0x04 /* a hint from userspace which CS is the last one */
958718dceddSDavid Howells /* The second dword of RADEON_CHUNK_ID_FLAGS is a uint32 that sets the ring type */
959718dceddSDavid Howells #define RADEON_CS_RING_GFX          0
960718dceddSDavid Howells #define RADEON_CS_RING_COMPUTE      1
961278a334cSAlex Deucher #define RADEON_CS_RING_DMA          2
962f2ba57b5SChristian König #define RADEON_CS_RING_UVD          3
963d93f7937SChristian König #define RADEON_CS_RING_VCE          4
964718dceddSDavid Howells /* The third dword of RADEON_CHUNK_ID_FLAGS is a sint32 that sets the priority */
965718dceddSDavid Howells /* 0 = normal, + = higher priority, - = lower priority */
966718dceddSDavid Howells 
967718dceddSDavid Howells struct drm_radeon_cs_chunk {
96831b4dfe2SMikko Rapeli 	__u32		chunk_id;
96931b4dfe2SMikko Rapeli 	__u32		length_dw;
97031b4dfe2SMikko Rapeli 	__u64		chunk_data;
971718dceddSDavid Howells };
972718dceddSDavid Howells 
973718dceddSDavid Howells /* drm_radeon_cs_reloc.flags */
974701e1e78SChristian König #define RADEON_RELOC_PRIO_MASK		(0xf << 0)
975718dceddSDavid Howells 
976718dceddSDavid Howells struct drm_radeon_cs_reloc {
97731b4dfe2SMikko Rapeli 	__u32		handle;
97831b4dfe2SMikko Rapeli 	__u32		read_domains;
97931b4dfe2SMikko Rapeli 	__u32		write_domain;
98031b4dfe2SMikko Rapeli 	__u32		flags;
981718dceddSDavid Howells };
982718dceddSDavid Howells 
983718dceddSDavid Howells struct drm_radeon_cs {
98431b4dfe2SMikko Rapeli 	__u32		num_chunks;
98531b4dfe2SMikko Rapeli 	__u32		cs_id;
98631b4dfe2SMikko Rapeli 	/* this points to __u64 * which point to cs chunks */
98731b4dfe2SMikko Rapeli 	__u64		chunks;
988718dceddSDavid Howells 	/* updates to the limits after this CS ioctl */
98931b4dfe2SMikko Rapeli 	__u64		gart_limit;
99031b4dfe2SMikko Rapeli 	__u64		vram_limit;
991718dceddSDavid Howells };
992718dceddSDavid Howells 
993718dceddSDavid Howells #define RADEON_INFO_DEVICE_ID		0x00
994718dceddSDavid Howells #define RADEON_INFO_NUM_GB_PIPES	0x01
995718dceddSDavid Howells #define RADEON_INFO_NUM_Z_PIPES 	0x02
996718dceddSDavid Howells #define RADEON_INFO_ACCEL_WORKING	0x03
997718dceddSDavid Howells #define RADEON_INFO_CRTC_FROM_ID	0x04
998718dceddSDavid Howells #define RADEON_INFO_ACCEL_WORKING2	0x05
999718dceddSDavid Howells #define RADEON_INFO_TILING_CONFIG	0x06
1000718dceddSDavid Howells #define RADEON_INFO_WANT_HYPERZ		0x07
1001718dceddSDavid Howells #define RADEON_INFO_WANT_CMASK		0x08 /* get access to CMASK on r300 */
1002718dceddSDavid Howells #define RADEON_INFO_CLOCK_CRYSTAL_FREQ	0x09 /* clock crystal frequency */
1003718dceddSDavid Howells #define RADEON_INFO_NUM_BACKENDS	0x0a /* DB/backends for r600+ - need for OQ */
1004718dceddSDavid Howells #define RADEON_INFO_NUM_TILE_PIPES	0x0b /* tile pipes for r600+ */
1005718dceddSDavid Howells #define RADEON_INFO_FUSION_GART_WORKING	0x0c /* fusion writes to GTT were broken before this */
1006718dceddSDavid Howells #define RADEON_INFO_BACKEND_MAP		0x0d /* pipe to backend map, needed by mesa */
1007718dceddSDavid Howells /* virtual address start, va < start are reserved by the kernel */
1008718dceddSDavid Howells #define RADEON_INFO_VA_START		0x0e
1009718dceddSDavid Howells /* maximum size of ib using the virtual memory cs */
1010718dceddSDavid Howells #define RADEON_INFO_IB_VM_MAX_SIZE	0x0f
1011718dceddSDavid Howells /* max pipes - needed for compute shaders */
1012718dceddSDavid Howells #define RADEON_INFO_MAX_PIPES		0x10
1013718dceddSDavid Howells /* timestamp for GL_ARB_timer_query (OpenGL), returns the current GPU clock */
1014718dceddSDavid Howells #define RADEON_INFO_TIMESTAMP		0x11
10152e1a7674SAlex Deucher /* max shader engines (SE) - needed for geometry shaders, etc. */
10162e1a7674SAlex Deucher #define RADEON_INFO_MAX_SE		0x12
10172e1a7674SAlex Deucher /* max SH per SE */
10182e1a7674SAlex Deucher #define RADEON_INFO_MAX_SH_PER_SE	0x13
1019a0a53aa8SSamuel Li /* fast fb access is enabled */
1020a0a53aa8SSamuel Li #define RADEON_INFO_FASTFB_WORKING	0x14
1021902aaef6SChristian König /* query if a RADEON_CS_RING_* submission is supported */
1022902aaef6SChristian König #define RADEON_INFO_RING_WORKING	0x15
102364d7b8beSJerome Glisse /* SI tile mode array */
102464d7b8beSJerome Glisse #define RADEON_INFO_SI_TILE_MODE_ARRAY	0x16
1025e5b9e750STom Stellard /* query if CP DMA is supported on the compute ring */
1026e5b9e750STom Stellard #define RADEON_INFO_SI_CP_DMA_COMPUTE	0x17
102732f79a8aSMichel Dänzer /* CIK macrotile mode array */
102832f79a8aSMichel Dänzer #define RADEON_INFO_CIK_MACROTILE_MODE_ARRAY	0x18
1029439a1cffSMarek Olšák /* query the number of render backends */
1030439a1cffSMarek Olšák #define RADEON_INFO_SI_BACKEND_ENABLED_MASK	0x19
1031f5f1f897SAlex Deucher /* max engine clock - needed for OpenCL */
1032f5f1f897SAlex Deucher #define RADEON_INFO_MAX_SCLK		0x1a
103398ccc291SChristian König /* version of VCE firmware */
103498ccc291SChristian König #define RADEON_INFO_VCE_FW_VERSION	0x1b
103598ccc291SChristian König /* version of VCE feedback */
103698ccc291SChristian König #define RADEON_INFO_VCE_FB_VERSION	0x1c
103767e8e3f9SMarek Olšák #define RADEON_INFO_NUM_BYTES_MOVED	0x1d
103867e8e3f9SMarek Olšák #define RADEON_INFO_VRAM_USAGE		0x1e
103967e8e3f9SMarek Olšák #define RADEON_INFO_GTT_USAGE		0x1f
104065fcf668SAlex Deucher #define RADEON_INFO_ACTIVE_CU_COUNT	0x20
1041d6d2a188SAlex Deucher #define RADEON_INFO_CURRENT_GPU_TEMP	0x21
10425c363a86SAlex Deucher #define RADEON_INFO_CURRENT_GPU_SCLK	0x22
10435c363a86SAlex Deucher #define RADEON_INFO_CURRENT_GPU_MCLK	0x23
10444535cb9cSAlex Deucher #define RADEON_INFO_READ_REG		0x24
10453bc980bfSMichel Dänzer #define RADEON_INFO_VA_UNMAP_WORKING	0x25
1046099bfbfcSLinus Torvalds #define RADEON_INFO_GPU_RESET_COUNTER	0x26
1047718dceddSDavid Howells 
1048718dceddSDavid Howells struct drm_radeon_info {
104931b4dfe2SMikko Rapeli 	__u32		request;
105031b4dfe2SMikko Rapeli 	__u32		pad;
105131b4dfe2SMikko Rapeli 	__u64		value;
1052718dceddSDavid Howells };
1053718dceddSDavid Howells 
105464d7b8beSJerome Glisse /* Those correspond to the tile index to use, this is to explicitly state
105564d7b8beSJerome Glisse  * the API that is implicitly defined by the tile mode array.
105664d7b8beSJerome Glisse  */
105764d7b8beSJerome Glisse #define SI_TILE_MODE_COLOR_LINEAR_ALIGNED	8
105864d7b8beSJerome Glisse #define SI_TILE_MODE_COLOR_1D			13
105964d7b8beSJerome Glisse #define SI_TILE_MODE_COLOR_1D_SCANOUT		9
106064d7b8beSJerome Glisse #define SI_TILE_MODE_COLOR_2D_8BPP		14
106164d7b8beSJerome Glisse #define SI_TILE_MODE_COLOR_2D_16BPP		15
106264d7b8beSJerome Glisse #define SI_TILE_MODE_COLOR_2D_32BPP		16
106364d7b8beSJerome Glisse #define SI_TILE_MODE_COLOR_2D_64BPP		17
106464d7b8beSJerome Glisse #define SI_TILE_MODE_COLOR_2D_SCANOUT_16BPP	11
106564d7b8beSJerome Glisse #define SI_TILE_MODE_COLOR_2D_SCANOUT_32BPP	12
106664d7b8beSJerome Glisse #define SI_TILE_MODE_DEPTH_STENCIL_1D		4
106764d7b8beSJerome Glisse #define SI_TILE_MODE_DEPTH_STENCIL_2D		0
106864d7b8beSJerome Glisse #define SI_TILE_MODE_DEPTH_STENCIL_2D_2AA	3
106964d7b8beSJerome Glisse #define SI_TILE_MODE_DEPTH_STENCIL_2D_4AA	3
107064d7b8beSJerome Glisse #define SI_TILE_MODE_DEPTH_STENCIL_2D_8AA	2
107164d7b8beSJerome Glisse 
107242baf21dSMichel Dänzer #define CIK_TILE_MODE_DEPTH_STENCIL_1D		5
107342baf21dSMichel Dänzer 
10746db26a94SEmil Velikov #if defined(__cplusplus)
10756db26a94SEmil Velikov }
10766db26a94SEmil Velikov #endif
10776db26a94SEmil Velikov 
1078718dceddSDavid Howells #endif
1079