blob: 32343f059f806fcc39b561e6f42d76723fafe04a [file] [log] [blame]
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07001/* Copyright (c) 2012, Code Aurora Forum. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 */
13
14#include <linux/delay.h>
Steve Mucklef132c6c2012-06-06 18:30:57 -070015#include <linux/sched.h>
Sudhakara Rao Tentu5746bde2012-03-15 12:16:32 +053016#include <mach/socinfo.h>
Jordan Crouseb4d31bd2012-02-01 22:11:12 -070017
18#include "kgsl.h"
19#include "adreno.h"
20#include "kgsl_sharedmem.h"
21#include "kgsl_cffdump.h"
22#include "a3xx_reg.h"
Carter Cooperb769c912012-04-13 08:16:35 -060023#include "adreno_a3xx_trace.h"
Jordan Crouseb4d31bd2012-02-01 22:11:12 -070024
Jordan Crouse0c2761a2012-02-01 22:11:12 -070025/*
26 * Set of registers to dump for A3XX on postmortem and snapshot.
27 * Registers in pairs - first value is the start offset, second
28 * is the stop offset (inclusive)
29 */
30
31const unsigned int a3xx_registers[] = {
32 0x0000, 0x0002, 0x0010, 0x0012, 0x0018, 0x0018, 0x0020, 0x0027,
33 0x0029, 0x002b, 0x002e, 0x0033, 0x0040, 0x0042, 0x0050, 0x005c,
34 0x0060, 0x006c, 0x0080, 0x0082, 0x0084, 0x0088, 0x0090, 0x00e5,
35 0x00ea, 0x00ed, 0x0100, 0x0100, 0x0110, 0x0123, 0x01c0, 0x01c1,
36 0x01c3, 0x01c5, 0x01c7, 0x01c7, 0x01d5, 0x01d9, 0x01dc, 0x01dd,
37 0x01ea, 0x01ea, 0x01ee, 0x01f1, 0x01f5, 0x01f5, 0x01fc, 0x01ff,
38 0x0440, 0x0440, 0x0443, 0x0443, 0x0445, 0x0445, 0x044d, 0x044f,
39 0x0452, 0x0452, 0x0454, 0x046f, 0x047c, 0x047c, 0x047f, 0x047f,
Jordan Crouse55d98fd2012-02-04 10:23:51 -070040 0x0578, 0x057f, 0x0600, 0x0602, 0x0605, 0x0607, 0x060a, 0x060e,
Jordan Crouse0c2761a2012-02-01 22:11:12 -070041 0x0612, 0x0614, 0x0c01, 0x0c02, 0x0c06, 0x0c1d, 0x0c3d, 0x0c3f,
42 0x0c48, 0x0c4b, 0x0c80, 0x0c80, 0x0c88, 0x0c8b, 0x0ca0, 0x0cb7,
Carter Cooperf294e892012-11-26 10:45:53 -070043 0x0cc0, 0x0cc1, 0x0cc6, 0x0cc7, 0x0ce4, 0x0ce5,
44 0x0e41, 0x0e45, 0x0e64, 0x0e65,
Jordan Crouse0c2761a2012-02-01 22:11:12 -070045 0x0e80, 0x0e82, 0x0e84, 0x0e89, 0x0ea0, 0x0ea1, 0x0ea4, 0x0ea7,
46 0x0ec4, 0x0ecb, 0x0ee0, 0x0ee0, 0x0f00, 0x0f01, 0x0f03, 0x0f09,
47 0x2040, 0x2040, 0x2044, 0x2044, 0x2048, 0x204d, 0x2068, 0x2069,
48 0x206c, 0x206d, 0x2070, 0x2070, 0x2072, 0x2072, 0x2074, 0x2075,
49 0x2079, 0x207a, 0x20c0, 0x20d3, 0x20e4, 0x20ef, 0x2100, 0x2109,
50 0x210c, 0x210c, 0x210e, 0x210e, 0x2110, 0x2111, 0x2114, 0x2115,
51 0x21e4, 0x21e4, 0x21ea, 0x21ea, 0x21ec, 0x21ed, 0x21f0, 0x21f0,
Carter Cooperf294e892012-11-26 10:45:53 -070052 0x2240, 0x227e,
Jordan Crouse0c2761a2012-02-01 22:11:12 -070053 0x2280, 0x228b, 0x22c0, 0x22c0, 0x22c4, 0x22ce, 0x22d0, 0x22d8,
54 0x22df, 0x22e6, 0x22e8, 0x22e9, 0x22ec, 0x22ec, 0x22f0, 0x22f7,
55 0x22ff, 0x22ff, 0x2340, 0x2343, 0x2348, 0x2349, 0x2350, 0x2356,
56 0x2360, 0x2360, 0x2440, 0x2440, 0x2444, 0x2444, 0x2448, 0x244d,
57 0x2468, 0x2469, 0x246c, 0x246d, 0x2470, 0x2470, 0x2472, 0x2472,
58 0x2474, 0x2475, 0x2479, 0x247a, 0x24c0, 0x24d3, 0x24e4, 0x24ef,
59 0x2500, 0x2509, 0x250c, 0x250c, 0x250e, 0x250e, 0x2510, 0x2511,
60 0x2514, 0x2515, 0x25e4, 0x25e4, 0x25ea, 0x25ea, 0x25ec, 0x25ed,
Carter Cooperf294e892012-11-26 10:45:53 -070061 0x25f0, 0x25f0,
Jordan Crouse0c2761a2012-02-01 22:11:12 -070062 0x2640, 0x267e, 0x2680, 0x268b, 0x26c0, 0x26c0, 0x26c4, 0x26ce,
63 0x26d0, 0x26d8, 0x26df, 0x26e6, 0x26e8, 0x26e9, 0x26ec, 0x26ec,
64 0x26f0, 0x26f7, 0x26ff, 0x26ff, 0x2740, 0x2743, 0x2748, 0x2749,
Jordan Crouse1268f9c2012-02-21 08:54:53 -070065 0x2750, 0x2756, 0x2760, 0x2760, 0x300C, 0x300E, 0x301C, 0x301D,
66 0x302A, 0x302A, 0x302C, 0x302D, 0x3030, 0x3031, 0x3034, 0x3036,
67 0x303C, 0x303C, 0x305E, 0x305F,
Jordan Crouse0c2761a2012-02-01 22:11:12 -070068};
69
70const unsigned int a3xx_registers_count = ARRAY_SIZE(a3xx_registers) / 2;
71
Carter Cooperf294e892012-11-26 10:45:53 -070072/* Removed the following HLSQ register ranges from being read during
73 * recovery since reading the registers may cause the device to hang:
74 */
75const unsigned int a3xx_hlsq_registers[] = {
76 0x0e00, 0x0e05, 0x0e0c, 0x0e0c, 0x0e22, 0x0e23,
77 0x2200, 0x2212, 0x2214, 0x2217, 0x221a, 0x221a,
78 0x2600, 0x2612, 0x2614, 0x2617, 0x261a, 0x261a,
79};
80
81const unsigned int a3xx_hlsq_registers_count =
82 ARRAY_SIZE(a3xx_hlsq_registers) / 2;
83
Jordan Crouse99839252012-08-14 14:33:42 -060084/* The set of additional registers to be dumped for A330 */
85
86const unsigned int a330_registers[] = {
87 0x1d0, 0x1d0, 0x1d4, 0x1d4, 0x453, 0x453,
88};
89
90const unsigned int a330_registers_count = ARRAY_SIZE(a330_registers) / 2;
91
Jordan Crouseb4d31bd2012-02-01 22:11:12 -070092/* Simple macro to facilitate bit setting in the gmem2sys and sys2gmem
93 * functions.
94 */
95
96#define _SET(_shift, _val) ((_val) << (_shift))
97
98/*
99 ****************************************************************************
100 *
101 * Context state shadow structure:
102 *
103 * +---------------------+------------+-------------+---------------------+---+
104 * | ALU Constant Shadow | Reg Shadow | C&V Buffers | Shader Instr Shadow |Tex|
105 * +---------------------+------------+-------------+---------------------+---+
106 *
107 * 8K - ALU Constant Shadow (8K aligned)
108 * 4K - H/W Register Shadow (8K aligned)
109 * 5K - Command and Vertex Buffers
110 * 8K - Shader Instruction Shadow
111 * ~6K - Texture Constant Shadow
112 *
113 *
114 ***************************************************************************
115 */
116
117/* Sizes of all sections in state shadow memory */
118#define ALU_SHADOW_SIZE (8*1024) /* 8KB */
119#define REG_SHADOW_SIZE (4*1024) /* 4KB */
120#define CMD_BUFFER_SIZE (5*1024) /* 5KB */
121#define TEX_SIZE_MEM_OBJECTS 896 /* bytes */
122#define TEX_SIZE_MIPMAP 1936 /* bytes */
123#define TEX_SIZE_SAMPLER_OBJ 256 /* bytes */
124#define TEX_SHADOW_SIZE \
125 ((TEX_SIZE_MEM_OBJECTS + TEX_SIZE_MIPMAP + \
126 TEX_SIZE_SAMPLER_OBJ)*2) /* ~6KB */
127#define SHADER_SHADOW_SIZE (8*1024) /* 8KB */
128
129/* Total context size, excluding GMEM shadow */
130#define CONTEXT_SIZE \
131 (ALU_SHADOW_SIZE+REG_SHADOW_SIZE + \
132 CMD_BUFFER_SIZE+SHADER_SHADOW_SIZE + \
133 TEX_SHADOW_SIZE)
134
135/* Offsets to different sections in context shadow memory */
136#define REG_OFFSET ALU_SHADOW_SIZE
137#define CMD_OFFSET (REG_OFFSET+REG_SHADOW_SIZE)
138#define SHADER_OFFSET (CMD_OFFSET+CMD_BUFFER_SIZE)
139#define TEX_OFFSET (SHADER_OFFSET+SHADER_SHADOW_SIZE)
140#define VS_TEX_OFFSET_MEM_OBJECTS TEX_OFFSET
141#define VS_TEX_OFFSET_MIPMAP (VS_TEX_OFFSET_MEM_OBJECTS+TEX_SIZE_MEM_OBJECTS)
142#define VS_TEX_OFFSET_SAMPLER_OBJ (VS_TEX_OFFSET_MIPMAP+TEX_SIZE_MIPMAP)
143#define FS_TEX_OFFSET_MEM_OBJECTS \
144 (VS_TEX_OFFSET_SAMPLER_OBJ+TEX_SIZE_SAMPLER_OBJ)
145#define FS_TEX_OFFSET_MIPMAP (FS_TEX_OFFSET_MEM_OBJECTS+TEX_SIZE_MEM_OBJECTS)
146#define FS_TEX_OFFSET_SAMPLER_OBJ (FS_TEX_OFFSET_MIPMAP+TEX_SIZE_MIPMAP)
147
148/* The offset for fragment shader data in HLSQ context */
149#define SSIZE (16*1024)
150
151#define HLSQ_SAMPLER_OFFSET 0x000
152#define HLSQ_MEMOBJ_OFFSET 0x400
153#define HLSQ_MIPMAP_OFFSET 0x800
154
Jordan Crouseb4d31bd2012-02-01 22:11:12 -0700155/* Use shadow RAM */
156#define HLSQ_SHADOW_BASE (0x10000+SSIZE*2)
Jordan Crouseb4d31bd2012-02-01 22:11:12 -0700157
Jordan Croused0070882012-02-21 08:54:52 -0700158#define REG_TO_MEM_LOOP_COUNT_SHIFT 18
Jordan Crouseb4d31bd2012-02-01 22:11:12 -0700159
160#define BUILD_PC_DRAW_INITIATOR(prim_type, source_select, index_size, \
161 vis_cull_mode) \
162 (((prim_type) << PC_DRAW_INITIATOR_PRIM_TYPE) | \
163 ((source_select) << PC_DRAW_INITIATOR_SOURCE_SELECT) | \
164 ((index_size & 1) << PC_DRAW_INITIATOR_INDEX_SIZE) | \
165 ((index_size >> 1) << PC_DRAW_INITIATOR_SMALL_INDEX) | \
166 ((vis_cull_mode) << PC_DRAW_INITIATOR_VISIBILITY_CULLING_MODE) | \
167 (1 << PC_DRAW_INITIATOR_PRE_DRAW_INITIATOR_ENABLE))
168
169/*
170 * List of context registers (starting from dword offset 0x2000).
171 * Each line contains start and end of a range of registers.
172 */
173static const unsigned int context_register_ranges[] = {
174 A3XX_GRAS_CL_CLIP_CNTL, A3XX_GRAS_CL_CLIP_CNTL,
175 A3XX_GRAS_CL_GB_CLIP_ADJ, A3XX_GRAS_CL_GB_CLIP_ADJ,
176 A3XX_GRAS_CL_VPORT_XOFFSET, A3XX_GRAS_CL_VPORT_ZSCALE,
177 A3XX_GRAS_SU_POINT_MINMAX, A3XX_GRAS_SU_POINT_SIZE,
178 A3XX_GRAS_SU_POLY_OFFSET_SCALE, A3XX_GRAS_SU_POLY_OFFSET_OFFSET,
179 A3XX_GRAS_SU_MODE_CONTROL, A3XX_GRAS_SU_MODE_CONTROL,
180 A3XX_GRAS_SC_CONTROL, A3XX_GRAS_SC_CONTROL,
181 A3XX_GRAS_SC_SCREEN_SCISSOR_TL, A3XX_GRAS_SC_SCREEN_SCISSOR_BR,
182 A3XX_GRAS_SC_WINDOW_SCISSOR_TL, A3XX_GRAS_SC_WINDOW_SCISSOR_BR,
183 A3XX_RB_MODE_CONTROL, A3XX_RB_MRT_BLEND_CONTROL3,
184 A3XX_RB_BLEND_RED, A3XX_RB_COPY_DEST_INFO,
185 A3XX_RB_DEPTH_CONTROL, A3XX_RB_DEPTH_CONTROL,
186 A3XX_PC_VSTREAM_CONTROL, A3XX_PC_VSTREAM_CONTROL,
187 A3XX_PC_VERTEX_REUSE_BLOCK_CNTL, A3XX_PC_VERTEX_REUSE_BLOCK_CNTL,
188 A3XX_PC_PRIM_VTX_CNTL, A3XX_PC_RESTART_INDEX,
189 A3XX_HLSQ_CONTROL_0_REG, A3XX_HLSQ_CONST_FSPRESV_RANGE_REG,
190 A3XX_HLSQ_CL_NDRANGE_0_REG, A3XX_HLSQ_CL_NDRANGE_0_REG,
191 A3XX_HLSQ_CL_NDRANGE_2_REG, A3XX_HLSQ_CL_CONTROL_1_REG,
192 A3XX_HLSQ_CL_KERNEL_CONST_REG, A3XX_HLSQ_CL_KERNEL_GROUP_Z_REG,
193 A3XX_HLSQ_CL_WG_OFFSET_REG, A3XX_HLSQ_CL_WG_OFFSET_REG,
194 A3XX_VFD_CONTROL_0, A3XX_VFD_VS_THREADING_THRESHOLD,
195 A3XX_SP_SP_CTRL_REG, A3XX_SP_SP_CTRL_REG,
196 A3XX_SP_VS_CTRL_REG0, A3XX_SP_VS_OUT_REG_7,
197 A3XX_SP_VS_VPC_DST_REG_0, A3XX_SP_VS_PVT_MEM_SIZE_REG,
198 A3XX_SP_VS_LENGTH_REG, A3XX_SP_FS_PVT_MEM_SIZE_REG,
199 A3XX_SP_FS_FLAT_SHAD_MODE_REG_0, A3XX_SP_FS_FLAT_SHAD_MODE_REG_1,
200 A3XX_SP_FS_OUTPUT_REG, A3XX_SP_FS_OUTPUT_REG,
201 A3XX_SP_FS_MRT_REG_0, A3XX_SP_FS_IMAGE_OUTPUT_REG_3,
202 A3XX_SP_FS_LENGTH_REG, A3XX_SP_FS_LENGTH_REG,
203 A3XX_TPL1_TP_VS_TEX_OFFSET, A3XX_TPL1_TP_FS_BORDER_COLOR_BASE_ADDR,
204 A3XX_VPC_ATTR, A3XX_VPC_VARY_CYLWRAP_ENABLE_1,
205};
206
207/* Global registers that need to be saved separately */
208static const unsigned int global_registers[] = {
209 A3XX_GRAS_CL_USER_PLANE_X0, A3XX_GRAS_CL_USER_PLANE_Y0,
210 A3XX_GRAS_CL_USER_PLANE_Z0, A3XX_GRAS_CL_USER_PLANE_W0,
211 A3XX_GRAS_CL_USER_PLANE_X1, A3XX_GRAS_CL_USER_PLANE_Y1,
212 A3XX_GRAS_CL_USER_PLANE_Z1, A3XX_GRAS_CL_USER_PLANE_W1,
213 A3XX_GRAS_CL_USER_PLANE_X2, A3XX_GRAS_CL_USER_PLANE_Y2,
214 A3XX_GRAS_CL_USER_PLANE_Z2, A3XX_GRAS_CL_USER_PLANE_W2,
215 A3XX_GRAS_CL_USER_PLANE_X3, A3XX_GRAS_CL_USER_PLANE_Y3,
216 A3XX_GRAS_CL_USER_PLANE_Z3, A3XX_GRAS_CL_USER_PLANE_W3,
217 A3XX_GRAS_CL_USER_PLANE_X4, A3XX_GRAS_CL_USER_PLANE_Y4,
218 A3XX_GRAS_CL_USER_PLANE_Z4, A3XX_GRAS_CL_USER_PLANE_W4,
219 A3XX_GRAS_CL_USER_PLANE_X5, A3XX_GRAS_CL_USER_PLANE_Y5,
220 A3XX_GRAS_CL_USER_PLANE_Z5, A3XX_GRAS_CL_USER_PLANE_W5,
221 A3XX_VSC_BIN_SIZE,
222 A3XX_VSC_PIPE_CONFIG_0, A3XX_VSC_PIPE_CONFIG_1,
223 A3XX_VSC_PIPE_CONFIG_2, A3XX_VSC_PIPE_CONFIG_3,
224 A3XX_VSC_PIPE_CONFIG_4, A3XX_VSC_PIPE_CONFIG_5,
225 A3XX_VSC_PIPE_CONFIG_6, A3XX_VSC_PIPE_CONFIG_7,
226 A3XX_VSC_PIPE_DATA_ADDRESS_0, A3XX_VSC_PIPE_DATA_ADDRESS_1,
227 A3XX_VSC_PIPE_DATA_ADDRESS_2, A3XX_VSC_PIPE_DATA_ADDRESS_3,
228 A3XX_VSC_PIPE_DATA_ADDRESS_4, A3XX_VSC_PIPE_DATA_ADDRESS_5,
229 A3XX_VSC_PIPE_DATA_ADDRESS_6, A3XX_VSC_PIPE_DATA_ADDRESS_7,
230 A3XX_VSC_PIPE_DATA_LENGTH_0, A3XX_VSC_PIPE_DATA_LENGTH_1,
231 A3XX_VSC_PIPE_DATA_LENGTH_2, A3XX_VSC_PIPE_DATA_LENGTH_3,
232 A3XX_VSC_PIPE_DATA_LENGTH_4, A3XX_VSC_PIPE_DATA_LENGTH_5,
233 A3XX_VSC_PIPE_DATA_LENGTH_6, A3XX_VSC_PIPE_DATA_LENGTH_7,
234 A3XX_VSC_SIZE_ADDRESS
235};
236
237#define GLOBAL_REGISTER_COUNT ARRAY_SIZE(global_registers)
238
239/* A scratchpad used to build commands during context create */
240static struct tmp_ctx {
241 unsigned int *cmd; /* Next available dword in C&V buffer */
242
243 /* Addresses in comamnd buffer where registers are saved */
244 uint32_t reg_values[GLOBAL_REGISTER_COUNT];
245 uint32_t gmem_base; /* Base GPU address of GMEM */
246} tmp_ctx;
247
248#ifndef GSL_CONTEXT_SWITCH_CPU_SYNC
249/*
250 * Function for executing dest = ( (reg & and) ROL rol ) | or
251 */
252static unsigned int *rmw_regtomem(unsigned int *cmd,
253 unsigned int reg, unsigned int and,
254 unsigned int rol, unsigned int or,
255 unsigned int dest)
256{
257 /* CP_SCRATCH_REG2 = (CP_SCRATCH_REG2 & 0x00000000) | reg */
258 *cmd++ = cp_type3_packet(CP_REG_RMW, 3);
259 *cmd++ = (1 << 30) | A3XX_CP_SCRATCH_REG2;
260 *cmd++ = 0x00000000; /* AND value */
261 *cmd++ = reg; /* OR address */
262
263 /* CP_SCRATCH_REG2 = ( (CP_SCRATCH_REG2 & and) ROL rol ) | or */
264 *cmd++ = cp_type3_packet(CP_REG_RMW, 3);
265 *cmd++ = (rol << 24) | A3XX_CP_SCRATCH_REG2;
266 *cmd++ = and; /* AND value */
267 *cmd++ = or; /* OR value */
268
269 *cmd++ = cp_type3_packet(CP_REG_TO_MEM, 2);
270 *cmd++ = A3XX_CP_SCRATCH_REG2;
271 *cmd++ = dest;
272
273 return cmd;
274}
275#endif
276
277static void build_regconstantsave_cmds(struct adreno_device *adreno_dev,
278 struct adreno_context *drawctxt)
279{
280 unsigned int *cmd = tmp_ctx.cmd;
Jordan Crousea7ec4212012-02-04 10:23:52 -0700281 unsigned int *start;
Jordan Crouseb4d31bd2012-02-01 22:11:12 -0700282 unsigned int i;
283
284 drawctxt->constant_save_commands[0].hostptr = cmd;
285 drawctxt->constant_save_commands[0].gpuaddr =
286 virt2gpu(cmd, &drawctxt->gpustate);
287 cmd++;
288
Jordan Crousea7ec4212012-02-04 10:23:52 -0700289 start = cmd;
290
Jordan Crouseb4d31bd2012-02-01 22:11:12 -0700291 *cmd++ = cp_type3_packet(CP_WAIT_FOR_IDLE, 1);
292 *cmd++ = 0;
293
294#ifndef CONFIG_MSM_KGSL_DISABLE_SHADOW_WRITES
295 /*
296 * Context registers are already shadowed; just need to
297 * disable shadowing to prevent corruption.
298 */
299
300 *cmd++ = cp_type3_packet(CP_LOAD_CONSTANT_CONTEXT, 3);
301 *cmd++ = (drawctxt->gpustate.gpuaddr + REG_OFFSET) & 0xFFFFE000;
302 *cmd++ = 4 << 16; /* regs, start=0 */
303 *cmd++ = 0x0; /* count = 0 */
304
305#else
306 /*
307 * Make sure the HW context has the correct register values before
308 * reading them.
309 */
310
311 /* Write context registers into shadow */
312 for (i = 0; i < ARRAY_SIZE(context_register_ranges) / 2; i++) {
313 unsigned int start = context_register_ranges[i * 2];
314 unsigned int end = context_register_ranges[i * 2 + 1];
315 *cmd++ = cp_type3_packet(CP_REG_TO_MEM, 2);
316 *cmd++ = ((end - start + 1) << REG_TO_MEM_LOOP_COUNT_SHIFT) |
317 start;
318 *cmd++ = ((drawctxt->gpustate.gpuaddr + REG_OFFSET)
319 & 0xFFFFE000) + (start - 0x2000) * 4;
320 }
321#endif
322
323 /* Need to handle some of the global registers separately */
324 for (i = 0; i < ARRAY_SIZE(global_registers); i++) {
325 *cmd++ = cp_type3_packet(CP_REG_TO_MEM, 2);
326 *cmd++ = global_registers[i];
327 *cmd++ = tmp_ctx.reg_values[i];
328 }
329
330 /* Save vertex shader constants */
331 *cmd++ = cp_type3_packet(CP_COND_EXEC, 4);
332 *cmd++ = drawctxt->cond_execs[2].gpuaddr >> 2;
333 *cmd++ = drawctxt->cond_execs[2].gpuaddr >> 2;
334 *cmd++ = 0x0000FFFF;
335 *cmd++ = 3; /* EXEC_COUNT */
336 *cmd++ = cp_type3_packet(CP_REG_TO_MEM, 2);
337 drawctxt->constant_save_commands[1].hostptr = cmd;
338 drawctxt->constant_save_commands[1].gpuaddr =
339 virt2gpu(cmd, &drawctxt->gpustate);
340 /*
341 From fixup:
342
343 dwords = SP_VS_CTRL_REG1.VSCONSTLENGTH / 4
344 src = (HLSQ_SHADOW_BASE + 0x2000) / 4
345
346 From register spec:
347 SP_VS_CTRL_REG1.VSCONSTLENGTH [09:00]: 0-512, unit = 128bits.
348 */
349 *cmd++ = 0; /* (dwords << REG_TO_MEM_LOOP_COUNT_SHIFT) | src */
350 /* ALU constant shadow base */
351 *cmd++ = drawctxt->gpustate.gpuaddr & 0xfffffffc;
352
353 /* Save fragment shader constants */
354 *cmd++ = cp_type3_packet(CP_COND_EXEC, 4);
355 *cmd++ = drawctxt->cond_execs[3].gpuaddr >> 2;
356 *cmd++ = drawctxt->cond_execs[3].gpuaddr >> 2;
357 *cmd++ = 0x0000FFFF;
358 *cmd++ = 3; /* EXEC_COUNT */
359 *cmd++ = cp_type3_packet(CP_REG_TO_MEM, 2);
360 drawctxt->constant_save_commands[2].hostptr = cmd;
361 drawctxt->constant_save_commands[2].gpuaddr =
362 virt2gpu(cmd, &drawctxt->gpustate);
363 /*
364 From fixup:
365
366 dwords = SP_FS_CTRL_REG1.FSCONSTLENGTH / 4
367 src = (HLSQ_SHADOW_BASE + 0x2000 + SSIZE) / 4
368
369 From register spec:
370 SP_FS_CTRL_REG1.FSCONSTLENGTH [09:00]: 0-512, unit = 128bits.
371 */
372 *cmd++ = 0; /* (dwords << REG_TO_MEM_LOOP_COUNT_SHIFT) | src */
373
374 /*
375 From fixup:
376
377 base = drawctxt->gpustate.gpuaddr (ALU constant shadow base)
378 offset = SP_FS_OBJ_OFFSET_REG.CONSTOBJECTSTARTOFFSET
379
380 From register spec:
381 SP_FS_OBJ_OFFSET_REG.CONSTOBJECTSTARTOFFSET [16:24]: Constant object
382 start offset in on chip RAM,
383 128bit aligned
384
385 dst = base + offset
386 Because of the base alignment we can use
387 dst = base | offset
388 */
389 *cmd++ = 0; /* dst */
390
391 /* Save VS texture memory objects */
392 *cmd++ = cp_type3_packet(CP_REG_TO_MEM, 2);
393 *cmd++ =
394 ((TEX_SIZE_MEM_OBJECTS / 4) << REG_TO_MEM_LOOP_COUNT_SHIFT) |
395 ((HLSQ_SHADOW_BASE + HLSQ_MEMOBJ_OFFSET) / 4);
396 *cmd++ =
397 (drawctxt->gpustate.gpuaddr +
398 VS_TEX_OFFSET_MEM_OBJECTS) & 0xfffffffc;
399
400 /* Save VS texture mipmap pointers */
401 *cmd++ = cp_type3_packet(CP_REG_TO_MEM, 2);
402 *cmd++ =
403 ((TEX_SIZE_MIPMAP / 4) << REG_TO_MEM_LOOP_COUNT_SHIFT) |
404 ((HLSQ_SHADOW_BASE + HLSQ_MIPMAP_OFFSET) / 4);
405 *cmd++ =
406 (drawctxt->gpustate.gpuaddr + VS_TEX_OFFSET_MIPMAP) & 0xfffffffc;
407
408 /* Save VS texture sampler objects */
409 *cmd++ = cp_type3_packet(CP_REG_TO_MEM, 2);
410 *cmd++ = ((TEX_SIZE_SAMPLER_OBJ / 4) << REG_TO_MEM_LOOP_COUNT_SHIFT) |
411 ((HLSQ_SHADOW_BASE + HLSQ_SAMPLER_OFFSET) / 4);
412 *cmd++ =
413 (drawctxt->gpustate.gpuaddr +
414 VS_TEX_OFFSET_SAMPLER_OBJ) & 0xfffffffc;
415
416 /* Save FS texture memory objects */
417 *cmd++ = cp_type3_packet(CP_REG_TO_MEM, 2);
418 *cmd++ =
419 ((TEX_SIZE_MEM_OBJECTS / 4) << REG_TO_MEM_LOOP_COUNT_SHIFT) |
420 ((HLSQ_SHADOW_BASE + HLSQ_MEMOBJ_OFFSET + SSIZE) / 4);
421 *cmd++ =
422 (drawctxt->gpustate.gpuaddr +
423 FS_TEX_OFFSET_MEM_OBJECTS) & 0xfffffffc;
424
425 /* Save FS texture mipmap pointers */
426 *cmd++ = cp_type3_packet(CP_REG_TO_MEM, 2);
427 *cmd++ =
428 ((TEX_SIZE_MIPMAP / 4) << REG_TO_MEM_LOOP_COUNT_SHIFT) |
429 ((HLSQ_SHADOW_BASE + HLSQ_MIPMAP_OFFSET + SSIZE) / 4);
430 *cmd++ =
431 (drawctxt->gpustate.gpuaddr + FS_TEX_OFFSET_MIPMAP) & 0xfffffffc;
432
433 /* Save FS texture sampler objects */
434 *cmd++ = cp_type3_packet(CP_REG_TO_MEM, 2);
435 *cmd++ =
436 ((TEX_SIZE_SAMPLER_OBJ / 4) << REG_TO_MEM_LOOP_COUNT_SHIFT) |
437 ((HLSQ_SHADOW_BASE + HLSQ_SAMPLER_OFFSET + SSIZE) / 4);
438 *cmd++ =
439 (drawctxt->gpustate.gpuaddr +
440 FS_TEX_OFFSET_SAMPLER_OBJ) & 0xfffffffc;
441
442 /* Create indirect buffer command for above command sequence */
443 create_ib1(drawctxt, drawctxt->regconstant_save, start, cmd);
444
445 tmp_ctx.cmd = cmd;
446}
447
448/* Copy GMEM contents to system memory shadow. */
449static unsigned int *build_gmem2sys_cmds(struct adreno_device *adreno_dev,
450 struct adreno_context *drawctxt,
451 struct gmem_shadow_t *shadow)
452{
453 unsigned int *cmds = tmp_ctx.cmd;
454 unsigned int *start = cmds;
455
Jordan Crousefb3012f2012-06-22 13:11:05 -0600456 *cmds++ = cp_type0_packet(A3XX_RBBM_CLOCK_CTL, 1);
457 *cmds++ = A3XX_RBBM_CLOCK_CTL_DEFAULT;
458
Jordan Crouseb4d31bd2012-02-01 22:11:12 -0700459 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 3);
460 *cmds++ = CP_REG(A3XX_RB_MODE_CONTROL);
461
462 /* RB_MODE_CONTROL */
463 *cmds++ = _SET(RB_MODECONTROL_RENDER_MODE, RB_RESOLVE_PASS) |
464 _SET(RB_MODECONTROL_MARB_CACHE_SPLIT_MODE, 1) |
465 _SET(RB_MODECONTROL_PACKER_TIMER_ENABLE, 1);
466 /* RB_RENDER_CONTROL */
467 *cmds++ = _SET(RB_RENDERCONTROL_BIN_WIDTH, shadow->width >> 5) |
468 _SET(RB_RENDERCONTROL_DISABLE_COLOR_PIPE, 1);
469
470 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 5);
471 *cmds++ = CP_REG(A3XX_RB_COPY_CONTROL);
472 /* RB_COPY_CONTROL */
473 *cmds++ = _SET(RB_COPYCONTROL_RESOLVE_CLEAR_MODE,
474 RB_CLEAR_MODE_RESOLVE) |
475 _SET(RB_COPYCONTROL_COPY_GMEM_BASE,
476 tmp_ctx.gmem_base >> 14);
477 /* RB_COPY_DEST_BASE */
478 *cmds++ = _SET(RB_COPYDESTBASE_COPY_DEST_BASE,
479 shadow->gmemshadow.gpuaddr >> 5);
480 /* RB_COPY_DEST_PITCH */
481 *cmds++ = _SET(RB_COPYDESTPITCH_COPY_DEST_PITCH,
482 (shadow->pitch * 4) / 32);
483 /* RB_COPY_DEST_INFO */
484 *cmds++ = _SET(RB_COPYDESTINFO_COPY_DEST_TILE,
485 RB_TILINGMODE_LINEAR) |
486 _SET(RB_COPYDESTINFO_COPY_DEST_FORMAT, RB_R8G8B8A8_UNORM) |
487 _SET(RB_COPYDESTINFO_COPY_COMPONENT_ENABLE, 0X0F) |
488 _SET(RB_COPYDESTINFO_COPY_DEST_ENDIAN, RB_ENDIAN_NONE);
489
490 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
491 *cmds++ = CP_REG(A3XX_GRAS_SC_CONTROL);
492 /* GRAS_SC_CONTROL */
493 *cmds++ = _SET(GRAS_SC_CONTROL_RENDER_MODE, 2);
494
495 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 3);
496 *cmds++ = CP_REG(A3XX_VFD_CONTROL_0);
497 /* VFD_CONTROL_0 */
498 *cmds++ = _SET(VFD_CTRLREG0_TOTALATTRTOVS, 4) |
499 _SET(VFD_CTRLREG0_PACKETSIZE, 2) |
500 _SET(VFD_CTRLREG0_STRMDECINSTRCNT, 1) |
501 _SET(VFD_CTRLREG0_STRMFETCHINSTRCNT, 1);
502 /* VFD_CONTROL_1 */
503 *cmds++ = _SET(VFD_CTRLREG1_MAXSTORAGE, 1) |
504 _SET(VFD_CTRLREG1_REGID4VTX, 252) |
505 _SET(VFD_CTRLREG1_REGID4INST, 252);
506
507 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 3);
508 *cmds++ = CP_REG(A3XX_VFD_FETCH_INSTR_0_0);
509 /* VFD_FETCH_INSTR_0_0 */
510 *cmds++ = _SET(VFD_FETCHINSTRUCTIONS_FETCHSIZE, 11) |
511 _SET(VFD_FETCHINSTRUCTIONS_BUFSTRIDE, 12) |
512 _SET(VFD_FETCHINSTRUCTIONS_STEPRATE, 1);
513 /* VFD_FETCH_INSTR_1_0 */
514 *cmds++ = _SET(VFD_BASEADDR_BASEADDR,
515 shadow->quad_vertices.gpuaddr);
516
517 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
518 *cmds++ = CP_REG(A3XX_VFD_DECODE_INSTR_0);
519 /* VFD_DECODE_INSTR_0 */
520 *cmds++ = _SET(VFD_DECODEINSTRUCTIONS_WRITEMASK, 0x0F) |
521 _SET(VFD_DECODEINSTRUCTIONS_CONSTFILL, 1) |
522 _SET(VFD_DECODEINSTRUCTIONS_FORMAT, 2) |
Jordan Crouseb4d31bd2012-02-01 22:11:12 -0700523 _SET(VFD_DECODEINSTRUCTIONS_SHIFTCNT, 12) |
524 _SET(VFD_DECODEINSTRUCTIONS_LASTCOMPVALID, 1);
525
526 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 5);
527 *cmds++ = CP_REG(A3XX_HLSQ_CONTROL_0_REG);
528 /* HLSQ_CONTROL_0_REG */
Rajeev Kulkarni06a2c722012-07-06 16:47:16 -0700529 *cmds++ = _SET(HLSQ_CTRL0REG_FSTHREADSIZE, HLSQ_FOUR_PIX_QUADS) |
Jordan Crouseb4d31bd2012-02-01 22:11:12 -0700530 _SET(HLSQ_CTRL0REG_FSSUPERTHREADENABLE, 1) |
Jordan Crouseb4d31bd2012-02-01 22:11:12 -0700531 _SET(HLSQ_CTRL0REG_RESERVED2, 1) |
Rajeev Kulkarni06a2c722012-07-06 16:47:16 -0700532 _SET(HLSQ_CTRL0REG_SPCONSTFULLUPDATE, 1);
Jordan Crouseb4d31bd2012-02-01 22:11:12 -0700533 /* HLSQ_CONTROL_1_REG */
534 *cmds++ = _SET(HLSQ_CTRL1REG_VSTHREADSIZE, HLSQ_TWO_VTX_QUADS) |
Rajeev Kulkarni06a2c722012-07-06 16:47:16 -0700535 _SET(HLSQ_CTRL1REG_VSSUPERTHREADENABLE, 1);
Jordan Crouseb4d31bd2012-02-01 22:11:12 -0700536 /* HLSQ_CONTROL_2_REG */
537 *cmds++ = _SET(HLSQ_CTRL2REG_PRIMALLOCTHRESHOLD, 31);
538 /* HLSQ_CONTROL_3_REG */
539 *cmds++ = 0x00000000;
540
541 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 5);
542 *cmds++ = CP_REG(A3XX_HLSQ_VS_CONTROL_REG);
543 /* HLSQ_VS_CONTROL_REG */
544 *cmds++ = _SET(HLSQ_VSCTRLREG_VSINSTRLENGTH, 1);
545 /* HLSQ_FS_CONTROL_REG */
546 *cmds++ = _SET(HLSQ_FSCTRLREG_FSCONSTLENGTH, 1) |
Rajeev Kulkarni06a2c722012-07-06 16:47:16 -0700547 _SET(HLSQ_FSCTRLREG_FSCONSTSTARTOFFSET, 128) |
Jordan Crouseb4d31bd2012-02-01 22:11:12 -0700548 _SET(HLSQ_FSCTRLREG_FSINSTRLENGTH, 1);
549 /* HLSQ_CONST_VSPRESV_RANGE_REG */
550 *cmds++ = 0x00000000;
551 /* HLSQ_CONST_FSPRESV_RANGE_REQ */
552 *cmds++ = _SET(HLSQ_CONSTFSPRESERVEDRANGEREG_STARTENTRY, 32) |
553 _SET(HLSQ_CONSTFSPRESERVEDRANGEREG_ENDENTRY, 32);
554
555 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
556 *cmds++ = CP_REG(A3XX_SP_FS_LENGTH_REG);
557 /* SP_FS_LENGTH_REG */
558 *cmds++ = _SET(SP_SHADERLENGTH_LEN, 1);
559
560 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
561 *cmds++ = CP_REG(A3XX_SP_SP_CTRL_REG);
562 /* SP_SP_CTRL_REG */
Rajeev Kulkarni06a2c722012-07-06 16:47:16 -0700563 *cmds++ = _SET(SP_SPCTRLREG_SLEEPMODE, 1) |
564 _SET(SP_SPCTRLREG_LOMODE, 1);
Jordan Crouseb4d31bd2012-02-01 22:11:12 -0700565
566 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 12);
567 *cmds++ = CP_REG(A3XX_SP_VS_CTRL_REG0);
568 /* SP_VS_CTRL_REG0 */
569 *cmds++ = _SET(SP_VSCTRLREG0_VSTHREADMODE, SP_MULTI) |
570 _SET(SP_VSCTRLREG0_VSINSTRBUFFERMODE, SP_BUFFER_MODE) |
571 _SET(SP_VSCTRLREG0_VSICACHEINVALID, 1) |
Rajeev Kulkarni06a2c722012-07-06 16:47:16 -0700572 _SET(SP_VSCTRLREG0_VSFULLREGFOOTPRINT, 1) |
Jordan Crouseb4d31bd2012-02-01 22:11:12 -0700573 _SET(SP_VSCTRLREG0_VSTHREADSIZE, SP_TWO_VTX_QUADS) |
574 _SET(SP_VSCTRLREG0_VSSUPERTHREADMODE, 1) |
575 _SET(SP_VSCTRLREG0_VSLENGTH, 1);
576 /* SP_VS_CTRL_REG1 */
577 *cmds++ = _SET(SP_VSCTRLREG1_VSINITIALOUTSTANDING, 4);
578 /* SP_VS_PARAM_REG */
Rajeev Kulkarni06a2c722012-07-06 16:47:16 -0700579 *cmds++ = _SET(SP_VSPARAMREG_PSIZEREGID, 252);
Jordan Crouseb4d31bd2012-02-01 22:11:12 -0700580 /* SP_VS_OUT_REG_0 */
581 *cmds++ = 0x00000000;
582 /* SP_VS_OUT_REG_1 */
583 *cmds++ = 0x00000000;
584 /* SP_VS_OUT_REG_2 */
585 *cmds++ = 0x00000000;
586 /* SP_VS_OUT_REG_3 */
587 *cmds++ = 0x00000000;
588 /* SP_VS_OUT_REG_4 */
589 *cmds++ = 0x00000000;
590 /* SP_VS_OUT_REG_5 */
591 *cmds++ = 0x00000000;
592 /* SP_VS_OUT_REG_6 */
593 *cmds++ = 0x00000000;
594 /* SP_VS_OUT_REG_7 */
595 *cmds++ = 0x00000000;
596
597 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 7);
598 *cmds++ = CP_REG(A3XX_SP_VS_VPC_DST_REG_0);
599 /* SP_VS_VPC_DST_REG_0 */
600 *cmds++ = 0x00000000;
601 /* SP_VS_VPC_DST_REG_1 */
602 *cmds++ = 0x00000000;
603 /* SP_VS_VPC_DST_REG_2 */
604 *cmds++ = 0x00000000;
605 /* SP_VS_VPC_DST_REG_3 */
606 *cmds++ = 0x00000000;
607 /* SP_VS_OBJ_OFFSET_REG */
608 *cmds++ = 0x00000000;
609 /* SP_VS_OBJ_START_REG */
610 *cmds++ = 0x00000000;
611
612 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 6);
613 *cmds++ = CP_REG(A3XX_SP_VS_LENGTH_REG);
614 /* SP_VS_LENGTH_REG */
615 *cmds++ = _SET(SP_SHADERLENGTH_LEN, 1);
616 /* SP_FS_CTRL_REG0 */
617 *cmds++ = _SET(SP_FSCTRLREG0_FSTHREADMODE, SP_MULTI) |
618 _SET(SP_FSCTRLREG0_FSINSTRBUFFERMODE, SP_BUFFER_MODE) |
619 _SET(SP_FSCTRLREG0_FSICACHEINVALID, 1) |
Rajeev Kulkarni06a2c722012-07-06 16:47:16 -0700620 _SET(SP_FSCTRLREG0_FSHALFREGFOOTPRINT, 1) |
Jordan Crouseb4d31bd2012-02-01 22:11:12 -0700621 _SET(SP_FSCTRLREG0_FSINOUTREGOVERLAP, 1) |
Rajeev Kulkarni06a2c722012-07-06 16:47:16 -0700622 _SET(SP_FSCTRLREG0_FSTHREADSIZE, SP_FOUR_PIX_QUADS) |
Jordan Crouseb4d31bd2012-02-01 22:11:12 -0700623 _SET(SP_FSCTRLREG0_FSSUPERTHREADMODE, 1) |
624 _SET(SP_FSCTRLREG0_FSLENGTH, 1);
625 /* SP_FS_CTRL_REG1 */
626 *cmds++ = _SET(SP_FSCTRLREG1_FSCONSTLENGTH, 1) |
Jordan Crouseb4d31bd2012-02-01 22:11:12 -0700627 _SET(SP_FSCTRLREG1_HALFPRECVAROFFSET, 63);
628 /* SP_FS_OBJ_OFFSET_REG */
Rajeev Kulkarni06a2c722012-07-06 16:47:16 -0700629 *cmds++ = _SET(SP_OBJOFFSETREG_CONSTOBJECTSTARTOFFSET, 128) |
630 _SET(SP_OBJOFFSETREG_SHADEROBJOFFSETINIC, 127);
Jordan Crouseb4d31bd2012-02-01 22:11:12 -0700631 /* SP_FS_OBJ_START_REG */
632 *cmds++ = 0x00000000;
633
634 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 3);
635 *cmds++ = CP_REG(A3XX_SP_FS_FLAT_SHAD_MODE_REG_0);
636 /* SP_FS_FLAT_SHAD_MODE_REG_0 */
637 *cmds++ = 0x00000000;
638 /* SP_FS_FLAT_SHAD_MODE_REG_1 */
639 *cmds++ = 0x00000000;
640
641 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
642 *cmds++ = CP_REG(A3XX_SP_FS_OUTPUT_REG);
643 /* SP_FS_OUTPUT_REG */
Rajeev Kulkarni06a2c722012-07-06 16:47:16 -0700644 *cmds++ = _SET(SP_IMAGEOUTPUTREG_DEPTHOUTMODE, SP_PIXEL_BASED);
Jordan Crouseb4d31bd2012-02-01 22:11:12 -0700645
646 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 5);
647 *cmds++ = CP_REG(A3XX_SP_FS_MRT_REG_0);
648 /* SP_FS_MRT_REG_0 */
Rajeev Kulkarni06a2c722012-07-06 16:47:16 -0700649 *cmds++ = _SET(SP_FSMRTREG_PRECISION, 1);
650
Jordan Crouseb4d31bd2012-02-01 22:11:12 -0700651 /* SP_FS_MRT_REG_1 */
652 *cmds++ = 0x00000000;
653 /* SP_FS_MRT_REG_2 */
654 *cmds++ = 0x00000000;
655 /* SP_FS_MRT_REG_3 */
656 *cmds++ = 0x00000000;
657
658 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 11);
659 *cmds++ = CP_REG(A3XX_VPC_ATTR);
660 /* VPC_ATTR */
661 *cmds++ = _SET(VPC_VPCATTR_THRHDASSIGN, 1) |
662 _SET(VPC_VPCATTR_LMSIZE, 1);
663 /* VPC_PACK */
664 *cmds++ = 0x00000000;
665 /* VPC_VARRYING_INTERUPT_MODE_0 */
666 *cmds++ = 0x00000000;
667 /* VPC_VARRYING_INTERUPT_MODE_1 */
668 *cmds++ = 0x00000000;
669 /* VPC_VARRYING_INTERUPT_MODE_2 */
670 *cmds++ = 0x00000000;
671 /* VPC_VARRYING_INTERUPT_MODE_3 */
672 *cmds++ = 0x00000000;
673 /* VPC_VARYING_PS_REPL_MODE_0 */
674 *cmds++ = 0x00000000;
675 /* VPC_VARYING_PS_REPL_MODE_1 */
676 *cmds++ = 0x00000000;
677 /* VPC_VARYING_PS_REPL_MODE_2 */
678 *cmds++ = 0x00000000;
679 /* VPC_VARYING_PS_REPL_MODE_3 */
680 *cmds++ = 0x00000000;
681
682 *cmds++ = cp_type3_packet(CP_LOAD_STATE, 10);
683 *cmds++ = (0 << CP_LOADSTATE_DSTOFFSET_SHIFT)
684 | (HLSQ_DIRECT << CP_LOADSTATE_STATESRC_SHIFT)
685 | (HLSQ_BLOCK_ID_SP_VS << CP_LOADSTATE_STATEBLOCKID_SHIFT)
686 | (1 << CP_LOADSTATE_NUMOFUNITS_SHIFT);
687 *cmds++ = (HLSQ_SP_VS_INSTR << CP_LOADSTATE_STATETYPE_SHIFT)
688 | (0 << CP_LOADSTATE_EXTSRCADDR_SHIFT);
689
690 /* (sy)(rpt3)mov.f32f32 r0.y, (r)r1.y; */
Rajeev Kulkarni06a2c722012-07-06 16:47:16 -0700691 *cmds++ = 0x00000000; *cmds++ = 0x13001000;
Jordan Crouseb4d31bd2012-02-01 22:11:12 -0700692 /* end; */
Rajeev Kulkarni06a2c722012-07-06 16:47:16 -0700693 *cmds++ = 0x00000000; *cmds++ = 0x00000000;
Jordan Crouseb4d31bd2012-02-01 22:11:12 -0700694 /* nop; */
695 *cmds++ = 0x00000000; *cmds++ = 0x00000000;
696 /* nop; */
697 *cmds++ = 0x00000000; *cmds++ = 0x00000000;
698
Rajeev Kulkarni06a2c722012-07-06 16:47:16 -0700699
700 *cmds++ = cp_type0_packet(A3XX_VFD_PERFCOUNTER0_SELECT, 1);
701 *cmds++ = 0x00000000;
702
703 *cmds++ = cp_type3_packet(CP_WAIT_FOR_IDLE, 1);
704 *cmds++ = 0x00000000;
705
Jordan Crouseb4d31bd2012-02-01 22:11:12 -0700706 *cmds++ = cp_type3_packet(CP_LOAD_STATE, 10);
707 *cmds++ = (0 << CP_LOADSTATE_DSTOFFSET_SHIFT)
708 | (HLSQ_DIRECT << CP_LOADSTATE_STATESRC_SHIFT)
709 | (HLSQ_BLOCK_ID_SP_FS << CP_LOADSTATE_STATEBLOCKID_SHIFT)
710 | (1 << CP_LOADSTATE_NUMOFUNITS_SHIFT);
711 *cmds++ = (HLSQ_SP_FS_INSTR << CP_LOADSTATE_STATETYPE_SHIFT)
712 | (0 << CP_LOADSTATE_EXTSRCADDR_SHIFT);
713
714 /* (sy)(rpt3)mov.f32f32 r0.y, (r)c0.x; */
Rajeev Kulkarni06a2c722012-07-06 16:47:16 -0700715 *cmds++ = 0x00000000; *cmds++ = 0x30201b00;
Jordan Crouseb4d31bd2012-02-01 22:11:12 -0700716 /* end; */
717 *cmds++ = 0x00000000; *cmds++ = 0x03000000;
718 /* nop; */
719 *cmds++ = 0x00000000; *cmds++ = 0x00000000;
720 /* nop; */
721 *cmds++ = 0x00000000; *cmds++ = 0x00000000;
722
Rajeev Kulkarni06a2c722012-07-06 16:47:16 -0700723
724
725 *cmds++ = cp_type0_packet(A3XX_VFD_PERFCOUNTER0_SELECT, 1);
726 *cmds++ = 0x00000000;
727
728 *cmds++ = cp_type3_packet(CP_WAIT_FOR_IDLE, 1);
729 *cmds++ = 0x00000000;
730
731
Jordan Crouseb4d31bd2012-02-01 22:11:12 -0700732 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
733 *cmds++ = CP_REG(A3XX_RB_MSAA_CONTROL);
734 /* RB_MSAA_CONTROL */
735 *cmds++ = _SET(RB_MSAACONTROL_MSAA_DISABLE, 1) |
736 _SET(RB_MSAACONTROL_SAMPLE_MASK, 0xFFFF);
737
738 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
739 *cmds++ = CP_REG(A3XX_RB_DEPTH_CONTROL);
740 /* RB_DEPTH_CONTROL */
741 *cmds++ = _SET(RB_DEPTHCONTROL_Z_TEST_FUNC, RB_FRAG_NEVER);
742
743 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
Rajeev Kulkarni06a2c722012-07-06 16:47:16 -0700744 *cmds++ = CP_REG(A3XX_RB_STENCIL_CONTROL);
745 /* RB_STENCIL_CONTROL */
746 *cmds++ = _SET(RB_STENCILCONTROL_STENCIL_FUNC, RB_REF_NEVER) |
747 _SET(RB_STENCILCONTROL_STENCIL_FAIL, RB_STENCIL_KEEP) |
748 _SET(RB_STENCILCONTROL_STENCIL_ZPASS, RB_STENCIL_KEEP) |
749 _SET(RB_STENCILCONTROL_STENCIL_ZFAIL, RB_STENCIL_KEEP) |
750 _SET(RB_STENCILCONTROL_STENCIL_FUNC_BF, RB_REF_NEVER) |
751 _SET(RB_STENCILCONTROL_STENCIL_FAIL_BF, RB_STENCIL_KEEP) |
752 _SET(RB_STENCILCONTROL_STENCIL_ZPASS_BF, RB_STENCIL_KEEP) |
753 _SET(RB_STENCILCONTROL_STENCIL_ZFAIL_BF, RB_STENCIL_KEEP);
754
755 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
756 *cmds++ = CP_REG(A3XX_GRAS_SU_MODE_CONTROL);
757 /* GRAS_SU_MODE_CONTROL */
758 *cmds++ = 0x00000000;
759
760 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
Jordan Crouseb4d31bd2012-02-01 22:11:12 -0700761 *cmds++ = CP_REG(A3XX_RB_MRT_CONTROL0);
762 /* RB_MRT_CONTROL0 */
763 *cmds++ = _SET(RB_MRTCONTROL_READ_DEST_ENABLE, 1) |
764 _SET(RB_MRTCONTROL_ROP_CODE, 12) |
765 _SET(RB_MRTCONTROL_DITHER_MODE, RB_DITHER_ALWAYS) |
766 _SET(RB_MRTCONTROL_COMPONENT_ENABLE, 0xF);
767
768 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 3);
769 *cmds++ = CP_REG(A3XX_RB_MRT_BLEND_CONTROL0);
770 /* RB_MRT_BLEND_CONTROL0 */
771 *cmds++ = _SET(RB_MRTBLENDCONTROL_RGB_SRC_FACTOR, RB_FACTOR_ONE) |
772 _SET(RB_MRTBLENDCONTROL_RGB_BLEND_OPCODE, RB_BLEND_OP_ADD) |
773 _SET(RB_MRTBLENDCONTROL_RGB_DEST_FACTOR, RB_FACTOR_ZERO) |
774 _SET(RB_MRTBLENDCONTROL_ALPHA_SRC_FACTOR, RB_FACTOR_ONE) |
775 _SET(RB_MRTBLENDCONTROL_ALPHA_DEST_FACTOR, RB_FACTOR_ZERO) |
776 _SET(RB_MRTBLENDCONTROL_CLAMP_ENABLE, 1);
777 /* RB_MRT_CONTROL1 */
778 *cmds++ = _SET(RB_MRTCONTROL_READ_DEST_ENABLE, 1) |
779 _SET(RB_MRTCONTROL_DITHER_MODE, RB_DITHER_DISABLE) |
780 _SET(RB_MRTCONTROL_COMPONENT_ENABLE, 0xF);
781
782 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 3);
783 *cmds++ = CP_REG(A3XX_RB_MRT_BLEND_CONTROL1);
784 /* RB_MRT_BLEND_CONTROL1 */
785 *cmds++ = _SET(RB_MRTBLENDCONTROL_RGB_SRC_FACTOR, RB_FACTOR_ONE) |
786 _SET(RB_MRTBLENDCONTROL_RGB_BLEND_OPCODE, RB_BLEND_OP_ADD) |
787 _SET(RB_MRTBLENDCONTROL_RGB_DEST_FACTOR, RB_FACTOR_ZERO) |
788 _SET(RB_MRTBLENDCONTROL_ALPHA_SRC_FACTOR, RB_FACTOR_ONE) |
789 _SET(RB_MRTBLENDCONTROL_ALPHA_DEST_FACTOR, RB_FACTOR_ZERO) |
790 _SET(RB_MRTBLENDCONTROL_CLAMP_ENABLE, 1);
791 /* RB_MRT_CONTROL2 */
792 *cmds++ = _SET(RB_MRTCONTROL_READ_DEST_ENABLE, 1) |
793 _SET(RB_MRTCONTROL_DITHER_MODE, RB_DITHER_DISABLE) |
794 _SET(RB_MRTCONTROL_COMPONENT_ENABLE, 0xF);
795
796 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 3);
797 *cmds++ = CP_REG(A3XX_RB_MRT_BLEND_CONTROL2);
798 /* RB_MRT_BLEND_CONTROL2 */
799 *cmds++ = _SET(RB_MRTBLENDCONTROL_RGB_SRC_FACTOR, RB_FACTOR_ONE) |
800 _SET(RB_MRTBLENDCONTROL_RGB_BLEND_OPCODE, RB_BLEND_OP_ADD) |
801 _SET(RB_MRTBLENDCONTROL_RGB_DEST_FACTOR, RB_FACTOR_ZERO) |
802 _SET(RB_MRTBLENDCONTROL_ALPHA_SRC_FACTOR, RB_FACTOR_ONE) |
803 _SET(RB_MRTBLENDCONTROL_ALPHA_DEST_FACTOR, RB_FACTOR_ZERO) |
804 _SET(RB_MRTBLENDCONTROL_CLAMP_ENABLE, 1);
805 /* RB_MRT_CONTROL3 */
806 *cmds++ = _SET(RB_MRTCONTROL_READ_DEST_ENABLE, 1) |
807 _SET(RB_MRTCONTROL_DITHER_MODE, RB_DITHER_DISABLE) |
808 _SET(RB_MRTCONTROL_COMPONENT_ENABLE, 0xF);
809
810 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
811 *cmds++ = CP_REG(A3XX_RB_MRT_BLEND_CONTROL3);
812 /* RB_MRT_BLEND_CONTROL3 */
813 *cmds++ = _SET(RB_MRTBLENDCONTROL_RGB_SRC_FACTOR, RB_FACTOR_ONE) |
814 _SET(RB_MRTBLENDCONTROL_RGB_BLEND_OPCODE, RB_BLEND_OP_ADD) |
815 _SET(RB_MRTBLENDCONTROL_RGB_DEST_FACTOR, RB_FACTOR_ZERO) |
816 _SET(RB_MRTBLENDCONTROL_ALPHA_SRC_FACTOR, RB_FACTOR_ONE) |
817 _SET(RB_MRTBLENDCONTROL_ALPHA_DEST_FACTOR, RB_FACTOR_ZERO) |
818 _SET(RB_MRTBLENDCONTROL_CLAMP_ENABLE, 1);
819
820 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 5);
821 *cmds++ = CP_REG(A3XX_VFD_INDEX_MIN);
822 /* VFD_INDEX_MIN */
823 *cmds++ = 0x00000000;
824 /* VFD_INDEX_MAX */
Rajeev Kulkarni06a2c722012-07-06 16:47:16 -0700825 *cmds++ = 0x155;
Jordan Crouseb4d31bd2012-02-01 22:11:12 -0700826 /* VFD_INSTANCEID_OFFSET */
827 *cmds++ = 0x00000000;
828 /* VFD_INDEX_OFFSET */
829 *cmds++ = 0x00000000;
830
831 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
832 *cmds++ = CP_REG(A3XX_VFD_VS_THREADING_THRESHOLD);
833 /* VFD_VS_THREADING_THRESHOLD */
Rajeev Kulkarni06a2c722012-07-06 16:47:16 -0700834 *cmds++ = _SET(VFD_THREADINGTHRESHOLD_REGID_THRESHOLD, 15) |
Jordan Crouseb4d31bd2012-02-01 22:11:12 -0700835 _SET(VFD_THREADINGTHRESHOLD_REGID_VTXCNT, 252);
836
837 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
838 *cmds++ = CP_REG(A3XX_TPL1_TP_VS_TEX_OFFSET);
839 /* TPL1_TP_VS_TEX_OFFSET */
840 *cmds++ = 0;
841
842 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
843 *cmds++ = CP_REG(A3XX_TPL1_TP_FS_TEX_OFFSET);
844 /* TPL1_TP_FS_TEX_OFFSET */
845 *cmds++ = _SET(TPL1_TPTEXOFFSETREG_SAMPLEROFFSET, 16) |
846 _SET(TPL1_TPTEXOFFSETREG_MEMOBJOFFSET, 16) |
847 _SET(TPL1_TPTEXOFFSETREG_BASETABLEPTR, 224);
848
849 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
850 *cmds++ = CP_REG(A3XX_PC_PRIM_VTX_CNTL);
851 /* PC_PRIM_VTX_CNTL */
852 *cmds++ = _SET(PC_PRIM_VTX_CONTROL_POLYMODE_FRONT_PTYPE,
853 PC_DRAW_TRIANGLES) |
854 _SET(PC_PRIM_VTX_CONTROL_POLYMODE_BACK_PTYPE,
855 PC_DRAW_TRIANGLES) |
856 _SET(PC_PRIM_VTX_CONTROL_PROVOKING_VTX_LAST, 1);
857
858 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 3);
859 *cmds++ = CP_REG(A3XX_GRAS_SC_WINDOW_SCISSOR_TL);
860 /* GRAS_SC_WINDOW_SCISSOR_TL */
861 *cmds++ = 0x00000000;
862 /* GRAS_SC_WINDOW_SCISSOR_BR */
863 *cmds++ = _SET(GRAS_SC_WINDOW_SCISSOR_BR_BR_X, shadow->width - 1) |
864 _SET(GRAS_SC_WINDOW_SCISSOR_BR_BR_Y, shadow->height - 1);
865
866 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 3);
867 *cmds++ = CP_REG(A3XX_GRAS_SC_SCREEN_SCISSOR_TL);
868 /* GRAS_SC_SCREEN_SCISSOR_TL */
869 *cmds++ = 0x00000000;
870 /* GRAS_SC_SCREEN_SCISSOR_BR */
871 *cmds++ = _SET(GRAS_SC_SCREEN_SCISSOR_BR_BR_X, shadow->width - 1) |
872 _SET(GRAS_SC_SCREEN_SCISSOR_BR_BR_Y, shadow->height - 1);
873
874 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 5);
875 *cmds++ = CP_REG(A3XX_GRAS_CL_VPORT_XOFFSET);
876 /* GRAS_CL_VPORT_XOFFSET */
877 *cmds++ = 0x00000000;
878 /* GRAS_CL_VPORT_XSCALE */
879 *cmds++ = _SET(GRAS_CL_VPORT_XSCALE_VPORT_XSCALE, 0x3f800000);
880 /* GRAS_CL_VPORT_YOFFSET */
881 *cmds++ = 0x00000000;
882 /* GRAS_CL_VPORT_YSCALE */
883 *cmds++ = _SET(GRAS_CL_VPORT_YSCALE_VPORT_YSCALE, 0x3f800000);
884
885 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 3);
886 *cmds++ = CP_REG(A3XX_GRAS_CL_VPORT_ZOFFSET);
887 /* GRAS_CL_VPORT_ZOFFSET */
888 *cmds++ = 0x00000000;
889 /* GRAS_CL_VPORT_ZSCALE */
890 *cmds++ = _SET(GRAS_CL_VPORT_ZSCALE_VPORT_ZSCALE, 0x3f800000);
891
892 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
893 *cmds++ = CP_REG(A3XX_GRAS_CL_CLIP_CNTL);
894 /* GRAS_CL_CLIP_CNTL */
895 *cmds++ = _SET(GRAS_CL_CLIP_CNTL_CLIP_DISABLE, 1) |
896 _SET(GRAS_CL_CLIP_CNTL_ZFAR_CLIP_DISABLE, 1) |
897 _SET(GRAS_CL_CLIP_CNTL_VP_CLIP_CODE_IGNORE, 1) |
898 _SET(GRAS_CL_CLIP_CNTL_VP_XFORM_DISABLE, 1) |
899 _SET(GRAS_CL_CLIP_CNTL_PERSP_DIVISION_DISABLE, 1);
900
901 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
902 *cmds++ = CP_REG(A3XX_GRAS_CL_GB_CLIP_ADJ);
903 /* GRAS_CL_GB_CLIP_ADJ */
904 *cmds++ = 0x00000000;
905
906 *cmds++ = cp_type3_packet(CP_WAIT_FOR_IDLE, 1);
907 *cmds++ = 0x00000000;
908
Rajeev Kulkarni06a2c722012-07-06 16:47:16 -0700909
910 /* oxili_generate_context_roll_packets */
911 *cmds++ = cp_type0_packet(A3XX_SP_VS_CTRL_REG0, 1);
912 *cmds++ = 0x00000400;
913
914 *cmds++ = cp_type0_packet(A3XX_SP_FS_CTRL_REG0, 1);
915 *cmds++ = 0x00000400;
916
917 *cmds++ = cp_type0_packet(A3XX_SP_VS_PVT_MEM_SIZE_REG, 1);
918 *cmds++ = 0x00008000; /* SP_VS_MEM_SIZE_REG */
919
920 *cmds++ = cp_type0_packet(A3XX_SP_FS_PVT_MEM_SIZE_REG, 1);
921 *cmds++ = 0x00008000; /* SP_FS_MEM_SIZE_REG */
922
923 /* Clear cache invalidate bit when re-loading the shader control regs */
924 *cmds++ = cp_type0_packet(A3XX_SP_VS_CTRL_REG0, 1);
925 *cmds++ = _SET(SP_VSCTRLREG0_VSTHREADMODE, SP_MULTI) |
926 _SET(SP_VSCTRLREG0_VSINSTRBUFFERMODE, SP_BUFFER_MODE) |
927 _SET(SP_VSCTRLREG0_VSFULLREGFOOTPRINT, 1) |
928 _SET(SP_VSCTRLREG0_VSTHREADSIZE, SP_TWO_VTX_QUADS) |
929 _SET(SP_VSCTRLREG0_VSSUPERTHREADMODE, 1) |
930 _SET(SP_VSCTRLREG0_VSLENGTH, 1);
931
932 *cmds++ = cp_type0_packet(A3XX_SP_FS_CTRL_REG0, 1);
933 *cmds++ = _SET(SP_FSCTRLREG0_FSTHREADMODE, SP_MULTI) |
934 _SET(SP_FSCTRLREG0_FSINSTRBUFFERMODE, SP_BUFFER_MODE) |
935 _SET(SP_FSCTRLREG0_FSHALFREGFOOTPRINT, 1) |
936 _SET(SP_FSCTRLREG0_FSINOUTREGOVERLAP, 1) |
937 _SET(SP_FSCTRLREG0_FSTHREADSIZE, SP_FOUR_PIX_QUADS) |
938 _SET(SP_FSCTRLREG0_FSSUPERTHREADMODE, 1) |
939 _SET(SP_FSCTRLREG0_FSLENGTH, 1);
940
941 *cmds++ = cp_type0_packet(A3XX_SP_VS_PVT_MEM_SIZE_REG, 1);
942 *cmds++ = 0x00000000; /* SP_VS_MEM_SIZE_REG */
943
944 *cmds++ = cp_type0_packet(A3XX_SP_FS_PVT_MEM_SIZE_REG, 1);
945 *cmds++ = 0x00000000; /* SP_FS_MEM_SIZE_REG */
946
947 /* end oxili_generate_context_roll_packets */
948
Jordan Crouseb4d31bd2012-02-01 22:11:12 -0700949 /*
950 * Resolve using two draw calls with a dummy register
951 * write in between. This is a HLM workaround
952 * that should be removed later.
953 */
954 *cmds++ = cp_type3_packet(CP_DRAW_INDX_2, 6);
955 *cmds++ = 0x00000000; /* Viz query info */
956 *cmds++ = BUILD_PC_DRAW_INITIATOR(PC_DI_PT_TRILIST,
957 PC_DI_SRC_SEL_IMMEDIATE,
958 PC_DI_INDEX_SIZE_32_BIT,
959 PC_DI_IGNORE_VISIBILITY);
960 *cmds++ = 0x00000003; /* Num indices */
961 *cmds++ = 0x00000000; /* Index 0 */
962 *cmds++ = 0x00000001; /* Index 1 */
963 *cmds++ = 0x00000002; /* Index 2 */
964
965 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
966 *cmds++ = CP_REG(A3XX_HLSQ_CL_CONTROL_0_REG);
967 *cmds++ = 0x00000000;
968
969 *cmds++ = cp_type3_packet(CP_DRAW_INDX_2, 6);
970 *cmds++ = 0x00000000; /* Viz query info */
971 *cmds++ = BUILD_PC_DRAW_INITIATOR(PC_DI_PT_TRILIST,
972 PC_DI_SRC_SEL_IMMEDIATE,
973 PC_DI_INDEX_SIZE_32_BIT,
974 PC_DI_IGNORE_VISIBILITY);
975 *cmds++ = 0x00000003; /* Num indices */
976 *cmds++ = 0x00000002; /* Index 0 */
977 *cmds++ = 0x00000001; /* Index 1 */
978 *cmds++ = 0x00000003; /* Index 2 */
979
980 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
981 *cmds++ = CP_REG(A3XX_HLSQ_CL_CONTROL_0_REG);
982 *cmds++ = 0x00000000;
983
984 *cmds++ = cp_type3_packet(CP_WAIT_FOR_IDLE, 1);
985 *cmds++ = 0x00000000;
986
987 /* Create indirect buffer command for above command sequence */
988 create_ib1(drawctxt, shadow->gmem_save, start, cmds);
989
990 return cmds;
991}
Jordan Crouseb4d31bd2012-02-01 22:11:12 -0700992static void build_shader_save_cmds(struct adreno_device *adreno_dev,
993 struct adreno_context *drawctxt)
994{
995 unsigned int *cmd = tmp_ctx.cmd;
996 unsigned int *start;
997
998 /* Reserve space for boolean values used for COND_EXEC packet */
999 drawctxt->cond_execs[0].hostptr = cmd;
1000 drawctxt->cond_execs[0].gpuaddr = virt2gpu(cmd, &drawctxt->gpustate);
1001 *cmd++ = 0;
1002 drawctxt->cond_execs[1].hostptr = cmd;
1003 drawctxt->cond_execs[1].gpuaddr = virt2gpu(cmd, &drawctxt->gpustate);
1004 *cmd++ = 0;
1005
1006 drawctxt->shader_save_commands[0].hostptr = cmd;
1007 drawctxt->shader_save_commands[0].gpuaddr =
1008 virt2gpu(cmd, &drawctxt->gpustate);
1009 *cmd++ = 0;
1010 drawctxt->shader_save_commands[1].hostptr = cmd;
1011 drawctxt->shader_save_commands[1].gpuaddr =
1012 virt2gpu(cmd, &drawctxt->gpustate);
1013 *cmd++ = 0;
1014
1015 start = cmd;
1016
1017 /* Save vertex shader */
1018
1019 *cmd++ = cp_type3_packet(CP_COND_EXEC, 4);
1020 *cmd++ = drawctxt->cond_execs[0].gpuaddr >> 2;
1021 *cmd++ = drawctxt->cond_execs[0].gpuaddr >> 2;
1022 *cmd++ = 0x0000FFFF;
1023 *cmd++ = 3; /* EXEC_COUNT */
1024
1025 *cmd++ = cp_type3_packet(CP_REG_TO_MEM, 2);
1026 drawctxt->shader_save_commands[2].hostptr = cmd;
1027 drawctxt->shader_save_commands[2].gpuaddr =
1028 virt2gpu(cmd, &drawctxt->gpustate);
1029 /*
1030 From fixup:
1031
1032 dwords = SP_VS_CTRL_REG0.VS_LENGTH * 8
1033
1034 From regspec:
1035 SP_VS_CTRL_REG0.VS_LENGTH [31:24]: VS length, unit = 256bits.
1036 If bit31 is 1, it means overflow
1037 or any long shader.
1038
1039 src = (HLSQ_SHADOW_BASE + 0x1000)/4
1040 */
1041 *cmd++ = 0; /*(dwords << REG_TO_MEM_LOOP_COUNT_SHIFT) | src */
1042 *cmd++ = (drawctxt->gpustate.gpuaddr + SHADER_OFFSET) & 0xfffffffc;
1043
1044 /* Save fragment shader */
1045 *cmd++ = cp_type3_packet(CP_COND_EXEC, 4);
1046 *cmd++ = drawctxt->cond_execs[1].gpuaddr >> 2;
1047 *cmd++ = drawctxt->cond_execs[1].gpuaddr >> 2;
1048 *cmd++ = 0x0000FFFF;
1049 *cmd++ = 3; /* EXEC_COUNT */
1050
1051 *cmd++ = cp_type3_packet(CP_REG_TO_MEM, 2);
1052 drawctxt->shader_save_commands[3].hostptr = cmd;
1053 drawctxt->shader_save_commands[3].gpuaddr =
1054 virt2gpu(cmd, &drawctxt->gpustate);
1055 /*
1056 From fixup:
1057
1058 dwords = SP_FS_CTRL_REG0.FS_LENGTH * 8
1059
1060 From regspec:
1061 SP_FS_CTRL_REG0.FS_LENGTH [31:24]: FS length, unit = 256bits.
1062 If bit31 is 1, it means overflow
1063 or any long shader.
1064
1065 fs_offset = SP_FS_OBJ_OFFSET_REG.SHADEROBJOFFSETINIC * 32
1066 From regspec:
1067
1068 SP_FS_OBJ_OFFSET_REG.SHADEROBJOFFSETINIC [31:25]:
1069 First instruction of the whole shader will be stored from
1070 the offset in instruction cache, unit = 256bits, a cache line.
1071 It can start from 0 if no VS available.
1072
1073 src = (HLSQ_SHADOW_BASE + 0x1000 + SSIZE + fs_offset)/4
1074 */
1075 *cmd++ = 0; /*(dwords << REG_TO_MEM_LOOP_COUNT_SHIFT) | src */
1076 *cmd++ = (drawctxt->gpustate.gpuaddr + SHADER_OFFSET
1077 + (SHADER_SHADOW_SIZE / 2)) & 0xfffffffc;
1078
1079 /* Create indirect buffer command for above command sequence */
1080 create_ib1(drawctxt, drawctxt->shader_save, start, cmd);
1081
1082 tmp_ctx.cmd = cmd;
1083}
1084
1085/*
1086 * Make an IB to modify context save IBs with the correct shader instruction
1087 * and constant sizes and offsets.
1088 */
1089
1090static void build_save_fixup_cmds(struct adreno_device *adreno_dev,
1091 struct adreno_context *drawctxt)
1092{
1093 unsigned int *cmd = tmp_ctx.cmd;
1094 unsigned int *start = cmd;
1095
1096 /* Flush HLSQ lazy updates */
1097 *cmd++ = cp_type3_packet(CP_EVENT_WRITE, 1);
1098 *cmd++ = 0x7; /* HLSQ_FLUSH */
1099 *cmd++ = cp_type3_packet(CP_WAIT_FOR_IDLE, 1);
1100 *cmd++ = 0;
1101
1102 *cmd++ = cp_type0_packet(A3XX_UCHE_CACHE_INVALIDATE0_REG, 2);
1103 *cmd++ = 0x00000000; /* No start addr for full invalidate */
1104 *cmd++ = (unsigned int)
1105 UCHE_ENTIRE_CACHE << UCHE_INVALIDATE1REG_ALLORPORTION |
1106 UCHE_OP_INVALIDATE << UCHE_INVALIDATE1REG_OPCODE |
1107 0; /* No end addr for full invalidate */
1108
1109 /* Make sure registers are flushed */
1110 *cmd++ = cp_type3_packet(CP_CONTEXT_UPDATE, 1);
1111 *cmd++ = 0;
1112
1113#ifdef GSL_CONTEXT_SWITCH_CPU_SYNC
1114
1115 /* Save shader sizes */
1116 *cmd++ = cp_type3_packet(CP_REG_TO_MEM, 2);
1117 *cmd++ = A3XX_SP_VS_CTRL_REG0;
1118 *cmd++ = drawctxt->shader_save_commands[2].gpuaddr;
1119
1120 *cmd++ = cp_type3_packet(CP_REG_TO_MEM, 2);
1121 *cmd++ = A3XX_SP_FS_CTRL_REG0;
1122 *cmd++ = drawctxt->shader_save_commands[3].gpuaddr;
1123
1124 /* Save shader offsets */
1125 *cmd++ = cp_type3_packet(CP_REG_TO_MEM, 2);
1126 *cmd++ = A3XX_SP_FS_OBJ_OFFSET_REG;
1127 *cmd++ = drawctxt->shader_save_commands[1].gpuaddr;
1128
1129 /* Save constant sizes */
1130 *cmd++ = cp_type3_packet(CP_REG_TO_MEM, 2);
1131 *cmd++ = A3XX_SP_VS_CTRL_REG1;
1132 *cmd++ = drawctxt->constant_save_commands[1].gpuaddr;
1133 *cmd++ = cp_type3_packet(CP_REG_TO_MEM, 2);
1134 *cmd++ = A3XX_SP_FS_CTRL_REG1;
1135 *cmd++ = drawctxt->constant_save_commands[2].gpuaddr;
1136
1137 /* Save FS constant offset */
1138 *cmd++ = cp_type3_packet(CP_REG_TO_MEM, 2);
1139 *cmd++ = A3XX_SP_FS_OBJ_OFFSET_REG;
1140 *cmd++ = drawctxt->constant_save_commands[0].gpuaddr;
1141
1142
1143 /* Save VS instruction store mode */
1144 *cmd++ = cp_type3_packet(CP_REG_TO_MEM, 2);
1145 *cmd++ = A3XX_SP_VS_CTRL_REG0;
1146 *cmd++ = drawctxt->cond_execs[0].gpuaddr;
1147
1148 /* Save FS instruction store mode */
1149 *cmd++ = cp_type3_packet(CP_REG_TO_MEM, 2);
1150 *cmd++ = A3XX_SP_FS_CTRL_REG0;
1151 *cmd++ = drawctxt->cond_execs[1].gpuaddr;
1152#else
1153
1154 /* Shader save */
1155 cmd = rmw_regtomem(cmd, A3XX_SP_VS_CTRL_REG0, 0x7f000000,
1156 11+REG_TO_MEM_LOOP_COUNT_SHIFT,
1157 (HLSQ_SHADOW_BASE + 0x1000) / 4,
1158 drawctxt->shader_save_commands[2].gpuaddr);
1159
1160 /* CP_SCRATCH_REG2 = (CP_SCRATCH_REG2 & 0x00000000) | SP_FS_CTRL_REG0 */
1161 *cmd++ = cp_type3_packet(CP_REG_RMW, 3);
1162 *cmd++ = (1 << 30) | A3XX_CP_SCRATCH_REG2;
1163 *cmd++ = 0x00000000; /* AND value */
1164 *cmd++ = A3XX_SP_FS_CTRL_REG0; /* OR address */
1165 /* CP_SCRATCH_REG2 = ( (CP_SCRATCH_REG2 & 0x7f000000) >> 21 )
1166 | ((HLSQ_SHADOW_BASE+0x1000+SSIZE)/4) */
1167 *cmd++ = cp_type3_packet(CP_REG_RMW, 3);
1168 *cmd++ = ((11 + REG_TO_MEM_LOOP_COUNT_SHIFT) << 24) |
1169 A3XX_CP_SCRATCH_REG2;
1170 *cmd++ = 0x7f000000; /* AND value */
1171 *cmd++ = (HLSQ_SHADOW_BASE + 0x1000 + SSIZE) / 4; /* OR value */
1172
1173 /*
1174 * CP_SCRATCH_REG3 = (CP_SCRATCH_REG3 & 0x00000000) |
1175 * SP_FS_OBJ_OFFSET_REG
1176 */
1177
1178 *cmd++ = cp_type3_packet(CP_REG_RMW, 3);
1179 *cmd++ = (1 << 30) | A3XX_CP_SCRATCH_REG3;
1180 *cmd++ = 0x00000000; /* AND value */
1181 *cmd++ = A3XX_SP_FS_OBJ_OFFSET_REG; /* OR address */
1182 /*
1183 * CP_SCRATCH_REG3 = ( (CP_SCRATCH_REG3 & 0xfe000000) >> 25 ) |
1184 * 0x00000000
1185 */
1186 *cmd++ = cp_type3_packet(CP_REG_RMW, 3);
1187 *cmd++ = A3XX_CP_SCRATCH_REG3;
1188 *cmd++ = 0xfe000000; /* AND value */
1189 *cmd++ = 0x00000000; /* OR value */
1190 /*
1191 * CP_SCRATCH_REG2 = (CP_SCRATCH_REG2 & 0xffffffff) | CP_SCRATCH_REG3
1192 */
1193 *cmd++ = cp_type3_packet(CP_REG_RMW, 3);
1194 *cmd++ = (1 << 30) | A3XX_CP_SCRATCH_REG2;
1195 *cmd++ = 0xffffffff; /* AND value */
1196 *cmd++ = A3XX_CP_SCRATCH_REG3; /* OR address */
1197
1198 *cmd++ = cp_type3_packet(CP_REG_TO_MEM, 2);
1199 *cmd++ = A3XX_CP_SCRATCH_REG2;
1200 *cmd++ = drawctxt->shader_save_commands[3].gpuaddr;
1201
1202 /* Constant save */
1203 cmd = rmw_regtomem(cmd, A3XX_SP_VS_CTRL_REG1, 0x000003ff,
Jordan Croused0070882012-02-21 08:54:52 -07001204 2 + REG_TO_MEM_LOOP_COUNT_SHIFT,
1205 (HLSQ_SHADOW_BASE + 0x2000) / 4,
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07001206 drawctxt->constant_save_commands[1].gpuaddr);
1207
1208 cmd = rmw_regtomem(cmd, A3XX_SP_FS_CTRL_REG1, 0x000003ff,
Jordan Croused0070882012-02-21 08:54:52 -07001209 2 + REG_TO_MEM_LOOP_COUNT_SHIFT,
1210 (HLSQ_SHADOW_BASE + 0x2000 + SSIZE) / 4,
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07001211 drawctxt->constant_save_commands[2].gpuaddr);
1212
1213 cmd = rmw_regtomem(cmd, A3XX_SP_FS_OBJ_OFFSET_REG, 0x00ff0000,
1214 18, drawctxt->gpustate.gpuaddr & 0xfffffe00,
1215 drawctxt->constant_save_commands[2].gpuaddr
1216 + sizeof(unsigned int));
1217
1218 /* Modify constant save conditionals */
1219 cmd = rmw_regtomem(cmd, A3XX_SP_VS_CTRL_REG1, 0x000003ff,
1220 0, 0, drawctxt->cond_execs[2].gpuaddr);
1221
1222 cmd = rmw_regtomem(cmd, A3XX_SP_FS_CTRL_REG1, 0x000003ff,
1223 0, 0, drawctxt->cond_execs[3].gpuaddr);
1224
1225 /* Save VS instruction store mode */
1226
1227 cmd = rmw_regtomem(cmd, A3XX_SP_VS_CTRL_REG0, 0x00000002,
1228 31, 0, drawctxt->cond_execs[0].gpuaddr);
1229
1230 /* Save FS instruction store mode */
1231 cmd = rmw_regtomem(cmd, A3XX_SP_FS_CTRL_REG0, 0x00000002,
1232 31, 0, drawctxt->cond_execs[1].gpuaddr);
1233
1234#endif
1235
1236 create_ib1(drawctxt, drawctxt->save_fixup, start, cmd);
1237
1238 tmp_ctx.cmd = cmd;
1239}
1240
1241/****************************************************************************/
1242/* Functions to build context restore IBs */
1243/****************************************************************************/
1244
1245static unsigned int *build_sys2gmem_cmds(struct adreno_device *adreno_dev,
1246 struct adreno_context *drawctxt,
1247 struct gmem_shadow_t *shadow)
1248{
1249 unsigned int *cmds = tmp_ctx.cmd;
1250 unsigned int *start = cmds;
1251
Jordan Crousefb3012f2012-06-22 13:11:05 -06001252 *cmds++ = cp_type0_packet(A3XX_RBBM_CLOCK_CTL, 1);
1253 *cmds++ = A3XX_RBBM_CLOCK_CTL_DEFAULT;
1254
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07001255 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 5);
1256 *cmds++ = CP_REG(A3XX_HLSQ_CONTROL_0_REG);
1257 /* HLSQ_CONTROL_0_REG */
1258 *cmds++ = _SET(HLSQ_CTRL0REG_FSTHREADSIZE, HLSQ_FOUR_PIX_QUADS) |
Rajeev Kulkarnic46499f2012-07-10 16:02:46 -07001259 _SET(HLSQ_CTRL0REG_FSSUPERTHREADENABLE, 1) |
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07001260 _SET(HLSQ_CTRL0REG_SPSHADERRESTART, 1) |
1261 _SET(HLSQ_CTRL0REG_CHUNKDISABLE, 1) |
Rajeev Kulkarnic46499f2012-07-10 16:02:46 -07001262 _SET(HLSQ_CTRL0REG_SPCONSTFULLUPDATE, 1);
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07001263 /* HLSQ_CONTROL_1_REG */
Rajeev Kulkarnic46499f2012-07-10 16:02:46 -07001264 *cmds++ = _SET(HLSQ_CTRL1REG_VSTHREADSIZE, HLSQ_TWO_VTX_QUADS) |
1265 _SET(HLSQ_CTRL1REG_VSSUPERTHREADENABLE, 1);
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07001266 /* HLSQ_CONTROL_2_REG */
1267 *cmds++ = _SET(HLSQ_CTRL2REG_PRIMALLOCTHRESHOLD, 31);
1268 /* HLSQ_CONTROL3_REG */
1269 *cmds++ = 0x00000000;
1270
1271 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 3);
1272 *cmds++ = CP_REG(A3XX_RB_MRT_BUF_INFO0);
1273 /* RB_MRT_BUF_INFO0 */
1274 *cmds++ = _SET(RB_MRTBUFINFO_COLOR_FORMAT, RB_R8G8B8A8_UNORM) |
1275 _SET(RB_MRTBUFINFO_COLOR_TILE_MODE, RB_TILINGMODE_32X32) |
1276 _SET(RB_MRTBUFINFO_COLOR_BUF_PITCH,
1277 (shadow->gmem_pitch * 4 * 8) / 256);
1278 /* RB_MRT_BUF_BASE0 */
1279 *cmds++ = _SET(RB_MRTBUFBASE_COLOR_BUF_BASE, tmp_ctx.gmem_base >> 5);
1280
1281 /* Texture samplers */
1282 *cmds++ = cp_type3_packet(CP_LOAD_STATE, 4);
1283 *cmds++ = (16 << CP_LOADSTATE_DSTOFFSET_SHIFT)
1284 | (HLSQ_DIRECT << CP_LOADSTATE_STATESRC_SHIFT)
1285 | (HLSQ_BLOCK_ID_TP_TEX << CP_LOADSTATE_STATEBLOCKID_SHIFT)
1286 | (1 << CP_LOADSTATE_NUMOFUNITS_SHIFT);
1287 *cmds++ = (HLSQ_TP_TEX_SAMPLERS << CP_LOADSTATE_STATETYPE_SHIFT)
1288 | (0 << CP_LOADSTATE_EXTSRCADDR_SHIFT);
1289 *cmds++ = 0x00000240;
1290 *cmds++ = 0x00000000;
1291
Rajeev Kulkarnic46499f2012-07-10 16:02:46 -07001292 *cmds++ = cp_type0_packet(A3XX_VFD_PERFCOUNTER0_SELECT, 1);
1293 *cmds++ = 0x00000000;
1294
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07001295 /* Texture memobjs */
1296 *cmds++ = cp_type3_packet(CP_LOAD_STATE, 6);
1297 *cmds++ = (16 << CP_LOADSTATE_DSTOFFSET_SHIFT)
1298 | (HLSQ_DIRECT << CP_LOADSTATE_STATESRC_SHIFT)
1299 | (HLSQ_BLOCK_ID_TP_TEX << CP_LOADSTATE_STATEBLOCKID_SHIFT)
1300 | (1 << CP_LOADSTATE_NUMOFUNITS_SHIFT);
1301 *cmds++ = (HLSQ_TP_TEX_MEMOBJ << CP_LOADSTATE_STATETYPE_SHIFT)
1302 | (0 << CP_LOADSTATE_EXTSRCADDR_SHIFT);
1303 *cmds++ = 0x4cc06880;
1304 *cmds++ = shadow->height | (shadow->width << 14);
1305 *cmds++ = (shadow->pitch*4*8) << 9;
1306 *cmds++ = 0x00000000;
1307
Rajeev Kulkarnic46499f2012-07-10 16:02:46 -07001308 *cmds++ = cp_type0_packet(A3XX_VFD_PERFCOUNTER0_SELECT, 1);
1309 *cmds++ = 0x00000000;
1310
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07001311 /* Mipmap bases */
1312 *cmds++ = cp_type3_packet(CP_LOAD_STATE, 16);
1313 *cmds++ = (224 << CP_LOADSTATE_DSTOFFSET_SHIFT)
1314 | (HLSQ_DIRECT << CP_LOADSTATE_STATESRC_SHIFT)
1315 | (HLSQ_BLOCK_ID_TP_MIPMAP << CP_LOADSTATE_STATEBLOCKID_SHIFT)
1316 | (14 << CP_LOADSTATE_NUMOFUNITS_SHIFT);
1317 *cmds++ = (HLSQ_TP_MIPMAP_BASE << CP_LOADSTATE_STATETYPE_SHIFT)
1318 | (0 << CP_LOADSTATE_EXTSRCADDR_SHIFT);
1319 *cmds++ = shadow->gmemshadow.gpuaddr;
1320 *cmds++ = 0x00000000;
1321 *cmds++ = 0x00000000;
1322 *cmds++ = 0x00000000;
1323 *cmds++ = 0x00000000;
1324 *cmds++ = 0x00000000;
1325 *cmds++ = 0x00000000;
1326 *cmds++ = 0x00000000;
1327 *cmds++ = 0x00000000;
1328 *cmds++ = 0x00000000;
1329 *cmds++ = 0x00000000;
1330 *cmds++ = 0x00000000;
1331 *cmds++ = 0x00000000;
1332 *cmds++ = 0x00000000;
1333
Rajeev Kulkarnic46499f2012-07-10 16:02:46 -07001334 *cmds++ = cp_type0_packet(A3XX_VFD_PERFCOUNTER0_SELECT, 1);
1335 *cmds++ = 0x00000000;
1336
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07001337 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 5);
1338 *cmds++ = CP_REG(A3XX_HLSQ_VS_CONTROL_REG);
1339 /* HLSQ_VS_CONTROL_REG */
1340 *cmds++ = _SET(HLSQ_VSCTRLREG_VSINSTRLENGTH, 1);
1341 /* HLSQ_FS_CONTROL_REG */
1342 *cmds++ = _SET(HLSQ_FSCTRLREG_FSCONSTLENGTH, 1) |
1343 _SET(HLSQ_FSCTRLREG_FSCONSTSTARTOFFSET, 128) |
1344 _SET(HLSQ_FSCTRLREG_FSINSTRLENGTH, 2);
1345 /* HLSQ_CONST_VSPRESV_RANGE_REG */
1346 *cmds++ = 0x00000000;
1347 /* HLSQ_CONST_FSPRESV_RANGE_REG */
1348 *cmds++ = 0x00000000;
1349
1350 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
1351 *cmds++ = CP_REG(A3XX_SP_FS_LENGTH_REG);
1352 /* SP_FS_LENGTH_REG */
1353 *cmds++ = _SET(SP_SHADERLENGTH_LEN, 2);
1354
1355 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 12);
1356 *cmds++ = CP_REG(A3XX_SP_VS_CTRL_REG0);
1357 /* SP_VS_CTRL_REG0 */
1358 *cmds++ = _SET(SP_VSCTRLREG0_VSTHREADMODE, SP_MULTI) |
1359 _SET(SP_VSCTRLREG0_VSINSTRBUFFERMODE, SP_BUFFER_MODE) |
1360 _SET(SP_VSCTRLREG0_VSICACHEINVALID, 1) |
1361 _SET(SP_VSCTRLREG0_VSFULLREGFOOTPRINT, 2) |
1362 _SET(SP_VSCTRLREG0_VSTHREADSIZE, SP_TWO_VTX_QUADS) |
1363 _SET(SP_VSCTRLREG0_VSLENGTH, 1);
1364 /* SP_VS_CTRL_REG1 */
1365 *cmds++ = _SET(SP_VSCTRLREG1_VSINITIALOUTSTANDING, 8);
1366 /* SP_VS_PARAM_REG */
1367 *cmds++ = _SET(SP_VSPARAMREG_POSREGID, 4) |
1368 _SET(SP_VSPARAMREG_PSIZEREGID, 252) |
1369 _SET(SP_VSPARAMREG_TOTALVSOUTVAR, 1);
1370 /* SP_VS_OUT_REG0 */
1371 *cmds++ = _SET(SP_VSOUTREG_COMPMASK0, 3);
1372 /* SP_VS_OUT_REG1 */
1373 *cmds++ = 0x00000000;
1374 /* SP_VS_OUT_REG2 */
1375 *cmds++ = 0x00000000;
1376 /* SP_VS_OUT_REG3 */
1377 *cmds++ = 0x00000000;
1378 /* SP_VS_OUT_REG4 */
1379 *cmds++ = 0x00000000;
1380 /* SP_VS_OUT_REG5 */
1381 *cmds++ = 0x00000000;
1382 /* SP_VS_OUT_REG6 */
1383 *cmds++ = 0x00000000;
1384 /* SP_VS_OUT_REG7 */
1385 *cmds++ = 0x00000000;
1386
1387 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 7);
1388 *cmds++ = CP_REG(A3XX_SP_VS_VPC_DST_REG_0);
1389 /* SP_VS_VPC_DST_REG0 */
1390 *cmds++ = _SET(SP_VSVPCDSTREG_OUTLOC0, 8);
1391 /* SP_VS_VPC_DST_REG1 */
1392 *cmds++ = 0x00000000;
1393 /* SP_VS_VPC_DST_REG2 */
1394 *cmds++ = 0x00000000;
1395 /* SP_VS_VPC_DST_REG3 */
1396 *cmds++ = 0x00000000;
1397 /* SP_VS_OBJ_OFFSET_REG */
1398 *cmds++ = 0x00000000;
1399 /* SP_VS_OBJ_START_REG */
1400 *cmds++ = 0x00000000;
1401
1402 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 6);
1403 *cmds++ = CP_REG(A3XX_SP_VS_LENGTH_REG);
1404 /* SP_VS_LENGTH_REG */
1405 *cmds++ = _SET(SP_SHADERLENGTH_LEN, 1);
1406 /* SP_FS_CTRL_REG0 */
1407 *cmds++ = _SET(SP_FSCTRLREG0_FSTHREADMODE, SP_MULTI) |
1408 _SET(SP_FSCTRLREG0_FSINSTRBUFFERMODE, SP_BUFFER_MODE) |
1409 _SET(SP_FSCTRLREG0_FSICACHEINVALID, 1) |
Rajeev Kulkarnic46499f2012-07-10 16:02:46 -07001410 _SET(SP_FSCTRLREG0_FSHALFREGFOOTPRINT, 1) |
1411 _SET(SP_FSCTRLREG0_FSFULLREGFOOTPRINT, 1) |
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07001412 _SET(SP_FSCTRLREG0_FSINOUTREGOVERLAP, 1) |
1413 _SET(SP_FSCTRLREG0_FSTHREADSIZE, SP_FOUR_PIX_QUADS) |
Rajeev Kulkarnic46499f2012-07-10 16:02:46 -07001414 _SET(SP_FSCTRLREG0_FSSUPERTHREADMODE, 1) |
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07001415 _SET(SP_FSCTRLREG0_PIXLODENABLE, 1) |
1416 _SET(SP_FSCTRLREG0_FSLENGTH, 2);
1417 /* SP_FS_CTRL_REG1 */
1418 *cmds++ = _SET(SP_FSCTRLREG1_FSCONSTLENGTH, 1) |
1419 _SET(SP_FSCTRLREG1_FSINITIALOUTSTANDING, 2) |
1420 _SET(SP_FSCTRLREG1_HALFPRECVAROFFSET, 63);
1421 /* SP_FS_OBJ_OFFSET_REG */
Tarun Karra7e8e1cf2012-02-06 18:23:19 -08001422 *cmds++ = _SET(SP_OBJOFFSETREG_CONSTOBJECTSTARTOFFSET, 128) |
Rajeev Kulkarnic46499f2012-07-10 16:02:46 -07001423 _SET(SP_OBJOFFSETREG_SHADEROBJOFFSETINIC, 126);
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07001424 /* SP_FS_OBJ_START_REG */
1425 *cmds++ = 0x00000000;
1426
1427 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 3);
1428 *cmds++ = CP_REG(A3XX_SP_FS_FLAT_SHAD_MODE_REG_0);
1429 /* SP_FS_FLAT_SHAD_MODE_REG0 */
1430 *cmds++ = 0x00000000;
1431 /* SP_FS_FLAT_SHAD_MODE_REG1 */
1432 *cmds++ = 0x00000000;
1433
1434 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
1435 *cmds++ = CP_REG(A3XX_SP_FS_OUTPUT_REG);
1436 /* SP_FS_OUT_REG */
1437 *cmds++ = _SET(SP_FSOUTREG_PAD0, SP_PIXEL_BASED);
1438
Jordan Crousea7ec4212012-02-04 10:23:52 -07001439 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 5);
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07001440 *cmds++ = CP_REG(A3XX_SP_FS_MRT_REG_0);
1441 /* SP_FS_MRT_REG0 */
Rajeev Kulkarnic46499f2012-07-10 16:02:46 -07001442 *cmds++ = _SET(SP_FSMRTREG_PRECISION, 1);
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07001443 /* SP_FS_MRT_REG1 */
1444 *cmds++ = 0;
1445 /* SP_FS_MRT_REG2 */
1446 *cmds++ = 0;
1447 /* SP_FS_MRT_REG3 */
1448 *cmds++ = 0;
1449
1450 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 11);
1451 *cmds++ = CP_REG(A3XX_VPC_ATTR);
1452 /* VPC_ATTR */
1453 *cmds++ = _SET(VPC_VPCATTR_TOTALATTR, 2) |
1454 _SET(VPC_VPCATTR_THRHDASSIGN, 1) |
1455 _SET(VPC_VPCATTR_LMSIZE, 1);
1456 /* VPC_PACK */
1457 *cmds++ = _SET(VPC_VPCPACK_NUMFPNONPOSVAR, 2) |
1458 _SET(VPC_VPCPACK_NUMNONPOSVSVAR, 2);
1459 /* VPC_VARYING_INTERP_MODE_0 */
1460 *cmds++ = 0x00000000;
1461 /* VPC_VARYING_INTERP_MODE1 */
1462 *cmds++ = 0x00000000;
1463 /* VPC_VARYING_INTERP_MODE2 */
1464 *cmds++ = 0x00000000;
1465 /* VPC_VARYING_IINTERP_MODE3 */
1466 *cmds++ = 0x00000000;
1467 /* VPC_VARRYING_PS_REPL_MODE_0 */
1468 *cmds++ = _SET(VPC_VPCVARPSREPLMODE_COMPONENT08, 1) |
1469 _SET(VPC_VPCVARPSREPLMODE_COMPONENT09, 2) |
1470 _SET(VPC_VPCVARPSREPLMODE_COMPONENT0A, 1) |
1471 _SET(VPC_VPCVARPSREPLMODE_COMPONENT0B, 2) |
1472 _SET(VPC_VPCVARPSREPLMODE_COMPONENT0C, 1) |
1473 _SET(VPC_VPCVARPSREPLMODE_COMPONENT0D, 2) |
1474 _SET(VPC_VPCVARPSREPLMODE_COMPONENT0E, 1) |
1475 _SET(VPC_VPCVARPSREPLMODE_COMPONENT0F, 2) |
1476 _SET(VPC_VPCVARPSREPLMODE_COMPONENT10, 1) |
1477 _SET(VPC_VPCVARPSREPLMODE_COMPONENT11, 2) |
1478 _SET(VPC_VPCVARPSREPLMODE_COMPONENT12, 1) |
1479 _SET(VPC_VPCVARPSREPLMODE_COMPONENT13, 2) |
1480 _SET(VPC_VPCVARPSREPLMODE_COMPONENT14, 1) |
1481 _SET(VPC_VPCVARPSREPLMODE_COMPONENT15, 2) |
1482 _SET(VPC_VPCVARPSREPLMODE_COMPONENT16, 1) |
1483 _SET(VPC_VPCVARPSREPLMODE_COMPONENT17, 2);
1484 /* VPC_VARRYING_PS_REPL_MODE_1 */
1485 *cmds++ = _SET(VPC_VPCVARPSREPLMODE_COMPONENT08, 1) |
1486 _SET(VPC_VPCVARPSREPLMODE_COMPONENT09, 2) |
1487 _SET(VPC_VPCVARPSREPLMODE_COMPONENT0A, 1) |
1488 _SET(VPC_VPCVARPSREPLMODE_COMPONENT0B, 2) |
1489 _SET(VPC_VPCVARPSREPLMODE_COMPONENT0C, 1) |
1490 _SET(VPC_VPCVARPSREPLMODE_COMPONENT0D, 2) |
1491 _SET(VPC_VPCVARPSREPLMODE_COMPONENT0E, 1) |
1492 _SET(VPC_VPCVARPSREPLMODE_COMPONENT0F, 2) |
1493 _SET(VPC_VPCVARPSREPLMODE_COMPONENT10, 1) |
1494 _SET(VPC_VPCVARPSREPLMODE_COMPONENT11, 2) |
1495 _SET(VPC_VPCVARPSREPLMODE_COMPONENT12, 1) |
1496 _SET(VPC_VPCVARPSREPLMODE_COMPONENT13, 2) |
1497 _SET(VPC_VPCVARPSREPLMODE_COMPONENT14, 1) |
1498 _SET(VPC_VPCVARPSREPLMODE_COMPONENT15, 2) |
1499 _SET(VPC_VPCVARPSREPLMODE_COMPONENT16, 1) |
1500 _SET(VPC_VPCVARPSREPLMODE_COMPONENT17, 2);
1501 /* VPC_VARRYING_PS_REPL_MODE_2 */
1502 *cmds++ = _SET(VPC_VPCVARPSREPLMODE_COMPONENT08, 1) |
1503 _SET(VPC_VPCVARPSREPLMODE_COMPONENT09, 2) |
1504 _SET(VPC_VPCVARPSREPLMODE_COMPONENT0A, 1) |
1505 _SET(VPC_VPCVARPSREPLMODE_COMPONENT0B, 2) |
1506 _SET(VPC_VPCVARPSREPLMODE_COMPONENT0C, 1) |
1507 _SET(VPC_VPCVARPSREPLMODE_COMPONENT0D, 2) |
1508 _SET(VPC_VPCVARPSREPLMODE_COMPONENT0E, 1) |
1509 _SET(VPC_VPCVARPSREPLMODE_COMPONENT0F, 2) |
1510 _SET(VPC_VPCVARPSREPLMODE_COMPONENT10, 1) |
1511 _SET(VPC_VPCVARPSREPLMODE_COMPONENT11, 2) |
1512 _SET(VPC_VPCVARPSREPLMODE_COMPONENT12, 1) |
1513 _SET(VPC_VPCVARPSREPLMODE_COMPONENT13, 2) |
1514 _SET(VPC_VPCVARPSREPLMODE_COMPONENT14, 1) |
1515 _SET(VPC_VPCVARPSREPLMODE_COMPONENT15, 2) |
1516 _SET(VPC_VPCVARPSREPLMODE_COMPONENT16, 1) |
1517 _SET(VPC_VPCVARPSREPLMODE_COMPONENT17, 2);
1518 /* VPC_VARRYING_PS_REPL_MODE_3 */
1519 *cmds++ = _SET(VPC_VPCVARPSREPLMODE_COMPONENT08, 1) |
1520 _SET(VPC_VPCVARPSREPLMODE_COMPONENT09, 2) |
1521 _SET(VPC_VPCVARPSREPLMODE_COMPONENT0A, 1) |
1522 _SET(VPC_VPCVARPSREPLMODE_COMPONENT0B, 2) |
1523 _SET(VPC_VPCVARPSREPLMODE_COMPONENT0C, 1) |
1524 _SET(VPC_VPCVARPSREPLMODE_COMPONENT0D, 2) |
1525 _SET(VPC_VPCVARPSREPLMODE_COMPONENT0E, 1) |
1526 _SET(VPC_VPCVARPSREPLMODE_COMPONENT0F, 2) |
1527 _SET(VPC_VPCVARPSREPLMODE_COMPONENT10, 1) |
1528 _SET(VPC_VPCVARPSREPLMODE_COMPONENT11, 2) |
1529 _SET(VPC_VPCVARPSREPLMODE_COMPONENT12, 1) |
1530 _SET(VPC_VPCVARPSREPLMODE_COMPONENT13, 2) |
1531 _SET(VPC_VPCVARPSREPLMODE_COMPONENT14, 1) |
1532 _SET(VPC_VPCVARPSREPLMODE_COMPONENT15, 2) |
1533 _SET(VPC_VPCVARPSREPLMODE_COMPONENT16, 1) |
1534 _SET(VPC_VPCVARPSREPLMODE_COMPONENT17, 2);
1535
Jordan Crousea7ec4212012-02-04 10:23:52 -07001536 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07001537 *cmds++ = CP_REG(A3XX_SP_SP_CTRL_REG);
1538 /* SP_SP_CTRL_REG */
Rajeev Kulkarnic46499f2012-07-10 16:02:46 -07001539 *cmds++ = _SET(SP_SPCTRLREG_SLEEPMODE, 1) |
1540 _SET(SP_SPCTRLREG_LOMODE, 1);
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07001541
1542 /* Load vertex shader */
1543 *cmds++ = cp_type3_packet(CP_LOAD_STATE, 10);
1544 *cmds++ = (0 << CP_LOADSTATE_DSTOFFSET_SHIFT)
1545 | (HLSQ_DIRECT << CP_LOADSTATE_STATESRC_SHIFT)
1546 | (HLSQ_BLOCK_ID_SP_VS << CP_LOADSTATE_STATEBLOCKID_SHIFT)
1547 | (1 << CP_LOADSTATE_NUMOFUNITS_SHIFT);
1548 *cmds++ = (HLSQ_SP_VS_INSTR << CP_LOADSTATE_STATETYPE_SHIFT)
1549 | (0 << CP_LOADSTATE_EXTSRCADDR_SHIFT);
1550 /* (sy)end; */
Rajeev Kulkarnic46499f2012-07-10 16:02:46 -07001551 *cmds++ = 0x00000000; *cmds++ = 0x13001000;
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07001552 /* nop; */
1553 *cmds++ = 0x00000000; *cmds++ = 0x00000000;
1554 /* nop; */
1555 *cmds++ = 0x00000000; *cmds++ = 0x00000000;
1556 /* nop; */
1557 *cmds++ = 0x00000000; *cmds++ = 0x00000000;
1558
Rajeev Kulkarnic46499f2012-07-10 16:02:46 -07001559 *cmds++ = cp_type0_packet(A3XX_VFD_PERFCOUNTER0_SELECT, 1);
1560 *cmds++ = 0x00000000;
1561
1562 *cmds++ = cp_type3_packet(CP_WAIT_FOR_IDLE, 1);
1563 *cmds++ = 0x00000000;
1564
1565
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07001566 /* Load fragment shader */
1567 *cmds++ = cp_type3_packet(CP_LOAD_STATE, 18);
1568 *cmds++ = (0 << CP_LOADSTATE_DSTOFFSET_SHIFT)
1569 | (HLSQ_DIRECT << CP_LOADSTATE_STATESRC_SHIFT)
1570 | (HLSQ_BLOCK_ID_SP_FS << CP_LOADSTATE_STATEBLOCKID_SHIFT)
1571 | (2 << CP_LOADSTATE_NUMOFUNITS_SHIFT);
1572 *cmds++ = (HLSQ_SP_FS_INSTR << CP_LOADSTATE_STATETYPE_SHIFT)
1573 | (0 << CP_LOADSTATE_EXTSRCADDR_SHIFT);
1574 /* (sy)(rpt1)bary.f (ei)r0.z, (r)0, r0.x; */
Rajeev Kulkarnic46499f2012-07-10 16:02:46 -07001575 *cmds++ = 0x00002000; *cmds++ = 0x57309902;
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07001576 /* (rpt5)nop; */
1577 *cmds++ = 0x00000000; *cmds++ = 0x00000500;
1578 /* sam (f32)r0.xyzw, r0.z, s#0, t#0; */
1579 *cmds++ = 0x00000005; *cmds++ = 0xa0c01f00;
1580 /* (sy)mov.f32f32 r1.x, r0.x; */
Rajeev Kulkarnic46499f2012-07-10 16:02:46 -07001581 *cmds++ = 0x00000000; *cmds++ = 0x30040b00;
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07001582 /* mov.f32f32 r1.y, r0.y; */
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07001583 *cmds++ = 0x00000000; *cmds++ = 0x03000000;
Rajeev Kulkarnic46499f2012-07-10 16:02:46 -07001584 /* mov.f32f32 r1.z, r0.z; */
1585 *cmds++ = 0x00000000; *cmds++ = 0x00000000;
1586 /* mov.f32f32 r1.w, r0.w; */
1587 *cmds++ = 0x00000000; *cmds++ = 0x00000000;
1588 /* end; */
1589 *cmds++ = 0x00000000; *cmds++ = 0x00000000;
1590
1591 *cmds++ = cp_type0_packet(A3XX_VFD_PERFCOUNTER0_SELECT, 1);
1592 *cmds++ = 0x00000000;
1593
1594 *cmds++ = cp_type3_packet(CP_WAIT_FOR_IDLE, 1);
1595 *cmds++ = 0x00000000;
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07001596
1597 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 3);
1598 *cmds++ = CP_REG(A3XX_VFD_CONTROL_0);
1599 /* VFD_CONTROL_0 */
1600 *cmds++ = _SET(VFD_CTRLREG0_TOTALATTRTOVS, 8) |
1601 _SET(VFD_CTRLREG0_PACKETSIZE, 2) |
1602 _SET(VFD_CTRLREG0_STRMDECINSTRCNT, 2) |
1603 _SET(VFD_CTRLREG0_STRMFETCHINSTRCNT, 2);
1604 /* VFD_CONTROL_1 */
1605 *cmds++ = _SET(VFD_CTRLREG1_MAXSTORAGE, 2) |
1606 _SET(VFD_CTRLREG1_REGID4VTX, 252) |
1607 _SET(VFD_CTRLREG1_REGID4INST, 252);
1608
1609 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 5);
1610 *cmds++ = CP_REG(A3XX_VFD_FETCH_INSTR_0_0);
1611 /* VFD_FETCH_INSTR_0_0 */
1612 *cmds++ = _SET(VFD_FETCHINSTRUCTIONS_FETCHSIZE, 7) |
1613 _SET(VFD_FETCHINSTRUCTIONS_BUFSTRIDE, 8) |
1614 _SET(VFD_FETCHINSTRUCTIONS_SWITCHNEXT, 1) |
1615 _SET(VFD_FETCHINSTRUCTIONS_STEPRATE, 1);
1616 /* VFD_FETCH_INSTR_1_0 */
1617 *cmds++ = _SET(VFD_BASEADDR_BASEADDR,
1618 shadow->quad_vertices_restore.gpuaddr);
1619 /* VFD_FETCH_INSTR_0_1 */
1620 *cmds++ = _SET(VFD_FETCHINSTRUCTIONS_FETCHSIZE, 11) |
1621 _SET(VFD_FETCHINSTRUCTIONS_BUFSTRIDE, 12) |
1622 _SET(VFD_FETCHINSTRUCTIONS_INDEXDECODE, 1) |
1623 _SET(VFD_FETCHINSTRUCTIONS_STEPRATE, 1);
1624 /* VFD_FETCH_INSTR_1_1 */
1625 *cmds++ = _SET(VFD_BASEADDR_BASEADDR,
1626 shadow->quad_vertices_restore.gpuaddr + 16);
1627
1628 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 3);
1629 *cmds++ = CP_REG(A3XX_VFD_DECODE_INSTR_0);
1630 /* VFD_DECODE_INSTR_0 */
1631 *cmds++ = _SET(VFD_DECODEINSTRUCTIONS_WRITEMASK, 0x0F) |
1632 _SET(VFD_DECODEINSTRUCTIONS_CONSTFILL, 1) |
1633 _SET(VFD_DECODEINSTRUCTIONS_FORMAT, 1) |
1634 _SET(VFD_DECODEINSTRUCTIONS_SHIFTCNT, 8) |
1635 _SET(VFD_DECODEINSTRUCTIONS_LASTCOMPVALID, 1) |
1636 _SET(VFD_DECODEINSTRUCTIONS_SWITCHNEXT, 1);
1637 /* VFD_DECODE_INSTR_1 */
1638 *cmds++ = _SET(VFD_DECODEINSTRUCTIONS_WRITEMASK, 0x0F) |
1639 _SET(VFD_DECODEINSTRUCTIONS_CONSTFILL, 1) |
1640 _SET(VFD_DECODEINSTRUCTIONS_FORMAT, 2) |
1641 _SET(VFD_DECODEINSTRUCTIONS_REGID, 4) |
1642 _SET(VFD_DECODEINSTRUCTIONS_SHIFTCNT, 12) |
1643 _SET(VFD_DECODEINSTRUCTIONS_LASTCOMPVALID, 1);
1644
1645 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
1646 *cmds++ = CP_REG(A3XX_RB_DEPTH_CONTROL);
1647 /* RB_DEPTH_CONTROL */
Rajeev Kulkarnic46499f2012-07-10 16:02:46 -07001648 *cmds++ = _SET(RB_DEPTHCONTROL_Z_TEST_FUNC, RB_FRAG_LESS);
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07001649
1650 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
1651 *cmds++ = CP_REG(A3XX_RB_STENCIL_CONTROL);
1652 /* RB_STENCIL_CONTROL */
Rajeev Kulkarnic46499f2012-07-10 16:02:46 -07001653 *cmds++ = _SET(RB_STENCILCONTROL_STENCIL_FUNC, RB_REF_ALWAYS) |
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07001654 _SET(RB_STENCILCONTROL_STENCIL_FAIL, RB_STENCIL_KEEP) |
1655 _SET(RB_STENCILCONTROL_STENCIL_ZPASS, RB_STENCIL_KEEP) |
1656 _SET(RB_STENCILCONTROL_STENCIL_ZFAIL, RB_STENCIL_KEEP) |
Rajeev Kulkarnic46499f2012-07-10 16:02:46 -07001657 _SET(RB_STENCILCONTROL_STENCIL_FUNC_BF, RB_REF_ALWAYS) |
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07001658 _SET(RB_STENCILCONTROL_STENCIL_FAIL_BF, RB_STENCIL_KEEP) |
1659 _SET(RB_STENCILCONTROL_STENCIL_ZPASS_BF, RB_STENCIL_KEEP) |
1660 _SET(RB_STENCILCONTROL_STENCIL_ZFAIL_BF, RB_STENCIL_KEEP);
1661
1662 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
1663 *cmds++ = CP_REG(A3XX_RB_MODE_CONTROL);
1664 /* RB_MODE_CONTROL */
1665 *cmds++ = _SET(RB_MODECONTROL_RENDER_MODE, RB_RENDERING_PASS) |
1666 _SET(RB_MODECONTROL_MARB_CACHE_SPLIT_MODE, 1);
1667
1668 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
1669 *cmds++ = CP_REG(A3XX_RB_RENDER_CONTROL);
1670 /* RB_RENDER_CONTROL */
1671 *cmds++ = _SET(RB_RENDERCONTROL_BIN_WIDTH, shadow->width >> 5) |
1672 _SET(RB_RENDERCONTROL_ALPHA_TEST_FUNC, 7);
1673
1674 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
1675 *cmds++ = CP_REG(A3XX_RB_MSAA_CONTROL);
1676 /* RB_MSAA_CONTROL */
1677 *cmds++ = _SET(RB_MSAACONTROL_MSAA_DISABLE, 1) |
1678 _SET(RB_MSAACONTROL_SAMPLE_MASK, 0xFFFF);
1679
1680 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
1681 *cmds++ = CP_REG(A3XX_RB_MRT_CONTROL0);
1682 /* RB_MRT_CONTROL0 */
Rajeev Kulkarnic46499f2012-07-10 16:02:46 -07001683 *cmds++ = _SET(RB_MRTCONTROL_ROP_CODE, 12) |
1684 _SET(RB_MRTCONTROL_DITHER_MODE, RB_DITHER_DISABLE) |
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07001685 _SET(RB_MRTCONTROL_COMPONENT_ENABLE, 0xF);
1686
1687 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 3);
1688 *cmds++ = CP_REG(A3XX_RB_MRT_BLEND_CONTROL0);
1689 /* RB_MRT_BLENDCONTROL0 */
1690 *cmds++ = _SET(RB_MRTBLENDCONTROL_RGB_SRC_FACTOR, RB_FACTOR_ONE) |
1691 _SET(RB_MRTBLENDCONTROL_RGB_BLEND_OPCODE, RB_BLEND_OP_ADD) |
1692 _SET(RB_MRTBLENDCONTROL_RGB_DEST_FACTOR, RB_FACTOR_ZERO) |
1693 _SET(RB_MRTBLENDCONTROL_ALPHA_SRC_FACTOR, RB_FACTOR_ONE) |
1694 _SET(RB_MRTBLENDCONTROL_ALPHA_BLEND_OPCODE, RB_BLEND_OP_ADD) |
1695 _SET(RB_MRTBLENDCONTROL_ALPHA_DEST_FACTOR, RB_FACTOR_ZERO) |
1696 _SET(RB_MRTBLENDCONTROL_CLAMP_ENABLE, 1);
1697 /* RB_MRT_CONTROL1 */
1698 *cmds++ = _SET(RB_MRTCONTROL_READ_DEST_ENABLE, 1) |
Rajeev Kulkarnic46499f2012-07-10 16:02:46 -07001699 _SET(RB_MRTCONTROL_ROP_CODE, 12) |
1700 _SET(RB_MRTCONTROL_DITHER_MODE, RB_DITHER_ALWAYS) |
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07001701 _SET(RB_MRTCONTROL_COMPONENT_ENABLE, 0xF);
1702
1703 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 3);
1704 *cmds++ = CP_REG(A3XX_RB_MRT_BLEND_CONTROL1);
1705 /* RB_MRT_BLENDCONTROL1 */
1706 *cmds++ = _SET(RB_MRTBLENDCONTROL_RGB_SRC_FACTOR, RB_FACTOR_ONE) |
1707 _SET(RB_MRTBLENDCONTROL_RGB_BLEND_OPCODE, RB_BLEND_OP_ADD) |
1708 _SET(RB_MRTBLENDCONTROL_RGB_DEST_FACTOR, RB_FACTOR_ZERO) |
1709 _SET(RB_MRTBLENDCONTROL_ALPHA_SRC_FACTOR, RB_FACTOR_ONE) |
1710 _SET(RB_MRTBLENDCONTROL_ALPHA_BLEND_OPCODE, RB_BLEND_OP_ADD) |
1711 _SET(RB_MRTBLENDCONTROL_ALPHA_DEST_FACTOR, RB_FACTOR_ZERO) |
1712 _SET(RB_MRTBLENDCONTROL_CLAMP_ENABLE, 1);
1713 /* RB_MRT_CONTROL2 */
1714 *cmds++ = _SET(RB_MRTCONTROL_READ_DEST_ENABLE, 1) |
Rajeev Kulkarnic46499f2012-07-10 16:02:46 -07001715 _SET(RB_MRTCONTROL_ROP_CODE, 12) |
1716 _SET(RB_MRTCONTROL_DITHER_MODE, RB_DITHER_ALWAYS) |
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07001717 _SET(RB_MRTCONTROL_COMPONENT_ENABLE, 0xF);
1718
1719 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 3);
1720 *cmds++ = CP_REG(A3XX_RB_MRT_BLEND_CONTROL2);
1721 /* RB_MRT_BLENDCONTROL2 */
1722 *cmds++ = _SET(RB_MRTBLENDCONTROL_RGB_SRC_FACTOR, RB_FACTOR_ONE) |
1723 _SET(RB_MRTBLENDCONTROL_RGB_BLEND_OPCODE, RB_BLEND_OP_ADD) |
1724 _SET(RB_MRTBLENDCONTROL_RGB_DEST_FACTOR, RB_FACTOR_ZERO) |
1725 _SET(RB_MRTBLENDCONTROL_ALPHA_SRC_FACTOR, RB_FACTOR_ONE) |
1726 _SET(RB_MRTBLENDCONTROL_ALPHA_BLEND_OPCODE, RB_BLEND_OP_ADD) |
1727 _SET(RB_MRTBLENDCONTROL_ALPHA_DEST_FACTOR, RB_FACTOR_ZERO) |
1728 _SET(RB_MRTBLENDCONTROL_CLAMP_ENABLE, 1);
1729 /* RB_MRT_CONTROL3 */
1730 *cmds++ = _SET(RB_MRTCONTROL_READ_DEST_ENABLE, 1) |
Rajeev Kulkarnic46499f2012-07-10 16:02:46 -07001731 _SET(RB_MRTCONTROL_ROP_CODE, 12) |
1732 _SET(RB_MRTCONTROL_DITHER_MODE, RB_DITHER_ALWAYS) |
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07001733 _SET(RB_MRTCONTROL_COMPONENT_ENABLE, 0xF);
1734
1735 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
1736 *cmds++ = CP_REG(A3XX_RB_MRT_BLEND_CONTROL3);
1737 /* RB_MRT_BLENDCONTROL3 */
1738 *cmds++ = _SET(RB_MRTBLENDCONTROL_RGB_SRC_FACTOR, RB_FACTOR_ONE) |
1739 _SET(RB_MRTBLENDCONTROL_RGB_BLEND_OPCODE, RB_BLEND_OP_ADD) |
1740 _SET(RB_MRTBLENDCONTROL_RGB_DEST_FACTOR, RB_FACTOR_ZERO) |
1741 _SET(RB_MRTBLENDCONTROL_ALPHA_SRC_FACTOR, RB_FACTOR_ONE) |
1742 _SET(RB_MRTBLENDCONTROL_ALPHA_BLEND_OPCODE, RB_BLEND_OP_ADD) |
1743 _SET(RB_MRTBLENDCONTROL_ALPHA_DEST_FACTOR, RB_FACTOR_ZERO) |
1744 _SET(RB_MRTBLENDCONTROL_CLAMP_ENABLE, 1);
1745
1746 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 5);
1747 *cmds++ = CP_REG(A3XX_VFD_INDEX_MIN);
1748 /* VFD_INDEX_MIN */
1749 *cmds++ = 0x00000000;
1750 /* VFD_INDEX_MAX */
Rajeev Kulkarnic46499f2012-07-10 16:02:46 -07001751 *cmds++ = 340;
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07001752 /* VFD_INDEX_OFFSET */
1753 *cmds++ = 0x00000000;
1754 /* TPL1_TP_VS_TEX_OFFSET */
1755 *cmds++ = 0x00000000;
1756
1757 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
1758 *cmds++ = CP_REG(A3XX_VFD_VS_THREADING_THRESHOLD);
1759 /* VFD_VS_THREADING_THRESHOLD */
Rajeev Kulkarnic46499f2012-07-10 16:02:46 -07001760 *cmds++ = _SET(VFD_THREADINGTHRESHOLD_REGID_THRESHOLD, 15) |
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07001761 _SET(VFD_THREADINGTHRESHOLD_REGID_VTXCNT, 252);
1762
1763 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
1764 *cmds++ = CP_REG(A3XX_TPL1_TP_VS_TEX_OFFSET);
1765 /* TPL1_TP_VS_TEX_OFFSET */
1766 *cmds++ = 0x00000000;
1767
1768 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
1769 *cmds++ = CP_REG(A3XX_TPL1_TP_FS_TEX_OFFSET);
1770 /* TPL1_TP_FS_TEX_OFFSET */
1771 *cmds++ = _SET(TPL1_TPTEXOFFSETREG_SAMPLEROFFSET, 16) |
1772 _SET(TPL1_TPTEXOFFSETREG_MEMOBJOFFSET, 16) |
1773 _SET(TPL1_TPTEXOFFSETREG_BASETABLEPTR, 224);
1774
1775 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
1776 *cmds++ = CP_REG(A3XX_GRAS_SC_CONTROL);
1777 /* GRAS_SC_CONTROL */
Tarun Karra7e8e1cf2012-02-06 18:23:19 -08001778 /*cmds++ = _SET(GRAS_SC_CONTROL_RASTER_MODE, 1);
1779 *cmds++ = _SET(GRAS_SC_CONTROL_RASTER_MODE, 1) |*/
1780 *cmds++ = 0x04001000;
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07001781
1782 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
1783 *cmds++ = CP_REG(A3XX_GRAS_SU_MODE_CONTROL);
1784 /* GRAS_SU_MODE_CONTROL */
Rajeev Kulkarnic46499f2012-07-10 16:02:46 -07001785 *cmds++ = _SET(GRAS_SU_CTRLMODE_LINEHALFWIDTH, 2);
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07001786
1787 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 3);
1788 *cmds++ = CP_REG(A3XX_GRAS_SC_WINDOW_SCISSOR_TL);
1789 /* GRAS_SC_WINDOW_SCISSOR_TL */
1790 *cmds++ = 0x00000000;
1791 /* GRAS_SC_WINDOW_SCISSOR_BR */
1792 *cmds++ = _SET(GRAS_SC_WINDOW_SCISSOR_BR_BR_X, shadow->width - 1) |
1793 _SET(GRAS_SC_WINDOW_SCISSOR_BR_BR_Y, shadow->height - 1);
1794
1795 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 3);
1796 *cmds++ = CP_REG(A3XX_GRAS_SC_SCREEN_SCISSOR_TL);
1797 /* GRAS_SC_SCREEN_SCISSOR_TL */
1798 *cmds++ = 0x00000000;
1799 /* GRAS_SC_SCREEN_SCISSOR_BR */
1800 *cmds++ = _SET(GRAS_SC_SCREEN_SCISSOR_BR_BR_X, shadow->width - 1) |
1801 _SET(GRAS_SC_SCREEN_SCISSOR_BR_BR_Y, shadow->height - 1);
1802
1803 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 5);
1804 *cmds++ = CP_REG(A3XX_GRAS_CL_VPORT_XOFFSET);
1805 /* GRAS_CL_VPORT_XOFFSET */
1806 *cmds++ = 0x00000000;
1807 /* GRAS_CL_VPORT_XSCALE */
1808 *cmds++ = _SET(GRAS_CL_VPORT_XSCALE_VPORT_XSCALE, 0x3F800000);
1809 /* GRAS_CL_VPORT_YOFFSET */
1810 *cmds++ = 0x00000000;
1811 /* GRAS_CL_VPORT_YSCALE */
1812 *cmds++ = _SET(GRAS_CL_VPORT_YSCALE_VPORT_YSCALE, 0x3F800000);
1813
1814 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 3);
1815 *cmds++ = CP_REG(A3XX_GRAS_CL_VPORT_ZOFFSET);
1816 /* GRAS_CL_VPORT_ZOFFSET */
1817 *cmds++ = 0x00000000;
1818 /* GRAS_CL_VPORT_ZSCALE */
1819 *cmds++ = _SET(GRAS_CL_VPORT_ZSCALE_VPORT_ZSCALE, 0x3F800000);
1820
1821 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
1822 *cmds++ = CP_REG(A3XX_GRAS_CL_CLIP_CNTL);
1823 /* GRAS_CL_CLIP_CNTL */
1824 *cmds++ = _SET(GRAS_CL_CLIP_CNTL_IJ_PERSP_CENTER, 1);
1825
1826 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
1827 *cmds++ = CP_REG(A3XX_SP_FS_IMAGE_OUTPUT_REG_0);
1828 /* SP_FS_IMAGE_OUTPUT_REG_0 */
1829 *cmds++ = _SET(SP_IMAGEOUTPUTREG_MRTFORMAT, SP_R8G8B8A8_UNORM);
1830
1831 *cmds++ = cp_type3_packet(CP_SET_CONSTANT, 2);
1832 *cmds++ = CP_REG(A3XX_PC_PRIM_VTX_CNTL);
1833 /* PC_PRIM_VTX_CONTROL */
1834 *cmds++ = _SET(PC_PRIM_VTX_CONTROL_STRIDE_IN_VPC, 2) |
1835 _SET(PC_PRIM_VTX_CONTROL_POLYMODE_FRONT_PTYPE,
1836 PC_DRAW_TRIANGLES) |
1837 _SET(PC_PRIM_VTX_CONTROL_POLYMODE_BACK_PTYPE,
1838 PC_DRAW_TRIANGLES) |
1839 _SET(PC_PRIM_VTX_CONTROL_PROVOKING_VTX_LAST, 1);
1840
Rajeev Kulkarnic46499f2012-07-10 16:02:46 -07001841
1842 /* oxili_generate_context_roll_packets */
1843 *cmds++ = cp_type0_packet(A3XX_SP_VS_CTRL_REG0, 1);
1844 *cmds++ = 0x00000400;
1845
1846 *cmds++ = cp_type0_packet(A3XX_SP_FS_CTRL_REG0, 1);
1847 *cmds++ = 0x00000400;
1848
1849 *cmds++ = cp_type0_packet(A3XX_SP_VS_PVT_MEM_SIZE_REG, 1);
1850 *cmds++ = 0x00008000; /* SP_VS_MEM_SIZE_REG */
1851
1852 *cmds++ = cp_type0_packet(A3XX_SP_FS_PVT_MEM_SIZE_REG, 1);
1853 *cmds++ = 0x00008000; /* SP_FS_MEM_SIZE_REG */
1854
1855 /* Clear cache invalidate bit when re-loading the shader control regs */
1856 *cmds++ = cp_type0_packet(A3XX_SP_VS_CTRL_REG0, 1);
1857 *cmds++ = _SET(SP_VSCTRLREG0_VSTHREADMODE, SP_MULTI) |
1858 _SET(SP_VSCTRLREG0_VSINSTRBUFFERMODE, SP_BUFFER_MODE) |
1859 _SET(SP_VSCTRLREG0_VSFULLREGFOOTPRINT, 2) |
1860 _SET(SP_VSCTRLREG0_VSTHREADSIZE, SP_TWO_VTX_QUADS) |
1861 _SET(SP_VSCTRLREG0_VSLENGTH, 1);
1862
1863 *cmds++ = cp_type0_packet(A3XX_SP_FS_CTRL_REG0, 1);
1864 *cmds++ = _SET(SP_FSCTRLREG0_FSTHREADMODE, SP_MULTI) |
1865 _SET(SP_FSCTRLREG0_FSINSTRBUFFERMODE, SP_BUFFER_MODE) |
1866 _SET(SP_FSCTRLREG0_FSHALFREGFOOTPRINT, 1) |
1867 _SET(SP_FSCTRLREG0_FSFULLREGFOOTPRINT, 1) |
1868 _SET(SP_FSCTRLREG0_FSINOUTREGOVERLAP, 1) |
1869 _SET(SP_FSCTRLREG0_FSTHREADSIZE, SP_FOUR_PIX_QUADS) |
1870 _SET(SP_FSCTRLREG0_FSSUPERTHREADMODE, 1) |
1871 _SET(SP_FSCTRLREG0_FSLENGTH, 2);
1872
1873 *cmds++ = cp_type0_packet(A3XX_SP_VS_PVT_MEM_SIZE_REG, 1);
1874 *cmds++ = 0x00000000; /* SP_VS_MEM_SIZE_REG */
1875
1876 *cmds++ = cp_type0_packet(A3XX_SP_FS_PVT_MEM_SIZE_REG, 1);
1877 *cmds++ = 0x00000000; /* SP_FS_MEM_SIZE_REG */
1878
1879 /* end oxili_generate_context_roll_packets */
1880
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07001881 *cmds++ = cp_type3_packet(CP_DRAW_INDX, 3);
1882 *cmds++ = 0x00000000; /* Viz query info */
1883 *cmds++ = BUILD_PC_DRAW_INITIATOR(PC_DI_PT_RECTLIST,
1884 PC_DI_SRC_SEL_AUTO_INDEX,
1885 PC_DI_INDEX_SIZE_16_BIT,
1886 PC_DI_IGNORE_VISIBILITY);
1887 *cmds++ = 0x00000002; /* Num indices */
1888
1889 /* Create indirect buffer command for above command sequence */
1890 create_ib1(drawctxt, shadow->gmem_restore, start, cmds);
1891
1892 return cmds;
1893}
1894
Rajeev Kulkarnic46499f2012-07-10 16:02:46 -07001895
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07001896static void build_regrestore_cmds(struct adreno_device *adreno_dev,
1897 struct adreno_context *drawctxt)
1898{
1899 unsigned int *start = tmp_ctx.cmd;
1900 unsigned int *cmd = start;
1901 unsigned int *lcc_start;
1902
1903 int i;
1904
1905 /* Flush HLSQ lazy updates */
1906 *cmd++ = cp_type3_packet(CP_EVENT_WRITE, 1);
1907 *cmd++ = 0x7; /* HLSQ_FLUSH */
1908 *cmd++ = cp_type3_packet(CP_WAIT_FOR_IDLE, 1);
1909 *cmd++ = 0;
1910
1911 *cmd++ = cp_type0_packet(A3XX_UCHE_CACHE_INVALIDATE0_REG, 2);
1912 *cmd++ = 0x00000000; /* No start addr for full invalidate */
1913 *cmd++ = (unsigned int)
1914 UCHE_ENTIRE_CACHE << UCHE_INVALIDATE1REG_ALLORPORTION |
1915 UCHE_OP_INVALIDATE << UCHE_INVALIDATE1REG_OPCODE |
1916 0; /* No end addr for full invalidate */
1917
1918 lcc_start = cmd;
1919
1920 /* deferred cp_type3_packet(CP_LOAD_CONSTANT_CONTEXT, ???); */
1921 cmd++;
1922
1923#ifdef CONFIG_MSM_KGSL_DISABLE_SHADOW_WRITES
1924 /* Force mismatch */
1925 *cmd++ = ((drawctxt->gpustate.gpuaddr + REG_OFFSET) & 0xFFFFE000) | 1;
1926#else
1927 *cmd++ = (drawctxt->gpustate.gpuaddr + REG_OFFSET) & 0xFFFFE000;
1928#endif
1929
1930 for (i = 0; i < ARRAY_SIZE(context_register_ranges) / 2; i++) {
1931 cmd = reg_range(cmd, context_register_ranges[i * 2],
1932 context_register_ranges[i * 2 + 1]);
1933 }
1934
1935 lcc_start[0] = cp_type3_packet(CP_LOAD_CONSTANT_CONTEXT,
1936 (cmd - lcc_start) - 1);
1937
1938#ifdef CONFIG_MSM_KGSL_DISABLE_SHADOW_WRITES
1939 lcc_start[2] |= (0 << 24) | (4 << 16); /* Disable shadowing. */
1940#else
1941 lcc_start[2] |= (1 << 24) | (4 << 16);
1942#endif
1943
1944 for (i = 0; i < ARRAY_SIZE(global_registers); i++) {
1945 *cmd++ = cp_type0_packet(global_registers[i], 1);
1946 tmp_ctx.reg_values[i] = virt2gpu(cmd, &drawctxt->gpustate);
1947 *cmd++ = 0x00000000;
1948 }
1949
1950 create_ib1(drawctxt, drawctxt->reg_restore, start, cmd);
1951 tmp_ctx.cmd = cmd;
1952}
1953
1954static void build_constantrestore_cmds(struct adreno_device *adreno_dev,
1955 struct adreno_context *drawctxt)
1956{
1957 unsigned int *cmd = tmp_ctx.cmd;
1958 unsigned int *start = cmd;
1959 unsigned int mode = 4; /* Indirect mode */
1960 unsigned int stateblock;
1961 unsigned int numunits;
1962 unsigned int statetype;
1963
1964 drawctxt->cond_execs[2].hostptr = cmd;
1965 drawctxt->cond_execs[2].gpuaddr = virt2gpu(cmd, &drawctxt->gpustate);
1966 *cmd++ = 0;
1967 drawctxt->cond_execs[3].hostptr = cmd;
1968 drawctxt->cond_execs[3].gpuaddr = virt2gpu(cmd, &drawctxt->gpustate);
1969 *cmd++ = 0;
1970
1971#ifndef CONFIG_MSM_KGSL_DISABLE_SHADOW_WRITES
1972 *cmd++ = cp_type3_packet(CP_LOAD_CONSTANT_CONTEXT, 3);
1973 *cmd++ = (drawctxt->gpustate.gpuaddr + REG_OFFSET) & 0xFFFFE000;
1974 *cmd++ = 4 << 16;
1975 *cmd++ = 0x0;
1976#endif
1977 /* HLSQ full update */
1978 *cmd++ = cp_type3_packet(CP_SET_CONSTANT, 2);
1979 *cmd++ = CP_REG(A3XX_HLSQ_CONTROL_0_REG);
1980 *cmd++ = 0x68000240; /* A3XX_HLSQ_CONTROL_0_REG */
1981
1982#ifndef CONFIG_MSM_KGSL_DISABLE_SHADOW_WRITES
1983 /* Re-enable shadowing */
1984 *cmd++ = cp_type3_packet(CP_LOAD_CONSTANT_CONTEXT, 3);
1985 *cmd++ = (drawctxt->gpustate.gpuaddr + REG_OFFSET) & 0xFFFFE000;
1986 *cmd++ = (4 << 16) | (1 << 24);
1987 *cmd++ = 0x0;
1988#endif
1989
1990 /* Load vertex shader constants */
1991 *cmd++ = cp_type3_packet(CP_COND_EXEC, 4);
1992 *cmd++ = drawctxt->cond_execs[2].gpuaddr >> 2;
1993 *cmd++ = drawctxt->cond_execs[2].gpuaddr >> 2;
1994 *cmd++ = 0x0000ffff;
1995 *cmd++ = 3; /* EXEC_COUNT */
1996 *cmd++ = cp_type3_packet(CP_LOAD_STATE, 2);
1997 drawctxt->constant_load_commands[0].hostptr = cmd;
1998 drawctxt->constant_load_commands[0].gpuaddr = virt2gpu(cmd,
1999 &drawctxt->gpustate);
2000
2001 /*
2002 From fixup:
2003
2004 mode = 4 (indirect)
2005 stateblock = 4 (Vertex constants)
2006 numunits = SP_VS_CTRL_REG1.VSCONSTLENGTH * 2; (256bit units)
2007
2008 From register spec:
2009 SP_VS_CTRL_REG1.VSCONSTLENGTH [09:00]: 0-512, unit = 128bits.
2010
2011 ord1 = (numunits<<22) | (stateblock<<19) | (mode<<16);
2012 */
2013
2014 *cmd++ = 0; /* ord1 */
2015 *cmd++ = ((drawctxt->gpustate.gpuaddr) & 0xfffffffc) | 1;
2016
2017 /* Load fragment shader constants */
2018 *cmd++ = cp_type3_packet(CP_COND_EXEC, 4);
2019 *cmd++ = drawctxt->cond_execs[3].gpuaddr >> 2;
2020 *cmd++ = drawctxt->cond_execs[3].gpuaddr >> 2;
2021 *cmd++ = 0x0000ffff;
2022 *cmd++ = 3; /* EXEC_COUNT */
2023 *cmd++ = cp_type3_packet(CP_LOAD_STATE, 2);
2024 drawctxt->constant_load_commands[1].hostptr = cmd;
2025 drawctxt->constant_load_commands[1].gpuaddr =
2026 virt2gpu(cmd, &drawctxt->gpustate);
2027 /*
2028 From fixup:
2029
2030 mode = 4 (indirect)
2031 stateblock = 6 (Fragment constants)
2032 numunits = SP_FS_CTRL_REG1.FSCONSTLENGTH * 2; (256bit units)
2033
2034 From register spec:
2035 SP_FS_CTRL_REG1.FSCONSTLENGTH [09:00]: 0-512, unit = 128bits.
2036
2037 ord1 = (numunits<<22) | (stateblock<<19) | (mode<<16);
2038 */
2039
2040 *cmd++ = 0; /* ord1 */
2041 drawctxt->constant_load_commands[2].hostptr = cmd;
2042 drawctxt->constant_load_commands[2].gpuaddr =
2043 virt2gpu(cmd, &drawctxt->gpustate);
2044 /*
2045 From fixup:
2046 base = drawctxt->gpustate.gpuaddr (ALU constant shadow base)
2047 offset = SP_FS_OBJ_OFFSET_REG.CONSTOBJECTSTARTOFFSET
2048
2049 From register spec:
2050 SP_FS_OBJ_OFFSET_REG.CONSTOBJECTSTARTOFFSET [16:24]: Constant object
2051 start offset in on chip RAM,
2052 128bit aligned
2053
2054 ord2 = base + offset | 1
2055 Because of the base alignment we can use
2056 ord2 = base | offset | 1
2057 */
2058 *cmd++ = 0; /* ord2 */
2059
2060 /* Restore VS texture memory objects */
2061 stateblock = 0;
2062 statetype = 1;
2063 numunits = (TEX_SIZE_MEM_OBJECTS / 7) / 4;
2064
2065 *cmd++ = cp_type3_packet(CP_LOAD_STATE, 2);
2066 *cmd++ = (numunits << 22) | (stateblock << 19) | (mode << 16);
2067 *cmd++ = ((drawctxt->gpustate.gpuaddr + VS_TEX_OFFSET_MEM_OBJECTS)
2068 & 0xfffffffc) | statetype;
2069
2070 /* Restore VS texture mipmap addresses */
2071 stateblock = 1;
2072 statetype = 1;
2073 numunits = TEX_SIZE_MIPMAP / 4;
2074 *cmd++ = cp_type3_packet(CP_LOAD_STATE, 2);
2075 *cmd++ = (numunits << 22) | (stateblock << 19) | (mode << 16);
2076 *cmd++ = ((drawctxt->gpustate.gpuaddr + VS_TEX_OFFSET_MIPMAP)
2077 & 0xfffffffc) | statetype;
2078
2079 /* Restore VS texture sampler objects */
2080 stateblock = 0;
2081 statetype = 0;
2082 numunits = (TEX_SIZE_SAMPLER_OBJ / 2) / 4;
2083 *cmd++ = cp_type3_packet(CP_LOAD_STATE, 2);
2084 *cmd++ = (numunits << 22) | (stateblock << 19) | (mode << 16);
2085 *cmd++ = ((drawctxt->gpustate.gpuaddr + VS_TEX_OFFSET_SAMPLER_OBJ)
2086 & 0xfffffffc) | statetype;
2087
2088 /* Restore FS texture memory objects */
2089 stateblock = 2;
2090 statetype = 1;
2091 numunits = (TEX_SIZE_MEM_OBJECTS / 7) / 4;
2092 *cmd++ = cp_type3_packet(CP_LOAD_STATE, 2);
2093 *cmd++ = (numunits << 22) | (stateblock << 19) | (mode << 16);
2094 *cmd++ = ((drawctxt->gpustate.gpuaddr + FS_TEX_OFFSET_MEM_OBJECTS)
2095 & 0xfffffffc) | statetype;
2096
2097 /* Restore FS texture mipmap addresses */
2098 stateblock = 3;
2099 statetype = 1;
2100 numunits = TEX_SIZE_MIPMAP / 4;
2101 *cmd++ = cp_type3_packet(CP_LOAD_STATE, 2);
2102 *cmd++ = (numunits << 22) | (stateblock << 19) | (mode << 16);
2103 *cmd++ = ((drawctxt->gpustate.gpuaddr + FS_TEX_OFFSET_MIPMAP)
2104 & 0xfffffffc) | statetype;
2105
2106 /* Restore FS texture sampler objects */
2107 stateblock = 2;
2108 statetype = 0;
2109 numunits = (TEX_SIZE_SAMPLER_OBJ / 2) / 4;
2110 *cmd++ = cp_type3_packet(CP_LOAD_STATE, 2);
2111 *cmd++ = (numunits << 22) | (stateblock << 19) | (mode << 16);
2112 *cmd++ = ((drawctxt->gpustate.gpuaddr + FS_TEX_OFFSET_SAMPLER_OBJ)
2113 & 0xfffffffc) | statetype;
2114
2115 create_ib1(drawctxt, drawctxt->constant_restore, start, cmd);
2116 tmp_ctx.cmd = cmd;
2117}
2118
2119static void build_shader_restore_cmds(struct adreno_device *adreno_dev,
2120 struct adreno_context *drawctxt)
2121{
2122 unsigned int *cmd = tmp_ctx.cmd;
2123 unsigned int *start = cmd;
2124
2125 /* Vertex shader */
2126 *cmd++ = cp_type3_packet(CP_COND_EXEC, 4);
2127 *cmd++ = drawctxt->cond_execs[0].gpuaddr >> 2;
2128 *cmd++ = drawctxt->cond_execs[0].gpuaddr >> 2;
2129 *cmd++ = 1;
2130 *cmd++ = 3; /* EXEC_COUNT */
2131
2132 *cmd++ = cp_type3_packet(CP_LOAD_STATE, 2);
2133 drawctxt->shader_load_commands[0].hostptr = cmd;
2134 drawctxt->shader_load_commands[0].gpuaddr =
2135 virt2gpu(cmd, &drawctxt->gpustate);
2136 /*
2137 From fixup:
2138
2139 mode = 4 (indirect)
2140 stateblock = 4 (Vertex shader)
2141 numunits = SP_VS_CTRL_REG0.VS_LENGTH
2142
2143 From regspec:
2144 SP_VS_CTRL_REG0.VS_LENGTH [31:24]: VS length, unit = 256bits.
2145 If bit31 is 1, it means overflow
2146 or any long shader.
2147
2148 ord1 = (numunits<<22) | (stateblock<<19) | (mode<<11)
2149 */
2150 *cmd++ = 0; /*ord1 */
2151 *cmd++ = (drawctxt->gpustate.gpuaddr + SHADER_OFFSET) & 0xfffffffc;
2152
2153 /* Fragment shader */
2154 *cmd++ = cp_type3_packet(CP_COND_EXEC, 4);
2155 *cmd++ = drawctxt->cond_execs[1].gpuaddr >> 2;
2156 *cmd++ = drawctxt->cond_execs[1].gpuaddr >> 2;
2157 *cmd++ = 1;
2158 *cmd++ = 3; /* EXEC_COUNT */
2159
2160 *cmd++ = cp_type3_packet(CP_LOAD_STATE, 2);
2161 drawctxt->shader_load_commands[1].hostptr = cmd;
2162 drawctxt->shader_load_commands[1].gpuaddr =
2163 virt2gpu(cmd, &drawctxt->gpustate);
2164 /*
2165 From fixup:
2166
2167 mode = 4 (indirect)
2168 stateblock = 6 (Fragment shader)
2169 numunits = SP_FS_CTRL_REG0.FS_LENGTH
2170
2171 From regspec:
2172 SP_FS_CTRL_REG0.FS_LENGTH [31:24]: FS length, unit = 256bits.
2173 If bit31 is 1, it means overflow
2174 or any long shader.
2175
2176 ord1 = (numunits<<22) | (stateblock<<19) | (mode<<11)
2177 */
2178 *cmd++ = 0; /*ord1 */
2179 *cmd++ = (drawctxt->gpustate.gpuaddr + SHADER_OFFSET
2180 + (SHADER_SHADOW_SIZE / 2)) & 0xfffffffc;
2181
2182 create_ib1(drawctxt, drawctxt->shader_restore, start, cmd);
2183 tmp_ctx.cmd = cmd;
2184}
2185
2186static void build_hlsqcontrol_restore_cmds(struct adreno_device *adreno_dev,
2187 struct adreno_context *drawctxt)
2188{
2189 unsigned int *cmd = tmp_ctx.cmd;
2190 unsigned int *start = cmd;
2191
2192 *cmd++ = cp_type3_packet(CP_SET_CONSTANT, 2);
2193 *cmd++ = CP_REG(A3XX_HLSQ_CONTROL_0_REG);
2194 drawctxt->hlsqcontrol_restore_commands[0].hostptr = cmd;
2195 drawctxt->hlsqcontrol_restore_commands[0].gpuaddr
2196 = virt2gpu(cmd, &drawctxt->gpustate);
2197 *cmd++ = 0;
2198
2199 /* Create indirect buffer command for above command sequence */
2200 create_ib1(drawctxt, drawctxt->hlsqcontrol_restore, start, cmd);
2201
2202 tmp_ctx.cmd = cmd;
2203}
2204
2205/* IB that modifies the shader and constant sizes and offsets in restore IBs. */
2206static void build_restore_fixup_cmds(struct adreno_device *adreno_dev,
2207 struct adreno_context *drawctxt)
2208{
2209 unsigned int *cmd = tmp_ctx.cmd;
2210 unsigned int *start = cmd;
2211
2212#ifdef GSL_CONTEXT_SWITCH_CPU_SYNC
2213 /* Save shader sizes */
2214 *cmd++ = cp_type3_packet(CP_REG_TO_MEM, 2);
2215 *cmd++ = A3XX_SP_VS_CTRL_REG0;
2216 *cmd++ = drawctxt->shader_load_commands[0].gpuaddr;
2217
2218 *cmd++ = cp_type3_packet(CP_REG_TO_MEM, 2);
2219 *cmd++ = A3XX_SP_FS_CTRL_REG0;
2220 *cmd++ = drawctxt->shader_load_commands[1].gpuaddr;
2221
2222 /* Save constant sizes */
2223 *cmd++ = cp_type3_packet(CP_REG_TO_MEM, 2);
2224 *cmd++ = A3XX_SP_VS_CTRL_REG1;
2225 *cmd++ = drawctxt->constant_load_commands[0].gpuaddr;
2226
2227 *cmd++ = cp_type3_packet(CP_REG_TO_MEM, 2);
2228 *cmd++ = A3XX_SP_FS_CTRL_REG1;
2229 *cmd++ = drawctxt->constant_load_commands[1].gpuaddr;
2230
2231 /* Save constant offsets */
2232 *cmd++ = cp_type3_packet(CP_REG_TO_MEM, 2);
2233 *cmd++ = A3XX_SP_FS_OBJ_OFFSET_REG;
2234 *cmd++ = drawctxt->constant_load_commands[2].gpuaddr;
2235#else
2236 /* Save shader sizes */
2237 cmd = rmw_regtomem(cmd, A3XX_SP_VS_CTRL_REG0, 0x7f000000,
2238 30, (4 << 19) | (4 << 16),
2239 drawctxt->shader_load_commands[0].gpuaddr);
2240
2241 cmd = rmw_regtomem(cmd, A3XX_SP_FS_CTRL_REG0, 0x7f000000,
2242 30, (6 << 19) | (4 << 16),
2243 drawctxt->shader_load_commands[1].gpuaddr);
2244
2245 /* Save constant sizes */
2246 cmd = rmw_regtomem(cmd, A3XX_SP_VS_CTRL_REG1, 0x000003ff,
2247 23, (4 << 19) | (4 << 16),
2248 drawctxt->constant_load_commands[0].gpuaddr);
2249
2250 cmd = rmw_regtomem(cmd, A3XX_SP_FS_CTRL_REG1, 0x000003ff,
2251 23, (6 << 19) | (4 << 16),
2252 drawctxt->constant_load_commands[1].gpuaddr);
2253
2254 /* Modify constant restore conditionals */
2255 cmd = rmw_regtomem(cmd, A3XX_SP_VS_CTRL_REG1, 0x000003ff,
2256 0, 0, drawctxt->cond_execs[2].gpuaddr);
2257
2258 cmd = rmw_regtomem(cmd, A3XX_SP_FS_CTRL_REG1, 0x000003ff,
2259 0, 0, drawctxt->cond_execs[3].gpuaddr);
2260
2261 /* Save fragment constant shadow offset */
2262 cmd = rmw_regtomem(cmd, A3XX_SP_FS_OBJ_OFFSET_REG, 0x00ff0000,
2263 18, (drawctxt->gpustate.gpuaddr & 0xfffffe00) | 1,
2264 drawctxt->constant_load_commands[2].gpuaddr);
2265#endif
2266
2267 /* Use mask value to avoid flushing HLSQ which would cause the HW to
2268 discard all the shader data */
2269
2270 cmd = rmw_regtomem(cmd, A3XX_HLSQ_CONTROL_0_REG, 0x9ffffdff,
2271 0, 0, drawctxt->hlsqcontrol_restore_commands[0].gpuaddr);
2272
2273 create_ib1(drawctxt, drawctxt->restore_fixup, start, cmd);
2274
2275 tmp_ctx.cmd = cmd;
2276}
2277
2278static int a3xx_create_gpustate_shadow(struct adreno_device *adreno_dev,
2279 struct adreno_context *drawctxt)
2280{
2281 drawctxt->flags |= CTXT_FLAGS_STATE_SHADOW;
2282
2283 build_regrestore_cmds(adreno_dev, drawctxt);
2284 build_constantrestore_cmds(adreno_dev, drawctxt);
2285 build_hlsqcontrol_restore_cmds(adreno_dev, drawctxt);
2286 build_regconstantsave_cmds(adreno_dev, drawctxt);
2287 build_shader_save_cmds(adreno_dev, drawctxt);
2288 build_shader_restore_cmds(adreno_dev, drawctxt);
2289 build_restore_fixup_cmds(adreno_dev, drawctxt);
2290 build_save_fixup_cmds(adreno_dev, drawctxt);
2291
2292 return 0;
2293}
2294
2295/* create buffers for saving/restoring registers, constants, & GMEM */
2296static int a3xx_create_gmem_shadow(struct adreno_device *adreno_dev,
2297 struct adreno_context *drawctxt)
2298{
Jordan Crousea7ec4212012-02-04 10:23:52 -07002299 int result;
2300
Jordan Crouse7501d452012-04-19 08:58:44 -06002301 calc_gmemsize(&drawctxt->context_gmem_shadow, adreno_dev->gmem_size);
2302 tmp_ctx.gmem_base = adreno_dev->gmem_base;
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002303
Jordan Crousea7ec4212012-02-04 10:23:52 -07002304 result = kgsl_allocate(&drawctxt->context_gmem_shadow.gmemshadow,
2305 drawctxt->pagetable, drawctxt->context_gmem_shadow.size);
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002306
Jordan Crousea7ec4212012-02-04 10:23:52 -07002307 if (result)
2308 return result;
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002309
2310 build_quad_vtxbuff(drawctxt, &drawctxt->context_gmem_shadow,
2311 &tmp_ctx.cmd);
2312
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002313 tmp_ctx.cmd = build_gmem2sys_cmds(adreno_dev, drawctxt,
2314 &drawctxt->context_gmem_shadow);
2315 tmp_ctx.cmd = build_sys2gmem_cmds(adreno_dev, drawctxt,
2316 &drawctxt->context_gmem_shadow);
2317
2318 kgsl_cache_range_op(&drawctxt->context_gmem_shadow.gmemshadow,
2319 KGSL_CACHE_OP_FLUSH);
2320
Jordan Crousea7ec4212012-02-04 10:23:52 -07002321 drawctxt->flags |= CTXT_FLAGS_GMEM_SHADOW;
2322
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002323 return 0;
2324}
2325
2326static int a3xx_drawctxt_create(struct adreno_device *adreno_dev,
2327 struct adreno_context *drawctxt)
2328{
2329 int ret;
2330
2331 /*
2332 * Allocate memory for the GPU state and the context commands.
2333 * Despite the name, this is much more then just storage for
2334 * the gpustate. This contains command space for gmem save
2335 * and texture and vertex buffer storage too
2336 */
2337
2338 ret = kgsl_allocate(&drawctxt->gpustate,
2339 drawctxt->pagetable, CONTEXT_SIZE);
2340
2341 if (ret)
2342 return ret;
2343
2344 kgsl_sharedmem_set(&drawctxt->gpustate, 0, 0, CONTEXT_SIZE);
2345 tmp_ctx.cmd = drawctxt->gpustate.hostptr + CMD_OFFSET;
2346
2347 if (!(drawctxt->flags & CTXT_FLAGS_PREAMBLE)) {
2348 ret = a3xx_create_gpustate_shadow(adreno_dev, drawctxt);
2349 if (ret)
2350 goto done;
2351
2352 drawctxt->flags |= CTXT_FLAGS_SHADER_SAVE;
2353 }
2354
2355 if (!(drawctxt->flags & CTXT_FLAGS_NOGMEMALLOC))
2356 ret = a3xx_create_gmem_shadow(adreno_dev, drawctxt);
2357
2358done:
2359 if (ret)
2360 kgsl_sharedmem_free(&drawctxt->gpustate);
2361
2362 return ret;
2363}
2364
2365static void a3xx_drawctxt_save(struct adreno_device *adreno_dev,
2366 struct adreno_context *context)
2367{
2368 struct kgsl_device *device = &adreno_dev->dev;
2369
Shubhraprakash Dasc9ec2662012-11-20 11:10:41 -07002370 if (context == NULL || (context->flags & CTXT_FLAGS_BEING_DESTROYED))
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002371 return;
2372
2373 if (context->flags & CTXT_FLAGS_GPU_HANG)
2374 KGSL_CTXT_WARN(device,
2375 "Current active context has caused gpu hang\n");
2376
2377 if (!(context->flags & CTXT_FLAGS_PREAMBLE)) {
2378 /* Fixup self modifying IBs for save operations */
Shubhraprakash Dasb2abc452012-06-08 16:33:03 -06002379 adreno_ringbuffer_issuecmds(device, context,
2380 KGSL_CMD_FLAGS_NONE, context->save_fixup, 3);
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002381
2382 /* save registers and constants. */
Shubhraprakash Dasb2abc452012-06-08 16:33:03 -06002383 adreno_ringbuffer_issuecmds(device, context,
2384 KGSL_CMD_FLAGS_NONE,
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002385 context->regconstant_save, 3);
2386
2387 if (context->flags & CTXT_FLAGS_SHADER_SAVE) {
2388 /* Save shader instructions */
Shubhraprakash Dasb2abc452012-06-08 16:33:03 -06002389 adreno_ringbuffer_issuecmds(device, context,
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002390 KGSL_CMD_FLAGS_PMODE, context->shader_save, 3);
2391
2392 context->flags |= CTXT_FLAGS_SHADER_RESTORE;
2393 }
2394 }
2395
2396 if ((context->flags & CTXT_FLAGS_GMEM_SAVE) &&
2397 (context->flags & CTXT_FLAGS_GMEM_SHADOW)) {
2398 /*
2399 * Save GMEM (note: changes shader. shader must
2400 * already be saved.)
2401 */
2402
Shubhraprakash Dasb2abc452012-06-08 16:33:03 -06002403 adreno_ringbuffer_issuecmds(device, context,
2404 KGSL_CMD_FLAGS_PMODE,
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002405 context->context_gmem_shadow.
2406 gmem_save, 3);
2407 context->flags |= CTXT_FLAGS_GMEM_RESTORE;
2408 }
2409}
2410
2411static void a3xx_drawctxt_restore(struct adreno_device *adreno_dev,
2412 struct adreno_context *context)
2413{
2414 struct kgsl_device *device = &adreno_dev->dev;
2415 unsigned int cmds[5];
2416
2417 if (context == NULL) {
2418 /* No context - set the default pagetable and thats it */
Shubhraprakash Dasb2abc452012-06-08 16:33:03 -06002419 kgsl_mmu_setstate(&device->mmu, device->mmu.defaultpagetable,
2420 adreno_dev->drawctxt_active->id);
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002421 return;
2422 }
2423
2424 KGSL_CTXT_INFO(device, "context flags %08x\n", context->flags);
2425
2426 cmds[0] = cp_nop_packet(1);
2427 cmds[1] = KGSL_CONTEXT_TO_MEM_IDENTIFIER;
2428 cmds[2] = cp_type3_packet(CP_MEM_WRITE, 2);
2429 cmds[3] = device->memstore.gpuaddr +
Carter Cooper7e7f02e2012-02-15 09:36:31 -07002430 KGSL_MEMSTORE_OFFSET(KGSL_MEMSTORE_GLOBAL, current_context);
2431 cmds[4] = context->id;
Shubhraprakash Dasb2abc452012-06-08 16:33:03 -06002432 adreno_ringbuffer_issuecmds(device, context, KGSL_CMD_FLAGS_NONE,
2433 cmds, 5);
2434 kgsl_mmu_setstate(&device->mmu, context->pagetable, context->id);
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002435
2436 /*
2437 * Restore GMEM. (note: changes shader.
2438 * Shader must not already be restored.)
2439 */
2440
2441 if (context->flags & CTXT_FLAGS_GMEM_RESTORE) {
Shubhraprakash Dasb2abc452012-06-08 16:33:03 -06002442 adreno_ringbuffer_issuecmds(device, context,
2443 KGSL_CMD_FLAGS_PMODE,
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002444 context->context_gmem_shadow.
2445 gmem_restore, 3);
2446 context->flags &= ~CTXT_FLAGS_GMEM_RESTORE;
2447 }
2448
2449 if (!(context->flags & CTXT_FLAGS_PREAMBLE)) {
Shubhraprakash Dasb2abc452012-06-08 16:33:03 -06002450 adreno_ringbuffer_issuecmds(device, context,
2451 KGSL_CMD_FLAGS_NONE, context->reg_restore, 3);
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002452
2453 /* Fixup self modifying IBs for restore operations */
Shubhraprakash Dasb2abc452012-06-08 16:33:03 -06002454 adreno_ringbuffer_issuecmds(device, context,
2455 KGSL_CMD_FLAGS_NONE,
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002456 context->restore_fixup, 3);
2457
Shubhraprakash Dasb2abc452012-06-08 16:33:03 -06002458 adreno_ringbuffer_issuecmds(device, context,
2459 KGSL_CMD_FLAGS_NONE,
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002460 context->constant_restore, 3);
2461
2462 if (context->flags & CTXT_FLAGS_SHADER_RESTORE)
Shubhraprakash Dasb2abc452012-06-08 16:33:03 -06002463 adreno_ringbuffer_issuecmds(device, context,
2464 KGSL_CMD_FLAGS_NONE,
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002465 context->shader_restore, 3);
2466
2467 /* Restore HLSQ_CONTROL_0 register */
Shubhraprakash Dasb2abc452012-06-08 16:33:03 -06002468 adreno_ringbuffer_issuecmds(device, context,
2469 KGSL_CMD_FLAGS_NONE,
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002470 context->hlsqcontrol_restore, 3);
2471 }
2472}
2473
2474static void a3xx_rb_init(struct adreno_device *adreno_dev,
2475 struct adreno_ringbuffer *rb)
2476{
2477 unsigned int *cmds, cmds_gpu;
Shubhraprakash Dasd316ff82012-08-02 12:43:48 -07002478 cmds = adreno_ringbuffer_allocspace(rb, NULL, 18);
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002479 cmds_gpu = rb->buffer_desc.gpuaddr + sizeof(uint) * (rb->wptr - 18);
2480
2481 GSL_RB_WRITE(cmds, cmds_gpu, cp_type3_packet(CP_ME_INIT, 17));
2482 GSL_RB_WRITE(cmds, cmds_gpu, 0x000003f7);
2483 GSL_RB_WRITE(cmds, cmds_gpu, 0x00000000);
2484 GSL_RB_WRITE(cmds, cmds_gpu, 0x00000000);
2485 GSL_RB_WRITE(cmds, cmds_gpu, 0x00000000);
2486 GSL_RB_WRITE(cmds, cmds_gpu, 0x00000080);
2487 GSL_RB_WRITE(cmds, cmds_gpu, 0x00000100);
2488 GSL_RB_WRITE(cmds, cmds_gpu, 0x00000180);
2489 GSL_RB_WRITE(cmds, cmds_gpu, 0x00006600);
2490 GSL_RB_WRITE(cmds, cmds_gpu, 0x00000150);
2491 GSL_RB_WRITE(cmds, cmds_gpu, 0x0000014e);
2492 GSL_RB_WRITE(cmds, cmds_gpu, 0x00000154);
2493 GSL_RB_WRITE(cmds, cmds_gpu, 0x00000001);
2494 GSL_RB_WRITE(cmds, cmds_gpu, 0x00000000);
2495 GSL_RB_WRITE(cmds, cmds_gpu, 0x00000000);
2496 /* Protected mode control - turned off for A3XX */
2497 GSL_RB_WRITE(cmds, cmds_gpu, 0x00000000);
2498 GSL_RB_WRITE(cmds, cmds_gpu, 0x00000000);
2499 GSL_RB_WRITE(cmds, cmds_gpu, 0x00000000);
2500
2501 adreno_ringbuffer_submit(rb);
2502}
2503
2504static void a3xx_err_callback(struct adreno_device *adreno_dev, int bit)
2505{
2506 struct kgsl_device *device = &adreno_dev->dev;
2507 const char *err = "";
2508
2509 switch (bit) {
2510 case A3XX_INT_RBBM_AHB_ERROR: {
2511 unsigned int reg;
2512
2513 adreno_regread(device, A3XX_RBBM_AHB_ERROR_STATUS, &reg);
2514
2515 /*
2516 * Return the word address of the erroring register so that it
2517 * matches the register specification
2518 */
2519
2520 KGSL_DRV_CRIT(device,
2521 "RBBM | AHB bus error | %s | addr=%x | ports=%x:%x\n",
2522 reg & (1 << 28) ? "WRITE" : "READ",
2523 (reg & 0xFFFFF) >> 2, (reg >> 20) & 0x3,
2524 (reg >> 24) & 0x3);
2525
2526 /* Clear the error */
2527 adreno_regwrite(device, A3XX_RBBM_AHB_CMD, (1 << 3));
2528 return;
2529 }
2530 case A3XX_INT_RBBM_REG_TIMEOUT:
2531 err = "RBBM: AHB register timeout";
2532 break;
2533 case A3XX_INT_RBBM_ME_MS_TIMEOUT:
2534 err = "RBBM: ME master split timeout";
2535 break;
2536 case A3XX_INT_RBBM_PFP_MS_TIMEOUT:
2537 err = "RBBM: PFP master split timeout";
2538 break;
2539 case A3XX_INT_RBBM_ATB_BUS_OVERFLOW:
2540 err = "RBBM: ATB bus oveflow";
2541 break;
2542 case A3XX_INT_VFD_ERROR:
2543 err = "VFD: Out of bounds access";
2544 break;
2545 case A3XX_INT_CP_T0_PACKET_IN_IB:
2546 err = "ringbuffer TO packet in IB interrupt";
2547 break;
2548 case A3XX_INT_CP_OPCODE_ERROR:
2549 err = "ringbuffer opcode error interrupt";
2550 break;
2551 case A3XX_INT_CP_RESERVED_BIT_ERROR:
2552 err = "ringbuffer reserved bit error interrupt";
2553 break;
2554 case A3XX_INT_CP_HW_FAULT:
2555 err = "ringbuffer hardware fault";
2556 break;
2557 case A3XX_INT_CP_REG_PROTECT_FAULT:
2558 err = "ringbuffer protected mode error interrupt";
2559 break;
2560 case A3XX_INT_CP_AHB_ERROR_HALT:
2561 err = "ringbuffer AHB error interrupt";
2562 break;
2563 case A3XX_INT_MISC_HANG_DETECT:
2564 err = "MISC: GPU hang detected";
2565 break;
2566 case A3XX_INT_UCHE_OOB_ACCESS:
2567 err = "UCHE: Out of bounds access";
2568 break;
2569 }
2570
2571 KGSL_DRV_CRIT(device, "%s\n", err);
2572 kgsl_pwrctrl_irq(device, KGSL_PWRFLAGS_OFF);
2573}
2574
2575static void a3xx_cp_callback(struct adreno_device *adreno_dev, int irq)
2576{
Carter Cooperd7b1aba2012-06-05 11:59:23 -06002577 struct kgsl_device *device = &adreno_dev->dev;
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002578
2579 if (irq == A3XX_INT_CP_RB_INT) {
Carter Cooper7e7f02e2012-02-15 09:36:31 -07002580 unsigned int context_id;
Carter Cooperd7b1aba2012-06-05 11:59:23 -06002581 kgsl_sharedmem_readl(&device->memstore, &context_id,
Carter Cooper7e7f02e2012-02-15 09:36:31 -07002582 KGSL_MEMSTORE_OFFSET(KGSL_MEMSTORE_GLOBAL,
2583 current_context));
2584 if (context_id < KGSL_MEMSTORE_MAX) {
Carter Cooperbedd2282012-11-05 11:53:54 -07002585 /* reset per context ts_cmp_enable */
Carter Cooperd7b1aba2012-06-05 11:59:23 -06002586 kgsl_sharedmem_writel(&device->memstore,
Carter Cooper7e7f02e2012-02-15 09:36:31 -07002587 KGSL_MEMSTORE_OFFSET(context_id,
2588 ts_cmp_enable), 0);
Carter Cooperbedd2282012-11-05 11:53:54 -07002589 /* Always reset global timestamp ts_cmp_enable */
2590 kgsl_sharedmem_writel(&device->memstore,
2591 KGSL_MEMSTORE_OFFSET(
2592 KGSL_MEMSTORE_GLOBAL,
2593 ts_cmp_enable), 0);
Carter Cooper7e7f02e2012-02-15 09:36:31 -07002594 wmb();
2595 }
Carter Cooperd7b1aba2012-06-05 11:59:23 -06002596 KGSL_CMD_WARN(device, "ringbuffer rb interrupt\n");
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002597 }
2598
Carter Cooperd7b1aba2012-06-05 11:59:23 -06002599 wake_up_interruptible_all(&device->wait_queue);
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002600
2601 /* Schedule work to free mem and issue ibs */
Carter Cooperd7b1aba2012-06-05 11:59:23 -06002602 queue_work(device->work_queue, &device->ts_expired_ws);
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002603
Carter Cooperd7b1aba2012-06-05 11:59:23 -06002604 atomic_notifier_call_chain(&device->ts_notifier_list,
2605 device->id, NULL);
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002606}
2607
2608#define A3XX_IRQ_CALLBACK(_c) { .func = _c }
2609
2610#define A3XX_INT_MASK \
2611 ((1 << A3XX_INT_RBBM_AHB_ERROR) | \
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002612 (1 << A3XX_INT_RBBM_ATB_BUS_OVERFLOW) | \
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002613 (1 << A3XX_INT_CP_T0_PACKET_IN_IB) | \
2614 (1 << A3XX_INT_CP_OPCODE_ERROR) | \
2615 (1 << A3XX_INT_CP_RESERVED_BIT_ERROR) | \
2616 (1 << A3XX_INT_CP_HW_FAULT) | \
2617 (1 << A3XX_INT_CP_IB1_INT) | \
2618 (1 << A3XX_INT_CP_IB2_INT) | \
2619 (1 << A3XX_INT_CP_RB_INT) | \
2620 (1 << A3XX_INT_CP_REG_PROTECT_FAULT) | \
2621 (1 << A3XX_INT_CP_AHB_ERROR_HALT) | \
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002622 (1 << A3XX_INT_UCHE_OOB_ACCESS))
2623
2624static struct {
2625 void (*func)(struct adreno_device *, int);
2626} a3xx_irq_funcs[] = {
2627 A3XX_IRQ_CALLBACK(NULL), /* 0 - RBBM_GPU_IDLE */
2628 A3XX_IRQ_CALLBACK(a3xx_err_callback), /* 1 - RBBM_AHB_ERROR */
2629 A3XX_IRQ_CALLBACK(a3xx_err_callback), /* 2 - RBBM_REG_TIMEOUT */
2630 A3XX_IRQ_CALLBACK(a3xx_err_callback), /* 3 - RBBM_ME_MS_TIMEOUT */
2631 A3XX_IRQ_CALLBACK(a3xx_err_callback), /* 4 - RBBM_PFP_MS_TIMEOUT */
2632 A3XX_IRQ_CALLBACK(a3xx_err_callback), /* 5 - RBBM_ATB_BUS_OVERFLOW */
2633 A3XX_IRQ_CALLBACK(a3xx_err_callback), /* 6 - RBBM_VFD_ERROR */
2634 A3XX_IRQ_CALLBACK(NULL), /* 7 - CP_SW */
2635 A3XX_IRQ_CALLBACK(a3xx_err_callback), /* 8 - CP_T0_PACKET_IN_IB */
2636 A3XX_IRQ_CALLBACK(a3xx_err_callback), /* 9 - CP_OPCODE_ERROR */
2637 A3XX_IRQ_CALLBACK(a3xx_err_callback), /* 10 - CP_RESERVED_BIT_ERROR */
2638 A3XX_IRQ_CALLBACK(a3xx_err_callback), /* 11 - CP_HW_FAULT */
2639 A3XX_IRQ_CALLBACK(NULL), /* 12 - CP_DMA */
2640 A3XX_IRQ_CALLBACK(a3xx_cp_callback), /* 13 - CP_IB2_INT */
2641 A3XX_IRQ_CALLBACK(a3xx_cp_callback), /* 14 - CP_IB1_INT */
2642 A3XX_IRQ_CALLBACK(a3xx_cp_callback), /* 15 - CP_RB_INT */
2643 A3XX_IRQ_CALLBACK(a3xx_err_callback), /* 16 - CP_REG_PROTECT_FAULT */
2644 A3XX_IRQ_CALLBACK(NULL), /* 17 - CP_RB_DONE_TS */
2645 A3XX_IRQ_CALLBACK(NULL), /* 18 - CP_VS_DONE_TS */
2646 A3XX_IRQ_CALLBACK(NULL), /* 19 - CP_PS_DONE_TS */
2647 A3XX_IRQ_CALLBACK(NULL), /* 20 - CP_CACHE_FLUSH_TS */
2648 A3XX_IRQ_CALLBACK(a3xx_err_callback), /* 21 - CP_AHB_ERROR_FAULT */
2649 A3XX_IRQ_CALLBACK(NULL), /* 22 - Unused */
2650 A3XX_IRQ_CALLBACK(NULL), /* 23 - Unused */
Jordan Crouseb6ebffe2012-02-04 10:23:53 -07002651 A3XX_IRQ_CALLBACK(NULL), /* 24 - MISC_HANG_DETECT */
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002652 A3XX_IRQ_CALLBACK(a3xx_err_callback), /* 25 - UCHE_OOB_ACCESS */
2653 /* 26 to 31 - Unused */
2654};
2655
2656static irqreturn_t a3xx_irq_handler(struct adreno_device *adreno_dev)
2657{
2658 struct kgsl_device *device = &adreno_dev->dev;
2659 irqreturn_t ret = IRQ_NONE;
2660 unsigned int status, tmp;
2661 int i;
2662
2663 adreno_regread(&adreno_dev->dev, A3XX_RBBM_INT_0_STATUS, &status);
2664
2665 for (tmp = status, i = 0; tmp && i < ARRAY_SIZE(a3xx_irq_funcs); i++) {
2666 if (tmp & 1) {
2667 if (a3xx_irq_funcs[i].func != NULL) {
2668 a3xx_irq_funcs[i].func(adreno_dev, i);
2669 ret = IRQ_HANDLED;
2670 } else {
2671 KGSL_DRV_CRIT(device,
2672 "Unhandled interrupt bit %x\n", i);
2673 }
2674 }
2675
2676 tmp >>= 1;
2677 }
2678
Carter Cooperb769c912012-04-13 08:16:35 -06002679 trace_kgsl_a3xx_irq_status(device, status);
2680
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002681 if (status)
2682 adreno_regwrite(&adreno_dev->dev, A3XX_RBBM_INT_CLEAR_CMD,
2683 status);
2684 return ret;
2685}
2686
2687static void a3xx_irq_control(struct adreno_device *adreno_dev, int state)
2688{
2689 struct kgsl_device *device = &adreno_dev->dev;
2690
Wei Zou08a7e572012-06-03 22:05:46 -07002691 if (state)
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002692 adreno_regwrite(device, A3XX_RBBM_INT_0_MASK, A3XX_INT_MASK);
Wei Zou08a7e572012-06-03 22:05:46 -07002693 else
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002694 adreno_regwrite(device, A3XX_RBBM_INT_0_MASK, 0);
2695}
2696
2697static unsigned int a3xx_busy_cycles(struct adreno_device *adreno_dev)
2698{
2699 struct kgsl_device *device = &adreno_dev->dev;
2700 unsigned int reg, val;
2701
2702 /* Freeze the counter */
2703 adreno_regread(device, A3XX_RBBM_RBBM_CTL, &reg);
2704 reg &= ~RBBM_RBBM_CTL_ENABLE_PWR_CTR1;
2705 adreno_regwrite(device, A3XX_RBBM_RBBM_CTL, reg);
2706
2707 /* Read the value */
2708 adreno_regread(device, A3XX_RBBM_PERFCTR_PWR_1_LO, &val);
2709
2710 /* Reset the counter */
2711 reg |= RBBM_RBBM_CTL_RESET_PWR_CTR1;
2712 adreno_regwrite(device, A3XX_RBBM_RBBM_CTL, reg);
2713
2714 /* Re-enable the counter */
2715 reg &= ~RBBM_RBBM_CTL_RESET_PWR_CTR1;
2716 reg |= RBBM_RBBM_CTL_ENABLE_PWR_CTR1;
2717 adreno_regwrite(device, A3XX_RBBM_RBBM_CTL, reg);
2718
2719 return val;
2720}
2721
Carter Cooper86a5af32012-08-15 16:14:38 -06002722struct a3xx_vbif_data {
2723 unsigned int reg;
2724 unsigned int val;
2725};
2726
2727/* VBIF registers start after 0x3000 so use 0x0 as end of list marker */
2728static struct a3xx_vbif_data a305_vbif[] = {
2729 /* Set up 16 deep read/write request queues */
2730 { A3XX_VBIF_IN_RD_LIM_CONF0, 0x10101010 },
2731 { A3XX_VBIF_IN_RD_LIM_CONF1, 0x10101010 },
2732 { A3XX_VBIF_OUT_RD_LIM_CONF0, 0x10101010 },
2733 { A3XX_VBIF_OUT_WR_LIM_CONF0, 0x10101010 },
2734 { A3XX_VBIF_DDR_OUT_MAX_BURST, 0x0000303 },
2735 { A3XX_VBIF_IN_WR_LIM_CONF0, 0x10101010 },
2736 { A3XX_VBIF_IN_WR_LIM_CONF1, 0x10101010 },
2737 /* Enable WR-REQ */
2738 { A3XX_VBIF_GATE_OFF_WRREQ_EN, 0x0000FF },
2739 /* Set up round robin arbitration between both AXI ports */
2740 { A3XX_VBIF_ARB_CTL, 0x00000030 },
2741 /* Set up AOOO */
2742 { A3XX_VBIF_OUT_AXI_AOOO_EN, 0x0000003C },
2743 { A3XX_VBIF_OUT_AXI_AOOO, 0x003C003C },
2744 {0, 0},
2745};
2746
2747static struct a3xx_vbif_data a320_vbif[] = {
2748 /* Set up 16 deep read/write request queues */
2749 { A3XX_VBIF_IN_RD_LIM_CONF0, 0x10101010 },
2750 { A3XX_VBIF_IN_RD_LIM_CONF1, 0x10101010 },
2751 { A3XX_VBIF_OUT_RD_LIM_CONF0, 0x10101010 },
2752 { A3XX_VBIF_OUT_WR_LIM_CONF0, 0x10101010 },
2753 { A3XX_VBIF_DDR_OUT_MAX_BURST, 0x0000303 },
2754 { A3XX_VBIF_IN_WR_LIM_CONF0, 0x10101010 },
2755 { A3XX_VBIF_IN_WR_LIM_CONF1, 0x10101010 },
2756 /* Enable WR-REQ */
2757 { A3XX_VBIF_GATE_OFF_WRREQ_EN, 0x0000FF },
2758 /* Set up round robin arbitration between both AXI ports */
2759 { A3XX_VBIF_ARB_CTL, 0x00000030 },
2760 /* Set up AOOO */
2761 { A3XX_VBIF_OUT_AXI_AOOO_EN, 0x0000003C },
2762 { A3XX_VBIF_OUT_AXI_AOOO, 0x003C003C },
2763 /* Enable 1K sort */
2764 { A3XX_VBIF_ABIT_SORT, 0x000000FF },
2765 { A3XX_VBIF_ABIT_SORT_CONF, 0x000000A4 },
2766 {0, 0},
2767};
2768
2769static struct a3xx_vbif_data a330_vbif[] = {
2770 /* Set up 16 deep read/write request queues */
2771 { A3XX_VBIF_IN_RD_LIM_CONF0, 0x18181818 },
Jordan Crouse9efae8f2012-11-08 13:52:48 -07002772 { A3XX_VBIF_IN_RD_LIM_CONF1, 0x00001818 },
2773 { A3XX_VBIF_OUT_RD_LIM_CONF0, 0x00001818 },
2774 { A3XX_VBIF_OUT_WR_LIM_CONF0, 0x00001818 },
Carter Cooper86a5af32012-08-15 16:14:38 -06002775 { A3XX_VBIF_DDR_OUT_MAX_BURST, 0x0000303 },
2776 { A3XX_VBIF_IN_WR_LIM_CONF0, 0x18181818 },
Jordan Crouse9efae8f2012-11-08 13:52:48 -07002777 { A3XX_VBIF_IN_WR_LIM_CONF1, 0x00001818 },
Carter Cooper86a5af32012-08-15 16:14:38 -06002778 /* Enable WR-REQ */
2779 { A3XX_VBIF_GATE_OFF_WRREQ_EN, 0x00003F },
2780 /* Set up round robin arbitration between both AXI ports */
2781 { A3XX_VBIF_ARB_CTL, 0x00000030 },
2782 /* Set up VBIF_ROUND_ROBIN_QOS_ARB */
2783 { A3XX_VBIF_ROUND_ROBIN_QOS_ARB, 0x0001 },
2784 /* Set up AOOO */
Jordan Crouse9efae8f2012-11-08 13:52:48 -07002785 { A3XX_VBIF_OUT_AXI_AOOO_EN, 0x0000003F },
2786 { A3XX_VBIF_OUT_AXI_AOOO, 0x003F003F },
Carter Cooper86a5af32012-08-15 16:14:38 -06002787 /* Enable 1K sort */
Jordan Crouse9efae8f2012-11-08 13:52:48 -07002788 { A3XX_VBIF_ABIT_SORT, 0x0001003F },
Carter Cooper86a5af32012-08-15 16:14:38 -06002789 { A3XX_VBIF_ABIT_SORT_CONF, 0x000000A4 },
2790 /* Disable VBIF clock gating. This is to enable AXI running
2791 * higher frequency than GPU.
2792 */
2793 { A3XX_VBIF_CLKON, 1 },
2794 {0, 0},
2795};
2796
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002797static void a3xx_start(struct adreno_device *adreno_dev)
2798{
2799 struct kgsl_device *device = &adreno_dev->dev;
Carter Cooper86a5af32012-08-15 16:14:38 -06002800 struct a3xx_vbif_data *vbif = NULL;
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002801
Carter Cooper86a5af32012-08-15 16:14:38 -06002802 if (adreno_is_a305(adreno_dev))
2803 vbif = a305_vbif;
2804 else if (adreno_is_a320(adreno_dev))
2805 vbif = a320_vbif;
2806 else if (adreno_is_a330(adreno_dev))
2807 vbif = a330_vbif;
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002808
Carter Cooper86a5af32012-08-15 16:14:38 -06002809 BUG_ON(vbif == NULL);
Jordan Crouse563cf0f2012-02-21 08:54:53 -07002810
Carter Cooper86a5af32012-08-15 16:14:38 -06002811 while (vbif->reg != 0) {
2812 adreno_regwrite(device, vbif->reg, vbif->val);
2813 vbif++;
liu zhongfd42e622012-05-01 19:18:30 -07002814 }
Jordan Crouse563cf0f2012-02-21 08:54:53 -07002815
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002816 /* Make all blocks contribute to the GPU BUSY perf counter */
2817 adreno_regwrite(device, A3XX_RBBM_GPU_BUSY_MASKED, 0xFFFFFFFF);
2818
Jordan Crousea1d43ff2012-04-09 09:37:50 -06002819 /* Tune the hystersis counters for SP and CP idle detection */
2820 adreno_regwrite(device, A3XX_RBBM_SP_HYST_CNT, 0x10);
2821 adreno_regwrite(device, A3XX_RBBM_WAIT_IDLE_CLOCKS_CTL, 0x10);
2822
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002823 /* Enable the RBBM error reporting bits. This lets us get
2824 useful information on failure */
2825
2826 adreno_regwrite(device, A3XX_RBBM_AHB_CTL0, 0x00000001);
2827
2828 /* Enable AHB error reporting */
Wei Zou8e6dfcc2012-03-16 14:53:39 -06002829 adreno_regwrite(device, A3XX_RBBM_AHB_CTL1, 0xA6FFFFFF);
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002830
2831 /* Turn on the power counters */
Tarun Karra4b6bd982012-04-23 17:55:36 -07002832 adreno_regwrite(device, A3XX_RBBM_RBBM_CTL, 0x00030000);
Jordan Crouseb6ebffe2012-02-04 10:23:53 -07002833
2834 /* Turn on hang detection - this spews a lot of useful information
2835 * into the RBBM registers on a hang */
2836
2837 adreno_regwrite(device, A3XX_RBBM_INTERFACE_HANG_INT_CTL,
2838 (1 << 16) | 0xFFF);
2839
Kevin Matlage17fbff72012-08-29 16:50:45 -06002840 /* Enable 64-byte cacheline size. HW Default is 32-byte (0x000000E0). */
2841 adreno_regwrite(device, A3XX_UCHE_CACHE_MODE_CONTROL_REG, 0x00000001);
2842
Rajeev Kulkarni7f177962012-06-22 12:09:44 -07002843 /* Enable Clock gating */
2844 adreno_regwrite(device, A3XX_RBBM_CLOCK_CTL,
2845 A3XX_RBBM_CLOCK_CTL_DEFAULT);
2846
liu zhong5af32d92012-08-29 14:36:36 -06002847 /* Set the OCMEM base address for A330 */
Jordan Crousec0978202012-08-29 14:35:51 -06002848 if (adreno_is_a330(adreno_dev)) {
liu zhong5af32d92012-08-29 14:36:36 -06002849 adreno_regwrite(device, A3XX_RB_GMEM_BASE_ADDR,
2850 (unsigned int)(adreno_dev->ocmem_base >> 14));
2851 }
Jordan Crouseb5c80482012-10-03 09:38:41 -06002852
2853 /* Turn on performance counters */
2854 adreno_regwrite(device, A3XX_RBBM_PERFCTR_CTL, 0x01);
2855
2856 /*
2857 * Set SP perfcounter 7 to count SP_FS_FULL_ALU_INSTRUCTIONS
2858 * we will use this to augment our hang detection
2859 */
2860
2861 adreno_regwrite(device, A3XX_SP_PERFCOUNTER7_SELECT,
2862 SP_FS_FULL_ALU_INSTRUCTIONS);
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002863}
2864
Jordan Crouse0c2761a2012-02-01 22:11:12 -07002865/* Defined in adreno_a3xx_snapshot.c */
2866void *a3xx_snapshot(struct adreno_device *adreno_dev, void *snapshot,
2867 int *remain, int hang);
2868
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002869struct adreno_gpudev adreno_a3xx_gpudev = {
2870 .reg_rbbm_status = A3XX_RBBM_STATUS,
2871 .reg_cp_pfp_ucode_addr = A3XX_CP_PFP_UCODE_ADDR,
2872 .reg_cp_pfp_ucode_data = A3XX_CP_PFP_UCODE_DATA,
2873
2874 .ctxt_create = a3xx_drawctxt_create,
2875 .ctxt_save = a3xx_drawctxt_save,
2876 .ctxt_restore = a3xx_drawctxt_restore,
Shubhraprakash Das4624b552012-06-01 14:08:03 -06002877 .ctxt_draw_workaround = NULL,
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002878 .rb_init = a3xx_rb_init,
2879 .irq_control = a3xx_irq_control,
2880 .irq_handler = a3xx_irq_handler,
2881 .busy_cycles = a3xx_busy_cycles,
2882 .start = a3xx_start,
Jordan Crouse0c2761a2012-02-01 22:11:12 -07002883 .snapshot = a3xx_snapshot,
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002884};