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