blob: 86cffb00dba89fc5db52a15e34a5f2e3584225cd [file] [log] [blame]
Jordan Crouse156cfbc2012-01-24 09:32:04 -07001/* Copyright (c) 2012, Code Aurora Forum. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
13#include "kgsl.h"
14#include "kgsl_sharedmem.h"
15#include "kgsl_snapshot.h"
16
17#include "adreno.h"
18#include "adreno_pm4types.h"
19#include "a2xx_reg.h"
Jordan Crousee0879b12012-03-16 14:53:43 -060020#include "a3xx_reg.h"
Jordan Crouse156cfbc2012-01-24 09:32:04 -070021
22/* Number of dwords of ringbuffer history to record */
23#define NUM_DWORDS_OF_RINGBUFFER_HISTORY 100
24
25/* Maintain a list of the objects we see during parsing */
26
27#define SNAPSHOT_OBJ_BUFSIZE 64
28
29#define SNAPSHOT_OBJ_TYPE_IB 0
30
Jordan Crouse9610b6b2012-03-16 14:53:42 -060031/* Keep track of how many bytes are frozen after a snapshot and tell the user */
32static int snapshot_frozen_objsize;
33
Jordan Crouse156cfbc2012-01-24 09:32:04 -070034static struct kgsl_snapshot_obj {
35 int type;
36 uint32_t gpuaddr;
37 uint32_t ptbase;
38 void *ptr;
39 int dwords;
40} objbuf[SNAPSHOT_OBJ_BUFSIZE];
41
42/* Pointer to the next open entry in the object list */
43static int objbufptr;
44
45/* Push a new buffer object onto the list */
46static void push_object(struct kgsl_device *device, int type, uint32_t ptbase,
47 uint32_t gpuaddr, int dwords)
48{
49 int index;
50 void *ptr;
51
Jordan Crousee9e91bf2012-02-21 09:48:36 -070052 /*
53 * Sometimes IBs can be reused in the same dump. Because we parse from
54 * oldest to newest, if we come across an IB that has already been used,
55 * assume that it has been reused and update the list with the newest
56 * size.
57 */
58
Jordan Crouse156cfbc2012-01-24 09:32:04 -070059 for (index = 0; index < objbufptr; index++) {
60 if (objbuf[index].gpuaddr == gpuaddr &&
Jordan Crousee9e91bf2012-02-21 09:48:36 -070061 objbuf[index].ptbase == ptbase) {
62 objbuf[index].dwords = dwords;
63 return;
64 }
Jordan Crouse156cfbc2012-01-24 09:32:04 -070065 }
66
67 if (objbufptr == SNAPSHOT_OBJ_BUFSIZE) {
68 KGSL_DRV_ERR(device, "snapshot: too many snapshot objects\n");
69 return;
70 }
71
72 /*
73 * adreno_convertaddr verifies that the IB size is valid - at least in
74 * the context of it being smaller then the allocated memory space
75 */
76 ptr = adreno_convertaddr(device, ptbase, gpuaddr, dwords << 2);
77
78 if (ptr == NULL) {
79 KGSL_DRV_ERR(device,
80 "snapshot: Can't find GPU address for %x\n", gpuaddr);
81 return;
82 }
83
84 /* Put it on the list of things to parse */
85 objbuf[objbufptr].type = type;
86 objbuf[objbufptr].gpuaddr = gpuaddr;
87 objbuf[objbufptr].ptbase = ptbase;
88 objbuf[objbufptr].dwords = dwords;
89 objbuf[objbufptr++].ptr = ptr;
90}
91
Jordan Crousee9e91bf2012-02-21 09:48:36 -070092/*
93 * Return a 1 if the specified object is already on the list of buffers
94 * to be dumped
95 */
96
97static int find_object(int type, unsigned int gpuaddr, unsigned int ptbase)
98{
99 int index;
100
101 for (index = 0; index < objbufptr; index++) {
102 if (objbuf[index].gpuaddr == gpuaddr &&
103 objbuf[index].ptbase == ptbase &&
104 objbuf[index].type == type)
105 return 1;
106 }
107
108 return 0;
109}
110
Jordan Crousee0879b12012-03-16 14:53:43 -0600111/*
112 * This structure keeps track of type0 writes to VSC_PIPE_DATA_ADDRESS_x and
113 * VSC_PIPE_DATA_LENGTH_x. When a draw initator is called these registers
114 * point to buffers that we need to freeze for a snapshot
115 */
116
117static struct {
118 unsigned int base;
119 unsigned int size;
120} vsc_pipe[8];
121
122/*
123 * This is the cached value of type0 writes to the VSC_SIZE_ADDRESS which
124 * contains the buffer address of the visiblity stream size buffer during a
125 * binning pass
126 */
127
128static unsigned int vsc_size_address;
129
130/*
131 * This struct keeps track of type0 writes to VFD_FETCH_INSTR_0_X and
132 * VFD_FETCH_INSTR_1_X registers. When a draw initator is called the addresses
133 * and sizes in these registers point to VBOs that we need to freeze for a
134 * snapshot
135 */
136
137static struct {
138 unsigned int base;
139 unsigned int stride;
140} vbo[16];
141
142/*
143 * This is the cached value of type0 writes to VFD_INDEX_MAX. This will be used
144 * to calculate the size of the VBOs when the draw initator is called
145 */
146
147static unsigned int vfd_index_max;
148
149/*
150 * This is the cached value of type0 writes to VFD_CONTROL_0 which tells us how
151 * many VBOs are active when the draw initator is called
152 */
153
154static unsigned int vfd_control_0;
155
156/*
157 * Cached value of type0 writes to SP_VS_PVT_MEM_ADDR and SP_FS_PVT_MEM_ADDR.
158 * This is a buffer that contains private stack information for the shader
159 */
160
161static unsigned int sp_vs_pvt_mem_addr;
162static unsigned int sp_fs_pvt_mem_addr;
163
Jordan Crouse361cc3d2012-06-20 08:22:14 -0600164/*
165 * Each load state block has two possible types. Each type has a different
166 * number of dwords per unit. Use this handy lookup table to make sure
167 * we dump the right amount of data from the indirect buffer
168 */
169
170static int load_state_unit_sizes[7][2] = {
171 { 2, 4 },
172 { 0, 1 },
173 { 2, 4 },
174 { 0, 1 },
175 { 8, 2 },
176 { 8, 2 },
177 { 8, 2 },
178};
179
Jordan Crouseea2c6382012-03-16 14:53:42 -0600180static void ib_parse_load_state(struct kgsl_device *device, unsigned int *pkt,
181 unsigned int ptbase)
182{
183 unsigned int block, source, type;
184
185 /*
186 * The object here is to find indirect shaders i.e - shaders loaded from
187 * GPU memory instead of directly in the command. These should be added
188 * to the list of memory objects to dump. So look at the load state
Jordan Crouse361cc3d2012-06-20 08:22:14 -0600189 * if the block is indirect (source = 4). If so then add the memory
190 * address to the list. The size of the object differs depending on the
191 * type per the load_state_unit_sizes array above.
Jordan Crouseea2c6382012-03-16 14:53:42 -0600192 */
193
194 if (type3_pkt_size(pkt[0]) < 2)
195 return;
196
197 /*
198 * pkt[1] 18:16 - source
199 * pkt[1] 21:19 - state block
200 * pkt[1] 31:22 - size in units
201 * pkt[2] 0:1 - type
202 * pkt[2] 31:2 - GPU memory address
203 */
204
205 block = (pkt[1] >> 19) & 0x07;
206 source = (pkt[1] >> 16) & 0x07;
207 type = pkt[2] & 0x03;
208
Jordan Crouse361cc3d2012-06-20 08:22:14 -0600209 if (source == 4) {
210 int unitsize, ret;
211
212 if (type == 0)
213 unitsize = load_state_unit_sizes[block][0];
214 else
215 unitsize = load_state_unit_sizes[block][1];
Jordan Crouseea2c6382012-03-16 14:53:42 -0600216
217 /* Freeze the GPU buffer containing the shader */
218
219 ret = kgsl_snapshot_get_object(device, ptbase,
220 pkt[2] & 0xFFFFFFFC,
221 (((pkt[1] >> 22) & 0x03FF) * unitsize) << 2,
222 SNAPSHOT_GPU_OBJECT_SHADER);
223 snapshot_frozen_objsize += ret;
224 }
225}
226
227/*
Jordan Crousee0879b12012-03-16 14:53:43 -0600228 * This opcode sets the base addresses for the visibilty stream buffer and the
229 * visiblity stream size buffer.
230 */
231
232static void ib_parse_set_bin_data(struct kgsl_device *device, unsigned int *pkt,
233 unsigned int ptbase)
234{
235 int ret;
236
237 if (type3_pkt_size(pkt[0]) < 2)
238 return;
239
240 /* Visiblity stream buffer */
241 ret = kgsl_snapshot_get_object(device, ptbase, pkt[1], 0,
242 SNAPSHOT_GPU_OBJECT_GENERIC);
243 snapshot_frozen_objsize += ret;
244
245 /* visiblity stream size buffer (fixed size 8 dwords) */
246 ret = kgsl_snapshot_get_object(device, ptbase, pkt[2], 32,
247 SNAPSHOT_GPU_OBJECT_GENERIC);
248 snapshot_frozen_objsize += ret;
249}
250
251/*
252 * This opcode writes to GPU memory - if the buffer is written to, there is a
253 * good chance that it would be valuable to capture in the snapshot, so mark all
254 * buffers that are written to as frozen
255 */
256
257static void ib_parse_mem_write(struct kgsl_device *device, unsigned int *pkt,
258 unsigned int ptbase)
259{
260 int ret;
261
262 if (type3_pkt_size(pkt[0]) < 1)
263 return;
264
265 /*
266 * The address is where the data in the rest of this packet is written
267 * to, but since that might be an offset into the larger buffer we need
268 * to get the whole thing. Pass a size of 0 kgsl_snapshot_get_object to
269 * capture the entire buffer.
270 */
271
272 ret = kgsl_snapshot_get_object(device, ptbase, pkt[1] & 0xFFFFFFFC, 0,
273 SNAPSHOT_GPU_OBJECT_GENERIC);
274
275 snapshot_frozen_objsize += ret;
276}
277
278/*
279 * The DRAW_INDX opcode sends a draw initator which starts a draw operation in
280 * the GPU, so this is the point where all the registers and buffers become
281 * "valid". The DRAW_INDX may also have an index buffer pointer that should be
282 * frozen with the others
283 */
284
285static void ib_parse_draw_indx(struct kgsl_device *device, unsigned int *pkt,
286 unsigned int ptbase)
287{
288 int ret, i;
289
290 if (type3_pkt_size(pkt[0]) < 3)
291 return;
292
293 /* DRAW_IDX may have a index buffer pointer */
294
295 if (type3_pkt_size(pkt[0]) > 3) {
296 ret = kgsl_snapshot_get_object(device, ptbase, pkt[4], pkt[5],
297 SNAPSHOT_GPU_OBJECT_GENERIC);
298 snapshot_frozen_objsize += ret;
299 }
300
301 /*
302 * All of the type0 writes are valid at a draw initiator, so freeze
303 * the various buffers that we are tracking
304 */
305
306 /* First up the visiblity stream buffer */
307
308 for (i = 0; i < ARRAY_SIZE(vsc_pipe); i++) {
309 if (vsc_pipe[i].base != 0 && vsc_pipe[i].size != 0) {
310 ret = kgsl_snapshot_get_object(device, ptbase,
311 vsc_pipe[i].base, vsc_pipe[i].size,
312 SNAPSHOT_GPU_OBJECT_GENERIC);
313 snapshot_frozen_objsize += ret;
314 }
315 }
316
317 /* Next the visibility stream size buffer */
318
319 if (vsc_size_address) {
320 ret = kgsl_snapshot_get_object(device, ptbase,
321 vsc_size_address, 32,
322 SNAPSHOT_GPU_OBJECT_GENERIC);
323 snapshot_frozen_objsize += ret;
324 }
325
326 /* Next private shader buffer memory */
327 if (sp_vs_pvt_mem_addr) {
328 ret = kgsl_snapshot_get_object(device, ptbase,
329 sp_vs_pvt_mem_addr, 8192,
330 SNAPSHOT_GPU_OBJECT_GENERIC);
331
332 snapshot_frozen_objsize += ret;
333 }
334
335 if (sp_fs_pvt_mem_addr) {
336 ret = kgsl_snapshot_get_object(device, ptbase,
337 sp_fs_pvt_mem_addr, 8192,
338 SNAPSHOT_GPU_OBJECT_GENERIC);
339 snapshot_frozen_objsize += ret;
340 }
341
342 /* Finally: VBOs */
343
344 /* The number of active VBOs is stored in VFD_CONTROL_O[31:27] */
345 for (i = 0; i < (vfd_control_0) >> 27; i++) {
346 int size;
347
348 /*
349 * The size of the VBO is the stride stored in
350 * VFD_FETCH_INSTR_0_X.BUFSTRIDE * VFD_INDEX_MAX. The base
351 * is stored in VFD_FETCH_INSTR_1_X
352 */
353
354 if (vbo[i].base != 0) {
355 size = vbo[i].stride * vfd_index_max;
356
357 ret = kgsl_snapshot_get_object(device, ptbase,
358 vbo[i].base,
359 0, SNAPSHOT_GPU_OBJECT_GENERIC);
360 snapshot_frozen_objsize += ret;
361 }
362 }
363}
364
365/*
Jordan Crouseea2c6382012-03-16 14:53:42 -0600366 * Parse all the type3 opcode packets that may contain important information,
Jordan Crousee0879b12012-03-16 14:53:43 -0600367 * such as additional GPU buffers to grab or a draw initator
Jordan Crouseea2c6382012-03-16 14:53:42 -0600368 */
369
370static void ib_parse_type3(struct kgsl_device *device, unsigned int *ptr,
371 unsigned int ptbase)
372{
373 switch (cp_type3_opcode(*ptr)) {
374 case CP_LOAD_STATE:
375 ib_parse_load_state(device, ptr, ptbase);
376 break;
Jordan Crousee0879b12012-03-16 14:53:43 -0600377 case CP_SET_BIN_DATA:
378 ib_parse_set_bin_data(device, ptr, ptbase);
379 break;
380 case CP_MEM_WRITE:
381 ib_parse_mem_write(device, ptr, ptbase);
382 break;
383 case CP_DRAW_INDX:
384 ib_parse_draw_indx(device, ptr, ptbase);
385 break;
386 }
387}
388
389/*
390 * Parse type0 packets found in the stream. Some of the registers that are
391 * written are clues for GPU buffers that we need to freeze. Register writes
392 * are considred valid when a draw initator is called, so just cache the values
393 * here and freeze them when a CP_DRAW_INDX is seen. This protects against
394 * needlessly caching buffers that won't be used during a draw call
395 */
396
397static void ib_parse_type0(struct kgsl_device *device, unsigned int *ptr,
398 unsigned int ptbase)
399{
400 int size = type0_pkt_size(*ptr);
401 int offset = type0_pkt_offset(*ptr);
402 int i;
403
Jordan Crouse7f24c712012-04-05 16:55:55 -0600404 for (i = 0; i < size; i++, offset++) {
Jordan Crousee0879b12012-03-16 14:53:43 -0600405
406 /* Visiblity stream buffer */
407
408 if (offset >= A3XX_VSC_PIPE_DATA_ADDRESS_0 &&
409 offset <= A3XX_VSC_PIPE_DATA_LENGTH_7) {
410 int index = offset - A3XX_VSC_PIPE_DATA_ADDRESS_0;
411
412 /* Each bank of address and length registers are
413 * interleaved with an empty register:
414 *
415 * address 0
416 * length 0
417 * empty
418 * address 1
419 * length 1
420 * empty
421 * ...
422 */
423
Jordan Crouse7f24c712012-04-05 16:55:55 -0600424 if ((index % 3) == 0)
Jordan Crousee0879b12012-03-16 14:53:43 -0600425 vsc_pipe[index / 3].base = ptr[i + 1];
Jordan Crouse7f24c712012-04-05 16:55:55 -0600426 else if ((index % 3) == 1)
Jordan Crousee0879b12012-03-16 14:53:43 -0600427 vsc_pipe[index / 3].size = ptr[i + 1];
428 } else if ((offset >= A3XX_VFD_FETCH_INSTR_0_0) &&
429 (offset <= A3XX_VFD_FETCH_INSTR_1_F)) {
430 int index = offset - A3XX_VFD_FETCH_INSTR_0_0;
431
432 /*
433 * FETCH_INSTR_0_X and FETCH_INSTR_1_X banks are
434 * interleaved as above but without the empty register
435 * in between
436 */
437
Jordan Crouse7f24c712012-04-05 16:55:55 -0600438 if ((index % 2) == 0)
Jordan Crousee0879b12012-03-16 14:53:43 -0600439 vbo[index >> 1].stride =
440 (ptr[i + 1] >> 7) & 0x1FF;
441 else
442 vbo[index >> 1].base = ptr[i + 1];
443 } else {
444 /*
445 * Cache various support registers for calculating
446 * buffer sizes
447 */
448
449 switch (offset) {
450 case A3XX_VFD_CONTROL_0:
451 vfd_control_0 = ptr[i + 1];
452 break;
453 case A3XX_VFD_INDEX_MAX:
454 vfd_index_max = ptr[i + 1];
455 break;
456 case A3XX_VSC_SIZE_ADDRESS:
457 vsc_size_address = ptr[i + 1];
458 break;
459 case A3XX_SP_VS_PVT_MEM_ADDR_REG:
460 sp_vs_pvt_mem_addr = ptr[i + 1];
461 break;
462 case A3XX_SP_FS_PVT_MEM_ADDR_REG:
463 sp_fs_pvt_mem_addr = ptr[i + 1];
464 break;
465 }
466 }
Jordan Crouseea2c6382012-03-16 14:53:42 -0600467 }
468}
469
Jordan Crousef99f5a662012-03-16 14:53:43 -0600470/* Add an IB as a GPU object, but first, parse it to find more goodies within */
471
472static void ib_add_gpu_object(struct kgsl_device *device, unsigned int ptbase,
473 unsigned int gpuaddr, unsigned int dwords)
474{
Jordan Crouse17d6d8b2012-04-18 09:31:09 -0600475 int i, ret, rem = dwords;
Jordan Crousef99f5a662012-03-16 14:53:43 -0600476 unsigned int *src = (unsigned int *) adreno_convertaddr(device, ptbase,
477 gpuaddr, dwords << 2);
478
479 if (src == NULL)
480 return;
481
Jordan Crouse17d6d8b2012-04-18 09:31:09 -0600482 for (i = 0; rem != 0; rem--, i++) {
483 int pktsize;
484
485 if (!pkt_is_type0(src[i]) && !pkt_is_type3(src[i]))
486 continue;
487
488 pktsize = type3_pkt_size(src[i]);
489
490 if ((pktsize + 1) > rem)
491 break;
Jordan Crousee0879b12012-03-16 14:53:43 -0600492
Jordan Crousef99f5a662012-03-16 14:53:43 -0600493 if (pkt_is_type3(src[i])) {
Jordan Crousef99f5a662012-03-16 14:53:43 -0600494 if (adreno_cmd_is_ib(src[i]))
495 ib_add_gpu_object(device, ptbase,
496 src[i + 1], src[i + 2]);
497 else
498 ib_parse_type3(device, &src[i], ptbase);
Jordan Crousee0879b12012-03-16 14:53:43 -0600499 } else if (pkt_is_type0(src[i])) {
500 ib_parse_type0(device, &src[i], ptbase);
Jordan Crousef99f5a662012-03-16 14:53:43 -0600501 }
Jordan Crousee0879b12012-03-16 14:53:43 -0600502
Jordan Crouse17d6d8b2012-04-18 09:31:09 -0600503 i += pktsize;
504 rem -= pktsize;
Jordan Crousef99f5a662012-03-16 14:53:43 -0600505 }
506
507 ret = kgsl_snapshot_get_object(device, ptbase, gpuaddr, dwords << 2,
508 SNAPSHOT_GPU_OBJECT_IB);
509
510 snapshot_frozen_objsize += ret;
511}
512
Jordan Crouse156cfbc2012-01-24 09:32:04 -0700513/* Snapshot the istore memory */
514static int snapshot_istore(struct kgsl_device *device, void *snapshot,
515 int remain, void *priv)
516{
517 struct kgsl_snapshot_istore *header = snapshot;
518 unsigned int *data = snapshot + sizeof(*header);
519 struct adreno_device *adreno_dev = ADRENO_DEVICE(device);
520 int count, i;
521
Jordan Crousec6b3a992012-02-04 10:23:51 -0700522 count = adreno_dev->istore_size * adreno_dev->instruction_size;
Jordan Crouse156cfbc2012-01-24 09:32:04 -0700523
524 if (remain < (count * 4) + sizeof(*header)) {
525 KGSL_DRV_ERR(device,
526 "snapshot: Not enough memory for the istore section");
527 return 0;
528 }
529
530 header->count = adreno_dev->istore_size;
531
532 for (i = 0; i < count; i++)
533 kgsl_regread(device, ADRENO_ISTORE_START + i, &data[i]);
534
535 return (count * 4) + sizeof(*header);
536}
537
538/* Snapshot the ringbuffer memory */
539static int snapshot_rb(struct kgsl_device *device, void *snapshot,
540 int remain, void *priv)
541{
542 struct kgsl_snapshot_rb *header = snapshot;
543 unsigned int *data = snapshot + sizeof(*header);
544 struct adreno_device *adreno_dev = ADRENO_DEVICE(device);
545 struct adreno_ringbuffer *rb = &adreno_dev->ringbuffer;
Jordan Crousee6b77622012-04-05 16:55:54 -0600546 unsigned int ptbase, rptr, *rbptr, ibbase;
547 int index, size, i;
Jordan Crousee9e91bf2012-02-21 09:48:36 -0700548 int parse_ibs = 0, ib_parse_start;
Jordan Crousee6b77622012-04-05 16:55:54 -0600549 int skip_pktsize = 1;
Jordan Crouse156cfbc2012-01-24 09:32:04 -0700550
551 /* Get the physical address of the MMU pagetable */
Shubhraprakash Das79447952012-04-26 18:12:23 -0600552 ptbase = kgsl_mmu_get_current_ptbase(&device->mmu);
Jordan Crouse156cfbc2012-01-24 09:32:04 -0700553
554 /* Get the current read pointers for the RB */
555 kgsl_regread(device, REG_CP_RB_RPTR, &rptr);
556
Jordan Crousee6b77622012-04-05 16:55:54 -0600557 /* Address of the last processed IB */
Jordan Crousef99f5a662012-03-16 14:53:43 -0600558 kgsl_regread(device, REG_CP_IB1_BASE, &ibbase);
559
Jordan Crouse156cfbc2012-01-24 09:32:04 -0700560 /*
Jordan Crousee6b77622012-04-05 16:55:54 -0600561 * Figure out the window of ringbuffer data to dump. First we need to
562 * find where the last processed IB ws submitted
Jordan Crouse156cfbc2012-01-24 09:32:04 -0700563 */
564
Jordan Crousee6b77622012-04-05 16:55:54 -0600565 index = rptr;
566 rbptr = rb->buffer_desc.hostptr;
Jordan Crouse156cfbc2012-01-24 09:32:04 -0700567
Jordan Crousee6b77622012-04-05 16:55:54 -0600568 while (index != rb->wptr) {
569 index--;
Jordan Crouse156cfbc2012-01-24 09:32:04 -0700570
Jordan Crousee6b77622012-04-05 16:55:54 -0600571 if (index < 0) {
572 index = rb->sizedwords - 3;
Jordan Crouse156cfbc2012-01-24 09:32:04 -0700573
Jordan Crousee6b77622012-04-05 16:55:54 -0600574 /* We wrapped without finding what we wanted */
575 if (index < rb->wptr) {
576 index = rb->wptr;
577 break;
578 }
579 }
580
581 if (adreno_cmd_is_ib(rbptr[index]) &&
582 rbptr[index + 1] == ibbase)
583 break;
584 }
585
586 /*
587 * index points at the last submitted IB. We can only trust that the
588 * memory between the context switch and the hanging IB is valid, so
589 * the next step is to find the context switch before the submission
590 */
591
592 while (index != rb->wptr) {
593 index--;
594
Jordan Crouse17d6d8b2012-04-18 09:31:09 -0600595 if (index < 0) {
Jordan Crousee6b77622012-04-05 16:55:54 -0600596 index = rb->sizedwords - 2;
597
598 /*
599 * Wrapped without finding the context switch. This is
600 * harmless - we should still have enough data to dump a
601 * valid state
602 */
603
604 if (index < rb->wptr) {
605 index = rb->wptr;
606 break;
607 }
608 }
609
610 /* Break if the current packet is a context switch identifier */
Jordan Crouse17d6d8b2012-04-18 09:31:09 -0600611 if ((rbptr[index] == cp_nop_packet(1)) &&
612 (rbptr[index + 1] == KGSL_CONTEXT_TO_MEM_IDENTIFIER))
Jordan Crousee6b77622012-04-05 16:55:54 -0600613 break;
614 }
615
616 /*
617 * Index represents the start of the window of interest. We will try
618 * to dump all buffers between here and the rptr
619 */
620
621 ib_parse_start = index;
622
623 /*
624 * Dump the entire ringbuffer - the parser can choose how much of it to
625 * process
626 */
627
628 size = (rb->sizedwords << 2);
Jordan Crouse156cfbc2012-01-24 09:32:04 -0700629
630 if (remain < size + sizeof(*header)) {
631 KGSL_DRV_ERR(device,
632 "snapshot: Not enough memory for the rb section");
633 return 0;
634 }
635
636 /* Write the sub-header for the section */
Jordan Crousee6b77622012-04-05 16:55:54 -0600637 header->start = rb->wptr;
638 header->end = rb->wptr;
Jordan Crouse156cfbc2012-01-24 09:32:04 -0700639 header->wptr = rb->wptr;
640 header->rbsize = rb->sizedwords;
Jordan Crousee6b77622012-04-05 16:55:54 -0600641 header->count = rb->sizedwords;
Jordan Crousee9e91bf2012-02-21 09:48:36 -0700642
Jordan Crouse156cfbc2012-01-24 09:32:04 -0700643 /*
644 * Loop through the RB, copying the data and looking for indirect
645 * buffers and MMU pagetable changes
646 */
647
Jordan Crousee6b77622012-04-05 16:55:54 -0600648 index = rb->wptr;
649 for (i = 0; i < rb->sizedwords; i++) {
Jordan Crouse156cfbc2012-01-24 09:32:04 -0700650 *data = rbptr[index];
651
Jordan Crousee6b77622012-04-05 16:55:54 -0600652 /*
653 * Sometimes the rptr is located in the middle of a packet.
654 * try to adust for that by modifying the rptr to match a
655 * packet boundary. Unfortunately for us, it is hard to tell
656 * which dwords are legitimate type0 header and which are just
657 * random data so just walk over type0 packets until we get
658 * to the first type3, and from that point on start checking the
659 * size of the packet and adjusting accordingly
660 */
661
662 if (skip_pktsize && pkt_is_type3(rbptr[index]))
663 skip_pktsize = 0;
664
665 if (skip_pktsize == 0) {
666 unsigned int pktsize = type3_pkt_size(rbptr[index]);
667 if (index + pktsize > rptr)
668 rptr = (index + pktsize) % rb->sizedwords;
669 }
670
671 /*
672 * Only parse IBs between the start and the rptr or the next
673 * context switch, whichever comes first
674 */
Jordan Crousee9e91bf2012-02-21 09:48:36 -0700675
676 if (index == ib_parse_start)
677 parse_ibs = 1;
Jordan Crousee6b77622012-04-05 16:55:54 -0600678 else if (index == rptr || adreno_rb_ctxtswitch(&rbptr[index]))
Jordan Crousee9e91bf2012-02-21 09:48:36 -0700679 parse_ibs = 0;
680
Jordan Crousef99f5a662012-03-16 14:53:43 -0600681 if (parse_ibs && adreno_cmd_is_ib(rbptr[index])) {
Jordan Crouse233b2092012-04-18 09:31:09 -0600682 unsigned int ibaddr = rbptr[index + 1];
683 unsigned int ibsize = rbptr[index + 2];
684
Jordan Crousef99f5a662012-03-16 14:53:43 -0600685 /*
Jordan Crouse233b2092012-04-18 09:31:09 -0600686 * This will return non NULL if the IB happens to be
687 * part of the context memory (i.e - context switch
688 * command buffers)
689 */
690
691 struct kgsl_memdesc *memdesc =
692 adreno_find_ctxtmem(device, ptbase, ibaddr,
693 ibsize);
694
Shubhraprakash Das3d784f52012-06-06 23:12:11 -0600695 /* IOMMU uses a NOP IB placed in setsate memory */
696 if (NULL == memdesc)
697 if (kgsl_gpuaddr_in_memdesc(
698 &device->mmu.setstate_memory,
699 ibaddr, ibsize))
700 memdesc = &device->mmu.setstate_memory;
Jordan Crouse233b2092012-04-18 09:31:09 -0600701 /*
702 * The IB from CP_IB1_BASE and the IBs for legacy
703 * context switch go into the snapshot all
Jordan Crousef99f5a662012-03-16 14:53:43 -0600704 * others get marked at GPU objects
705 */
Jordan Crouse233b2092012-04-18 09:31:09 -0600706
707 if (ibaddr == ibbase || memdesc != NULL)
Jordan Crousef99f5a662012-03-16 14:53:43 -0600708 push_object(device, SNAPSHOT_OBJ_TYPE_IB,
Jordan Crouse233b2092012-04-18 09:31:09 -0600709 ptbase, ibaddr, ibsize);
Jordan Crousef99f5a662012-03-16 14:53:43 -0600710 else
Jordan Crouse233b2092012-04-18 09:31:09 -0600711 ib_add_gpu_object(device, ptbase, ibaddr,
712 ibsize);
Jordan Crousef99f5a662012-03-16 14:53:43 -0600713 }
Jordan Crouse156cfbc2012-01-24 09:32:04 -0700714
Jordan Crouse156cfbc2012-01-24 09:32:04 -0700715 index = index + 1;
716
717 if (index == rb->sizedwords)
718 index = 0;
719
720 data++;
721 }
722
Jordan Crouse156cfbc2012-01-24 09:32:04 -0700723 /* Return the size of the section */
724 return size + sizeof(*header);
725}
726
Jordan Crousee0879b12012-03-16 14:53:43 -0600727/* Snapshot the memory for an indirect buffer */
Jordan Crouse156cfbc2012-01-24 09:32:04 -0700728static int snapshot_ib(struct kgsl_device *device, void *snapshot,
729 int remain, void *priv)
730{
731 struct kgsl_snapshot_ib *header = snapshot;
732 struct kgsl_snapshot_obj *obj = priv;
733 unsigned int *src = obj->ptr;
734 unsigned int *dst = snapshot + sizeof(*header);
735 int i;
736
737 if (remain < (obj->dwords << 2) + sizeof(*header)) {
738 KGSL_DRV_ERR(device,
739 "snapshot: Not enough memory for the ib section");
740 return 0;
741 }
742
743 /* Write the sub-header for the section */
744 header->gpuaddr = obj->gpuaddr;
745 header->ptbase = obj->ptbase;
746 header->size = obj->dwords;
747
748 /* Write the contents of the ib */
Jordan Crouseea2c6382012-03-16 14:53:42 -0600749 for (i = 0; i < obj->dwords; i++, src++, dst++) {
Jordan Crouse156cfbc2012-01-24 09:32:04 -0700750 *dst = *src;
Jordan Crouse156cfbc2012-01-24 09:32:04 -0700751
Jordan Crouseea2c6382012-03-16 14:53:42 -0600752 if (pkt_is_type3(*src)) {
753 if ((obj->dwords - i) < type3_pkt_size(*src) + 1)
754 continue;
Jordan Crouse156cfbc2012-01-24 09:32:04 -0700755
Jordan Crouseea2c6382012-03-16 14:53:42 -0600756 if (adreno_cmd_is_ib(*src))
757 push_object(device, SNAPSHOT_OBJ_TYPE_IB,
758 obj->ptbase, src[1], src[2]);
759 else
760 ib_parse_type3(device, src, obj->ptbase);
761 }
Jordan Crouse156cfbc2012-01-24 09:32:04 -0700762 }
763
764 return (obj->dwords << 2) + sizeof(*header);
765}
766
767/* Dump another item on the current pending list */
768static void *dump_object(struct kgsl_device *device, int obj, void *snapshot,
769 int *remain)
770{
771 switch (objbuf[obj].type) {
772 case SNAPSHOT_OBJ_TYPE_IB:
773 snapshot = kgsl_snapshot_add_section(device,
774 KGSL_SNAPSHOT_SECTION_IB, snapshot, remain,
775 snapshot_ib, &objbuf[obj]);
776 break;
777 default:
778 KGSL_DRV_ERR(device,
779 "snapshot: Invalid snapshot object type: %d\n",
780 objbuf[obj].type);
781 break;
782 }
783
784 return snapshot;
785}
786
787/* adreno_snapshot - Snapshot the Adreno GPU state
788 * @device - KGSL device to snapshot
789 * @snapshot - Pointer to the start of memory to write into
790 * @remain - A pointer to how many bytes of memory are remaining in the snapshot
791 * @hang - set if this snapshot was automatically triggered by a GPU hang
792 * This is a hook function called by kgsl_snapshot to snapshot the
793 * Adreno specific information for the GPU snapshot. In turn, this function
794 * calls the GPU specific snapshot function to get core specific information.
795 */
796
797void *adreno_snapshot(struct kgsl_device *device, void *snapshot, int *remain,
798 int hang)
799{
800 int i;
801 uint32_t ptbase, ibbase, ibsize;
802 struct adreno_device *adreno_dev = ADRENO_DEVICE(device);
803
804 /* Reset the list of objects */
805 objbufptr = 0;
806
Jordan Crouse9610b6b2012-03-16 14:53:42 -0600807 snapshot_frozen_objsize = 0;
808
Jordan Crousee0879b12012-03-16 14:53:43 -0600809 /* Clear the caches for the visibilty stream and VBO parsing */
810
811 vfd_control_0 = 0;
812 vfd_index_max = 0;
813 vsc_size_address = 0;
814
815 memset(vsc_pipe, 0, sizeof(vsc_pipe));
816 memset(vbo, 0, sizeof(vbo));
817
Jordan Crouse156cfbc2012-01-24 09:32:04 -0700818 /* Get the physical address of the MMU pagetable */
Shubhraprakash Das79447952012-04-26 18:12:23 -0600819 ptbase = kgsl_mmu_get_current_ptbase(&device->mmu);
Jordan Crouse156cfbc2012-01-24 09:32:04 -0700820
821 /* Dump the ringbuffer */
822 snapshot = kgsl_snapshot_add_section(device, KGSL_SNAPSHOT_SECTION_RB,
823 snapshot, remain, snapshot_rb, NULL);
824
825 /*
Jordan Crousee9e91bf2012-02-21 09:48:36 -0700826 * Make sure that the last IB1 that was being executed is dumped.
827 * Since this was the last IB1 that was processed, we should have
828 * already added it to the list during the ringbuffer parse but we
829 * want to be double plus sure.
Jordan Crouse156cfbc2012-01-24 09:32:04 -0700830 */
Jordan Crousee9e91bf2012-02-21 09:48:36 -0700831
Jordan Crouse156cfbc2012-01-24 09:32:04 -0700832 kgsl_regread(device, REG_CP_IB1_BASE, &ibbase);
833 kgsl_regread(device, REG_CP_IB1_BUFSZ, &ibsize);
834
Jordan Crousee9e91bf2012-02-21 09:48:36 -0700835 /*
836 * The problem is that IB size from the register is the unprocessed size
837 * of the buffer not the original size, so if we didn't catch this
838 * buffer being directly used in the RB, then we might not be able to
839 * dump the whle thing. Print a warning message so we can try to
840 * figure how often this really happens.
841 */
842
843 if (!find_object(SNAPSHOT_OBJ_TYPE_IB, ibbase, ptbase) && ibsize) {
Jordan Crouse156cfbc2012-01-24 09:32:04 -0700844 push_object(device, SNAPSHOT_OBJ_TYPE_IB, ptbase,
845 ibbase, ibsize);
Jordan Crousee9e91bf2012-02-21 09:48:36 -0700846 KGSL_DRV_ERR(device, "CP_IB1_BASE not found in the ringbuffer. "
847 "Dumping %x dwords of the buffer.\n", ibsize);
848 }
Jordan Crouse156cfbc2012-01-24 09:32:04 -0700849
850 kgsl_regread(device, REG_CP_IB2_BASE, &ibbase);
851 kgsl_regread(device, REG_CP_IB2_BUFSZ, &ibsize);
852
Jordan Crousee9e91bf2012-02-21 09:48:36 -0700853 /*
854 * Add the last parsed IB2 to the list. The IB2 should be found as we
855 * parse the objects below, but we try to add it to the list first, so
856 * it too can be parsed. Don't print an error message in this case - if
857 * the IB2 is found during parsing, the list will be updated with the
858 * correct size.
859 */
860
861 if (!find_object(SNAPSHOT_OBJ_TYPE_IB, ibbase, ptbase) && ibsize) {
Jordan Crouse156cfbc2012-01-24 09:32:04 -0700862 push_object(device, SNAPSHOT_OBJ_TYPE_IB, ptbase,
863 ibbase, ibsize);
Jordan Crousee9e91bf2012-02-21 09:48:36 -0700864 }
Jordan Crouse156cfbc2012-01-24 09:32:04 -0700865
866 /*
867 * Go through the list of found objects and dump each one. As the IBs
868 * are parsed, more objects might be found, and objbufptr will increase
869 */
870 for (i = 0; i < objbufptr; i++)
871 snapshot = dump_object(device, i, snapshot, remain);
872
873 /*
874 * Only dump the istore on a hang - reading it on a running system
875 * has a non 0 chance of hanging the GPU
876 */
877
878 if (hang) {
879 snapshot = kgsl_snapshot_add_section(device,
880 KGSL_SNAPSHOT_SECTION_ISTORE, snapshot, remain,
881 snapshot_istore, NULL);
882 }
883
884 /* Add GPU specific sections - registers mainly, but other stuff too */
885 if (adreno_dev->gpudev->snapshot)
886 snapshot = adreno_dev->gpudev->snapshot(adreno_dev, snapshot,
887 remain, hang);
888
Jordan Crouse9610b6b2012-03-16 14:53:42 -0600889 if (snapshot_frozen_objsize)
890 KGSL_DRV_ERR(device, "GPU snapshot froze %dKb of GPU buffers\n",
891 snapshot_frozen_objsize / 1024);
892
Jordan Crouse156cfbc2012-01-24 09:32:04 -0700893 return snapshot;
894}