1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2013 Red Hat
4 * Author: Rob Clark <robdclark@gmail.com>
6 * Copyright (c) 2014 The Linux Foundation. All rights reserved.
9 #include <linux/ascii85.h>
10 #include <linux/interconnect.h>
11 #include <linux/qcom_scm.h>
12 #include <linux/kernel.h>
13 #include <linux/of_address.h>
14 #include <linux/pm_opp.h>
15 #include <linux/slab.h>
16 #include <linux/soc/qcom/mdt_loader.h>
17 #include <soc/qcom/ocmem.h>
18 #include "adreno_gpu.h"
22 static bool zap_available
= true;
24 static int zap_shader_load_mdt(struct msm_gpu
*gpu
, const char *fwname
,
27 struct device
*dev
= &gpu
->pdev
->dev
;
28 const struct firmware
*fw
;
29 const char *signed_fwname
= NULL
;
30 struct device_node
*np
, *mem_np
;
34 void *mem_region
= NULL
;
37 if (!IS_ENABLED(CONFIG_ARCH_QCOM
)) {
38 zap_available
= false;
42 np
= of_get_child_by_name(dev
->of_node
, "zap-shader");
44 zap_available
= false;
48 mem_np
= of_parse_phandle(np
, "memory-region", 0);
51 zap_available
= false;
55 ret
= of_address_to_resource(mem_np
, 0, &r
);
63 * Check for a firmware-name property. This is the new scheme
64 * to handle firmware that may be signed with device specific
65 * keys, allowing us to have a different zap fw path for different
68 * If the firmware-name property is found, we bypass the
69 * adreno_request_fw() mechanism, because we don't need to handle
70 * the /lib/firmware/qcom/... vs /lib/firmware/... case.
72 * If the firmware-name property is not found, for backwards
73 * compatibility we fall back to the fwname from the gpulist
76 of_property_read_string_index(np
, "firmware-name", 0, &signed_fwname
);
78 fwname
= signed_fwname
;
79 ret
= request_firmware_direct(&fw
, fwname
, gpu
->dev
->dev
);
83 /* Request the MDT file from the default location: */
84 fw
= adreno_request_fw(to_adreno_gpu(gpu
), fwname
);
87 * For new targets, we require the firmware-name property,
88 * if a zap-shader is required, rather than falling back
89 * to a firmware name specified in gpulist.
91 * Because the firmware is signed with a (potentially)
92 * device specific key, having the name come from gpulist
93 * was a bad idea, and is only provided for backwards
94 * compatibility for older targets.
100 DRM_DEV_ERROR(dev
, "Unable to load %s\n", fwname
);
104 /* Figure out how much memory we need */
105 mem_size
= qcom_mdt_get_size(fw
);
111 if (mem_size
> resource_size(&r
)) {
113 "memory region is too small to load the MDT\n");
118 /* Allocate memory for the firmware image */
119 mem_region
= memremap(mem_phys
, mem_size
, MEMREMAP_WC
);
126 * Load the rest of the MDT
128 * Note that we could be dealing with two different paths, since
129 * with upstream linux-firmware it would be in a qcom/ subdir..
130 * adreno_request_fw() handles this, but qcom_mdt_load() does
131 * not. But since we've already gotten through adreno_request_fw()
132 * we know which of the two cases it is:
134 if (signed_fwname
|| (to_adreno_gpu(gpu
)->fwloc
== FW_LOCATION_LEGACY
)) {
135 ret
= qcom_mdt_load(dev
, fw
, fwname
, pasid
,
136 mem_region
, mem_phys
, mem_size
, NULL
);
140 newname
= kasprintf(GFP_KERNEL
, "qcom/%s", fwname
);
142 ret
= qcom_mdt_load(dev
, fw
, newname
, pasid
,
143 mem_region
, mem_phys
, mem_size
, NULL
);
149 /* Send the image to the secure world */
150 ret
= qcom_scm_pas_auth_and_reset(pasid
);
153 * If the scm call returns -EOPNOTSUPP we assume that this target
154 * doesn't need/support the zap shader so quietly fail
156 if (ret
== -EOPNOTSUPP
)
157 zap_available
= false;
159 DRM_DEV_ERROR(dev
, "Unable to authorize the image\n");
163 memunmap(mem_region
);
165 release_firmware(fw
);
170 int adreno_zap_shader_load(struct msm_gpu
*gpu
, u32 pasid
)
172 struct adreno_gpu
*adreno_gpu
= to_adreno_gpu(gpu
);
173 struct platform_device
*pdev
= gpu
->pdev
;
175 /* Short cut if we determine the zap shader isn't available/needed */
179 /* We need SCM to be able to load the firmware */
180 if (!qcom_scm_is_available()) {
181 DRM_DEV_ERROR(&pdev
->dev
, "SCM is not available\n");
182 return -EPROBE_DEFER
;
185 return zap_shader_load_mdt(gpu
, adreno_gpu
->info
->zapfw
, pasid
);
188 int adreno_get_param(struct msm_gpu
*gpu
, uint32_t param
, uint64_t *value
)
190 struct adreno_gpu
*adreno_gpu
= to_adreno_gpu(gpu
);
193 case MSM_PARAM_GPU_ID
:
194 *value
= adreno_gpu
->info
->revn
;
196 case MSM_PARAM_GMEM_SIZE
:
197 *value
= adreno_gpu
->gmem
;
199 case MSM_PARAM_GMEM_BASE
:
202 case MSM_PARAM_CHIP_ID
:
203 *value
= adreno_gpu
->rev
.patchid
|
204 (adreno_gpu
->rev
.minor
<< 8) |
205 (adreno_gpu
->rev
.major
<< 16) |
206 (adreno_gpu
->rev
.core
<< 24);
208 case MSM_PARAM_MAX_FREQ
:
209 *value
= adreno_gpu
->base
.fast_rate
;
211 case MSM_PARAM_TIMESTAMP
:
212 if (adreno_gpu
->funcs
->get_timestamp
) {
215 pm_runtime_get_sync(&gpu
->pdev
->dev
);
216 ret
= adreno_gpu
->funcs
->get_timestamp(gpu
, value
);
217 pm_runtime_put_autosuspend(&gpu
->pdev
->dev
);
222 case MSM_PARAM_NR_RINGS
:
223 *value
= gpu
->nr_rings
;
225 case MSM_PARAM_PP_PGTABLE
:
228 case MSM_PARAM_FAULTS
:
229 *value
= gpu
->global_faults
;
232 DBG("%s: invalid param: %u", gpu
->name
, param
);
237 const struct firmware
*
238 adreno_request_fw(struct adreno_gpu
*adreno_gpu
, const char *fwname
)
240 struct drm_device
*drm
= adreno_gpu
->base
.dev
;
241 const struct firmware
*fw
= NULL
;
245 newname
= kasprintf(GFP_KERNEL
, "qcom/%s", fwname
);
247 return ERR_PTR(-ENOMEM
);
250 * Try first to load from qcom/$fwfile using a direct load (to avoid
251 * a potential timeout waiting for usermode helper)
253 if ((adreno_gpu
->fwloc
== FW_LOCATION_UNKNOWN
) ||
254 (adreno_gpu
->fwloc
== FW_LOCATION_NEW
)) {
256 ret
= request_firmware_direct(&fw
, newname
, drm
->dev
);
258 DRM_DEV_INFO(drm
->dev
, "loaded %s from new location\n",
260 adreno_gpu
->fwloc
= FW_LOCATION_NEW
;
262 } else if (adreno_gpu
->fwloc
!= FW_LOCATION_UNKNOWN
) {
263 DRM_DEV_ERROR(drm
->dev
, "failed to load %s: %d\n",
271 * Then try the legacy location without qcom/ prefix
273 if ((adreno_gpu
->fwloc
== FW_LOCATION_UNKNOWN
) ||
274 (adreno_gpu
->fwloc
== FW_LOCATION_LEGACY
)) {
276 ret
= request_firmware_direct(&fw
, fwname
, drm
->dev
);
278 DRM_DEV_INFO(drm
->dev
, "loaded %s from legacy location\n",
280 adreno_gpu
->fwloc
= FW_LOCATION_LEGACY
;
282 } else if (adreno_gpu
->fwloc
!= FW_LOCATION_UNKNOWN
) {
283 DRM_DEV_ERROR(drm
->dev
, "failed to load %s: %d\n",
291 * Finally fall back to request_firmware() for cases where the
292 * usermode helper is needed (I think mainly android)
294 if ((adreno_gpu
->fwloc
== FW_LOCATION_UNKNOWN
) ||
295 (adreno_gpu
->fwloc
== FW_LOCATION_HELPER
)) {
297 ret
= request_firmware(&fw
, newname
, drm
->dev
);
299 DRM_DEV_INFO(drm
->dev
, "loaded %s with helper\n",
301 adreno_gpu
->fwloc
= FW_LOCATION_HELPER
;
303 } else if (adreno_gpu
->fwloc
!= FW_LOCATION_UNKNOWN
) {
304 DRM_DEV_ERROR(drm
->dev
, "failed to load %s: %d\n",
311 DRM_DEV_ERROR(drm
->dev
, "failed to load %s\n", fwname
);
312 fw
= ERR_PTR(-ENOENT
);
318 int adreno_load_fw(struct adreno_gpu
*adreno_gpu
)
322 for (i
= 0; i
< ARRAY_SIZE(adreno_gpu
->info
->fw
); i
++) {
323 const struct firmware
*fw
;
325 if (!adreno_gpu
->info
->fw
[i
])
328 /* Skip if the firmware has already been loaded */
329 if (adreno_gpu
->fw
[i
])
332 fw
= adreno_request_fw(adreno_gpu
, adreno_gpu
->info
->fw
[i
]);
336 adreno_gpu
->fw
[i
] = fw
;
342 struct drm_gem_object
*adreno_fw_create_bo(struct msm_gpu
*gpu
,
343 const struct firmware
*fw
, u64
*iova
)
345 struct drm_gem_object
*bo
;
348 ptr
= msm_gem_kernel_new_locked(gpu
->dev
, fw
->size
- 4,
349 MSM_BO_UNCACHED
| MSM_BO_GPU_READONLY
, gpu
->aspace
, &bo
, iova
);
352 return ERR_CAST(ptr
);
354 memcpy(ptr
, &fw
->data
[4], fw
->size
- 4);
356 msm_gem_put_vaddr(bo
);
361 int adreno_hw_init(struct msm_gpu
*gpu
)
363 struct adreno_gpu
*adreno_gpu
= to_adreno_gpu(gpu
);
366 DBG("%s", gpu
->name
);
368 ret
= adreno_load_fw(adreno_gpu
);
372 for (i
= 0; i
< gpu
->nr_rings
; i
++) {
373 struct msm_ringbuffer
*ring
= gpu
->rb
[i
];
378 ring
->cur
= ring
->start
;
379 ring
->next
= ring
->start
;
381 /* reset completed fence seqno: */
382 ring
->memptrs
->fence
= ring
->seqno
;
383 ring
->memptrs
->rptr
= 0;
387 * Setup REG_CP_RB_CNTL. The same value is used across targets (with
388 * the excpetion of A430 that disables the RPTR shadow) - the cacluation
389 * for the ringbuffer size and block size is moved to msm_gpu.h for the
390 * pre-processor to deal with and the A430 variant is ORed in here
392 adreno_gpu_write(adreno_gpu
, REG_ADRENO_CP_RB_CNTL
,
393 MSM_GPU_RB_CNTL_DEFAULT
|
394 (adreno_is_a430(adreno_gpu
) ? AXXX_CP_RB_CNTL_NO_UPDATE
: 0));
396 /* Setup ringbuffer address - use ringbuffer[0] for GPU init */
397 adreno_gpu_write64(adreno_gpu
, REG_ADRENO_CP_RB_BASE
,
398 REG_ADRENO_CP_RB_BASE_HI
, gpu
->rb
[0]->iova
);
400 if (!adreno_is_a430(adreno_gpu
)) {
401 adreno_gpu_write64(adreno_gpu
, REG_ADRENO_CP_RB_RPTR_ADDR
,
402 REG_ADRENO_CP_RB_RPTR_ADDR_HI
,
403 rbmemptr(gpu
->rb
[0], rptr
));
409 /* Use this helper to read rptr, since a430 doesn't update rptr in memory */
410 static uint32_t get_rptr(struct adreno_gpu
*adreno_gpu
,
411 struct msm_ringbuffer
*ring
)
413 if (adreno_is_a430(adreno_gpu
))
414 return ring
->memptrs
->rptr
= adreno_gpu_read(
415 adreno_gpu
, REG_ADRENO_CP_RB_RPTR
);
417 return ring
->memptrs
->rptr
;
420 struct msm_ringbuffer
*adreno_active_ring(struct msm_gpu
*gpu
)
425 void adreno_recover(struct msm_gpu
*gpu
)
427 struct drm_device
*dev
= gpu
->dev
;
430 // XXX pm-runtime?? we *need* the device to be off after this
431 // so maybe continuing to call ->pm_suspend/resume() is better?
433 gpu
->funcs
->pm_suspend(gpu
);
434 gpu
->funcs
->pm_resume(gpu
);
436 ret
= msm_gpu_hw_init(gpu
);
438 DRM_DEV_ERROR(dev
->dev
, "gpu hw init failed: %d\n", ret
);
443 void adreno_submit(struct msm_gpu
*gpu
, struct msm_gem_submit
*submit
,
444 struct msm_file_private
*ctx
)
446 struct adreno_gpu
*adreno_gpu
= to_adreno_gpu(gpu
);
447 struct msm_drm_private
*priv
= gpu
->dev
->dev_private
;
448 struct msm_ringbuffer
*ring
= submit
->ring
;
451 for (i
= 0; i
< submit
->nr_cmds
; i
++) {
452 switch (submit
->cmd
[i
].type
) {
453 case MSM_SUBMIT_CMD_IB_TARGET_BUF
:
454 /* ignore IB-targets */
456 case MSM_SUBMIT_CMD_CTX_RESTORE_BUF
:
457 /* ignore if there has not been a ctx switch: */
458 if (priv
->lastctx
== ctx
)
461 case MSM_SUBMIT_CMD_BUF
:
462 OUT_PKT3(ring
, adreno_is_a430(adreno_gpu
) ?
463 CP_INDIRECT_BUFFER_PFE
: CP_INDIRECT_BUFFER_PFD
, 2);
464 OUT_RING(ring
, lower_32_bits(submit
->cmd
[i
].iova
));
465 OUT_RING(ring
, submit
->cmd
[i
].size
);
471 OUT_PKT0(ring
, REG_AXXX_CP_SCRATCH_REG2
, 1);
472 OUT_RING(ring
, submit
->seqno
);
474 if (adreno_is_a3xx(adreno_gpu
) || adreno_is_a4xx(adreno_gpu
)) {
475 /* Flush HLSQ lazy updates to make sure there is nothing
476 * pending for indirect loads after the timestamp has
479 OUT_PKT3(ring
, CP_EVENT_WRITE
, 1);
480 OUT_RING(ring
, HLSQ_FLUSH
);
483 /* wait for idle before cache flush/interrupt */
484 OUT_PKT3(ring
, CP_WAIT_FOR_IDLE
, 1);
485 OUT_RING(ring
, 0x00000000);
487 if (!adreno_is_a2xx(adreno_gpu
)) {
488 /* BIT(31) of CACHE_FLUSH_TS triggers CACHE_FLUSH_TS IRQ from GPU */
489 OUT_PKT3(ring
, CP_EVENT_WRITE
, 3);
490 OUT_RING(ring
, CACHE_FLUSH_TS
| BIT(31));
491 OUT_RING(ring
, rbmemptr(ring
, fence
));
492 OUT_RING(ring
, submit
->seqno
);
494 /* BIT(31) means something else on a2xx */
495 OUT_PKT3(ring
, CP_EVENT_WRITE
, 3);
496 OUT_RING(ring
, CACHE_FLUSH_TS
);
497 OUT_RING(ring
, rbmemptr(ring
, fence
));
498 OUT_RING(ring
, submit
->seqno
);
499 OUT_PKT3(ring
, CP_INTERRUPT
, 1);
500 OUT_RING(ring
, 0x80000000);
504 if (adreno_is_a3xx(adreno_gpu
)) {
505 /* Dummy set-constant to trigger context rollover */
506 OUT_PKT3(ring
, CP_SET_CONSTANT
, 2);
507 OUT_RING(ring
, CP_REG(REG_A3XX_HLSQ_CL_KERNEL_GROUP_X_REG
));
508 OUT_RING(ring
, 0x00000000);
512 gpu
->funcs
->flush(gpu
, ring
);
515 void adreno_flush(struct msm_gpu
*gpu
, struct msm_ringbuffer
*ring
)
517 struct adreno_gpu
*adreno_gpu
= to_adreno_gpu(gpu
);
520 /* Copy the shadow to the actual register */
521 ring
->cur
= ring
->next
;
524 * Mask wptr value that we calculate to fit in the HW range. This is
525 * to account for the possibility that the last command fit exactly into
526 * the ringbuffer and rb->next hasn't wrapped to zero yet
528 wptr
= get_wptr(ring
);
530 /* ensure writes to ringbuffer have hit system memory: */
533 adreno_gpu_write(adreno_gpu
, REG_ADRENO_CP_RB_WPTR
, wptr
);
536 bool adreno_idle(struct msm_gpu
*gpu
, struct msm_ringbuffer
*ring
)
538 struct adreno_gpu
*adreno_gpu
= to_adreno_gpu(gpu
);
539 uint32_t wptr
= get_wptr(ring
);
541 /* wait for CP to drain ringbuffer: */
542 if (!spin_until(get_rptr(adreno_gpu
, ring
) == wptr
))
545 /* TODO maybe we need to reset GPU here to recover from hang? */
546 DRM_ERROR("%s: timeout waiting to drain ringbuffer %d rptr/wptr = %X/%X\n",
547 gpu
->name
, ring
->id
, get_rptr(adreno_gpu
, ring
), wptr
);
552 int adreno_gpu_state_get(struct msm_gpu
*gpu
, struct msm_gpu_state
*state
)
554 struct adreno_gpu
*adreno_gpu
= to_adreno_gpu(gpu
);
557 kref_init(&state
->ref
);
559 ktime_get_real_ts64(&state
->time
);
561 for (i
= 0; i
< gpu
->nr_rings
; i
++) {
564 state
->ring
[i
].fence
= gpu
->rb
[i
]->memptrs
->fence
;
565 state
->ring
[i
].iova
= gpu
->rb
[i
]->iova
;
566 state
->ring
[i
].seqno
= gpu
->rb
[i
]->seqno
;
567 state
->ring
[i
].rptr
= get_rptr(adreno_gpu
, gpu
->rb
[i
]);
568 state
->ring
[i
].wptr
= get_wptr(gpu
->rb
[i
]);
570 /* Copy at least 'wptr' dwords of the data */
571 size
= state
->ring
[i
].wptr
;
573 /* After wptr find the last non zero dword to save space */
574 for (j
= state
->ring
[i
].wptr
; j
< MSM_GPU_RINGBUFFER_SZ
>> 2; j
++)
575 if (gpu
->rb
[i
]->start
[j
])
579 state
->ring
[i
].data
= kvmalloc(size
<< 2, GFP_KERNEL
);
580 if (state
->ring
[i
].data
) {
581 memcpy(state
->ring
[i
].data
, gpu
->rb
[i
]->start
, size
<< 2);
582 state
->ring
[i
].data_size
= size
<< 2;
587 /* Some targets prefer to collect their own registers */
588 if (!adreno_gpu
->registers
)
591 /* Count the number of registers */
592 for (i
= 0; adreno_gpu
->registers
[i
] != ~0; i
+= 2)
593 count
+= adreno_gpu
->registers
[i
+ 1] -
594 adreno_gpu
->registers
[i
] + 1;
596 state
->registers
= kcalloc(count
* 2, sizeof(u32
), GFP_KERNEL
);
597 if (state
->registers
) {
600 for (i
= 0; adreno_gpu
->registers
[i
] != ~0; i
+= 2) {
601 u32 start
= adreno_gpu
->registers
[i
];
602 u32 end
= adreno_gpu
->registers
[i
+ 1];
605 for (addr
= start
; addr
<= end
; addr
++) {
606 state
->registers
[pos
++] = addr
;
607 state
->registers
[pos
++] = gpu_read(gpu
, addr
);
611 state
->nr_registers
= count
;
617 void adreno_gpu_state_destroy(struct msm_gpu_state
*state
)
621 for (i
= 0; i
< ARRAY_SIZE(state
->ring
); i
++)
622 kvfree(state
->ring
[i
].data
);
624 for (i
= 0; state
->bos
&& i
< state
->nr_bos
; i
++)
625 kvfree(state
->bos
[i
].data
);
630 kfree(state
->registers
);
633 static void adreno_gpu_state_kref_destroy(struct kref
*kref
)
635 struct msm_gpu_state
*state
= container_of(kref
,
636 struct msm_gpu_state
, ref
);
638 adreno_gpu_state_destroy(state
);
642 int adreno_gpu_state_put(struct msm_gpu_state
*state
)
644 if (IS_ERR_OR_NULL(state
))
647 return kref_put(&state
->ref
, adreno_gpu_state_kref_destroy
);
650 #if defined(CONFIG_DEBUG_FS) || defined(CONFIG_DEV_COREDUMP)
652 static char *adreno_gpu_ascii85_encode(u32
*src
, size_t len
)
655 size_t buf_itr
= 0, buffer_size
;
656 char out
[ASCII85_BUFSZ
];
663 l
= ascii85_encode_len(len
);
666 * Ascii85 outputs either a 5 byte string or a 1 byte string. So we
667 * account for the worst case of 5 bytes per dword plus the 1 for '\0'
669 buffer_size
= (l
* 5) + 1;
671 buf
= kvmalloc(buffer_size
, GFP_KERNEL
);
675 for (i
= 0; i
< l
; i
++)
676 buf_itr
+= snprintf(buf
+ buf_itr
, buffer_size
- buf_itr
, "%s",
677 ascii85_encode(src
[i
], out
));
682 /* len is expected to be in bytes */
683 static void adreno_show_object(struct drm_printer
*p
, void **ptr
, int len
,
694 * Only dump the non-zero part of the buffer - rarely will
695 * any data completely fill the entire allocated size of
698 for (datalen
= 0, i
= 0; i
< len
>> 2; i
++)
700 datalen
= ((i
+ 1) << 2);
703 * If we reach here, then the originally captured binary buffer
704 * will be replaced with the ascii85 encoded string
706 *ptr
= adreno_gpu_ascii85_encode(buf
, datalen
);
716 drm_puts(p
, " data: !!ascii85 |\n");
724 void adreno_show(struct msm_gpu
*gpu
, struct msm_gpu_state
*state
,
725 struct drm_printer
*p
)
727 struct adreno_gpu
*adreno_gpu
= to_adreno_gpu(gpu
);
730 if (IS_ERR_OR_NULL(state
))
733 drm_printf(p
, "revision: %d (%d.%d.%d.%d)\n",
734 adreno_gpu
->info
->revn
, adreno_gpu
->rev
.core
,
735 adreno_gpu
->rev
.major
, adreno_gpu
->rev
.minor
,
736 adreno_gpu
->rev
.patchid
);
738 drm_printf(p
, "rbbm-status: 0x%08x\n", state
->rbbm_status
);
740 drm_puts(p
, "ringbuffer:\n");
742 for (i
= 0; i
< gpu
->nr_rings
; i
++) {
743 drm_printf(p
, " - id: %d\n", i
);
744 drm_printf(p
, " iova: 0x%016llx\n", state
->ring
[i
].iova
);
745 drm_printf(p
, " last-fence: %d\n", state
->ring
[i
].seqno
);
746 drm_printf(p
, " retired-fence: %d\n", state
->ring
[i
].fence
);
747 drm_printf(p
, " rptr: %d\n", state
->ring
[i
].rptr
);
748 drm_printf(p
, " wptr: %d\n", state
->ring
[i
].wptr
);
749 drm_printf(p
, " size: %d\n", MSM_GPU_RINGBUFFER_SZ
);
751 adreno_show_object(p
, &state
->ring
[i
].data
,
752 state
->ring
[i
].data_size
, &state
->ring
[i
].encoded
);
756 drm_puts(p
, "bos:\n");
758 for (i
= 0; i
< state
->nr_bos
; i
++) {
759 drm_printf(p
, " - iova: 0x%016llx\n",
761 drm_printf(p
, " size: %zd\n", state
->bos
[i
].size
);
763 adreno_show_object(p
, &state
->bos
[i
].data
,
764 state
->bos
[i
].size
, &state
->bos
[i
].encoded
);
768 if (state
->nr_registers
) {
769 drm_puts(p
, "registers:\n");
771 for (i
= 0; i
< state
->nr_registers
; i
++) {
772 drm_printf(p
, " - { offset: 0x%04x, value: 0x%08x }\n",
773 state
->registers
[i
* 2] << 2,
774 state
->registers
[(i
* 2) + 1]);
780 /* Dump common gpu status and scratch registers on any hang, to make
781 * the hangcheck logs more useful. The scratch registers seem always
782 * safe to read when GPU has hung (unlike some other regs, depending
783 * on how the GPU hung), and they are useful to match up to cmdstream
784 * dumps when debugging hangs:
786 void adreno_dump_info(struct msm_gpu
*gpu
)
788 struct adreno_gpu
*adreno_gpu
= to_adreno_gpu(gpu
);
791 printk("revision: %d (%d.%d.%d.%d)\n",
792 adreno_gpu
->info
->revn
, adreno_gpu
->rev
.core
,
793 adreno_gpu
->rev
.major
, adreno_gpu
->rev
.minor
,
794 adreno_gpu
->rev
.patchid
);
796 for (i
= 0; i
< gpu
->nr_rings
; i
++) {
797 struct msm_ringbuffer
*ring
= gpu
->rb
[i
];
799 printk("rb %d: fence: %d/%d\n", i
,
800 ring
->memptrs
->fence
,
803 printk("rptr: %d\n", get_rptr(adreno_gpu
, ring
));
804 printk("rb wptr: %d\n", get_wptr(ring
));
808 /* would be nice to not have to duplicate the _show() stuff with printk(): */
809 void adreno_dump(struct msm_gpu
*gpu
)
811 struct adreno_gpu
*adreno_gpu
= to_adreno_gpu(gpu
);
814 if (!adreno_gpu
->registers
)
817 /* dump these out in a form that can be parsed by demsm: */
818 printk("IO:region %s 00000000 00020000\n", gpu
->name
);
819 for (i
= 0; adreno_gpu
->registers
[i
] != ~0; i
+= 2) {
820 uint32_t start
= adreno_gpu
->registers
[i
];
821 uint32_t end
= adreno_gpu
->registers
[i
+1];
824 for (addr
= start
; addr
<= end
; addr
++) {
825 uint32_t val
= gpu_read(gpu
, addr
);
826 printk("IO:R %08x %08x\n", addr
<<2, val
);
831 static uint32_t ring_freewords(struct msm_ringbuffer
*ring
)
833 struct adreno_gpu
*adreno_gpu
= to_adreno_gpu(ring
->gpu
);
834 uint32_t size
= MSM_GPU_RINGBUFFER_SZ
>> 2;
835 /* Use ring->next to calculate free size */
836 uint32_t wptr
= ring
->next
- ring
->start
;
837 uint32_t rptr
= get_rptr(adreno_gpu
, ring
);
838 return (rptr
+ (size
- 1) - wptr
) % size
;
841 void adreno_wait_ring(struct msm_ringbuffer
*ring
, uint32_t ndwords
)
843 if (spin_until(ring_freewords(ring
) >= ndwords
))
844 DRM_DEV_ERROR(ring
->gpu
->dev
->dev
,
845 "timeout waiting for space in ringbuffer %d\n",
849 /* Get legacy powerlevels from qcom,gpu-pwrlevels and populate the opp table */
850 static int adreno_get_legacy_pwrlevels(struct device
*dev
)
852 struct device_node
*child
, *node
;
855 node
= of_get_compatible_child(dev
->of_node
, "qcom,gpu-pwrlevels");
857 DRM_DEV_DEBUG(dev
, "Could not find the GPU powerlevels\n");
861 for_each_child_of_node(node
, child
) {
864 ret
= of_property_read_u32(child
, "qcom,gpu-freq", &val
);
869 * Skip the intentionally bogus clock value found at the bottom
870 * of most legacy frequency tables
873 dev_pm_opp_add(dev
, val
, 0);
881 static int adreno_get_pwrlevels(struct device
*dev
,
884 unsigned long freq
= ULONG_MAX
;
885 struct dev_pm_opp
*opp
;
890 /* You down with OPP? */
891 if (!of_find_property(dev
->of_node
, "operating-points-v2", NULL
))
892 ret
= adreno_get_legacy_pwrlevels(dev
);
894 ret
= dev_pm_opp_of_add_table(dev
);
896 DRM_DEV_ERROR(dev
, "Unable to set the OPP table\n");
900 /* Find the fastest defined rate */
901 opp
= dev_pm_opp_find_freq_floor(dev
, &freq
);
903 gpu
->fast_rate
= freq
;
908 if (!gpu
->fast_rate
) {
910 "Could not find a clock rate. Using a reasonable default\n");
911 /* Pick a suitably safe clock speed for any target */
912 gpu
->fast_rate
= 200000000;
915 DBG("fast_rate=%u, slow_rate=27000000", gpu
->fast_rate
);
917 /* Check for an interconnect path for the bus */
918 gpu
->icc_path
= of_icc_get(dev
, "gfx-mem");
919 if (!gpu
->icc_path
) {
921 * Keep compatbility with device trees that don't have an
922 * interconnect-names property.
924 gpu
->icc_path
= of_icc_get(dev
, NULL
);
926 if (IS_ERR(gpu
->icc_path
))
927 gpu
->icc_path
= NULL
;
929 gpu
->ocmem_icc_path
= of_icc_get(dev
, "ocmem");
930 if (IS_ERR(gpu
->ocmem_icc_path
))
931 gpu
->ocmem_icc_path
= NULL
;
936 int adreno_gpu_ocmem_init(struct device
*dev
, struct adreno_gpu
*adreno_gpu
,
937 struct adreno_ocmem
*adreno_ocmem
)
939 struct ocmem_buf
*ocmem_hdl
;
942 ocmem
= of_get_ocmem(dev
);
944 if (PTR_ERR(ocmem
) == -ENODEV
) {
946 * Return success since either the ocmem property was
947 * not specified in device tree, or ocmem support is
948 * not compiled into the kernel.
953 return PTR_ERR(ocmem
);
956 ocmem_hdl
= ocmem_allocate(ocmem
, OCMEM_GRAPHICS
, adreno_gpu
->gmem
);
957 if (IS_ERR(ocmem_hdl
))
958 return PTR_ERR(ocmem_hdl
);
960 adreno_ocmem
->ocmem
= ocmem
;
961 adreno_ocmem
->base
= ocmem_hdl
->addr
;
962 adreno_ocmem
->hdl
= ocmem_hdl
;
963 adreno_gpu
->gmem
= ocmem_hdl
->len
;
968 void adreno_gpu_ocmem_cleanup(struct adreno_ocmem
*adreno_ocmem
)
970 if (adreno_ocmem
&& adreno_ocmem
->base
)
971 ocmem_free(adreno_ocmem
->ocmem
, OCMEM_GRAPHICS
,
975 int adreno_gpu_init(struct drm_device
*drm
, struct platform_device
*pdev
,
976 struct adreno_gpu
*adreno_gpu
,
977 const struct adreno_gpu_funcs
*funcs
, int nr_rings
)
979 struct adreno_platform_config
*config
= pdev
->dev
.platform_data
;
980 struct msm_gpu_config adreno_gpu_config
= { 0 };
981 struct msm_gpu
*gpu
= &adreno_gpu
->base
;
983 adreno_gpu
->funcs
= funcs
;
984 adreno_gpu
->info
= adreno_info(config
->rev
);
985 adreno_gpu
->gmem
= adreno_gpu
->info
->gmem
;
986 adreno_gpu
->revn
= adreno_gpu
->info
->revn
;
987 adreno_gpu
->rev
= config
->rev
;
989 adreno_gpu_config
.ioname
= "kgsl_3d0_reg_memory";
991 adreno_gpu_config
.va_start
= SZ_16M
;
992 adreno_gpu_config
.va_end
= 0xffffffff;
993 /* maximum range of a2xx mmu */
994 if (adreno_is_a2xx(adreno_gpu
))
995 adreno_gpu_config
.va_end
= SZ_16M
+ 0xfff * SZ_64K
;
997 adreno_gpu_config
.nr_rings
= nr_rings
;
999 adreno_get_pwrlevels(&pdev
->dev
, gpu
);
1001 pm_runtime_set_autosuspend_delay(&pdev
->dev
,
1002 adreno_gpu
->info
->inactive_period
);
1003 pm_runtime_use_autosuspend(&pdev
->dev
);
1004 pm_runtime_enable(&pdev
->dev
);
1006 return msm_gpu_init(drm
, pdev
, &adreno_gpu
->base
, &funcs
->base
,
1007 adreno_gpu
->info
->name
, &adreno_gpu_config
);
1010 void adreno_gpu_cleanup(struct adreno_gpu
*adreno_gpu
)
1012 struct msm_gpu
*gpu
= &adreno_gpu
->base
;
1015 for (i
= 0; i
< ARRAY_SIZE(adreno_gpu
->info
->fw
); i
++)
1016 release_firmware(adreno_gpu
->fw
[i
]);
1018 icc_put(gpu
->icc_path
);
1019 icc_put(gpu
->ocmem_icc_path
);
1021 msm_gpu_cleanup(&adreno_gpu
->base
);