2 * Copyright 2010 Jerome Glisse <glisse@freedesktop.org>
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * on the rights to use, copy, modify, merge, publish, distribute, sub
8 * license, and/or sell copies of the Software, and to permit persons to whom
9 * the Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
20 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
21 * USE OR OTHER DEALINGS IN THE SOFTWARE.
30 #include "radeon_priv.h"
33 static int r600_state_pm4_resource(struct radeon_state
*state
);
34 static int r600_state_pm4_cb0(struct radeon_state
*state
);
35 static int r600_state_pm4_vgt(struct radeon_state
*state
);
36 static int r600_state_pm4_db(struct radeon_state
*state
);
37 static int r600_state_pm4_shader(struct radeon_state
*state
);
38 static int r600_state_pm4_draw(struct radeon_state
*state
);
39 static int r600_state_pm4_config(struct radeon_state
*state
);
40 static int r600_state_pm4_generic(struct radeon_state
*state
);
41 static int r600_state_pm4_query_begin(struct radeon_state
*state
);
42 static int r600_state_pm4_query_end(struct radeon_state
*state
);
43 static int r700_state_pm4_config(struct radeon_state
*state
);
44 static int r700_state_pm4_cb0(struct radeon_state
*state
);
45 static int r700_state_pm4_db(struct radeon_state
*state
);
47 #include "r600_states.h"
50 * r600/r700 state functions
52 static int r600_state_pm4_bytecode(struct radeon_state
*state
, unsigned offset
, unsigned id
, unsigned nreg
)
54 const struct radeon_register
*regs
= state
->radeon
->type
[state
->type
].regs
;
59 fprintf(stderr
, "%s invalid register for state %d %d\n",
60 __func__
, state
->type
, id
);
63 if (offset
>= R600_CONFIG_REG_OFFSET
&& offset
< R600_CONFIG_REG_END
) {
64 state
->pm4
[state
->cpm4
++] = PKT3(PKT3_SET_CONFIG_REG
, nreg
);
65 state
->pm4
[state
->cpm4
++] = (offset
- R600_CONFIG_REG_OFFSET
) >> 2;
66 for (i
= 0; i
< nreg
; i
++) {
67 state
->pm4
[state
->cpm4
++] = state
->states
[id
+ i
];
69 for (i
= 0; i
< nreg
; i
++) {
70 if (regs
[id
+ i
].need_reloc
) {
71 state
->pm4
[state
->cpm4
++] = PKT3(PKT3_NOP
, 0);
72 r
= radeon_state_reloc(state
, state
->cpm4
, regs
[id
+ i
].bo_id
);
75 state
->pm4
[state
->cpm4
++] = state
->bo
[regs
[id
+ i
].bo_id
]->handle
;
80 if (offset
>= R600_CONTEXT_REG_OFFSET
&& offset
< R600_CONTEXT_REG_END
) {
81 state
->pm4
[state
->cpm4
++] = PKT3(PKT3_SET_CONTEXT_REG
, nreg
);
82 state
->pm4
[state
->cpm4
++] = (offset
- R600_CONTEXT_REG_OFFSET
) >> 2;
83 for (i
= 0; i
< nreg
; i
++) {
84 state
->pm4
[state
->cpm4
++] = state
->states
[id
+ i
];
86 for (i
= 0; i
< nreg
; i
++) {
87 if (regs
[id
+ i
].need_reloc
) {
88 state
->pm4
[state
->cpm4
++] = PKT3(PKT3_NOP
, 0);
89 r
= radeon_state_reloc(state
, state
->cpm4
, regs
[id
+ i
].bo_id
);
92 state
->pm4
[state
->cpm4
++] = state
->bo
[regs
[id
+ i
].bo_id
]->handle
;
97 if (offset
>= R600_ALU_CONST_OFFSET
&& offset
< R600_ALU_CONST_END
) {
98 state
->pm4
[state
->cpm4
++] = PKT3(PKT3_SET_ALU_CONST
, nreg
);
99 state
->pm4
[state
->cpm4
++] = (offset
- R600_ALU_CONST_OFFSET
) >> 2;
100 for (i
= 0; i
< nreg
; i
++) {
101 state
->pm4
[state
->cpm4
++] = state
->states
[id
+ i
];
105 if (offset
>= R600_SAMPLER_OFFSET
&& offset
< R600_SAMPLER_END
) {
106 state
->pm4
[state
->cpm4
++] = PKT3(PKT3_SET_SAMPLER
, nreg
);
107 state
->pm4
[state
->cpm4
++] = (offset
- R600_SAMPLER_OFFSET
) >> 2;
108 for (i
= 0; i
< nreg
; i
++) {
109 state
->pm4
[state
->cpm4
++] = state
->states
[id
+ i
];
113 fprintf(stderr
, "%s unsupported offset 0x%08X\n", __func__
, offset
);
117 static int r600_state_pm4_generic(struct radeon_state
*state
)
119 struct radeon
*radeon
= state
->radeon
;
120 unsigned i
, offset
, nreg
, type
, coffset
, loffset
, soffset
;
127 soffset
= (state
->id
- radeon
->type
[type
].id
) * radeon
->type
[type
].stride
;
128 offset
= loffset
= radeon
->type
[type
].regs
[0].offset
+ soffset
;
130 for (i
= 1, nreg
= 1; i
< state
->nstates
; i
++) {
131 coffset
= radeon
->type
[type
].regs
[i
].offset
+ soffset
;
132 if (coffset
== (loffset
+ 4)) {
136 r
= r600_state_pm4_bytecode(state
, offset
, start
, nreg
);
138 fprintf(stderr
, "%s invalid 0x%08X %d\n", __func__
, start
, nreg
);
141 offset
= loffset
= coffset
;
146 return r600_state_pm4_bytecode(state
, offset
, start
, nreg
);
149 static void r600_state_pm4_with_flush(struct radeon_state
*state
, u32 flags
)
151 unsigned i
, j
, add
, size
;
154 for (i
= 0; i
< state
->nbo
; i
++) {
155 for (j
= 0, add
= 1; j
< state
->nreloc
; j
++) {
156 if (state
->bo
[state
->reloc_bo_id
[j
]] == state
->bo
[i
]) {
162 state
->reloc_bo_id
[state
->nreloc
++] = i
;
165 for (i
= 0; i
< state
->nreloc
; i
++) {
166 size
= (state
->bo
[state
->reloc_bo_id
[i
]]->size
+ 255) >> 8;
167 state
->pm4
[state
->cpm4
++] = PKT3(PKT3_SURFACE_SYNC
, 3);
168 state
->pm4
[state
->cpm4
++] = flags
;
169 state
->pm4
[state
->cpm4
++] = size
;
170 state
->pm4
[state
->cpm4
++] = 0x00000000;
171 state
->pm4
[state
->cpm4
++] = 0x0000000A;
172 state
->pm4
[state
->cpm4
++] = PKT3(PKT3_NOP
, 0);
173 state
->reloc_pm4_id
[i
] = state
->cpm4
;
174 state
->pm4
[state
->cpm4
++] = state
->bo
[state
->reloc_bo_id
[i
]]->handle
;
178 static int r600_state_pm4_cb0(struct radeon_state
*state
)
182 r600_state_pm4_with_flush(state
, S_0085F0_CB_ACTION_ENA(1) |
183 S_0085F0_CB0_DEST_BASE_ENA(1));
184 r
= r600_state_pm4_generic(state
);
187 state
->pm4
[state
->cpm4
++] = PKT3(PKT3_SURFACE_BASE_UPDATE
, 0);
188 state
->pm4
[state
->cpm4
++] = 0x00000002;
192 static int r700_state_pm4_cb0(struct radeon_state
*state
)
196 r600_state_pm4_with_flush(state
, S_0085F0_CB_ACTION_ENA(1) |
197 S_0085F0_CB0_DEST_BASE_ENA(1));
198 r
= r600_state_pm4_generic(state
);
204 static int r600_state_pm4_db(struct radeon_state
*state
)
208 r600_state_pm4_with_flush(state
, S_0085F0_DB_ACTION_ENA(1) |
209 S_0085F0_DB_DEST_BASE_ENA(1));
210 r
= r600_state_pm4_generic(state
);
213 state
->pm4
[state
->cpm4
++] = PKT3(PKT3_SURFACE_BASE_UPDATE
, 0);
214 state
->pm4
[state
->cpm4
++] = 0x00000001;
218 static int r700_state_pm4_db(struct radeon_state
*state
)
222 r600_state_pm4_with_flush(state
, S_0085F0_DB_ACTION_ENA(1) |
223 S_0085F0_DB_DEST_BASE_ENA(1));
224 r
= r600_state_pm4_generic(state
);
230 static int r600_state_pm4_config(struct radeon_state
*state
)
232 state
->pm4
[state
->cpm4
++] = PKT3(PKT3_START_3D_CMDBUF
, 0);
233 state
->pm4
[state
->cpm4
++] = 0x00000000;
234 state
->pm4
[state
->cpm4
++] = PKT3(PKT3_CONTEXT_CONTROL
, 1);
235 state
->pm4
[state
->cpm4
++] = 0x80000000;
236 state
->pm4
[state
->cpm4
++] = 0x80000000;
237 state
->pm4
[state
->cpm4
++] = PKT3(PKT3_EVENT_WRITE
, 0);
238 state
->pm4
[state
->cpm4
++] = EVENT_TYPE_CACHE_FLUSH_AND_INV_EVENT
;
239 state
->pm4
[state
->cpm4
++] = PKT3(PKT3_SET_CONFIG_REG
, 1);
240 state
->pm4
[state
->cpm4
++] = 0x00000010;
241 state
->pm4
[state
->cpm4
++] = 0x00028000;
242 return r600_state_pm4_generic(state
);
245 static int r600_state_pm4_query_begin(struct radeon_state
*state
)
250 state
->pm4
[state
->cpm4
++] = PKT3(PKT3_EVENT_WRITE
, 2);
251 state
->pm4
[state
->cpm4
++] = EVENT_TYPE_ZPASS_DONE
;
252 state
->pm4
[state
->cpm4
++] = state
->states
[0];
253 state
->pm4
[state
->cpm4
++] = 0x0;
254 state
->pm4
[state
->cpm4
++] = PKT3(PKT3_NOP
, 0);
255 r
= radeon_state_reloc(state
, state
->cpm4
, 0);
258 state
->pm4
[state
->cpm4
++] = state
->bo
[0]->handle
;
262 static int r600_state_pm4_query_end(struct radeon_state
*state
)
267 state
->pm4
[state
->cpm4
++] = PKT3(PKT3_EVENT_WRITE
, 2);
268 state
->pm4
[state
->cpm4
++] = EVENT_TYPE_ZPASS_DONE
;
269 state
->pm4
[state
->cpm4
++] = state
->states
[0];
270 state
->pm4
[state
->cpm4
++] = 0x0;
271 state
->pm4
[state
->cpm4
++] = PKT3(PKT3_NOP
, 0);
272 r
= radeon_state_reloc(state
, state
->cpm4
, 0);
275 state
->pm4
[state
->cpm4
++] = state
->bo
[0]->handle
;
279 static int r700_state_pm4_config(struct radeon_state
*state
)
281 state
->pm4
[state
->cpm4
++] = PKT3(PKT3_CONTEXT_CONTROL
, 1);
282 state
->pm4
[state
->cpm4
++] = 0x80000000;
283 state
->pm4
[state
->cpm4
++] = 0x80000000;
284 state
->pm4
[state
->cpm4
++] = PKT3(PKT3_EVENT_WRITE
, 0);
285 state
->pm4
[state
->cpm4
++] = EVENT_TYPE_CACHE_FLUSH_AND_INV_EVENT
;
286 state
->pm4
[state
->cpm4
++] = PKT3(PKT3_SET_CONFIG_REG
, 1);
287 state
->pm4
[state
->cpm4
++] = 0x00000010;
288 state
->pm4
[state
->cpm4
++] = 0x00028000;
289 return r600_state_pm4_generic(state
);
292 static int r600_state_pm4_shader(struct radeon_state
*state
)
294 r600_state_pm4_with_flush(state
, S_0085F0_SH_ACTION_ENA(1));
295 return r600_state_pm4_generic(state
);
298 static int r600_state_pm4_vgt(struct radeon_state
*state
)
302 r
= r600_state_pm4_bytecode(state
, R_028400_VGT_MAX_VTX_INDX
, R600_VGT__VGT_MAX_VTX_INDX
, 1);
305 r
= r600_state_pm4_bytecode(state
, R_028404_VGT_MIN_VTX_INDX
, R600_VGT__VGT_MIN_VTX_INDX
, 1);
308 r
= r600_state_pm4_bytecode(state
, R_028408_VGT_INDX_OFFSET
, R600_VGT__VGT_INDX_OFFSET
, 1);
311 r
= r600_state_pm4_bytecode(state
, R_02840C_VGT_MULTI_PRIM_IB_RESET_INDX
, R600_VGT__VGT_MULTI_PRIM_IB_RESET_INDX
, 1);
314 r
= r600_state_pm4_bytecode(state
, R_008958_VGT_PRIMITIVE_TYPE
, R600_VGT__VGT_PRIMITIVE_TYPE
, 1);
317 state
->pm4
[state
->cpm4
++] = PKT3(PKT3_INDEX_TYPE
, 0);
318 state
->pm4
[state
->cpm4
++] = state
->states
[R600_VGT__VGT_DMA_INDEX_TYPE
];
319 state
->pm4
[state
->cpm4
++] = PKT3(PKT3_NUM_INSTANCES
, 0);
320 state
->pm4
[state
->cpm4
++] = state
->states
[R600_VGT__VGT_DMA_NUM_INSTANCES
];
324 static int r600_state_pm4_draw(struct radeon_state
*state
)
330 state
->pm4
[state
->cpm4
++] = PKT3(PKT3_DRAW_INDEX
, 3);
331 state
->pm4
[state
->cpm4
++] = state
->states
[R600_DRAW__VGT_DMA_BASE
];
332 state
->pm4
[state
->cpm4
++] = state
->states
[R600_DRAW__VGT_DMA_BASE_HI
];
333 state
->pm4
[state
->cpm4
++] = state
->states
[R600_DRAW__VGT_NUM_INDICES
];
334 state
->pm4
[state
->cpm4
++] = state
->states
[R600_DRAW__VGT_DRAW_INITIATOR
];
335 state
->pm4
[state
->cpm4
++] = PKT3(PKT3_NOP
, 0);
336 r
= radeon_state_reloc(state
, state
->cpm4
, 0);
339 state
->pm4
[state
->cpm4
++] = state
->bo
[0]->handle
;
340 } else if (state
->nimmd
) {
341 state
->pm4
[state
->cpm4
++] = PKT3(PKT3_DRAW_INDEX_IMMD
, state
->nimmd
+ 1);
342 state
->pm4
[state
->cpm4
++] = state
->states
[R600_DRAW__VGT_NUM_INDICES
];
343 state
->pm4
[state
->cpm4
++] = state
->states
[R600_DRAW__VGT_DRAW_INITIATOR
];
344 for (i
= 0; i
< state
->nimmd
; i
++) {
345 state
->pm4
[state
->cpm4
++] = state
->immd
[i
];
348 state
->pm4
[state
->cpm4
++] = PKT3(PKT3_DRAW_INDEX_AUTO
, 1);
349 state
->pm4
[state
->cpm4
++] = state
->states
[R600_DRAW__VGT_NUM_INDICES
];
350 state
->pm4
[state
->cpm4
++] = state
->states
[R600_DRAW__VGT_DRAW_INITIATOR
];
352 state
->pm4
[state
->cpm4
++] = PKT3(PKT3_EVENT_WRITE
, 0);
353 state
->pm4
[state
->cpm4
++] = EVENT_TYPE_CACHE_FLUSH_AND_INV_EVENT
;
357 static int r600_state_pm4_resource(struct radeon_state
*state
)
359 u32 flags
, type
, nbo
, offset
, soffset
;
362 soffset
= (state
->id
- state
->radeon
->type
[state
->type
].id
) * state
->radeon
->type
[state
->type
].stride
;
363 type
= G_038018_TYPE(state
->states
[6]);
366 flags
= S_0085F0_TC_ACTION_ENA(1);
370 flags
= S_0085F0_VC_ACTION_ENA(1);
376 if (state
->nbo
!= nbo
) {
377 fprintf(stderr
, "%s need %d bo got %d\n", __func__
, nbo
, state
->nbo
);
380 r600_state_pm4_with_flush(state
, flags
);
381 offset
= state
->radeon
->type
[state
->type
].regs
[0].offset
+ soffset
;
382 state
->pm4
[state
->cpm4
++] = PKT3(PKT3_SET_RESOURCE
, 7);
383 state
->pm4
[state
->cpm4
++] = (offset
- R_038000_SQ_TEX_RESOURCE_WORD0_0
) >> 2;
384 state
->pm4
[state
->cpm4
++] = state
->states
[0];
385 state
->pm4
[state
->cpm4
++] = state
->states
[1];
386 state
->pm4
[state
->cpm4
++] = state
->states
[2];
387 state
->pm4
[state
->cpm4
++] = state
->states
[3];
388 state
->pm4
[state
->cpm4
++] = state
->states
[4];
389 state
->pm4
[state
->cpm4
++] = state
->states
[5];
390 state
->pm4
[state
->cpm4
++] = state
->states
[6];
391 state
->pm4
[state
->cpm4
++] = PKT3(PKT3_NOP
, 0);
392 r
= radeon_state_reloc(state
, state
->cpm4
, 0);
395 state
->pm4
[state
->cpm4
++] = state
->bo
[0]->handle
;
397 state
->pm4
[state
->cpm4
++] = PKT3(PKT3_NOP
, 0);
398 r
= radeon_state_reloc(state
, state
->cpm4
, 1);
401 state
->pm4
[state
->cpm4
++] = state
->bo
[1]->handle
;
406 int r600_init(struct radeon
*radeon
)
408 switch (radeon
->family
) {
417 radeon
->ntype
= R600_NTYPE
;
418 radeon
->nstate
= R600_NSTATE
;
419 radeon
->type
= R600_types
;
425 radeon
->ntype
= R600_NTYPE
;
426 radeon
->nstate
= R600_NSTATE
;
427 radeon
->type
= R700_types
;
430 fprintf(stderr
, "%s unknown or unsupported chipset 0x%04X\n",
431 __func__
, radeon
->device
);