xref: /openbmc/linux/drivers/gpu/drm/msm/adreno/a5xx_gpu.c (revision c8dbaa22)
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 }
1035