blob: 3d9ec6d234d740f4692288ec37afd75ec6a7cdfd [file] [log] [blame]
Tarun Karra6e750d72013-01-04 10:28:40 -08001/* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002 *
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
Tarun Karrad20d71a2013-01-25 15:38:57 -080073 * fault tolerance since reading the registers may cause the device to hang:
Carter Cooperf294e892012-11-26 10:45:53 -070074 */
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
Jordan Crouseef02fc02013-03-05 11:19:31 -07002579 /* Wake up everybody waiting for the interrupt */
Carter Cooperd7b1aba2012-06-05 11:59:23 -06002580 wake_up_interruptible_all(&device->wait_queue);
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002581
2582 /* Schedule work to free mem and issue ibs */
Carter Cooperd7b1aba2012-06-05 11:59:23 -06002583 queue_work(device->work_queue, &device->ts_expired_ws);
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002584
Carter Cooperd7b1aba2012-06-05 11:59:23 -06002585 atomic_notifier_call_chain(&device->ts_notifier_list,
2586 device->id, NULL);
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002587}
2588
2589#define A3XX_IRQ_CALLBACK(_c) { .func = _c }
2590
2591#define A3XX_INT_MASK \
2592 ((1 << A3XX_INT_RBBM_AHB_ERROR) | \
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002593 (1 << A3XX_INT_RBBM_ATB_BUS_OVERFLOW) | \
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002594 (1 << A3XX_INT_CP_T0_PACKET_IN_IB) | \
2595 (1 << A3XX_INT_CP_OPCODE_ERROR) | \
2596 (1 << A3XX_INT_CP_RESERVED_BIT_ERROR) | \
2597 (1 << A3XX_INT_CP_HW_FAULT) | \
2598 (1 << A3XX_INT_CP_IB1_INT) | \
2599 (1 << A3XX_INT_CP_IB2_INT) | \
2600 (1 << A3XX_INT_CP_RB_INT) | \
2601 (1 << A3XX_INT_CP_REG_PROTECT_FAULT) | \
2602 (1 << A3XX_INT_CP_AHB_ERROR_HALT) | \
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002603 (1 << A3XX_INT_UCHE_OOB_ACCESS))
2604
2605static struct {
2606 void (*func)(struct adreno_device *, int);
2607} a3xx_irq_funcs[] = {
2608 A3XX_IRQ_CALLBACK(NULL), /* 0 - RBBM_GPU_IDLE */
2609 A3XX_IRQ_CALLBACK(a3xx_err_callback), /* 1 - RBBM_AHB_ERROR */
2610 A3XX_IRQ_CALLBACK(a3xx_err_callback), /* 2 - RBBM_REG_TIMEOUT */
2611 A3XX_IRQ_CALLBACK(a3xx_err_callback), /* 3 - RBBM_ME_MS_TIMEOUT */
2612 A3XX_IRQ_CALLBACK(a3xx_err_callback), /* 4 - RBBM_PFP_MS_TIMEOUT */
2613 A3XX_IRQ_CALLBACK(a3xx_err_callback), /* 5 - RBBM_ATB_BUS_OVERFLOW */
2614 A3XX_IRQ_CALLBACK(a3xx_err_callback), /* 6 - RBBM_VFD_ERROR */
2615 A3XX_IRQ_CALLBACK(NULL), /* 7 - CP_SW */
2616 A3XX_IRQ_CALLBACK(a3xx_err_callback), /* 8 - CP_T0_PACKET_IN_IB */
2617 A3XX_IRQ_CALLBACK(a3xx_err_callback), /* 9 - CP_OPCODE_ERROR */
2618 A3XX_IRQ_CALLBACK(a3xx_err_callback), /* 10 - CP_RESERVED_BIT_ERROR */
2619 A3XX_IRQ_CALLBACK(a3xx_err_callback), /* 11 - CP_HW_FAULT */
2620 A3XX_IRQ_CALLBACK(NULL), /* 12 - CP_DMA */
2621 A3XX_IRQ_CALLBACK(a3xx_cp_callback), /* 13 - CP_IB2_INT */
2622 A3XX_IRQ_CALLBACK(a3xx_cp_callback), /* 14 - CP_IB1_INT */
2623 A3XX_IRQ_CALLBACK(a3xx_cp_callback), /* 15 - CP_RB_INT */
2624 A3XX_IRQ_CALLBACK(a3xx_err_callback), /* 16 - CP_REG_PROTECT_FAULT */
2625 A3XX_IRQ_CALLBACK(NULL), /* 17 - CP_RB_DONE_TS */
2626 A3XX_IRQ_CALLBACK(NULL), /* 18 - CP_VS_DONE_TS */
2627 A3XX_IRQ_CALLBACK(NULL), /* 19 - CP_PS_DONE_TS */
2628 A3XX_IRQ_CALLBACK(NULL), /* 20 - CP_CACHE_FLUSH_TS */
2629 A3XX_IRQ_CALLBACK(a3xx_err_callback), /* 21 - CP_AHB_ERROR_FAULT */
2630 A3XX_IRQ_CALLBACK(NULL), /* 22 - Unused */
2631 A3XX_IRQ_CALLBACK(NULL), /* 23 - Unused */
Jordan Crouseb6ebffe2012-02-04 10:23:53 -07002632 A3XX_IRQ_CALLBACK(NULL), /* 24 - MISC_HANG_DETECT */
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002633 A3XX_IRQ_CALLBACK(a3xx_err_callback), /* 25 - UCHE_OOB_ACCESS */
2634 /* 26 to 31 - Unused */
2635};
2636
2637static irqreturn_t a3xx_irq_handler(struct adreno_device *adreno_dev)
2638{
2639 struct kgsl_device *device = &adreno_dev->dev;
2640 irqreturn_t ret = IRQ_NONE;
2641 unsigned int status, tmp;
2642 int i;
2643
2644 adreno_regread(&adreno_dev->dev, A3XX_RBBM_INT_0_STATUS, &status);
2645
2646 for (tmp = status, i = 0; tmp && i < ARRAY_SIZE(a3xx_irq_funcs); i++) {
2647 if (tmp & 1) {
2648 if (a3xx_irq_funcs[i].func != NULL) {
2649 a3xx_irq_funcs[i].func(adreno_dev, i);
2650 ret = IRQ_HANDLED;
2651 } else {
2652 KGSL_DRV_CRIT(device,
2653 "Unhandled interrupt bit %x\n", i);
2654 }
2655 }
2656
2657 tmp >>= 1;
2658 }
2659
Carter Cooperb769c912012-04-13 08:16:35 -06002660 trace_kgsl_a3xx_irq_status(device, status);
2661
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002662 if (status)
2663 adreno_regwrite(&adreno_dev->dev, A3XX_RBBM_INT_CLEAR_CMD,
2664 status);
2665 return ret;
2666}
2667
2668static void a3xx_irq_control(struct adreno_device *adreno_dev, int state)
2669{
2670 struct kgsl_device *device = &adreno_dev->dev;
2671
Wei Zou08a7e572012-06-03 22:05:46 -07002672 if (state)
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002673 adreno_regwrite(device, A3XX_RBBM_INT_0_MASK, A3XX_INT_MASK);
Wei Zou08a7e572012-06-03 22:05:46 -07002674 else
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002675 adreno_regwrite(device, A3XX_RBBM_INT_0_MASK, 0);
2676}
2677
Jordan Crouseab601992013-03-05 11:18:20 -07002678static unsigned int a3xx_irq_pending(struct adreno_device *adreno_dev)
2679{
2680 unsigned int status;
2681
2682 adreno_regread(&adreno_dev->dev, A3XX_RBBM_INT_0_STATUS, &status);
2683
2684 return (status & A3XX_INT_MASK) ? 1 : 0;
2685}
2686
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002687static unsigned int a3xx_busy_cycles(struct adreno_device *adreno_dev)
2688{
2689 struct kgsl_device *device = &adreno_dev->dev;
2690 unsigned int reg, val;
2691
2692 /* Freeze the counter */
2693 adreno_regread(device, A3XX_RBBM_RBBM_CTL, &reg);
2694 reg &= ~RBBM_RBBM_CTL_ENABLE_PWR_CTR1;
2695 adreno_regwrite(device, A3XX_RBBM_RBBM_CTL, reg);
2696
2697 /* Read the value */
2698 adreno_regread(device, A3XX_RBBM_PERFCTR_PWR_1_LO, &val);
2699
2700 /* Reset the counter */
2701 reg |= RBBM_RBBM_CTL_RESET_PWR_CTR1;
2702 adreno_regwrite(device, A3XX_RBBM_RBBM_CTL, reg);
2703
2704 /* Re-enable the counter */
2705 reg &= ~RBBM_RBBM_CTL_RESET_PWR_CTR1;
2706 reg |= RBBM_RBBM_CTL_ENABLE_PWR_CTR1;
2707 adreno_regwrite(device, A3XX_RBBM_RBBM_CTL, reg);
2708
2709 return val;
2710}
2711
Carter Cooper86a5af32012-08-15 16:14:38 -06002712struct a3xx_vbif_data {
2713 unsigned int reg;
2714 unsigned int val;
2715};
2716
2717/* VBIF registers start after 0x3000 so use 0x0 as end of list marker */
2718static struct a3xx_vbif_data a305_vbif[] = {
2719 /* Set up 16 deep read/write request queues */
2720 { A3XX_VBIF_IN_RD_LIM_CONF0, 0x10101010 },
2721 { A3XX_VBIF_IN_RD_LIM_CONF1, 0x10101010 },
2722 { A3XX_VBIF_OUT_RD_LIM_CONF0, 0x10101010 },
2723 { A3XX_VBIF_OUT_WR_LIM_CONF0, 0x10101010 },
2724 { A3XX_VBIF_DDR_OUT_MAX_BURST, 0x0000303 },
2725 { A3XX_VBIF_IN_WR_LIM_CONF0, 0x10101010 },
2726 { A3XX_VBIF_IN_WR_LIM_CONF1, 0x10101010 },
2727 /* Enable WR-REQ */
2728 { A3XX_VBIF_GATE_OFF_WRREQ_EN, 0x0000FF },
2729 /* Set up round robin arbitration between both AXI ports */
2730 { A3XX_VBIF_ARB_CTL, 0x00000030 },
2731 /* Set up AOOO */
2732 { A3XX_VBIF_OUT_AXI_AOOO_EN, 0x0000003C },
2733 { A3XX_VBIF_OUT_AXI_AOOO, 0x003C003C },
2734 {0, 0},
2735};
2736
2737static struct a3xx_vbif_data a320_vbif[] = {
2738 /* Set up 16 deep read/write request queues */
2739 { A3XX_VBIF_IN_RD_LIM_CONF0, 0x10101010 },
2740 { A3XX_VBIF_IN_RD_LIM_CONF1, 0x10101010 },
2741 { A3XX_VBIF_OUT_RD_LIM_CONF0, 0x10101010 },
2742 { A3XX_VBIF_OUT_WR_LIM_CONF0, 0x10101010 },
2743 { A3XX_VBIF_DDR_OUT_MAX_BURST, 0x0000303 },
2744 { A3XX_VBIF_IN_WR_LIM_CONF0, 0x10101010 },
2745 { A3XX_VBIF_IN_WR_LIM_CONF1, 0x10101010 },
2746 /* Enable WR-REQ */
2747 { A3XX_VBIF_GATE_OFF_WRREQ_EN, 0x0000FF },
2748 /* Set up round robin arbitration between both AXI ports */
2749 { A3XX_VBIF_ARB_CTL, 0x00000030 },
2750 /* Set up AOOO */
2751 { A3XX_VBIF_OUT_AXI_AOOO_EN, 0x0000003C },
2752 { A3XX_VBIF_OUT_AXI_AOOO, 0x003C003C },
2753 /* Enable 1K sort */
2754 { A3XX_VBIF_ABIT_SORT, 0x000000FF },
2755 { A3XX_VBIF_ABIT_SORT_CONF, 0x000000A4 },
2756 {0, 0},
2757};
2758
2759static struct a3xx_vbif_data a330_vbif[] = {
2760 /* Set up 16 deep read/write request queues */
2761 { A3XX_VBIF_IN_RD_LIM_CONF0, 0x18181818 },
Jordan Crouse9efae8f2012-11-08 13:52:48 -07002762 { A3XX_VBIF_IN_RD_LIM_CONF1, 0x00001818 },
2763 { A3XX_VBIF_OUT_RD_LIM_CONF0, 0x00001818 },
2764 { A3XX_VBIF_OUT_WR_LIM_CONF0, 0x00001818 },
Carter Cooper86a5af32012-08-15 16:14:38 -06002765 { A3XX_VBIF_DDR_OUT_MAX_BURST, 0x0000303 },
2766 { A3XX_VBIF_IN_WR_LIM_CONF0, 0x18181818 },
Jordan Crouse9efae8f2012-11-08 13:52:48 -07002767 { A3XX_VBIF_IN_WR_LIM_CONF1, 0x00001818 },
Carter Cooper86a5af32012-08-15 16:14:38 -06002768 /* Enable WR-REQ */
2769 { A3XX_VBIF_GATE_OFF_WRREQ_EN, 0x00003F },
2770 /* Set up round robin arbitration between both AXI ports */
2771 { A3XX_VBIF_ARB_CTL, 0x00000030 },
2772 /* Set up VBIF_ROUND_ROBIN_QOS_ARB */
2773 { A3XX_VBIF_ROUND_ROBIN_QOS_ARB, 0x0001 },
2774 /* Set up AOOO */
Jordan Crouse9efae8f2012-11-08 13:52:48 -07002775 { A3XX_VBIF_OUT_AXI_AOOO_EN, 0x0000003F },
2776 { A3XX_VBIF_OUT_AXI_AOOO, 0x003F003F },
Carter Cooper86a5af32012-08-15 16:14:38 -06002777 /* Enable 1K sort */
Jordan Crouse9efae8f2012-11-08 13:52:48 -07002778 { A3XX_VBIF_ABIT_SORT, 0x0001003F },
Carter Cooper86a5af32012-08-15 16:14:38 -06002779 { A3XX_VBIF_ABIT_SORT_CONF, 0x000000A4 },
2780 /* Disable VBIF clock gating. This is to enable AXI running
2781 * higher frequency than GPU.
2782 */
2783 { A3XX_VBIF_CLKON, 1 },
2784 {0, 0},
2785};
2786
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002787static void a3xx_start(struct adreno_device *adreno_dev)
2788{
2789 struct kgsl_device *device = &adreno_dev->dev;
Carter Cooper86a5af32012-08-15 16:14:38 -06002790 struct a3xx_vbif_data *vbif = NULL;
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002791
Carter Cooper86a5af32012-08-15 16:14:38 -06002792 if (adreno_is_a305(adreno_dev))
2793 vbif = a305_vbif;
2794 else if (adreno_is_a320(adreno_dev))
2795 vbif = a320_vbif;
2796 else if (adreno_is_a330(adreno_dev))
2797 vbif = a330_vbif;
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002798
Carter Cooper86a5af32012-08-15 16:14:38 -06002799 BUG_ON(vbif == NULL);
Jordan Crouse563cf0f2012-02-21 08:54:53 -07002800
Carter Cooper86a5af32012-08-15 16:14:38 -06002801 while (vbif->reg != 0) {
2802 adreno_regwrite(device, vbif->reg, vbif->val);
2803 vbif++;
liu zhongfd42e622012-05-01 19:18:30 -07002804 }
Jordan Crouse563cf0f2012-02-21 08:54:53 -07002805
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002806 /* Make all blocks contribute to the GPU BUSY perf counter */
2807 adreno_regwrite(device, A3XX_RBBM_GPU_BUSY_MASKED, 0xFFFFFFFF);
2808
Jordan Crousea1d43ff2012-04-09 09:37:50 -06002809 /* Tune the hystersis counters for SP and CP idle detection */
2810 adreno_regwrite(device, A3XX_RBBM_SP_HYST_CNT, 0x10);
2811 adreno_regwrite(device, A3XX_RBBM_WAIT_IDLE_CLOCKS_CTL, 0x10);
2812
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002813 /* Enable the RBBM error reporting bits. This lets us get
2814 useful information on failure */
2815
2816 adreno_regwrite(device, A3XX_RBBM_AHB_CTL0, 0x00000001);
2817
2818 /* Enable AHB error reporting */
Wei Zou8e6dfcc2012-03-16 14:53:39 -06002819 adreno_regwrite(device, A3XX_RBBM_AHB_CTL1, 0xA6FFFFFF);
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002820
2821 /* Turn on the power counters */
Tarun Karra4b6bd982012-04-23 17:55:36 -07002822 adreno_regwrite(device, A3XX_RBBM_RBBM_CTL, 0x00030000);
Jordan Crouseb6ebffe2012-02-04 10:23:53 -07002823
2824 /* Turn on hang detection - this spews a lot of useful information
2825 * into the RBBM registers on a hang */
2826
2827 adreno_regwrite(device, A3XX_RBBM_INTERFACE_HANG_INT_CTL,
2828 (1 << 16) | 0xFFF);
2829
Kevin Matlage17fbff72012-08-29 16:50:45 -06002830 /* Enable 64-byte cacheline size. HW Default is 32-byte (0x000000E0). */
2831 adreno_regwrite(device, A3XX_UCHE_CACHE_MODE_CONTROL_REG, 0x00000001);
2832
Rajeev Kulkarni7f177962012-06-22 12:09:44 -07002833 /* Enable Clock gating */
2834 adreno_regwrite(device, A3XX_RBBM_CLOCK_CTL,
2835 A3XX_RBBM_CLOCK_CTL_DEFAULT);
2836
liu zhong5af32d92012-08-29 14:36:36 -06002837 /* Set the OCMEM base address for A330 */
Jordan Crousec0978202012-08-29 14:35:51 -06002838 if (adreno_is_a330(adreno_dev)) {
liu zhong5af32d92012-08-29 14:36:36 -06002839 adreno_regwrite(device, A3XX_RB_GMEM_BASE_ADDR,
2840 (unsigned int)(adreno_dev->ocmem_base >> 14));
2841 }
Jordan Crouseb5c80482012-10-03 09:38:41 -06002842
2843 /* Turn on performance counters */
2844 adreno_regwrite(device, A3XX_RBBM_PERFCTR_CTL, 0x01);
2845
2846 /*
Tarun Karra6e750d72013-01-04 10:28:40 -08002847 * Set SP perfcounter 5 to count SP_ALU_ACTIVE_CYCLES, it includes
2848 * all ALU instruction execution regardless precision or shader ID.
2849 * Set SP perfcounter 6 to count SP0_ICL1_MISSES, It counts
2850 * USP L1 instruction miss request.
2851 * Set SP perfcounter 7 to count SP_FS_FULL_ALU_INSTRUCTIONS, it
2852 * counts USP flow control instruction execution.
Jordan Crouseb5c80482012-10-03 09:38:41 -06002853 * we will use this to augment our hang detection
2854 */
Tarun Karra6e750d72013-01-04 10:28:40 -08002855 if (adreno_dev->fast_hang_detect) {
2856 adreno_regwrite(device, A3XX_SP_PERFCOUNTER5_SELECT,
2857 SP_ALU_ACTIVE_CYCLES);
2858 adreno_regwrite(device, A3XX_SP_PERFCOUNTER6_SELECT,
2859 SP0_ICL1_MISSES);
2860 adreno_regwrite(device, A3XX_SP_PERFCOUNTER7_SELECT,
2861 SP_FS_CFLOW_INSTRUCTIONS);
2862 }
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,
Jordan Crouseab601992013-03-05 11:18:20 -07002881 .irq_pending = a3xx_irq_pending,
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002882 .busy_cycles = a3xx_busy_cycles,
2883 .start = a3xx_start,
Jordan Crouse0c2761a2012-02-01 22:11:12 -07002884 .snapshot = a3xx_snapshot,
Jordan Crouseb4d31bd2012-02-01 22:11:12 -07002885};