mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 10:41:38 -04:00
msm: kgsl: Make OOB timeouts easier to debug
Instead of a vague message and a mask use actual string names and a nice WARN() to make it easier for mere mortals to debug OOB timeouts. Also remove a unneeded global function and replace it with a smaller local function. Change-Id: Ic0dedbad470326854e8565d651d477cf54401f07 Signed-off-by: Jordan Crouse <[email protected]>
This commit is contained in:
parent
468361c1a9
commit
85de653589
4 changed files with 47 additions and 45 deletions
|
|
@ -563,6 +563,19 @@ static int load_gmu_fw(struct kgsl_device *device)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static const char *oob_to_str(enum oob_request req)
|
||||
{
|
||||
if (req == oob_gpu)
|
||||
return "oob_gpu";
|
||||
else if (req == oob_perfcntr)
|
||||
return "oob_perfcntr";
|
||||
else if (req == oob_boot_slumber)
|
||||
return "oob_boot_slumber";
|
||||
else if (req == oob_dcvs)
|
||||
return "oob_dcvs";
|
||||
return "unknown";
|
||||
}
|
||||
|
||||
/*
|
||||
* a6xx_gmu_oob_set() - Set OOB interrupt to GMU.
|
||||
* @device: Pointer to kgsl device
|
||||
|
|
@ -576,30 +589,31 @@ static int a6xx_gmu_oob_set(struct kgsl_device *device,
|
|||
int ret = 0;
|
||||
int set, check;
|
||||
|
||||
if (!adreno_is_a630(adreno_dev) && !adreno_is_a615_family(adreno_dev)) {
|
||||
set = BIT(30 - req * 2);
|
||||
check = BIT(31 - req);
|
||||
|
||||
if (req >= 6) {
|
||||
dev_err(&gmu->pdev->dev,
|
||||
"OOB_set(0x%x) invalid\n", set);
|
||||
return -EINVAL;
|
||||
}
|
||||
} else {
|
||||
if (adreno_is_a630(adreno_dev) || adreno_is_a615_family(adreno_dev)) {
|
||||
set = BIT(req + 16);
|
||||
check = BIT(req + 24);
|
||||
} else {
|
||||
/*
|
||||
* The legacy targets have special bits that aren't supported on
|
||||
* newer implementations
|
||||
*/
|
||||
if (req >= oob_boot_slumber) {
|
||||
dev_err(&gmu->pdev->dev,
|
||||
"Unsupported OOB request %s\n",
|
||||
oob_to_str(req));
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
set = BIT(30 - req * 2);
|
||||
check = BIT(31 - req);
|
||||
}
|
||||
|
||||
gmu_core_regwrite(device, A6XX_GMU_HOST2GMU_INTR_SET, set);
|
||||
|
||||
if (timed_poll_check(device,
|
||||
A6XX_GMU_GMU2HOST_INTR_INFO,
|
||||
check,
|
||||
GPU_START_TIMEOUT,
|
||||
check)) {
|
||||
if (timed_poll_check(device, A6XX_GMU_GMU2HOST_INTR_INFO, check,
|
||||
GPU_START_TIMEOUT, check)) {
|
||||
ret = -ETIMEDOUT;
|
||||
dev_err(&gmu->pdev->dev,
|
||||
"OOB_set(0x%x) timed out\n", set);
|
||||
WARN(1, "OOB request %s timed out\n", oob_to_str(req));
|
||||
}
|
||||
|
||||
gmu_core_regwrite(device, A6XX_GMU_GMU2HOST_INTR_CLR, check);
|
||||
|
|
@ -620,15 +634,16 @@ static void a6xx_gmu_oob_clear(struct kgsl_device *device,
|
|||
struct gmu_device *gmu = KGSL_GMU_DEVICE(device);
|
||||
int clear;
|
||||
|
||||
if (!adreno_is_a630(adreno_dev) && !adreno_is_a615_family(adreno_dev)) {
|
||||
if (adreno_is_a630(adreno_dev) || adreno_is_a615_family(adreno_dev)) {
|
||||
clear = BIT(req + 24);
|
||||
} else {
|
||||
clear = BIT(31 - req * 2);
|
||||
if (req >= 6) {
|
||||
dev_err(&gmu->pdev->dev,
|
||||
"OOB_clear(0x%x) invalid\n", clear);
|
||||
if (req >= oob_boot_slumber) {
|
||||
dev_err(&gmu->pdev->dev, "Unsupported OOB clear %s\n",
|
||||
oob_to_str(req));
|
||||
return;
|
||||
}
|
||||
} else
|
||||
clear = BIT(req + 24);
|
||||
}
|
||||
|
||||
gmu_core_regwrite(device, A6XX_GMU_HOST2GMU_INTR_SET, clear);
|
||||
trace_kgsl_gmu_oob_clear(clear);
|
||||
|
|
|
|||
|
|
@ -84,6 +84,15 @@ irqreturn_t oob_irq_handler(int irq, void *data)
|
|||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static const char *oob_to_str(enum oob_request req)
|
||||
{
|
||||
if (req == oob_gpu)
|
||||
return "oob_gpu";
|
||||
else if (req == oob_perfcntr)
|
||||
return "oob_perfcntr";
|
||||
return "unknown";
|
||||
}
|
||||
|
||||
/*
|
||||
* a6xx_rgmu_oob_set() - Set OOB interrupt to RGMU
|
||||
* @adreno_dev: Pointer to adreno device
|
||||
|
|
@ -112,7 +121,7 @@ static int a6xx_rgmu_oob_set(struct kgsl_device *device,
|
|||
gmu_core_regread(device, A6XX_RGMU_CX_PCC_DEBUG, &status);
|
||||
dev_err(&rgmu->pdev->dev,
|
||||
"Timed out while setting OOB req:%s status:0x%x\n",
|
||||
gmu_core_oob_type_str(req), status);
|
||||
oob_to_str(req), status);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -16,27 +16,6 @@ static const struct of_device_id gmu_match_table[] = {
|
|||
{},
|
||||
};
|
||||
|
||||
struct oob_entry {
|
||||
enum oob_request req;
|
||||
const char *str;
|
||||
};
|
||||
|
||||
const char *gmu_core_oob_type_str(enum oob_request req)
|
||||
{
|
||||
int i;
|
||||
struct oob_entry table[] = {
|
||||
{ oob_gpu, "oob_gpu"},
|
||||
{ oob_perfcntr, "oob_perfcntr"},
|
||||
{ oob_boot_slumber, "oob_boot_slumber"},
|
||||
{ oob_dcvs, "oob_dcvs"},
|
||||
};
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(table); i++)
|
||||
if (req == table[i].req)
|
||||
return table[i].str;
|
||||
return "UNKNOWN";
|
||||
}
|
||||
|
||||
void __init gmu_core_register(void)
|
||||
{
|
||||
const struct of_device_id *match;
|
||||
|
|
|
|||
|
|
@ -205,7 +205,6 @@ void gmu_core_blkwrite(struct kgsl_device *device, unsigned int offsetwords,
|
|||
const void *buffer, size_t size);
|
||||
void gmu_core_regrmw(struct kgsl_device *device, unsigned int offsetwords,
|
||||
unsigned int mask, unsigned int bits);
|
||||
const char *gmu_core_oob_type_str(enum oob_request req);
|
||||
int gmu_core_dev_oob_set(struct kgsl_device *device, enum oob_request req);
|
||||
void gmu_core_dev_oob_clear(struct kgsl_device *device, enum oob_request req);
|
||||
int gmu_core_dev_hfi_start_msg(struct kgsl_device *device);
|
||||
|
|
|
|||
Loading…
Reference in a new issue