]> Git Repo - linux.git/blob - drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c
Merge tag 'amd-drm-next-6.5-2023-06-09' of https://gitlab.freedesktop.org/agd5f/linux...
[linux.git] / drivers / gpu / drm / msm / adreno / a6xx_gpu_state.c
1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. */
3
4 #include <linux/ascii85.h>
5 #include "msm_gem.h"
6 #include "a6xx_gpu.h"
7 #include "a6xx_gmu.h"
8 #include "a6xx_gpu_state.h"
9 #include "a6xx_gmu.xml.h"
10
11 struct a6xx_gpu_state_obj {
12         const void *handle;
13         u32 *data;
14 };
15
16 struct a6xx_gpu_state {
17         struct msm_gpu_state base;
18
19         struct a6xx_gpu_state_obj *gmu_registers;
20         int nr_gmu_registers;
21
22         struct a6xx_gpu_state_obj *registers;
23         int nr_registers;
24
25         struct a6xx_gpu_state_obj *shaders;
26         int nr_shaders;
27
28         struct a6xx_gpu_state_obj *clusters;
29         int nr_clusters;
30
31         struct a6xx_gpu_state_obj *dbgahb_clusters;
32         int nr_dbgahb_clusters;
33
34         struct a6xx_gpu_state_obj *indexed_regs;
35         int nr_indexed_regs;
36
37         struct a6xx_gpu_state_obj *debugbus;
38         int nr_debugbus;
39
40         struct a6xx_gpu_state_obj *vbif_debugbus;
41
42         struct a6xx_gpu_state_obj *cx_debugbus;
43         int nr_cx_debugbus;
44
45         struct msm_gpu_state_bo *gmu_log;
46         struct msm_gpu_state_bo *gmu_hfi;
47         struct msm_gpu_state_bo *gmu_debug;
48
49         s32 hfi_queue_history[2][HFI_HISTORY_SZ];
50
51         struct list_head objs;
52
53         bool gpu_initialized;
54 };
55
56 static inline int CRASHDUMP_WRITE(u64 *in, u32 reg, u32 val)
57 {
58         in[0] = val;
59         in[1] = (((u64) reg) << 44 | (1 << 21) | 1);
60
61         return 2;
62 }
63
64 static inline int CRASHDUMP_READ(u64 *in, u32 reg, u32 dwords, u64 target)
65 {
66         in[0] = target;
67         in[1] = (((u64) reg) << 44 | dwords);
68
69         return 2;
70 }
71
72 static inline int CRASHDUMP_FINI(u64 *in)
73 {
74         in[0] = 0;
75         in[1] = 0;
76
77         return 2;
78 }
79
80 struct a6xx_crashdumper {
81         void *ptr;
82         struct drm_gem_object *bo;
83         u64 iova;
84 };
85
86 struct a6xx_state_memobj {
87         struct list_head node;
88         unsigned long long data[];
89 };
90
91 static void *state_kcalloc(struct a6xx_gpu_state *a6xx_state, int nr, size_t objsize)
92 {
93         struct a6xx_state_memobj *obj =
94                 kvzalloc((nr * objsize) + sizeof(*obj), GFP_KERNEL);
95
96         if (!obj)
97                 return NULL;
98
99         list_add_tail(&obj->node, &a6xx_state->objs);
100         return &obj->data;
101 }
102
103 static void *state_kmemdup(struct a6xx_gpu_state *a6xx_state, void *src,
104                 size_t size)
105 {
106         void *dst = state_kcalloc(a6xx_state, 1, size);
107
108         if (dst)
109                 memcpy(dst, src, size);
110         return dst;
111 }
112
113 /*
114  * Allocate 1MB for the crashdumper scratch region - 8k for the script and
115  * the rest for the data
116  */
117 #define A6XX_CD_DATA_OFFSET 8192
118 #define A6XX_CD_DATA_SIZE  (SZ_1M - 8192)
119
120 static int a6xx_crashdumper_init(struct msm_gpu *gpu,
121                 struct a6xx_crashdumper *dumper)
122 {
123         dumper->ptr = msm_gem_kernel_new(gpu->dev,
124                 SZ_1M, MSM_BO_WC, gpu->aspace,
125                 &dumper->bo, &dumper->iova);
126
127         if (!IS_ERR(dumper->ptr))
128                 msm_gem_object_set_name(dumper->bo, "crashdump");
129
130         return PTR_ERR_OR_ZERO(dumper->ptr);
131 }
132
133 static int a6xx_crashdumper_run(struct msm_gpu *gpu,
134                 struct a6xx_crashdumper *dumper)
135 {
136         struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
137         struct a6xx_gpu *a6xx_gpu = to_a6xx_gpu(adreno_gpu);
138         u32 val;
139         int ret;
140
141         if (IS_ERR_OR_NULL(dumper->ptr))
142                 return -EINVAL;
143
144         if (!a6xx_gmu_sptprac_is_on(&a6xx_gpu->gmu))
145                 return -EINVAL;
146
147         /* Make sure all pending memory writes are posted */
148         wmb();
149
150         gpu_write64(gpu, REG_A6XX_CP_CRASH_SCRIPT_BASE, dumper->iova);
151
152         gpu_write(gpu, REG_A6XX_CP_CRASH_DUMP_CNTL, 1);
153
154         ret = gpu_poll_timeout(gpu, REG_A6XX_CP_CRASH_DUMP_STATUS, val,
155                 val & 0x02, 100, 10000);
156
157         gpu_write(gpu, REG_A6XX_CP_CRASH_DUMP_CNTL, 0);
158
159         return ret;
160 }
161
162 /* read a value from the GX debug bus */
163 static int debugbus_read(struct msm_gpu *gpu, u32 block, u32 offset,
164                 u32 *data)
165 {
166         u32 reg = A6XX_DBGC_CFG_DBGBUS_SEL_D_PING_INDEX(offset) |
167                 A6XX_DBGC_CFG_DBGBUS_SEL_D_PING_BLK_SEL(block);
168
169         gpu_write(gpu, REG_A6XX_DBGC_CFG_DBGBUS_SEL_A, reg);
170         gpu_write(gpu, REG_A6XX_DBGC_CFG_DBGBUS_SEL_B, reg);
171         gpu_write(gpu, REG_A6XX_DBGC_CFG_DBGBUS_SEL_C, reg);
172         gpu_write(gpu, REG_A6XX_DBGC_CFG_DBGBUS_SEL_D, reg);
173
174         /* Wait 1 us to make sure the data is flowing */
175         udelay(1);
176
177         data[0] = gpu_read(gpu, REG_A6XX_DBGC_CFG_DBGBUS_TRACE_BUF2);
178         data[1] = gpu_read(gpu, REG_A6XX_DBGC_CFG_DBGBUS_TRACE_BUF1);
179
180         return 2;
181 }
182
183 #define cxdbg_write(ptr, offset, val) \
184         msm_writel((val), (ptr) + ((offset) << 2))
185
186 #define cxdbg_read(ptr, offset) \
187         msm_readl((ptr) + ((offset) << 2))
188
189 /* read a value from the CX debug bus */
190 static int cx_debugbus_read(void __iomem *cxdbg, u32 block, u32 offset,
191                 u32 *data)
192 {
193         u32 reg = A6XX_CX_DBGC_CFG_DBGBUS_SEL_A_PING_INDEX(offset) |
194                 A6XX_CX_DBGC_CFG_DBGBUS_SEL_A_PING_BLK_SEL(block);
195
196         cxdbg_write(cxdbg, REG_A6XX_CX_DBGC_CFG_DBGBUS_SEL_A, reg);
197         cxdbg_write(cxdbg, REG_A6XX_CX_DBGC_CFG_DBGBUS_SEL_B, reg);
198         cxdbg_write(cxdbg, REG_A6XX_CX_DBGC_CFG_DBGBUS_SEL_C, reg);
199         cxdbg_write(cxdbg, REG_A6XX_CX_DBGC_CFG_DBGBUS_SEL_D, reg);
200
201         /* Wait 1 us to make sure the data is flowing */
202         udelay(1);
203
204         data[0] = cxdbg_read(cxdbg, REG_A6XX_CX_DBGC_CFG_DBGBUS_TRACE_BUF2);
205         data[1] = cxdbg_read(cxdbg, REG_A6XX_CX_DBGC_CFG_DBGBUS_TRACE_BUF1);
206
207         return 2;
208 }
209
210 /* Read a chunk of data from the VBIF debug bus */
211 static int vbif_debugbus_read(struct msm_gpu *gpu, u32 ctrl0, u32 ctrl1,
212                 u32 reg, int count, u32 *data)
213 {
214         int i;
215
216         gpu_write(gpu, ctrl0, reg);
217
218         for (i = 0; i < count; i++) {
219                 gpu_write(gpu, ctrl1, i);
220                 data[i] = gpu_read(gpu, REG_A6XX_VBIF_TEST_BUS_OUT);
221         }
222
223         return count;
224 }
225
226 #define AXI_ARB_BLOCKS 2
227 #define XIN_AXI_BLOCKS 5
228 #define XIN_CORE_BLOCKS 4
229
230 #define VBIF_DEBUGBUS_BLOCK_SIZE \
231         ((16 * AXI_ARB_BLOCKS) + \
232          (18 * XIN_AXI_BLOCKS) + \
233          (12 * XIN_CORE_BLOCKS))
234
235 static void a6xx_get_vbif_debugbus_block(struct msm_gpu *gpu,
236                 struct a6xx_gpu_state *a6xx_state,
237                 struct a6xx_gpu_state_obj *obj)
238 {
239         u32 clk, *ptr;
240         int i;
241
242         obj->data = state_kcalloc(a6xx_state, VBIF_DEBUGBUS_BLOCK_SIZE,
243                 sizeof(u32));
244         if (!obj->data)
245                 return;
246
247         obj->handle = NULL;
248
249         /* Get the current clock setting */
250         clk = gpu_read(gpu, REG_A6XX_VBIF_CLKON);
251
252         /* Force on the bus so we can read it */
253         gpu_write(gpu, REG_A6XX_VBIF_CLKON,
254                 clk | A6XX_VBIF_CLKON_FORCE_ON_TESTBUS);
255
256         /* We will read from BUS2 first, so disable BUS1 */
257         gpu_write(gpu, REG_A6XX_VBIF_TEST_BUS1_CTRL0, 0);
258
259         /* Enable the VBIF bus for reading */
260         gpu_write(gpu, REG_A6XX_VBIF_TEST_BUS_OUT_CTRL, 1);
261
262         ptr = obj->data;
263
264         for (i = 0; i < AXI_ARB_BLOCKS; i++)
265                 ptr += vbif_debugbus_read(gpu,
266                         REG_A6XX_VBIF_TEST_BUS2_CTRL0,
267                         REG_A6XX_VBIF_TEST_BUS2_CTRL1,
268                         1 << (i + 16), 16, ptr);
269
270         for (i = 0; i < XIN_AXI_BLOCKS; i++)
271                 ptr += vbif_debugbus_read(gpu,
272                         REG_A6XX_VBIF_TEST_BUS2_CTRL0,
273                         REG_A6XX_VBIF_TEST_BUS2_CTRL1,
274                         1 << i, 18, ptr);
275
276         /* Stop BUS2 so we can turn on BUS1 */
277         gpu_write(gpu, REG_A6XX_VBIF_TEST_BUS2_CTRL0, 0);
278
279         for (i = 0; i < XIN_CORE_BLOCKS; i++)
280                 ptr += vbif_debugbus_read(gpu,
281                         REG_A6XX_VBIF_TEST_BUS1_CTRL0,
282                         REG_A6XX_VBIF_TEST_BUS1_CTRL1,
283                         1 << i, 12, ptr);
284
285         /* Restore the VBIF clock setting */
286         gpu_write(gpu, REG_A6XX_VBIF_CLKON, clk);
287 }
288
289 static void a6xx_get_debugbus_block(struct msm_gpu *gpu,
290                 struct a6xx_gpu_state *a6xx_state,
291                 const struct a6xx_debugbus_block *block,
292                 struct a6xx_gpu_state_obj *obj)
293 {
294         int i;
295         u32 *ptr;
296
297         obj->data = state_kcalloc(a6xx_state, block->count, sizeof(u64));
298         if (!obj->data)
299                 return;
300
301         obj->handle = block;
302
303         for (ptr = obj->data, i = 0; i < block->count; i++)
304                 ptr += debugbus_read(gpu, block->id, i, ptr);
305 }
306
307 static void a6xx_get_cx_debugbus_block(void __iomem *cxdbg,
308                 struct a6xx_gpu_state *a6xx_state,
309                 const struct a6xx_debugbus_block *block,
310                 struct a6xx_gpu_state_obj *obj)
311 {
312         int i;
313         u32 *ptr;
314
315         obj->data = state_kcalloc(a6xx_state, block->count, sizeof(u64));
316         if (!obj->data)
317                 return;
318
319         obj->handle = block;
320
321         for (ptr = obj->data, i = 0; i < block->count; i++)
322                 ptr += cx_debugbus_read(cxdbg, block->id, i, ptr);
323 }
324
325 static void a6xx_get_debugbus(struct msm_gpu *gpu,
326                 struct a6xx_gpu_state *a6xx_state)
327 {
328         struct resource *res;
329         void __iomem *cxdbg = NULL;
330         int nr_debugbus_blocks;
331
332         /* Set up the GX debug bus */
333
334         gpu_write(gpu, REG_A6XX_DBGC_CFG_DBGBUS_CNTLT,
335                 A6XX_DBGC_CFG_DBGBUS_CNTLT_SEGT(0xf));
336
337         gpu_write(gpu, REG_A6XX_DBGC_CFG_DBGBUS_CNTLM,
338                 A6XX_DBGC_CFG_DBGBUS_CNTLM_ENABLE(0xf));
339
340         gpu_write(gpu, REG_A6XX_DBGC_CFG_DBGBUS_IVTL_0, 0);
341         gpu_write(gpu, REG_A6XX_DBGC_CFG_DBGBUS_IVTL_1, 0);
342         gpu_write(gpu, REG_A6XX_DBGC_CFG_DBGBUS_IVTL_2, 0);
343         gpu_write(gpu, REG_A6XX_DBGC_CFG_DBGBUS_IVTL_3, 0);
344
345         gpu_write(gpu, REG_A6XX_DBGC_CFG_DBGBUS_BYTEL_0, 0x76543210);
346         gpu_write(gpu, REG_A6XX_DBGC_CFG_DBGBUS_BYTEL_1, 0xFEDCBA98);
347
348         gpu_write(gpu, REG_A6XX_DBGC_CFG_DBGBUS_MASKL_0, 0);
349         gpu_write(gpu, REG_A6XX_DBGC_CFG_DBGBUS_MASKL_1, 0);
350         gpu_write(gpu, REG_A6XX_DBGC_CFG_DBGBUS_MASKL_2, 0);
351         gpu_write(gpu, REG_A6XX_DBGC_CFG_DBGBUS_MASKL_3, 0);
352
353         /* Set up the CX debug bus - it lives elsewhere in the system so do a
354          * temporary ioremap for the registers
355          */
356         res = platform_get_resource_byname(gpu->pdev, IORESOURCE_MEM,
357                         "cx_dbgc");
358
359         if (res)
360                 cxdbg = ioremap(res->start, resource_size(res));
361
362         if (cxdbg) {
363                 cxdbg_write(cxdbg, REG_A6XX_CX_DBGC_CFG_DBGBUS_CNTLT,
364                         A6XX_DBGC_CFG_DBGBUS_CNTLT_SEGT(0xf));
365
366                 cxdbg_write(cxdbg, REG_A6XX_CX_DBGC_CFG_DBGBUS_CNTLM,
367                         A6XX_DBGC_CFG_DBGBUS_CNTLM_ENABLE(0xf));
368
369                 cxdbg_write(cxdbg, REG_A6XX_CX_DBGC_CFG_DBGBUS_IVTL_0, 0);
370                 cxdbg_write(cxdbg, REG_A6XX_CX_DBGC_CFG_DBGBUS_IVTL_1, 0);
371                 cxdbg_write(cxdbg, REG_A6XX_CX_DBGC_CFG_DBGBUS_IVTL_2, 0);
372                 cxdbg_write(cxdbg, REG_A6XX_CX_DBGC_CFG_DBGBUS_IVTL_3, 0);
373
374                 cxdbg_write(cxdbg, REG_A6XX_CX_DBGC_CFG_DBGBUS_BYTEL_0,
375                         0x76543210);
376                 cxdbg_write(cxdbg, REG_A6XX_CX_DBGC_CFG_DBGBUS_BYTEL_1,
377                         0xFEDCBA98);
378
379                 cxdbg_write(cxdbg, REG_A6XX_CX_DBGC_CFG_DBGBUS_MASKL_0, 0);
380                 cxdbg_write(cxdbg, REG_A6XX_CX_DBGC_CFG_DBGBUS_MASKL_1, 0);
381                 cxdbg_write(cxdbg, REG_A6XX_CX_DBGC_CFG_DBGBUS_MASKL_2, 0);
382                 cxdbg_write(cxdbg, REG_A6XX_CX_DBGC_CFG_DBGBUS_MASKL_3, 0);
383         }
384
385         nr_debugbus_blocks = ARRAY_SIZE(a6xx_debugbus_blocks) +
386                 (a6xx_has_gbif(to_adreno_gpu(gpu)) ? 1 : 0);
387
388         if (adreno_is_a650_family(to_adreno_gpu(gpu)))
389                 nr_debugbus_blocks += ARRAY_SIZE(a650_debugbus_blocks);
390
391         a6xx_state->debugbus = state_kcalloc(a6xx_state, nr_debugbus_blocks,
392                         sizeof(*a6xx_state->debugbus));
393
394         if (a6xx_state->debugbus) {
395                 int i;
396
397                 for (i = 0; i < ARRAY_SIZE(a6xx_debugbus_blocks); i++)
398                         a6xx_get_debugbus_block(gpu,
399                                 a6xx_state,
400                                 &a6xx_debugbus_blocks[i],
401                                 &a6xx_state->debugbus[i]);
402
403                 a6xx_state->nr_debugbus = ARRAY_SIZE(a6xx_debugbus_blocks);
404
405                 /*
406                  * GBIF has same debugbus as of other GPU blocks, fall back to
407                  * default path if GPU uses GBIF, also GBIF uses exactly same
408                  * ID as of VBIF.
409                  */
410                 if (a6xx_has_gbif(to_adreno_gpu(gpu))) {
411                         a6xx_get_debugbus_block(gpu, a6xx_state,
412                                 &a6xx_gbif_debugbus_block,
413                                 &a6xx_state->debugbus[i]);
414
415                         a6xx_state->nr_debugbus += 1;
416                 }
417
418
419                 if (adreno_is_a650_family(to_adreno_gpu(gpu))) {
420                         for (i = 0; i < ARRAY_SIZE(a650_debugbus_blocks); i++)
421                                 a6xx_get_debugbus_block(gpu,
422                                         a6xx_state,
423                                         &a650_debugbus_blocks[i],
424                                         &a6xx_state->debugbus[i]);
425                 }
426         }
427
428         /*  Dump the VBIF debugbus on applicable targets */
429         if (!a6xx_has_gbif(to_adreno_gpu(gpu))) {
430                 a6xx_state->vbif_debugbus =
431                         state_kcalloc(a6xx_state, 1,
432                                         sizeof(*a6xx_state->vbif_debugbus));
433
434                 if (a6xx_state->vbif_debugbus)
435                         a6xx_get_vbif_debugbus_block(gpu, a6xx_state,
436                                         a6xx_state->vbif_debugbus);
437         }
438
439         if (cxdbg) {
440                 a6xx_state->cx_debugbus =
441                         state_kcalloc(a6xx_state,
442                         ARRAY_SIZE(a6xx_cx_debugbus_blocks),
443                         sizeof(*a6xx_state->cx_debugbus));
444
445                 if (a6xx_state->cx_debugbus) {
446                         int i;
447
448                         for (i = 0; i < ARRAY_SIZE(a6xx_cx_debugbus_blocks); i++)
449                                 a6xx_get_cx_debugbus_block(cxdbg,
450                                         a6xx_state,
451                                         &a6xx_cx_debugbus_blocks[i],
452                                         &a6xx_state->cx_debugbus[i]);
453
454                         a6xx_state->nr_cx_debugbus =
455                                 ARRAY_SIZE(a6xx_cx_debugbus_blocks);
456                 }
457
458                 iounmap(cxdbg);
459         }
460 }
461
462 #define RANGE(reg, a) ((reg)[(a) + 1] - (reg)[(a)] + 1)
463
464 /* Read a data cluster from behind the AHB aperture */
465 static void a6xx_get_dbgahb_cluster(struct msm_gpu *gpu,
466                 struct a6xx_gpu_state *a6xx_state,
467                 const struct a6xx_dbgahb_cluster *dbgahb,
468                 struct a6xx_gpu_state_obj *obj,
469                 struct a6xx_crashdumper *dumper)
470 {
471         u64 *in = dumper->ptr;
472         u64 out = dumper->iova + A6XX_CD_DATA_OFFSET;
473         size_t datasize;
474         int i, regcount = 0;
475
476         for (i = 0; i < A6XX_NUM_CONTEXTS; i++) {
477                 int j;
478
479                 in += CRASHDUMP_WRITE(in, REG_A6XX_HLSQ_DBG_READ_SEL,
480                         (dbgahb->statetype + i * 2) << 8);
481
482                 for (j = 0; j < dbgahb->count; j += 2) {
483                         int count = RANGE(dbgahb->registers, j);
484                         u32 offset = REG_A6XX_HLSQ_DBG_AHB_READ_APERTURE +
485                                 dbgahb->registers[j] - (dbgahb->base >> 2);
486
487                         in += CRASHDUMP_READ(in, offset, count, out);
488
489                         out += count * sizeof(u32);
490
491                         if (i == 0)
492                                 regcount += count;
493                 }
494         }
495
496         CRASHDUMP_FINI(in);
497
498         datasize = regcount * A6XX_NUM_CONTEXTS * sizeof(u32);
499
500         if (WARN_ON(datasize > A6XX_CD_DATA_SIZE))
501                 return;
502
503         if (a6xx_crashdumper_run(gpu, dumper))
504                 return;
505
506         obj->handle = dbgahb;
507         obj->data = state_kmemdup(a6xx_state, dumper->ptr + A6XX_CD_DATA_OFFSET,
508                 datasize);
509 }
510
511 static void a6xx_get_dbgahb_clusters(struct msm_gpu *gpu,
512                 struct a6xx_gpu_state *a6xx_state,
513                 struct a6xx_crashdumper *dumper)
514 {
515         int i;
516
517         a6xx_state->dbgahb_clusters = state_kcalloc(a6xx_state,
518                 ARRAY_SIZE(a6xx_dbgahb_clusters),
519                 sizeof(*a6xx_state->dbgahb_clusters));
520
521         if (!a6xx_state->dbgahb_clusters)
522                 return;
523
524         a6xx_state->nr_dbgahb_clusters = ARRAY_SIZE(a6xx_dbgahb_clusters);
525
526         for (i = 0; i < ARRAY_SIZE(a6xx_dbgahb_clusters); i++)
527                 a6xx_get_dbgahb_cluster(gpu, a6xx_state,
528                         &a6xx_dbgahb_clusters[i],
529                         &a6xx_state->dbgahb_clusters[i], dumper);
530 }
531
532 /* Read a data cluster from the CP aperture with the crashdumper */
533 static void a6xx_get_cluster(struct msm_gpu *gpu,
534                 struct a6xx_gpu_state *a6xx_state,
535                 const struct a6xx_cluster *cluster,
536                 struct a6xx_gpu_state_obj *obj,
537                 struct a6xx_crashdumper *dumper)
538 {
539         struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
540         u64 *in = dumper->ptr;
541         u64 out = dumper->iova + A6XX_CD_DATA_OFFSET;
542         size_t datasize;
543         int i, regcount = 0;
544         u32 id = cluster->id;
545
546         /* Skip registers that are not present on older generation */
547         if (!adreno_is_a660_family(adreno_gpu) &&
548                         cluster->registers == a660_fe_cluster)
549                 return;
550
551         if (adreno_is_a650_family(adreno_gpu) &&
552                         cluster->registers == a6xx_ps_cluster)
553                 id = CLUSTER_VPC_PS;
554
555         /* Some clusters need a selector register to be programmed too */
556         if (cluster->sel_reg)
557                 in += CRASHDUMP_WRITE(in, cluster->sel_reg, cluster->sel_val);
558
559         for (i = 0; i < A6XX_NUM_CONTEXTS; i++) {
560                 int j;
561
562                 in += CRASHDUMP_WRITE(in, REG_A6XX_CP_APERTURE_CNTL_CD,
563                         (id << 8) | (i << 4) | i);
564
565                 for (j = 0; j < cluster->count; j += 2) {
566                         int count = RANGE(cluster->registers, j);
567
568                         in += CRASHDUMP_READ(in, cluster->registers[j],
569                                 count, out);
570
571                         out += count * sizeof(u32);
572
573                         if (i == 0)
574                                 regcount += count;
575                 }
576         }
577
578         CRASHDUMP_FINI(in);
579
580         datasize = regcount * A6XX_NUM_CONTEXTS * sizeof(u32);
581
582         if (WARN_ON(datasize > A6XX_CD_DATA_SIZE))
583                 return;
584
585         if (a6xx_crashdumper_run(gpu, dumper))
586                 return;
587
588         obj->handle = cluster;
589         obj->data = state_kmemdup(a6xx_state, dumper->ptr + A6XX_CD_DATA_OFFSET,
590                 datasize);
591 }
592
593 static void a6xx_get_clusters(struct msm_gpu *gpu,
594                 struct a6xx_gpu_state *a6xx_state,
595                 struct a6xx_crashdumper *dumper)
596 {
597         int i;
598
599         a6xx_state->clusters = state_kcalloc(a6xx_state,
600                 ARRAY_SIZE(a6xx_clusters), sizeof(*a6xx_state->clusters));
601
602         if (!a6xx_state->clusters)
603                 return;
604
605         a6xx_state->nr_clusters = ARRAY_SIZE(a6xx_clusters);
606
607         for (i = 0; i < ARRAY_SIZE(a6xx_clusters); i++)
608                 a6xx_get_cluster(gpu, a6xx_state, &a6xx_clusters[i],
609                         &a6xx_state->clusters[i], dumper);
610 }
611
612 /* Read a shader / debug block from the HLSQ aperture with the crashdumper */
613 static void a6xx_get_shader_block(struct msm_gpu *gpu,
614                 struct a6xx_gpu_state *a6xx_state,
615                 const struct a6xx_shader_block *block,
616                 struct a6xx_gpu_state_obj *obj,
617                 struct a6xx_crashdumper *dumper)
618 {
619         u64 *in = dumper->ptr;
620         size_t datasize = block->size * A6XX_NUM_SHADER_BANKS * sizeof(u32);
621         int i;
622
623         if (WARN_ON(datasize > A6XX_CD_DATA_SIZE))
624                 return;
625
626         for (i = 0; i < A6XX_NUM_SHADER_BANKS; i++) {
627                 in += CRASHDUMP_WRITE(in, REG_A6XX_HLSQ_DBG_READ_SEL,
628                         (block->type << 8) | i);
629
630                 in += CRASHDUMP_READ(in, REG_A6XX_HLSQ_DBG_AHB_READ_APERTURE,
631                         block->size, dumper->iova + A6XX_CD_DATA_OFFSET);
632         }
633
634         CRASHDUMP_FINI(in);
635
636         if (a6xx_crashdumper_run(gpu, dumper))
637                 return;
638
639         obj->handle = block;
640         obj->data = state_kmemdup(a6xx_state, dumper->ptr + A6XX_CD_DATA_OFFSET,
641                 datasize);
642 }
643
644 static void a6xx_get_shaders(struct msm_gpu *gpu,
645                 struct a6xx_gpu_state *a6xx_state,
646                 struct a6xx_crashdumper *dumper)
647 {
648         int i;
649
650         a6xx_state->shaders = state_kcalloc(a6xx_state,
651                 ARRAY_SIZE(a6xx_shader_blocks), sizeof(*a6xx_state->shaders));
652
653         if (!a6xx_state->shaders)
654                 return;
655
656         a6xx_state->nr_shaders = ARRAY_SIZE(a6xx_shader_blocks);
657
658         for (i = 0; i < ARRAY_SIZE(a6xx_shader_blocks); i++)
659                 a6xx_get_shader_block(gpu, a6xx_state, &a6xx_shader_blocks[i],
660                         &a6xx_state->shaders[i], dumper);
661 }
662
663 /* Read registers from behind the HLSQ aperture with the crashdumper */
664 static void a6xx_get_crashdumper_hlsq_registers(struct msm_gpu *gpu,
665                 struct a6xx_gpu_state *a6xx_state,
666                 const struct a6xx_registers *regs,
667                 struct a6xx_gpu_state_obj *obj,
668                 struct a6xx_crashdumper *dumper)
669
670 {
671         u64 *in = dumper->ptr;
672         u64 out = dumper->iova + A6XX_CD_DATA_OFFSET;
673         int i, regcount = 0;
674
675         in += CRASHDUMP_WRITE(in, REG_A6XX_HLSQ_DBG_READ_SEL, regs->val1);
676
677         for (i = 0; i < regs->count; i += 2) {
678                 u32 count = RANGE(regs->registers, i);
679                 u32 offset = REG_A6XX_HLSQ_DBG_AHB_READ_APERTURE +
680                         regs->registers[i] - (regs->val0 >> 2);
681
682                 in += CRASHDUMP_READ(in, offset, count, out);
683
684                 out += count * sizeof(u32);
685                 regcount += count;
686         }
687
688         CRASHDUMP_FINI(in);
689
690         if (WARN_ON((regcount * sizeof(u32)) > A6XX_CD_DATA_SIZE))
691                 return;
692
693         if (a6xx_crashdumper_run(gpu, dumper))
694                 return;
695
696         obj->handle = regs;
697         obj->data = state_kmemdup(a6xx_state, dumper->ptr + A6XX_CD_DATA_OFFSET,
698                 regcount * sizeof(u32));
699 }
700
701 /* Read a block of registers using the crashdumper */
702 static void a6xx_get_crashdumper_registers(struct msm_gpu *gpu,
703                 struct a6xx_gpu_state *a6xx_state,
704                 const struct a6xx_registers *regs,
705                 struct a6xx_gpu_state_obj *obj,
706                 struct a6xx_crashdumper *dumper)
707
708 {
709         u64 *in = dumper->ptr;
710         u64 out = dumper->iova + A6XX_CD_DATA_OFFSET;
711         int i, regcount = 0;
712
713         /* Skip unsupported registers on older generations */
714         if (!adreno_is_a660_family(to_adreno_gpu(gpu)) &&
715                         (regs->registers == a660_registers))
716                 return;
717
718         /* Some blocks might need to program a selector register first */
719         if (regs->val0)
720                 in += CRASHDUMP_WRITE(in, regs->val0, regs->val1);
721
722         for (i = 0; i < regs->count; i += 2) {
723                 u32 count = RANGE(regs->registers, i);
724
725                 in += CRASHDUMP_READ(in, regs->registers[i], count, out);
726
727                 out += count * sizeof(u32);
728                 regcount += count;
729         }
730
731         CRASHDUMP_FINI(in);
732
733         if (WARN_ON((regcount * sizeof(u32)) > A6XX_CD_DATA_SIZE))
734                 return;
735
736         if (a6xx_crashdumper_run(gpu, dumper))
737                 return;
738
739         obj->handle = regs;
740         obj->data = state_kmemdup(a6xx_state, dumper->ptr + A6XX_CD_DATA_OFFSET,
741                 regcount * sizeof(u32));
742 }
743
744 /* Read a block of registers via AHB */
745 static void a6xx_get_ahb_gpu_registers(struct msm_gpu *gpu,
746                 struct a6xx_gpu_state *a6xx_state,
747                 const struct a6xx_registers *regs,
748                 struct a6xx_gpu_state_obj *obj)
749 {
750         int i, regcount = 0, index = 0;
751
752         /* Skip unsupported registers on older generations */
753         if (!adreno_is_a660_family(to_adreno_gpu(gpu)) &&
754                         (regs->registers == a660_registers))
755                 return;
756
757         for (i = 0; i < regs->count; i += 2)
758                 regcount += RANGE(regs->registers, i);
759
760         obj->handle = (const void *) regs;
761         obj->data = state_kcalloc(a6xx_state, regcount, sizeof(u32));
762         if (!obj->data)
763                 return;
764
765         for (i = 0; i < regs->count; i += 2) {
766                 u32 count = RANGE(regs->registers, i);
767                 int j;
768
769                 for (j = 0; j < count; j++)
770                         obj->data[index++] = gpu_read(gpu,
771                                 regs->registers[i] + j);
772         }
773 }
774
775 /* Read a block of GMU registers */
776 static void _a6xx_get_gmu_registers(struct msm_gpu *gpu,
777                 struct a6xx_gpu_state *a6xx_state,
778                 const struct a6xx_registers *regs,
779                 struct a6xx_gpu_state_obj *obj,
780                 bool rscc)
781 {
782         struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
783         struct a6xx_gpu *a6xx_gpu = to_a6xx_gpu(adreno_gpu);
784         struct a6xx_gmu *gmu = &a6xx_gpu->gmu;
785         int i, regcount = 0, index = 0;
786
787         for (i = 0; i < regs->count; i += 2)
788                 regcount += RANGE(regs->registers, i);
789
790         obj->handle = (const void *) regs;
791         obj->data = state_kcalloc(a6xx_state, regcount, sizeof(u32));
792         if (!obj->data)
793                 return;
794
795         for (i = 0; i < regs->count; i += 2) {
796                 u32 count = RANGE(regs->registers, i);
797                 int j;
798
799                 for (j = 0; j < count; j++) {
800                         u32 offset = regs->registers[i] + j;
801                         u32 val;
802
803                         if (rscc)
804                                 val = gmu_read_rscc(gmu, offset);
805                         else
806                                 val = gmu_read(gmu, offset);
807
808                         obj->data[index++] = val;
809                 }
810         }
811 }
812
813 static void a6xx_get_gmu_registers(struct msm_gpu *gpu,
814                 struct a6xx_gpu_state *a6xx_state)
815 {
816         struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
817         struct a6xx_gpu *a6xx_gpu = to_a6xx_gpu(adreno_gpu);
818
819         a6xx_state->gmu_registers = state_kcalloc(a6xx_state,
820                 3, sizeof(*a6xx_state->gmu_registers));
821
822         if (!a6xx_state->gmu_registers)
823                 return;
824
825         a6xx_state->nr_gmu_registers = 3;
826
827         /* Get the CX GMU registers from AHB */
828         _a6xx_get_gmu_registers(gpu, a6xx_state, &a6xx_gmu_reglist[0],
829                 &a6xx_state->gmu_registers[0], false);
830         _a6xx_get_gmu_registers(gpu, a6xx_state, &a6xx_gmu_reglist[1],
831                 &a6xx_state->gmu_registers[1], true);
832
833         if (!a6xx_gmu_gx_is_on(&a6xx_gpu->gmu))
834                 return;
835
836         /* Set the fence to ALLOW mode so we can access the registers */
837         gpu_write(gpu, REG_A6XX_GMU_AO_AHB_FENCE_CTRL, 0);
838
839         _a6xx_get_gmu_registers(gpu, a6xx_state, &a6xx_gmu_reglist[2],
840                 &a6xx_state->gmu_registers[2], false);
841 }
842
843 static struct msm_gpu_state_bo *a6xx_snapshot_gmu_bo(
844                 struct a6xx_gpu_state *a6xx_state, struct a6xx_gmu_bo *bo)
845 {
846         struct msm_gpu_state_bo *snapshot;
847
848         if (!bo->size)
849                 return NULL;
850
851         snapshot = state_kcalloc(a6xx_state, 1, sizeof(*snapshot));
852         if (!snapshot)
853                 return NULL;
854
855         snapshot->iova = bo->iova;
856         snapshot->size = bo->size;
857         snapshot->data = kvzalloc(snapshot->size, GFP_KERNEL);
858         if (!snapshot->data)
859                 return NULL;
860
861         memcpy(snapshot->data, bo->virt, bo->size);
862
863         return snapshot;
864 }
865
866 static void a6xx_snapshot_gmu_hfi_history(struct msm_gpu *gpu,
867                                           struct a6xx_gpu_state *a6xx_state)
868 {
869         struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
870         struct a6xx_gpu *a6xx_gpu = to_a6xx_gpu(adreno_gpu);
871         struct a6xx_gmu *gmu = &a6xx_gpu->gmu;
872         unsigned i, j;
873
874         BUILD_BUG_ON(ARRAY_SIZE(gmu->queues) != ARRAY_SIZE(a6xx_state->hfi_queue_history));
875
876         for (i = 0; i < ARRAY_SIZE(gmu->queues); i++) {
877                 struct a6xx_hfi_queue *queue = &gmu->queues[i];
878                 for (j = 0; j < HFI_HISTORY_SZ; j++) {
879                         unsigned idx = (j + queue->history_idx) % HFI_HISTORY_SZ;
880                         a6xx_state->hfi_queue_history[i][j] = queue->history[idx];
881                 }
882         }
883 }
884
885 #define A6XX_GBIF_REGLIST_SIZE   1
886 static void a6xx_get_registers(struct msm_gpu *gpu,
887                 struct a6xx_gpu_state *a6xx_state,
888                 struct a6xx_crashdumper *dumper)
889 {
890         int i, count = ARRAY_SIZE(a6xx_ahb_reglist) +
891                 ARRAY_SIZE(a6xx_reglist) +
892                 ARRAY_SIZE(a6xx_hlsq_reglist) + A6XX_GBIF_REGLIST_SIZE;
893         int index = 0;
894         struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
895
896         a6xx_state->registers = state_kcalloc(a6xx_state,
897                 count, sizeof(*a6xx_state->registers));
898
899         if (!a6xx_state->registers)
900                 return;
901
902         a6xx_state->nr_registers = count;
903
904         for (i = 0; i < ARRAY_SIZE(a6xx_ahb_reglist); i++)
905                 a6xx_get_ahb_gpu_registers(gpu,
906                         a6xx_state, &a6xx_ahb_reglist[i],
907                         &a6xx_state->registers[index++]);
908
909         if (a6xx_has_gbif(adreno_gpu))
910                 a6xx_get_ahb_gpu_registers(gpu,
911                                 a6xx_state, &a6xx_gbif_reglist,
912                                 &a6xx_state->registers[index++]);
913         else
914                 a6xx_get_ahb_gpu_registers(gpu,
915                                 a6xx_state, &a6xx_vbif_reglist,
916                                 &a6xx_state->registers[index++]);
917         if (!dumper) {
918                 /*
919                  * We can't use the crashdumper when the SMMU is stalled,
920                  * because the GPU has no memory access until we resume
921                  * translation (but we don't want to do that until after
922                  * we have captured as much useful GPU state as possible).
923                  * So instead collect registers via the CPU:
924                  */
925                 for (i = 0; i < ARRAY_SIZE(a6xx_reglist); i++)
926                         a6xx_get_ahb_gpu_registers(gpu,
927                                 a6xx_state, &a6xx_reglist[i],
928                                 &a6xx_state->registers[index++]);
929                 return;
930         }
931
932         for (i = 0; i < ARRAY_SIZE(a6xx_reglist); i++)
933                 a6xx_get_crashdumper_registers(gpu,
934                         a6xx_state, &a6xx_reglist[i],
935                         &a6xx_state->registers[index++],
936                         dumper);
937
938         for (i = 0; i < ARRAY_SIZE(a6xx_hlsq_reglist); i++)
939                 a6xx_get_crashdumper_hlsq_registers(gpu,
940                         a6xx_state, &a6xx_hlsq_reglist[i],
941                         &a6xx_state->registers[index++],
942                         dumper);
943 }
944
945 static u32 a6xx_get_cp_roq_size(struct msm_gpu *gpu)
946 {
947         /* The value at [16:31] is in 4dword units. Convert it to dwords */
948         return gpu_read(gpu, REG_A6XX_CP_ROQ_THRESHOLDS_2) >> 14;
949 }
950
951 /* Read a block of data from an indexed register pair */
952 static void a6xx_get_indexed_regs(struct msm_gpu *gpu,
953                 struct a6xx_gpu_state *a6xx_state,
954                 struct a6xx_indexed_registers *indexed,
955                 struct a6xx_gpu_state_obj *obj)
956 {
957         int i;
958
959         obj->handle = (const void *) indexed;
960         if (indexed->count_fn)
961                 indexed->count = indexed->count_fn(gpu);
962
963         obj->data = state_kcalloc(a6xx_state, indexed->count, sizeof(u32));
964         if (!obj->data)
965                 return;
966
967         /* All the indexed banks start at address 0 */
968         gpu_write(gpu, indexed->addr, 0);
969
970         /* Read the data - each read increments the internal address by 1 */
971         for (i = 0; i < indexed->count; i++)
972                 obj->data[i] = gpu_read(gpu, indexed->data);
973 }
974
975 static void a6xx_get_indexed_registers(struct msm_gpu *gpu,
976                 struct a6xx_gpu_state *a6xx_state)
977 {
978         u32 mempool_size;
979         int count = ARRAY_SIZE(a6xx_indexed_reglist) + 1;
980         int i;
981
982         a6xx_state->indexed_regs = state_kcalloc(a6xx_state, count,
983                 sizeof(*a6xx_state->indexed_regs));
984         if (!a6xx_state->indexed_regs)
985                 return;
986
987         for (i = 0; i < ARRAY_SIZE(a6xx_indexed_reglist); i++)
988                 a6xx_get_indexed_regs(gpu, a6xx_state, &a6xx_indexed_reglist[i],
989                         &a6xx_state->indexed_regs[i]);
990
991         if (adreno_is_a650_family(to_adreno_gpu(gpu))) {
992                 u32 val;
993
994                 val = gpu_read(gpu, REG_A6XX_CP_CHICKEN_DBG);
995                 gpu_write(gpu, REG_A6XX_CP_CHICKEN_DBG, val | 4);
996
997                 /* Get the contents of the CP mempool */
998                 a6xx_get_indexed_regs(gpu, a6xx_state, &a6xx_cp_mempool_indexed,
999                         &a6xx_state->indexed_regs[i]);
1000
1001                 gpu_write(gpu, REG_A6XX_CP_CHICKEN_DBG, val);
1002                 a6xx_state->nr_indexed_regs = count;
1003                 return;
1004         }
1005
1006         /* Set the CP mempool size to 0 to stabilize it while dumping */
1007         mempool_size = gpu_read(gpu, REG_A6XX_CP_MEM_POOL_SIZE);
1008         gpu_write(gpu, REG_A6XX_CP_MEM_POOL_SIZE, 0);
1009
1010         /* Get the contents of the CP mempool */
1011         a6xx_get_indexed_regs(gpu, a6xx_state, &a6xx_cp_mempool_indexed,
1012                 &a6xx_state->indexed_regs[i]);
1013
1014         /*
1015          * Offset 0x2000 in the mempool is the size - copy the saved size over
1016          * so the data is consistent
1017          */
1018         a6xx_state->indexed_regs[i].data[0x2000] = mempool_size;
1019
1020         /* Restore the size in the hardware */
1021         gpu_write(gpu, REG_A6XX_CP_MEM_POOL_SIZE, mempool_size);
1022
1023         a6xx_state->nr_indexed_regs = count;
1024 }
1025
1026 struct msm_gpu_state *a6xx_gpu_state_get(struct msm_gpu *gpu)
1027 {
1028         struct a6xx_crashdumper _dumper = { 0 }, *dumper = NULL;
1029         struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
1030         struct a6xx_gpu *a6xx_gpu = to_a6xx_gpu(adreno_gpu);
1031         struct a6xx_gpu_state *a6xx_state = kzalloc(sizeof(*a6xx_state),
1032                 GFP_KERNEL);
1033         bool stalled = !!(gpu_read(gpu, REG_A6XX_RBBM_STATUS3) &
1034                         A6XX_RBBM_STATUS3_SMMU_STALLED_ON_FAULT);
1035
1036         if (!a6xx_state)
1037                 return ERR_PTR(-ENOMEM);
1038
1039         INIT_LIST_HEAD(&a6xx_state->objs);
1040
1041         /* Get the generic state from the adreno core */
1042         adreno_gpu_state_get(gpu, &a6xx_state->base);
1043
1044         a6xx_get_gmu_registers(gpu, a6xx_state);
1045
1046         a6xx_state->gmu_log = a6xx_snapshot_gmu_bo(a6xx_state, &a6xx_gpu->gmu.log);
1047         a6xx_state->gmu_hfi = a6xx_snapshot_gmu_bo(a6xx_state, &a6xx_gpu->gmu.hfi);
1048         a6xx_state->gmu_debug = a6xx_snapshot_gmu_bo(a6xx_state, &a6xx_gpu->gmu.debug);
1049
1050         a6xx_snapshot_gmu_hfi_history(gpu, a6xx_state);
1051
1052         /* If GX isn't on the rest of the data isn't going to be accessible */
1053         if (!a6xx_gmu_gx_is_on(&a6xx_gpu->gmu))
1054                 return &a6xx_state->base;
1055
1056         /* Get the banks of indexed registers */
1057         a6xx_get_indexed_registers(gpu, a6xx_state);
1058
1059         /*
1060          * Try to initialize the crashdumper, if we are not dumping state
1061          * with the SMMU stalled.  The crashdumper needs memory access to
1062          * write out GPU state, so we need to skip this when the SMMU is
1063          * stalled in response to an iova fault
1064          */
1065         if (!stalled && !gpu->needs_hw_init &&
1066             !a6xx_crashdumper_init(gpu, &_dumper)) {
1067                 dumper = &_dumper;
1068         }
1069
1070         a6xx_get_registers(gpu, a6xx_state, dumper);
1071
1072         if (dumper) {
1073                 a6xx_get_shaders(gpu, a6xx_state, dumper);
1074                 a6xx_get_clusters(gpu, a6xx_state, dumper);
1075                 a6xx_get_dbgahb_clusters(gpu, a6xx_state, dumper);
1076
1077                 msm_gem_kernel_put(dumper->bo, gpu->aspace);
1078         }
1079
1080         if (snapshot_debugbus)
1081                 a6xx_get_debugbus(gpu, a6xx_state);
1082
1083         a6xx_state->gpu_initialized = !gpu->needs_hw_init;
1084
1085         return  &a6xx_state->base;
1086 }
1087
1088 static void a6xx_gpu_state_destroy(struct kref *kref)
1089 {
1090         struct a6xx_state_memobj *obj, *tmp;
1091         struct msm_gpu_state *state = container_of(kref,
1092                         struct msm_gpu_state, ref);
1093         struct a6xx_gpu_state *a6xx_state = container_of(state,
1094                         struct a6xx_gpu_state, base);
1095
1096         if (a6xx_state->gmu_log)
1097                 kvfree(a6xx_state->gmu_log->data);
1098
1099         if (a6xx_state->gmu_hfi)
1100                 kvfree(a6xx_state->gmu_hfi->data);
1101
1102         if (a6xx_state->gmu_debug)
1103                 kvfree(a6xx_state->gmu_debug->data);
1104
1105         list_for_each_entry_safe(obj, tmp, &a6xx_state->objs, node) {
1106                 list_del(&obj->node);
1107                 kvfree(obj);
1108         }
1109
1110         adreno_gpu_state_destroy(state);
1111         kfree(a6xx_state);
1112 }
1113
1114 int a6xx_gpu_state_put(struct msm_gpu_state *state)
1115 {
1116         if (IS_ERR_OR_NULL(state))
1117                 return 1;
1118
1119         return kref_put(&state->ref, a6xx_gpu_state_destroy);
1120 }
1121
1122 static void a6xx_show_registers(const u32 *registers, u32 *data, size_t count,
1123                 struct drm_printer *p)
1124 {
1125         int i, index = 0;
1126
1127         if (!data)
1128                 return;
1129
1130         for (i = 0; i < count; i += 2) {
1131                 u32 count = RANGE(registers, i);
1132                 u32 offset = registers[i];
1133                 int j;
1134
1135                 for (j = 0; j < count; index++, offset++, j++) {
1136                         if (data[index] == 0xdeafbead)
1137                                 continue;
1138
1139                         drm_printf(p, "  - { offset: 0x%06x, value: 0x%08x }\n",
1140                                 offset << 2, data[index]);
1141                 }
1142         }
1143 }
1144
1145 static void print_ascii85(struct drm_printer *p, size_t len, u32 *data)
1146 {
1147         char out[ASCII85_BUFSZ];
1148         long i, l, datalen = 0;
1149
1150         for (i = 0; i < len >> 2; i++) {
1151                 if (data[i])
1152                         datalen = (i + 1) << 2;
1153         }
1154
1155         if (datalen == 0)
1156                 return;
1157
1158         drm_puts(p, "    data: !!ascii85 |\n");
1159         drm_puts(p, "      ");
1160
1161
1162         l = ascii85_encode_len(datalen);
1163
1164         for (i = 0; i < l; i++)
1165                 drm_puts(p, ascii85_encode(data[i], out));
1166
1167         drm_puts(p, "\n");
1168 }
1169
1170 static void print_name(struct drm_printer *p, const char *fmt, const char *name)
1171 {
1172         drm_puts(p, fmt);
1173         drm_puts(p, name);
1174         drm_puts(p, "\n");
1175 }
1176
1177 static void a6xx_show_shader(struct a6xx_gpu_state_obj *obj,
1178                 struct drm_printer *p)
1179 {
1180         const struct a6xx_shader_block *block = obj->handle;
1181         int i;
1182
1183         if (!obj->handle)
1184                 return;
1185
1186         print_name(p, "  - type: ", block->name);
1187
1188         for (i = 0; i < A6XX_NUM_SHADER_BANKS; i++) {
1189                 drm_printf(p, "    - bank: %d\n", i);
1190                 drm_printf(p, "      size: %d\n", block->size);
1191
1192                 if (!obj->data)
1193                         continue;
1194
1195                 print_ascii85(p, block->size << 2,
1196                         obj->data + (block->size * i));
1197         }
1198 }
1199
1200 static void a6xx_show_cluster_data(const u32 *registers, int size, u32 *data,
1201                 struct drm_printer *p)
1202 {
1203         int ctx, index = 0;
1204
1205         for (ctx = 0; ctx < A6XX_NUM_CONTEXTS; ctx++) {
1206                 int j;
1207
1208                 drm_printf(p, "    - context: %d\n", ctx);
1209
1210                 for (j = 0; j < size; j += 2) {
1211                         u32 count = RANGE(registers, j);
1212                         u32 offset = registers[j];
1213                         int k;
1214
1215                         for (k = 0; k < count; index++, offset++, k++) {
1216                                 if (data[index] == 0xdeafbead)
1217                                         continue;
1218
1219                                 drm_printf(p, "      - { offset: 0x%06x, value: 0x%08x }\n",
1220                                         offset << 2, data[index]);
1221                         }
1222                 }
1223         }
1224 }
1225
1226 static void a6xx_show_dbgahb_cluster(struct a6xx_gpu_state_obj *obj,
1227                 struct drm_printer *p)
1228 {
1229         const struct a6xx_dbgahb_cluster *dbgahb = obj->handle;
1230
1231         if (dbgahb) {
1232                 print_name(p, "  - cluster-name: ", dbgahb->name);
1233                 a6xx_show_cluster_data(dbgahb->registers, dbgahb->count,
1234                         obj->data, p);
1235         }
1236 }
1237
1238 static void a6xx_show_cluster(struct a6xx_gpu_state_obj *obj,
1239                 struct drm_printer *p)
1240 {
1241         const struct a6xx_cluster *cluster = obj->handle;
1242
1243         if (cluster) {
1244                 print_name(p, "  - cluster-name: ", cluster->name);
1245                 a6xx_show_cluster_data(cluster->registers, cluster->count,
1246                         obj->data, p);
1247         }
1248 }
1249
1250 static void a6xx_show_indexed_regs(struct a6xx_gpu_state_obj *obj,
1251                 struct drm_printer *p)
1252 {
1253         const struct a6xx_indexed_registers *indexed = obj->handle;
1254
1255         if (!indexed)
1256                 return;
1257
1258         print_name(p, "  - regs-name: ", indexed->name);
1259         drm_printf(p, "    dwords: %d\n", indexed->count);
1260
1261         print_ascii85(p, indexed->count << 2, obj->data);
1262 }
1263
1264 static void a6xx_show_debugbus_block(const struct a6xx_debugbus_block *block,
1265                 u32 *data, struct drm_printer *p)
1266 {
1267         if (block) {
1268                 print_name(p, "  - debugbus-block: ", block->name);
1269
1270                 /*
1271                  * count for regular debugbus data is in quadwords,
1272                  * but print the size in dwords for consistency
1273                  */
1274                 drm_printf(p, "    count: %d\n", block->count << 1);
1275
1276                 print_ascii85(p, block->count << 3, data);
1277         }
1278 }
1279
1280 static void a6xx_show_debugbus(struct a6xx_gpu_state *a6xx_state,
1281                 struct drm_printer *p)
1282 {
1283         int i;
1284
1285         for (i = 0; i < a6xx_state->nr_debugbus; i++) {
1286                 struct a6xx_gpu_state_obj *obj = &a6xx_state->debugbus[i];
1287
1288                 a6xx_show_debugbus_block(obj->handle, obj->data, p);
1289         }
1290
1291         if (a6xx_state->vbif_debugbus) {
1292                 struct a6xx_gpu_state_obj *obj = a6xx_state->vbif_debugbus;
1293
1294                 drm_puts(p, "  - debugbus-block: A6XX_DBGBUS_VBIF\n");
1295                 drm_printf(p, "    count: %d\n", VBIF_DEBUGBUS_BLOCK_SIZE);
1296
1297                 /* vbif debugbus data is in dwords.  Confusing, huh? */
1298                 print_ascii85(p, VBIF_DEBUGBUS_BLOCK_SIZE << 2, obj->data);
1299         }
1300
1301         for (i = 0; i < a6xx_state->nr_cx_debugbus; i++) {
1302                 struct a6xx_gpu_state_obj *obj = &a6xx_state->cx_debugbus[i];
1303
1304                 a6xx_show_debugbus_block(obj->handle, obj->data, p);
1305         }
1306 }
1307
1308 void a6xx_show(struct msm_gpu *gpu, struct msm_gpu_state *state,
1309                 struct drm_printer *p)
1310 {
1311         struct a6xx_gpu_state *a6xx_state = container_of(state,
1312                         struct a6xx_gpu_state, base);
1313         int i;
1314
1315         if (IS_ERR_OR_NULL(state))
1316                 return;
1317
1318         drm_printf(p, "gpu-initialized: %d\n", a6xx_state->gpu_initialized);
1319
1320         adreno_show(gpu, state, p);
1321
1322         drm_puts(p, "gmu-log:\n");
1323         if (a6xx_state->gmu_log) {
1324                 struct msm_gpu_state_bo *gmu_log = a6xx_state->gmu_log;
1325
1326                 drm_printf(p, "    iova: 0x%016llx\n", gmu_log->iova);
1327                 drm_printf(p, "    size: %zu\n", gmu_log->size);
1328                 adreno_show_object(p, &gmu_log->data, gmu_log->size,
1329                                 &gmu_log->encoded);
1330         }
1331
1332         drm_puts(p, "gmu-hfi:\n");
1333         if (a6xx_state->gmu_hfi) {
1334                 struct msm_gpu_state_bo *gmu_hfi = a6xx_state->gmu_hfi;
1335                 unsigned i, j;
1336
1337                 drm_printf(p, "    iova: 0x%016llx\n", gmu_hfi->iova);
1338                 drm_printf(p, "    size: %zu\n", gmu_hfi->size);
1339                 for (i = 0; i < ARRAY_SIZE(a6xx_state->hfi_queue_history); i++) {
1340                         drm_printf(p, "    queue-history[%u]:", i);
1341                         for (j = 0; j < HFI_HISTORY_SZ; j++) {
1342                                 drm_printf(p, " %d", a6xx_state->hfi_queue_history[i][j]);
1343                         }
1344                         drm_printf(p, "\n");
1345                 }
1346                 adreno_show_object(p, &gmu_hfi->data, gmu_hfi->size,
1347                                 &gmu_hfi->encoded);
1348         }
1349
1350         drm_puts(p, "gmu-debug:\n");
1351         if (a6xx_state->gmu_debug) {
1352                 struct msm_gpu_state_bo *gmu_debug = a6xx_state->gmu_debug;
1353
1354                 drm_printf(p, "    iova: 0x%016llx\n", gmu_debug->iova);
1355                 drm_printf(p, "    size: %zu\n", gmu_debug->size);
1356                 adreno_show_object(p, &gmu_debug->data, gmu_debug->size,
1357                                 &gmu_debug->encoded);
1358         }
1359
1360         drm_puts(p, "registers:\n");
1361         for (i = 0; i < a6xx_state->nr_registers; i++) {
1362                 struct a6xx_gpu_state_obj *obj = &a6xx_state->registers[i];
1363                 const struct a6xx_registers *regs = obj->handle;
1364
1365                 if (!obj->handle)
1366                         continue;
1367
1368                 a6xx_show_registers(regs->registers, obj->data, regs->count, p);
1369         }
1370
1371         drm_puts(p, "registers-gmu:\n");
1372         for (i = 0; i < a6xx_state->nr_gmu_registers; i++) {
1373                 struct a6xx_gpu_state_obj *obj = &a6xx_state->gmu_registers[i];
1374                 const struct a6xx_registers *regs = obj->handle;
1375
1376                 if (!obj->handle)
1377                         continue;
1378
1379                 a6xx_show_registers(regs->registers, obj->data, regs->count, p);
1380         }
1381
1382         drm_puts(p, "indexed-registers:\n");
1383         for (i = 0; i < a6xx_state->nr_indexed_regs; i++)
1384                 a6xx_show_indexed_regs(&a6xx_state->indexed_regs[i], p);
1385
1386         drm_puts(p, "shader-blocks:\n");
1387         for (i = 0; i < a6xx_state->nr_shaders; i++)
1388                 a6xx_show_shader(&a6xx_state->shaders[i], p);
1389
1390         drm_puts(p, "clusters:\n");
1391         for (i = 0; i < a6xx_state->nr_clusters; i++)
1392                 a6xx_show_cluster(&a6xx_state->clusters[i], p);
1393
1394         for (i = 0; i < a6xx_state->nr_dbgahb_clusters; i++)
1395                 a6xx_show_dbgahb_cluster(&a6xx_state->dbgahb_clusters[i], p);
1396
1397         drm_puts(p, "debugbus:\n");
1398         a6xx_show_debugbus(a6xx_state, p);
1399 }
This page took 0.121488 seconds and 4 git commands to generate.