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