]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blob - drivers/gpu/drm/msm/adreno/a5xx_gpu.c
mtd: nand: atmel: Relax tADL_min constraint
[mirror_ubuntu-artful-kernel.git] / drivers / gpu / drm / msm / adreno / a5xx_gpu.c
1 /* Copyright (c) 2016-2017 The Linux Foundation. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 */
13
14 #include <linux/types.h>
15 #include <linux/cpumask.h>
16 #include <linux/qcom_scm.h>
17 #include <linux/dma-mapping.h>
18 #include <linux/of_reserved_mem.h>
19 #include <linux/soc/qcom/mdt_loader.h>
20 #include "msm_gem.h"
21 #include "msm_mmu.h"
22 #include "a5xx_gpu.h"
23
24 extern bool hang_debug;
25 static void a5xx_dump(struct msm_gpu *gpu);
26
27 #define GPU_PAS_ID 13
28
29 #if IS_ENABLED(CONFIG_QCOM_MDT_LOADER)
30
31 static int zap_shader_load_mdt(struct device *dev, const char *fwname)
32 {
33 const struct firmware *fw;
34 phys_addr_t mem_phys;
35 ssize_t mem_size;
36 void *mem_region = NULL;
37 int ret;
38
39 /* Request the MDT file for the firmware */
40 ret = request_firmware(&fw, fwname, dev);
41 if (ret) {
42 DRM_DEV_ERROR(dev, "Unable to load %s\n", fwname);
43 return ret;
44 }
45
46 /* Figure out how much memory we need */
47 mem_size = qcom_mdt_get_size(fw);
48 if (mem_size < 0) {
49 ret = mem_size;
50 goto out;
51 }
52
53 /* Allocate memory for the firmware image */
54 mem_region = dmam_alloc_coherent(dev, mem_size, &mem_phys, GFP_KERNEL);
55 if (!mem_region) {
56 ret = -ENOMEM;
57 goto out;
58 }
59
60 /* Load the rest of the MDT */
61 ret = qcom_mdt_load(dev, fw, fwname, GPU_PAS_ID, mem_region, mem_phys,
62 mem_size);
63 if (ret)
64 goto out;
65
66 /* Send the image to the secure world */
67 ret = qcom_scm_pas_auth_and_reset(GPU_PAS_ID);
68 if (ret)
69 DRM_DEV_ERROR(dev, "Unable to authorize the image\n");
70
71 out:
72 release_firmware(fw);
73
74 return ret;
75 }
76 #else
77 static int zap_shader_load_mdt(struct device *dev, const char *fwname)
78 {
79 return -ENODEV;
80 }
81 #endif
82
83 static void a5xx_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit,
84 struct msm_file_private *ctx)
85 {
86 struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
87 struct msm_drm_private *priv = gpu->dev->dev_private;
88 struct msm_ringbuffer *ring = gpu->rb;
89 unsigned int i, ibs = 0;
90
91 for (i = 0; i < submit->nr_cmds; i++) {
92 switch (submit->cmd[i].type) {
93 case MSM_SUBMIT_CMD_IB_TARGET_BUF:
94 break;
95 case MSM_SUBMIT_CMD_CTX_RESTORE_BUF:
96 if (priv->lastctx == ctx)
97 break;
98 case MSM_SUBMIT_CMD_BUF:
99 OUT_PKT7(ring, CP_INDIRECT_BUFFER_PFE, 3);
100 OUT_RING(ring, lower_32_bits(submit->cmd[i].iova));
101 OUT_RING(ring, upper_32_bits(submit->cmd[i].iova));
102 OUT_RING(ring, submit->cmd[i].size);
103 ibs++;
104 break;
105 }
106 }
107
108 OUT_PKT4(ring, REG_A5XX_CP_SCRATCH_REG(2), 1);
109 OUT_RING(ring, submit->fence->seqno);
110
111 OUT_PKT7(ring, CP_EVENT_WRITE, 4);
112 OUT_RING(ring, CACHE_FLUSH_TS | (1 << 31));
113 OUT_RING(ring, lower_32_bits(rbmemptr(adreno_gpu, fence)));
114 OUT_RING(ring, upper_32_bits(rbmemptr(adreno_gpu, fence)));
115 OUT_RING(ring, submit->fence->seqno);
116
117 gpu->funcs->flush(gpu);
118 }
119
120 struct a5xx_hwcg {
121 u32 offset;
122 u32 value;
123 };
124
125 static const struct a5xx_hwcg a530_hwcg[] = {
126 {REG_A5XX_RBBM_CLOCK_CNTL_SP0, 0x02222222},
127 {REG_A5XX_RBBM_CLOCK_CNTL_SP1, 0x02222222},
128 {REG_A5XX_RBBM_CLOCK_CNTL_SP2, 0x02222222},
129 {REG_A5XX_RBBM_CLOCK_CNTL_SP3, 0x02222222},
130 {REG_A5XX_RBBM_CLOCK_CNTL2_SP0, 0x02222220},
131 {REG_A5XX_RBBM_CLOCK_CNTL2_SP1, 0x02222220},
132 {REG_A5XX_RBBM_CLOCK_CNTL2_SP2, 0x02222220},
133 {REG_A5XX_RBBM_CLOCK_CNTL2_SP3, 0x02222220},
134 {REG_A5XX_RBBM_CLOCK_HYST_SP0, 0x0000F3CF},
135 {REG_A5XX_RBBM_CLOCK_HYST_SP1, 0x0000F3CF},
136 {REG_A5XX_RBBM_CLOCK_HYST_SP2, 0x0000F3CF},
137 {REG_A5XX_RBBM_CLOCK_HYST_SP3, 0x0000F3CF},
138 {REG_A5XX_RBBM_CLOCK_DELAY_SP0, 0x00000080},
139 {REG_A5XX_RBBM_CLOCK_DELAY_SP1, 0x00000080},
140 {REG_A5XX_RBBM_CLOCK_DELAY_SP2, 0x00000080},
141 {REG_A5XX_RBBM_CLOCK_DELAY_SP3, 0x00000080},
142 {REG_A5XX_RBBM_CLOCK_CNTL_TP0, 0x22222222},
143 {REG_A5XX_RBBM_CLOCK_CNTL_TP1, 0x22222222},
144 {REG_A5XX_RBBM_CLOCK_CNTL_TP2, 0x22222222},
145 {REG_A5XX_RBBM_CLOCK_CNTL_TP3, 0x22222222},
146 {REG_A5XX_RBBM_CLOCK_CNTL2_TP0, 0x22222222},
147 {REG_A5XX_RBBM_CLOCK_CNTL2_TP1, 0x22222222},
148 {REG_A5XX_RBBM_CLOCK_CNTL2_TP2, 0x22222222},
149 {REG_A5XX_RBBM_CLOCK_CNTL2_TP3, 0x22222222},
150 {REG_A5XX_RBBM_CLOCK_CNTL3_TP0, 0x00002222},
151 {REG_A5XX_RBBM_CLOCK_CNTL3_TP1, 0x00002222},
152 {REG_A5XX_RBBM_CLOCK_CNTL3_TP2, 0x00002222},
153 {REG_A5XX_RBBM_CLOCK_CNTL3_TP3, 0x00002222},
154 {REG_A5XX_RBBM_CLOCK_HYST_TP0, 0x77777777},
155 {REG_A5XX_RBBM_CLOCK_HYST_TP1, 0x77777777},
156 {REG_A5XX_RBBM_CLOCK_HYST_TP2, 0x77777777},
157 {REG_A5XX_RBBM_CLOCK_HYST_TP3, 0x77777777},
158 {REG_A5XX_RBBM_CLOCK_HYST2_TP0, 0x77777777},
159 {REG_A5XX_RBBM_CLOCK_HYST2_TP1, 0x77777777},
160 {REG_A5XX_RBBM_CLOCK_HYST2_TP2, 0x77777777},
161 {REG_A5XX_RBBM_CLOCK_HYST2_TP3, 0x77777777},
162 {REG_A5XX_RBBM_CLOCK_HYST3_TP0, 0x00007777},
163 {REG_A5XX_RBBM_CLOCK_HYST3_TP1, 0x00007777},
164 {REG_A5XX_RBBM_CLOCK_HYST3_TP2, 0x00007777},
165 {REG_A5XX_RBBM_CLOCK_HYST3_TP3, 0x00007777},
166 {REG_A5XX_RBBM_CLOCK_DELAY_TP0, 0x11111111},
167 {REG_A5XX_RBBM_CLOCK_DELAY_TP1, 0x11111111},
168 {REG_A5XX_RBBM_CLOCK_DELAY_TP2, 0x11111111},
169 {REG_A5XX_RBBM_CLOCK_DELAY_TP3, 0x11111111},
170 {REG_A5XX_RBBM_CLOCK_DELAY2_TP0, 0x11111111},
171 {REG_A5XX_RBBM_CLOCK_DELAY2_TP1, 0x11111111},
172 {REG_A5XX_RBBM_CLOCK_DELAY2_TP2, 0x11111111},
173 {REG_A5XX_RBBM_CLOCK_DELAY2_TP3, 0x11111111},
174 {REG_A5XX_RBBM_CLOCK_DELAY3_TP0, 0x00001111},
175 {REG_A5XX_RBBM_CLOCK_DELAY3_TP1, 0x00001111},
176 {REG_A5XX_RBBM_CLOCK_DELAY3_TP2, 0x00001111},
177 {REG_A5XX_RBBM_CLOCK_DELAY3_TP3, 0x00001111},
178 {REG_A5XX_RBBM_CLOCK_CNTL_UCHE, 0x22222222},
179 {REG_A5XX_RBBM_CLOCK_CNTL2_UCHE, 0x22222222},
180 {REG_A5XX_RBBM_CLOCK_CNTL3_UCHE, 0x22222222},
181 {REG_A5XX_RBBM_CLOCK_CNTL4_UCHE, 0x00222222},
182 {REG_A5XX_RBBM_CLOCK_HYST_UCHE, 0x00444444},
183 {REG_A5XX_RBBM_CLOCK_DELAY_UCHE, 0x00000002},
184 {REG_A5XX_RBBM_CLOCK_CNTL_RB0, 0x22222222},
185 {REG_A5XX_RBBM_CLOCK_CNTL_RB1, 0x22222222},
186 {REG_A5XX_RBBM_CLOCK_CNTL_RB2, 0x22222222},
187 {REG_A5XX_RBBM_CLOCK_CNTL_RB3, 0x22222222},
188 {REG_A5XX_RBBM_CLOCK_CNTL2_RB0, 0x00222222},
189 {REG_A5XX_RBBM_CLOCK_CNTL2_RB1, 0x00222222},
190 {REG_A5XX_RBBM_CLOCK_CNTL2_RB2, 0x00222222},
191 {REG_A5XX_RBBM_CLOCK_CNTL2_RB3, 0x00222222},
192 {REG_A5XX_RBBM_CLOCK_CNTL_CCU0, 0x00022220},
193 {REG_A5XX_RBBM_CLOCK_CNTL_CCU1, 0x00022220},
194 {REG_A5XX_RBBM_CLOCK_CNTL_CCU2, 0x00022220},
195 {REG_A5XX_RBBM_CLOCK_CNTL_CCU3, 0x00022220},
196 {REG_A5XX_RBBM_CLOCK_CNTL_RAC, 0x05522222},
197 {REG_A5XX_RBBM_CLOCK_CNTL2_RAC, 0x00505555},
198 {REG_A5XX_RBBM_CLOCK_HYST_RB_CCU0, 0x04040404},
199 {REG_A5XX_RBBM_CLOCK_HYST_RB_CCU1, 0x04040404},
200 {REG_A5XX_RBBM_CLOCK_HYST_RB_CCU2, 0x04040404},
201 {REG_A5XX_RBBM_CLOCK_HYST_RB_CCU3, 0x04040404},
202 {REG_A5XX_RBBM_CLOCK_HYST_RAC, 0x07444044},
203 {REG_A5XX_RBBM_CLOCK_DELAY_RB_CCU_L1_0, 0x00000002},
204 {REG_A5XX_RBBM_CLOCK_DELAY_RB_CCU_L1_1, 0x00000002},
205 {REG_A5XX_RBBM_CLOCK_DELAY_RB_CCU_L1_2, 0x00000002},
206 {REG_A5XX_RBBM_CLOCK_DELAY_RB_CCU_L1_3, 0x00000002},
207 {REG_A5XX_RBBM_CLOCK_DELAY_RAC, 0x00010011},
208 {REG_A5XX_RBBM_CLOCK_CNTL_TSE_RAS_RBBM, 0x04222222},
209 {REG_A5XX_RBBM_CLOCK_MODE_GPC, 0x02222222},
210 {REG_A5XX_RBBM_CLOCK_MODE_VFD, 0x00002222},
211 {REG_A5XX_RBBM_CLOCK_HYST_TSE_RAS_RBBM, 0x00000000},
212 {REG_A5XX_RBBM_CLOCK_HYST_GPC, 0x04104004},
213 {REG_A5XX_RBBM_CLOCK_HYST_VFD, 0x00000000},
214 {REG_A5XX_RBBM_CLOCK_DELAY_HLSQ, 0x00000000},
215 {REG_A5XX_RBBM_CLOCK_DELAY_TSE_RAS_RBBM, 0x00004000},
216 {REG_A5XX_RBBM_CLOCK_DELAY_GPC, 0x00000200},
217 {REG_A5XX_RBBM_CLOCK_DELAY_VFD, 0x00002222}
218 };
219
220 static const struct {
221 int (*test)(struct adreno_gpu *gpu);
222 const struct a5xx_hwcg *regs;
223 unsigned int count;
224 } a5xx_hwcg_regs[] = {
225 { adreno_is_a530, a530_hwcg, ARRAY_SIZE(a530_hwcg), },
226 };
227
228 static void _a5xx_enable_hwcg(struct msm_gpu *gpu,
229 const struct a5xx_hwcg *regs, unsigned int count)
230 {
231 unsigned int i;
232
233 for (i = 0; i < count; i++)
234 gpu_write(gpu, regs[i].offset, regs[i].value);
235
236 gpu_write(gpu, REG_A5XX_RBBM_CLOCK_CNTL, 0xAAA8AA00);
237 gpu_write(gpu, REG_A5XX_RBBM_ISDB_CNT, 0x182);
238 }
239
240 static void a5xx_enable_hwcg(struct msm_gpu *gpu)
241 {
242 struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
243 unsigned int i;
244
245 for (i = 0; i < ARRAY_SIZE(a5xx_hwcg_regs); i++) {
246 if (a5xx_hwcg_regs[i].test(adreno_gpu)) {
247 _a5xx_enable_hwcg(gpu, a5xx_hwcg_regs[i].regs,
248 a5xx_hwcg_regs[i].count);
249 return;
250 }
251 }
252 }
253
254 static int a5xx_me_init(struct msm_gpu *gpu)
255 {
256 struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
257 struct msm_ringbuffer *ring = gpu->rb;
258
259 OUT_PKT7(ring, CP_ME_INIT, 8);
260
261 OUT_RING(ring, 0x0000002F);
262
263 /* Enable multiple hardware contexts */
264 OUT_RING(ring, 0x00000003);
265
266 /* Enable error detection */
267 OUT_RING(ring, 0x20000000);
268
269 /* Don't enable header dump */
270 OUT_RING(ring, 0x00000000);
271 OUT_RING(ring, 0x00000000);
272
273 /* Specify workarounds for various microcode issues */
274 if (adreno_is_a530(adreno_gpu)) {
275 /* Workaround for token end syncs
276 * Force a WFI after every direct-render 3D mode draw and every
277 * 2D mode 3 draw
278 */
279 OUT_RING(ring, 0x0000000B);
280 } else {
281 /* No workarounds enabled */
282 OUT_RING(ring, 0x00000000);
283 }
284
285 OUT_RING(ring, 0x00000000);
286 OUT_RING(ring, 0x00000000);
287
288 gpu->funcs->flush(gpu);
289
290 return a5xx_idle(gpu) ? 0 : -EINVAL;
291 }
292
293 static struct drm_gem_object *a5xx_ucode_load_bo(struct msm_gpu *gpu,
294 const struct firmware *fw, u64 *iova)
295 {
296 struct drm_device *drm = gpu->dev;
297 struct drm_gem_object *bo;
298 void *ptr;
299
300 bo = msm_gem_new_locked(drm, fw->size - 4, MSM_BO_UNCACHED);
301 if (IS_ERR(bo))
302 return bo;
303
304 ptr = msm_gem_get_vaddr(bo);
305 if (!ptr) {
306 drm_gem_object_unreference(bo);
307 return ERR_PTR(-ENOMEM);
308 }
309
310 if (iova) {
311 int ret = msm_gem_get_iova(bo, gpu->aspace, iova);
312
313 if (ret) {
314 drm_gem_object_unreference(bo);
315 return ERR_PTR(ret);
316 }
317 }
318
319 memcpy(ptr, &fw->data[4], fw->size - 4);
320
321 msm_gem_put_vaddr(bo);
322 return bo;
323 }
324
325 static int a5xx_ucode_init(struct msm_gpu *gpu)
326 {
327 struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
328 struct a5xx_gpu *a5xx_gpu = to_a5xx_gpu(adreno_gpu);
329 int ret;
330
331 if (!a5xx_gpu->pm4_bo) {
332 a5xx_gpu->pm4_bo = a5xx_ucode_load_bo(gpu, adreno_gpu->pm4,
333 &a5xx_gpu->pm4_iova);
334
335 if (IS_ERR(a5xx_gpu->pm4_bo)) {
336 ret = PTR_ERR(a5xx_gpu->pm4_bo);
337 a5xx_gpu->pm4_bo = NULL;
338 dev_err(gpu->dev->dev, "could not allocate PM4: %d\n",
339 ret);
340 return ret;
341 }
342 }
343
344 if (!a5xx_gpu->pfp_bo) {
345 a5xx_gpu->pfp_bo = a5xx_ucode_load_bo(gpu, adreno_gpu->pfp,
346 &a5xx_gpu->pfp_iova);
347
348 if (IS_ERR(a5xx_gpu->pfp_bo)) {
349 ret = PTR_ERR(a5xx_gpu->pfp_bo);
350 a5xx_gpu->pfp_bo = NULL;
351 dev_err(gpu->dev->dev, "could not allocate PFP: %d\n",
352 ret);
353 return ret;
354 }
355 }
356
357 gpu_write64(gpu, REG_A5XX_CP_ME_INSTR_BASE_LO,
358 REG_A5XX_CP_ME_INSTR_BASE_HI, a5xx_gpu->pm4_iova);
359
360 gpu_write64(gpu, REG_A5XX_CP_PFP_INSTR_BASE_LO,
361 REG_A5XX_CP_PFP_INSTR_BASE_HI, a5xx_gpu->pfp_iova);
362
363 return 0;
364 }
365
366 #define SCM_GPU_ZAP_SHADER_RESUME 0
367
368 static int a5xx_zap_shader_resume(struct msm_gpu *gpu)
369 {
370 int ret;
371
372 ret = qcom_scm_set_remote_state(SCM_GPU_ZAP_SHADER_RESUME, GPU_PAS_ID);
373 if (ret)
374 DRM_ERROR("%s: zap-shader resume failed: %d\n",
375 gpu->name, ret);
376
377 return ret;
378 }
379
380 /* Set up a child device to "own" the zap shader */
381 static int a5xx_zap_shader_dev_init(struct device *parent, struct device *dev)
382 {
383 struct device_node *node;
384 int ret;
385
386 if (dev->parent)
387 return 0;
388
389 /* Find the sub-node for the zap shader */
390 node = of_get_child_by_name(parent->of_node, "zap-shader");
391 if (!node) {
392 DRM_DEV_ERROR(parent, "zap-shader not found in device tree\n");
393 return -ENODEV;
394 }
395
396 dev->parent = parent;
397 dev->of_node = node;
398 dev_set_name(dev, "adreno_zap_shader");
399
400 ret = device_register(dev);
401 if (ret) {
402 DRM_DEV_ERROR(parent, "Couldn't register zap shader device\n");
403 goto out;
404 }
405
406 ret = of_reserved_mem_device_init(dev);
407 if (ret) {
408 DRM_DEV_ERROR(parent, "Unable to set up the reserved memory\n");
409 device_unregister(dev);
410 }
411
412 out:
413 if (ret)
414 dev->parent = NULL;
415
416 return ret;
417 }
418
419 static int a5xx_zap_shader_init(struct msm_gpu *gpu)
420 {
421 static bool loaded;
422 struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
423 struct a5xx_gpu *a5xx_gpu = to_a5xx_gpu(adreno_gpu);
424 struct platform_device *pdev = a5xx_gpu->pdev;
425 int ret;
426
427 /*
428 * If the zap shader is already loaded into memory we just need to kick
429 * the remote processor to reinitialize it
430 */
431 if (loaded)
432 return a5xx_zap_shader_resume(gpu);
433
434 /* We need SCM to be able to load the firmware */
435 if (!qcom_scm_is_available()) {
436 DRM_DEV_ERROR(&pdev->dev, "SCM is not available\n");
437 return -EPROBE_DEFER;
438 }
439
440 /* Each GPU has a target specific zap shader firmware name to use */
441 if (!adreno_gpu->info->zapfw) {
442 DRM_DEV_ERROR(&pdev->dev,
443 "Zap shader firmware file not specified for this target\n");
444 return -ENODEV;
445 }
446
447 ret = a5xx_zap_shader_dev_init(&pdev->dev, &a5xx_gpu->zap_dev);
448
449 if (!ret)
450 ret = zap_shader_load_mdt(&a5xx_gpu->zap_dev,
451 adreno_gpu->info->zapfw);
452
453 loaded = !ret;
454
455 return ret;
456 }
457
458 #define A5XX_INT_MASK (A5XX_RBBM_INT_0_MASK_RBBM_AHB_ERROR | \
459 A5XX_RBBM_INT_0_MASK_RBBM_TRANSFER_TIMEOUT | \
460 A5XX_RBBM_INT_0_MASK_RBBM_ME_MS_TIMEOUT | \
461 A5XX_RBBM_INT_0_MASK_RBBM_PFP_MS_TIMEOUT | \
462 A5XX_RBBM_INT_0_MASK_RBBM_ETS_MS_TIMEOUT | \
463 A5XX_RBBM_INT_0_MASK_RBBM_ATB_ASYNC_OVERFLOW | \
464 A5XX_RBBM_INT_0_MASK_CP_HW_ERROR | \
465 A5XX_RBBM_INT_0_MASK_CP_CACHE_FLUSH_TS | \
466 A5XX_RBBM_INT_0_MASK_UCHE_OOB_ACCESS | \
467 A5XX_RBBM_INT_0_MASK_GPMU_VOLTAGE_DROOP)
468
469 static int a5xx_hw_init(struct msm_gpu *gpu)
470 {
471 struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
472 int ret;
473
474 gpu_write(gpu, REG_A5XX_VBIF_ROUND_ROBIN_QOS_ARB, 0x00000003);
475
476 /* Make all blocks contribute to the GPU BUSY perf counter */
477 gpu_write(gpu, REG_A5XX_RBBM_PERFCTR_GPU_BUSY_MASKED, 0xFFFFFFFF);
478
479 /* Enable RBBM error reporting bits */
480 gpu_write(gpu, REG_A5XX_RBBM_AHB_CNTL0, 0x00000001);
481
482 if (adreno_gpu->info->quirks & ADRENO_QUIRK_FAULT_DETECT_MASK) {
483 /*
484 * Mask out the activity signals from RB1-3 to avoid false
485 * positives
486 */
487
488 gpu_write(gpu, REG_A5XX_RBBM_INTERFACE_HANG_MASK_CNTL11,
489 0xF0000000);
490 gpu_write(gpu, REG_A5XX_RBBM_INTERFACE_HANG_MASK_CNTL12,
491 0xFFFFFFFF);
492 gpu_write(gpu, REG_A5XX_RBBM_INTERFACE_HANG_MASK_CNTL13,
493 0xFFFFFFFF);
494 gpu_write(gpu, REG_A5XX_RBBM_INTERFACE_HANG_MASK_CNTL14,
495 0xFFFFFFFF);
496 gpu_write(gpu, REG_A5XX_RBBM_INTERFACE_HANG_MASK_CNTL15,
497 0xFFFFFFFF);
498 gpu_write(gpu, REG_A5XX_RBBM_INTERFACE_HANG_MASK_CNTL16,
499 0xFFFFFFFF);
500 gpu_write(gpu, REG_A5XX_RBBM_INTERFACE_HANG_MASK_CNTL17,
501 0xFFFFFFFF);
502 gpu_write(gpu, REG_A5XX_RBBM_INTERFACE_HANG_MASK_CNTL18,
503 0xFFFFFFFF);
504 }
505
506 /* Enable fault detection */
507 gpu_write(gpu, REG_A5XX_RBBM_INTERFACE_HANG_INT_CNTL,
508 (1 << 30) | 0xFFFF);
509
510 /* Turn on performance counters */
511 gpu_write(gpu, REG_A5XX_RBBM_PERFCTR_CNTL, 0x01);
512
513 /* Increase VFD cache access so LRZ and other data gets evicted less */
514 gpu_write(gpu, REG_A5XX_UCHE_CACHE_WAYS, 0x02);
515
516 /* Disable L2 bypass in the UCHE */
517 gpu_write(gpu, REG_A5XX_UCHE_TRAP_BASE_LO, 0xFFFF0000);
518 gpu_write(gpu, REG_A5XX_UCHE_TRAP_BASE_HI, 0x0001FFFF);
519 gpu_write(gpu, REG_A5XX_UCHE_WRITE_THRU_BASE_LO, 0xFFFF0000);
520 gpu_write(gpu, REG_A5XX_UCHE_WRITE_THRU_BASE_HI, 0x0001FFFF);
521
522 /* Set the GMEM VA range (0 to gpu->gmem) */
523 gpu_write(gpu, REG_A5XX_UCHE_GMEM_RANGE_MIN_LO, 0x00100000);
524 gpu_write(gpu, REG_A5XX_UCHE_GMEM_RANGE_MIN_HI, 0x00000000);
525 gpu_write(gpu, REG_A5XX_UCHE_GMEM_RANGE_MAX_LO,
526 0x00100000 + adreno_gpu->gmem - 1);
527 gpu_write(gpu, REG_A5XX_UCHE_GMEM_RANGE_MAX_HI, 0x00000000);
528
529 gpu_write(gpu, REG_A5XX_CP_MEQ_THRESHOLDS, 0x40);
530 gpu_write(gpu, REG_A5XX_CP_MERCIU_SIZE, 0x40);
531 gpu_write(gpu, REG_A5XX_CP_ROQ_THRESHOLDS_2, 0x80000060);
532 gpu_write(gpu, REG_A5XX_CP_ROQ_THRESHOLDS_1, 0x40201B16);
533
534 gpu_write(gpu, REG_A5XX_PC_DBG_ECO_CNTL, (0x400 << 11 | 0x300 << 22));
535
536 if (adreno_gpu->info->quirks & ADRENO_QUIRK_TWO_PASS_USE_WFI)
537 gpu_rmw(gpu, REG_A5XX_PC_DBG_ECO_CNTL, 0, (1 << 8));
538
539 gpu_write(gpu, REG_A5XX_PC_DBG_ECO_CNTL, 0xc0200100);
540
541 /* Enable USE_RETENTION_FLOPS */
542 gpu_write(gpu, REG_A5XX_CP_CHICKEN_DBG, 0x02000000);
543
544 /* Enable ME/PFP split notification */
545 gpu_write(gpu, REG_A5XX_RBBM_AHB_CNTL1, 0xA6FFFFFF);
546
547 /* Enable HWCG */
548 a5xx_enable_hwcg(gpu);
549
550 gpu_write(gpu, REG_A5XX_RBBM_AHB_CNTL2, 0x0000003F);
551
552 /* Set the highest bank bit */
553 gpu_write(gpu, REG_A5XX_TPL1_MODE_CNTL, 2 << 7);
554 gpu_write(gpu, REG_A5XX_RB_MODE_CNTL, 2 << 1);
555
556 /* Protect registers from the CP */
557 gpu_write(gpu, REG_A5XX_CP_PROTECT_CNTL, 0x00000007);
558
559 /* RBBM */
560 gpu_write(gpu, REG_A5XX_CP_PROTECT(0), ADRENO_PROTECT_RW(0x04, 4));
561 gpu_write(gpu, REG_A5XX_CP_PROTECT(1), ADRENO_PROTECT_RW(0x08, 8));
562 gpu_write(gpu, REG_A5XX_CP_PROTECT(2), ADRENO_PROTECT_RW(0x10, 16));
563 gpu_write(gpu, REG_A5XX_CP_PROTECT(3), ADRENO_PROTECT_RW(0x20, 32));
564 gpu_write(gpu, REG_A5XX_CP_PROTECT(4), ADRENO_PROTECT_RW(0x40, 64));
565 gpu_write(gpu, REG_A5XX_CP_PROTECT(5), ADRENO_PROTECT_RW(0x80, 64));
566
567 /* Content protect */
568 gpu_write(gpu, REG_A5XX_CP_PROTECT(6),
569 ADRENO_PROTECT_RW(REG_A5XX_RBBM_SECVID_TSB_TRUSTED_BASE_LO,
570 16));
571 gpu_write(gpu, REG_A5XX_CP_PROTECT(7),
572 ADRENO_PROTECT_RW(REG_A5XX_RBBM_SECVID_TRUST_CNTL, 2));
573
574 /* CP */
575 gpu_write(gpu, REG_A5XX_CP_PROTECT(8), ADRENO_PROTECT_RW(0x800, 64));
576 gpu_write(gpu, REG_A5XX_CP_PROTECT(9), ADRENO_PROTECT_RW(0x840, 8));
577 gpu_write(gpu, REG_A5XX_CP_PROTECT(10), ADRENO_PROTECT_RW(0x880, 32));
578 gpu_write(gpu, REG_A5XX_CP_PROTECT(11), ADRENO_PROTECT_RW(0xAA0, 1));
579
580 /* RB */
581 gpu_write(gpu, REG_A5XX_CP_PROTECT(12), ADRENO_PROTECT_RW(0xCC0, 1));
582 gpu_write(gpu, REG_A5XX_CP_PROTECT(13), ADRENO_PROTECT_RW(0xCF0, 2));
583
584 /* VPC */
585 gpu_write(gpu, REG_A5XX_CP_PROTECT(14), ADRENO_PROTECT_RW(0xE68, 8));
586 gpu_write(gpu, REG_A5XX_CP_PROTECT(15), ADRENO_PROTECT_RW(0xE70, 4));
587
588 /* UCHE */
589 gpu_write(gpu, REG_A5XX_CP_PROTECT(16), ADRENO_PROTECT_RW(0xE80, 16));
590
591 if (adreno_is_a530(adreno_gpu))
592 gpu_write(gpu, REG_A5XX_CP_PROTECT(17),
593 ADRENO_PROTECT_RW(0x10000, 0x8000));
594
595 gpu_write(gpu, REG_A5XX_RBBM_SECVID_TSB_CNTL, 0);
596 /*
597 * Disable the trusted memory range - we don't actually supported secure
598 * memory rendering at this point in time and we don't want to block off
599 * part of the virtual memory space.
600 */
601 gpu_write64(gpu, REG_A5XX_RBBM_SECVID_TSB_TRUSTED_BASE_LO,
602 REG_A5XX_RBBM_SECVID_TSB_TRUSTED_BASE_HI, 0x00000000);
603 gpu_write(gpu, REG_A5XX_RBBM_SECVID_TSB_TRUSTED_SIZE, 0x00000000);
604
605 /* Load the GPMU firmware before starting the HW init */
606 a5xx_gpmu_ucode_init(gpu);
607
608 ret = adreno_hw_init(gpu);
609 if (ret)
610 return ret;
611
612 ret = a5xx_ucode_init(gpu);
613 if (ret)
614 return ret;
615
616 /* Disable the interrupts through the initial bringup stage */
617 gpu_write(gpu, REG_A5XX_RBBM_INT_0_MASK, A5XX_INT_MASK);
618
619 /* Clear ME_HALT to start the micro engine */
620 gpu_write(gpu, REG_A5XX_CP_PFP_ME_CNTL, 0);
621 ret = a5xx_me_init(gpu);
622 if (ret)
623 return ret;
624
625 ret = a5xx_power_init(gpu);
626 if (ret)
627 return ret;
628
629 /*
630 * Send a pipeline event stat to get misbehaving counters to start
631 * ticking correctly
632 */
633 if (adreno_is_a530(adreno_gpu)) {
634 OUT_PKT7(gpu->rb, CP_EVENT_WRITE, 1);
635 OUT_RING(gpu->rb, 0x0F);
636
637 gpu->funcs->flush(gpu);
638 if (!a5xx_idle(gpu))
639 return -EINVAL;
640 }
641
642 /*
643 * Try to load a zap shader into the secure world. If successful
644 * we can use the CP to switch out of secure mode. If not then we
645 * have no resource but to try to switch ourselves out manually. If we
646 * guessed wrong then access to the RBBM_SECVID_TRUST_CNTL register will
647 * be blocked and a permissions violation will soon follow.
648 */
649 ret = a5xx_zap_shader_init(gpu);
650 if (!ret) {
651 OUT_PKT7(gpu->rb, CP_SET_SECURE_MODE, 1);
652 OUT_RING(gpu->rb, 0x00000000);
653
654 gpu->funcs->flush(gpu);
655 if (!a5xx_idle(gpu))
656 return -EINVAL;
657 } else {
658 /* Print a warning so if we die, we know why */
659 dev_warn_once(gpu->dev->dev,
660 "Zap shader not enabled - using SECVID_TRUST_CNTL instead\n");
661 gpu_write(gpu, REG_A5XX_RBBM_SECVID_TRUST_CNTL, 0x0);
662 }
663
664 return 0;
665 }
666
667 static void a5xx_recover(struct msm_gpu *gpu)
668 {
669 int i;
670
671 adreno_dump_info(gpu);
672
673 for (i = 0; i < 8; i++) {
674 printk("CP_SCRATCH_REG%d: %u\n", i,
675 gpu_read(gpu, REG_A5XX_CP_SCRATCH_REG(i)));
676 }
677
678 if (hang_debug)
679 a5xx_dump(gpu);
680
681 gpu_write(gpu, REG_A5XX_RBBM_SW_RESET_CMD, 1);
682 gpu_read(gpu, REG_A5XX_RBBM_SW_RESET_CMD);
683 gpu_write(gpu, REG_A5XX_RBBM_SW_RESET_CMD, 0);
684 adreno_recover(gpu);
685 }
686
687 static void a5xx_destroy(struct msm_gpu *gpu)
688 {
689 struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
690 struct a5xx_gpu *a5xx_gpu = to_a5xx_gpu(adreno_gpu);
691
692 DBG("%s", gpu->name);
693
694 if (a5xx_gpu->zap_dev.parent)
695 device_unregister(&a5xx_gpu->zap_dev);
696
697 if (a5xx_gpu->pm4_bo) {
698 if (a5xx_gpu->pm4_iova)
699 msm_gem_put_iova(a5xx_gpu->pm4_bo, gpu->aspace);
700 drm_gem_object_unreference_unlocked(a5xx_gpu->pm4_bo);
701 }
702
703 if (a5xx_gpu->pfp_bo) {
704 if (a5xx_gpu->pfp_iova)
705 msm_gem_put_iova(a5xx_gpu->pfp_bo, gpu->aspace);
706 drm_gem_object_unreference_unlocked(a5xx_gpu->pfp_bo);
707 }
708
709 if (a5xx_gpu->gpmu_bo) {
710 if (a5xx_gpu->gpmu_iova)
711 msm_gem_put_iova(a5xx_gpu->gpmu_bo, gpu->aspace);
712 drm_gem_object_unreference_unlocked(a5xx_gpu->gpmu_bo);
713 }
714
715 adreno_gpu_cleanup(adreno_gpu);
716 kfree(a5xx_gpu);
717 }
718
719 static inline bool _a5xx_check_idle(struct msm_gpu *gpu)
720 {
721 if (gpu_read(gpu, REG_A5XX_RBBM_STATUS) & ~A5XX_RBBM_STATUS_HI_BUSY)
722 return false;
723
724 /*
725 * Nearly every abnormality ends up pausing the GPU and triggering a
726 * fault so we can safely just watch for this one interrupt to fire
727 */
728 return !(gpu_read(gpu, REG_A5XX_RBBM_INT_0_STATUS) &
729 A5XX_RBBM_INT_0_MASK_MISC_HANG_DETECT);
730 }
731
732 bool a5xx_idle(struct msm_gpu *gpu)
733 {
734 /* wait for CP to drain ringbuffer: */
735 if (!adreno_idle(gpu))
736 return false;
737
738 if (spin_until(_a5xx_check_idle(gpu))) {
739 DRM_ERROR("%s: %ps: timeout waiting for GPU to idle: status %8.8X irq %8.8X\n",
740 gpu->name, __builtin_return_address(0),
741 gpu_read(gpu, REG_A5XX_RBBM_STATUS),
742 gpu_read(gpu, REG_A5XX_RBBM_INT_0_STATUS));
743
744 return false;
745 }
746
747 return true;
748 }
749
750 static int a5xx_fault_handler(void *arg, unsigned long iova, int flags)
751 {
752 struct msm_gpu *gpu = arg;
753 pr_warn_ratelimited("*** gpu fault: iova=%08lx, flags=%d (%u,%u,%u,%u)\n",
754 iova, flags,
755 gpu_read(gpu, REG_A5XX_CP_SCRATCH_REG(4)),
756 gpu_read(gpu, REG_A5XX_CP_SCRATCH_REG(5)),
757 gpu_read(gpu, REG_A5XX_CP_SCRATCH_REG(6)),
758 gpu_read(gpu, REG_A5XX_CP_SCRATCH_REG(7)));
759
760 return -EFAULT;
761 }
762
763 static void a5xx_cp_err_irq(struct msm_gpu *gpu)
764 {
765 u32 status = gpu_read(gpu, REG_A5XX_CP_INTERRUPT_STATUS);
766
767 if (status & A5XX_CP_INT_CP_OPCODE_ERROR) {
768 u32 val;
769
770 gpu_write(gpu, REG_A5XX_CP_PFP_STAT_ADDR, 0);
771
772 /*
773 * REG_A5XX_CP_PFP_STAT_DATA is indexed, and we want index 1 so
774 * read it twice
775 */
776
777 gpu_read(gpu, REG_A5XX_CP_PFP_STAT_DATA);
778 val = gpu_read(gpu, REG_A5XX_CP_PFP_STAT_DATA);
779
780 dev_err_ratelimited(gpu->dev->dev, "CP | opcode error | possible opcode=0x%8.8X\n",
781 val);
782 }
783
784 if (status & A5XX_CP_INT_CP_HW_FAULT_ERROR)
785 dev_err_ratelimited(gpu->dev->dev, "CP | HW fault | status=0x%8.8X\n",
786 gpu_read(gpu, REG_A5XX_CP_HW_FAULT));
787
788 if (status & A5XX_CP_INT_CP_DMA_ERROR)
789 dev_err_ratelimited(gpu->dev->dev, "CP | DMA error\n");
790
791 if (status & A5XX_CP_INT_CP_REGISTER_PROTECTION_ERROR) {
792 u32 val = gpu_read(gpu, REG_A5XX_CP_PROTECT_STATUS);
793
794 dev_err_ratelimited(gpu->dev->dev,
795 "CP | protected mode error | %s | addr=0x%8.8X | status=0x%8.8X\n",
796 val & (1 << 24) ? "WRITE" : "READ",
797 (val & 0xFFFFF) >> 2, val);
798 }
799
800 if (status & A5XX_CP_INT_CP_AHB_ERROR) {
801 u32 status = gpu_read(gpu, REG_A5XX_CP_AHB_FAULT);
802 const char *access[16] = { "reserved", "reserved",
803 "timestamp lo", "timestamp hi", "pfp read", "pfp write",
804 "", "", "me read", "me write", "", "", "crashdump read",
805 "crashdump write" };
806
807 dev_err_ratelimited(gpu->dev->dev,
808 "CP | AHB error | addr=%X access=%s error=%d | status=0x%8.8X\n",
809 status & 0xFFFFF, access[(status >> 24) & 0xF],
810 (status & (1 << 31)), status);
811 }
812 }
813
814 static void a5xx_rbbm_err_irq(struct msm_gpu *gpu, u32 status)
815 {
816 if (status & A5XX_RBBM_INT_0_MASK_RBBM_AHB_ERROR) {
817 u32 val = gpu_read(gpu, REG_A5XX_RBBM_AHB_ERROR_STATUS);
818
819 dev_err_ratelimited(gpu->dev->dev,
820 "RBBM | AHB bus error | %s | addr=0x%X | ports=0x%X:0x%X\n",
821 val & (1 << 28) ? "WRITE" : "READ",
822 (val & 0xFFFFF) >> 2, (val >> 20) & 0x3,
823 (val >> 24) & 0xF);
824
825 /* Clear the error */
826 gpu_write(gpu, REG_A5XX_RBBM_AHB_CMD, (1 << 4));
827
828 /* Clear the interrupt */
829 gpu_write(gpu, REG_A5XX_RBBM_INT_CLEAR_CMD,
830 A5XX_RBBM_INT_0_MASK_RBBM_AHB_ERROR);
831 }
832
833 if (status & A5XX_RBBM_INT_0_MASK_RBBM_TRANSFER_TIMEOUT)
834 dev_err_ratelimited(gpu->dev->dev, "RBBM | AHB transfer timeout\n");
835
836 if (status & A5XX_RBBM_INT_0_MASK_RBBM_ME_MS_TIMEOUT)
837 dev_err_ratelimited(gpu->dev->dev, "RBBM | ME master split | status=0x%X\n",
838 gpu_read(gpu, REG_A5XX_RBBM_AHB_ME_SPLIT_STATUS));
839
840 if (status & A5XX_RBBM_INT_0_MASK_RBBM_PFP_MS_TIMEOUT)
841 dev_err_ratelimited(gpu->dev->dev, "RBBM | PFP master split | status=0x%X\n",
842 gpu_read(gpu, REG_A5XX_RBBM_AHB_PFP_SPLIT_STATUS));
843
844 if (status & A5XX_RBBM_INT_0_MASK_RBBM_ETS_MS_TIMEOUT)
845 dev_err_ratelimited(gpu->dev->dev, "RBBM | ETS master split | status=0x%X\n",
846 gpu_read(gpu, REG_A5XX_RBBM_AHB_ETS_SPLIT_STATUS));
847
848 if (status & A5XX_RBBM_INT_0_MASK_RBBM_ATB_ASYNC_OVERFLOW)
849 dev_err_ratelimited(gpu->dev->dev, "RBBM | ATB ASYNC overflow\n");
850
851 if (status & A5XX_RBBM_INT_0_MASK_RBBM_ATB_BUS_OVERFLOW)
852 dev_err_ratelimited(gpu->dev->dev, "RBBM | ATB bus overflow\n");
853 }
854
855 static void a5xx_uche_err_irq(struct msm_gpu *gpu)
856 {
857 uint64_t addr = (uint64_t) gpu_read(gpu, REG_A5XX_UCHE_TRAP_LOG_HI);
858
859 addr |= gpu_read(gpu, REG_A5XX_UCHE_TRAP_LOG_LO);
860
861 dev_err_ratelimited(gpu->dev->dev, "UCHE | Out of bounds access | addr=0x%llX\n",
862 addr);
863 }
864
865 static void a5xx_gpmu_err_irq(struct msm_gpu *gpu)
866 {
867 dev_err_ratelimited(gpu->dev->dev, "GPMU | voltage droop\n");
868 }
869
870 #define RBBM_ERROR_MASK \
871 (A5XX_RBBM_INT_0_MASK_RBBM_AHB_ERROR | \
872 A5XX_RBBM_INT_0_MASK_RBBM_TRANSFER_TIMEOUT | \
873 A5XX_RBBM_INT_0_MASK_RBBM_ME_MS_TIMEOUT | \
874 A5XX_RBBM_INT_0_MASK_RBBM_PFP_MS_TIMEOUT | \
875 A5XX_RBBM_INT_0_MASK_RBBM_ETS_MS_TIMEOUT | \
876 A5XX_RBBM_INT_0_MASK_RBBM_ATB_ASYNC_OVERFLOW)
877
878 static irqreturn_t a5xx_irq(struct msm_gpu *gpu)
879 {
880 u32 status = gpu_read(gpu, REG_A5XX_RBBM_INT_0_STATUS);
881
882 /*
883 * Clear all the interrupts except RBBM_AHB_ERROR - if we clear it
884 * before the source is cleared the interrupt will storm.
885 */
886 gpu_write(gpu, REG_A5XX_RBBM_INT_CLEAR_CMD,
887 status & ~A5XX_RBBM_INT_0_MASK_RBBM_AHB_ERROR);
888
889 /* Pass status to a5xx_rbbm_err_irq because we've already cleared it */
890 if (status & RBBM_ERROR_MASK)
891 a5xx_rbbm_err_irq(gpu, status);
892
893 if (status & A5XX_RBBM_INT_0_MASK_CP_HW_ERROR)
894 a5xx_cp_err_irq(gpu);
895
896 if (status & A5XX_RBBM_INT_0_MASK_UCHE_OOB_ACCESS)
897 a5xx_uche_err_irq(gpu);
898
899 if (status & A5XX_RBBM_INT_0_MASK_GPMU_VOLTAGE_DROOP)
900 a5xx_gpmu_err_irq(gpu);
901
902 if (status & A5XX_RBBM_INT_0_MASK_CP_CACHE_FLUSH_TS)
903 msm_gpu_retire(gpu);
904
905 return IRQ_HANDLED;
906 }
907
908 static const u32 a5xx_register_offsets[REG_ADRENO_REGISTER_MAX] = {
909 REG_ADRENO_DEFINE(REG_ADRENO_CP_RB_BASE, REG_A5XX_CP_RB_BASE),
910 REG_ADRENO_DEFINE(REG_ADRENO_CP_RB_BASE_HI, REG_A5XX_CP_RB_BASE_HI),
911 REG_ADRENO_DEFINE(REG_ADRENO_CP_RB_RPTR_ADDR, REG_A5XX_CP_RB_RPTR_ADDR),
912 REG_ADRENO_DEFINE(REG_ADRENO_CP_RB_RPTR_ADDR_HI,
913 REG_A5XX_CP_RB_RPTR_ADDR_HI),
914 REG_ADRENO_DEFINE(REG_ADRENO_CP_RB_RPTR, REG_A5XX_CP_RB_RPTR),
915 REG_ADRENO_DEFINE(REG_ADRENO_CP_RB_WPTR, REG_A5XX_CP_RB_WPTR),
916 REG_ADRENO_DEFINE(REG_ADRENO_CP_RB_CNTL, REG_A5XX_CP_RB_CNTL),
917 };
918
919 static const u32 a5xx_registers[] = {
920 0x0000, 0x0002, 0x0004, 0x0020, 0x0022, 0x0026, 0x0029, 0x002B,
921 0x002E, 0x0035, 0x0038, 0x0042, 0x0044, 0x0044, 0x0047, 0x0095,
922 0x0097, 0x00BB, 0x03A0, 0x0464, 0x0469, 0x046F, 0x04D2, 0x04D3,
923 0x04E0, 0x0533, 0x0540, 0x0555, 0xF400, 0xF400, 0xF800, 0xF807,
924 0x0800, 0x081A, 0x081F, 0x0841, 0x0860, 0x0860, 0x0880, 0x08A0,
925 0x0B00, 0x0B12, 0x0B15, 0x0B28, 0x0B78, 0x0B7F, 0x0BB0, 0x0BBD,
926 0x0BC0, 0x0BC6, 0x0BD0, 0x0C53, 0x0C60, 0x0C61, 0x0C80, 0x0C82,
927 0x0C84, 0x0C85, 0x0C90, 0x0C98, 0x0CA0, 0x0CA0, 0x0CB0, 0x0CB2,
928 0x2180, 0x2185, 0x2580, 0x2585, 0x0CC1, 0x0CC1, 0x0CC4, 0x0CC7,
929 0x0CCC, 0x0CCC, 0x0CD0, 0x0CD8, 0x0CE0, 0x0CE5, 0x0CE8, 0x0CE8,
930 0x0CEC, 0x0CF1, 0x0CFB, 0x0D0E, 0x2100, 0x211E, 0x2140, 0x2145,
931 0x2500, 0x251E, 0x2540, 0x2545, 0x0D10, 0x0D17, 0x0D20, 0x0D23,
932 0x0D30, 0x0D30, 0x20C0, 0x20C0, 0x24C0, 0x24C0, 0x0E40, 0x0E43,
933 0x0E4A, 0x0E4A, 0x0E50, 0x0E57, 0x0E60, 0x0E7C, 0x0E80, 0x0E8E,
934 0x0E90, 0x0E96, 0x0EA0, 0x0EA8, 0x0EB0, 0x0EB2, 0xE140, 0xE147,
935 0xE150, 0xE187, 0xE1A0, 0xE1A9, 0xE1B0, 0xE1B6, 0xE1C0, 0xE1C7,
936 0xE1D0, 0xE1D1, 0xE200, 0xE201, 0xE210, 0xE21C, 0xE240, 0xE268,
937 0xE000, 0xE006, 0xE010, 0xE09A, 0xE0A0, 0xE0A4, 0xE0AA, 0xE0EB,
938 0xE100, 0xE105, 0xE380, 0xE38F, 0xE3B0, 0xE3B0, 0xE400, 0xE405,
939 0xE408, 0xE4E9, 0xE4F0, 0xE4F0, 0xE280, 0xE280, 0xE282, 0xE2A3,
940 0xE2A5, 0xE2C2, 0xE940, 0xE947, 0xE950, 0xE987, 0xE9A0, 0xE9A9,
941 0xE9B0, 0xE9B6, 0xE9C0, 0xE9C7, 0xE9D0, 0xE9D1, 0xEA00, 0xEA01,
942 0xEA10, 0xEA1C, 0xEA40, 0xEA68, 0xE800, 0xE806, 0xE810, 0xE89A,
943 0xE8A0, 0xE8A4, 0xE8AA, 0xE8EB, 0xE900, 0xE905, 0xEB80, 0xEB8F,
944 0xEBB0, 0xEBB0, 0xEC00, 0xEC05, 0xEC08, 0xECE9, 0xECF0, 0xECF0,
945 0xEA80, 0xEA80, 0xEA82, 0xEAA3, 0xEAA5, 0xEAC2, 0xA800, 0xA8FF,
946 0xAC60, 0xAC60, 0xB000, 0xB97F, 0xB9A0, 0xB9BF,
947 ~0
948 };
949
950 static void a5xx_dump(struct msm_gpu *gpu)
951 {
952 dev_info(gpu->dev->dev, "status: %08x\n",
953 gpu_read(gpu, REG_A5XX_RBBM_STATUS));
954 adreno_dump(gpu);
955 }
956
957 static int a5xx_pm_resume(struct msm_gpu *gpu)
958 {
959 int ret;
960
961 /* Turn on the core power */
962 ret = msm_gpu_pm_resume(gpu);
963 if (ret)
964 return ret;
965
966 /* Turn the RBCCU domain first to limit the chances of voltage droop */
967 gpu_write(gpu, REG_A5XX_GPMU_RBCCU_POWER_CNTL, 0x778000);
968
969 /* Wait 3 usecs before polling */
970 udelay(3);
971
972 ret = spin_usecs(gpu, 20, REG_A5XX_GPMU_RBCCU_PWR_CLK_STATUS,
973 (1 << 20), (1 << 20));
974 if (ret) {
975 DRM_ERROR("%s: timeout waiting for RBCCU GDSC enable: %X\n",
976 gpu->name,
977 gpu_read(gpu, REG_A5XX_GPMU_RBCCU_PWR_CLK_STATUS));
978 return ret;
979 }
980
981 /* Turn on the SP domain */
982 gpu_write(gpu, REG_A5XX_GPMU_SP_POWER_CNTL, 0x778000);
983 ret = spin_usecs(gpu, 20, REG_A5XX_GPMU_SP_PWR_CLK_STATUS,
984 (1 << 20), (1 << 20));
985 if (ret)
986 DRM_ERROR("%s: timeout waiting for SP GDSC enable\n",
987 gpu->name);
988
989 return ret;
990 }
991
992 static int a5xx_pm_suspend(struct msm_gpu *gpu)
993 {
994 /* Clear the VBIF pipe before shutting down */
995 gpu_write(gpu, REG_A5XX_VBIF_XIN_HALT_CTRL0, 0xF);
996 spin_until((gpu_read(gpu, REG_A5XX_VBIF_XIN_HALT_CTRL1) & 0xF) == 0xF);
997
998 gpu_write(gpu, REG_A5XX_VBIF_XIN_HALT_CTRL0, 0);
999
1000 /*
1001 * Reset the VBIF before power collapse to avoid issue with FIFO
1002 * entries
1003 */
1004 gpu_write(gpu, REG_A5XX_RBBM_BLOCK_SW_RESET_CMD, 0x003C0000);
1005 gpu_write(gpu, REG_A5XX_RBBM_BLOCK_SW_RESET_CMD, 0x00000000);
1006
1007 return msm_gpu_pm_suspend(gpu);
1008 }
1009
1010 static int a5xx_get_timestamp(struct msm_gpu *gpu, uint64_t *value)
1011 {
1012 *value = gpu_read64(gpu, REG_A5XX_RBBM_PERFCTR_CP_0_LO,
1013 REG_A5XX_RBBM_PERFCTR_CP_0_HI);
1014
1015 return 0;
1016 }
1017
1018 #ifdef CONFIG_DEBUG_FS
1019 static void a5xx_show(struct msm_gpu *gpu, struct seq_file *m)
1020 {
1021 seq_printf(m, "status: %08x\n",
1022 gpu_read(gpu, REG_A5XX_RBBM_STATUS));
1023 adreno_show(gpu, m);
1024 }
1025 #endif
1026
1027 static const struct adreno_gpu_funcs funcs = {
1028 .base = {
1029 .get_param = adreno_get_param,
1030 .hw_init = a5xx_hw_init,
1031 .pm_suspend = a5xx_pm_suspend,
1032 .pm_resume = a5xx_pm_resume,
1033 .recover = a5xx_recover,
1034 .last_fence = adreno_last_fence,
1035 .submit = a5xx_submit,
1036 .flush = adreno_flush,
1037 .irq = a5xx_irq,
1038 .destroy = a5xx_destroy,
1039 #ifdef CONFIG_DEBUG_FS
1040 .show = a5xx_show,
1041 #endif
1042 },
1043 .get_timestamp = a5xx_get_timestamp,
1044 };
1045
1046 struct msm_gpu *a5xx_gpu_init(struct drm_device *dev)
1047 {
1048 struct msm_drm_private *priv = dev->dev_private;
1049 struct platform_device *pdev = priv->gpu_pdev;
1050 struct a5xx_gpu *a5xx_gpu = NULL;
1051 struct adreno_gpu *adreno_gpu;
1052 struct msm_gpu *gpu;
1053 int ret;
1054
1055 if (!pdev) {
1056 dev_err(dev->dev, "No A5XX device is defined\n");
1057 return ERR_PTR(-ENXIO);
1058 }
1059
1060 a5xx_gpu = kzalloc(sizeof(*a5xx_gpu), GFP_KERNEL);
1061 if (!a5xx_gpu)
1062 return ERR_PTR(-ENOMEM);
1063
1064 adreno_gpu = &a5xx_gpu->base;
1065 gpu = &adreno_gpu->base;
1066
1067 a5xx_gpu->pdev = pdev;
1068 adreno_gpu->registers = a5xx_registers;
1069 adreno_gpu->reg_offsets = a5xx_register_offsets;
1070
1071 a5xx_gpu->lm_leakage = 0x4E001A;
1072
1073 ret = adreno_gpu_init(dev, pdev, adreno_gpu, &funcs);
1074 if (ret) {
1075 a5xx_destroy(&(a5xx_gpu->base.base));
1076 return ERR_PTR(ret);
1077 }
1078
1079 if (gpu->aspace)
1080 msm_mmu_set_fault_handler(gpu->aspace->mmu, gpu, a5xx_fault_handler);
1081
1082 return gpu;
1083 }