From 54154c6436ff410cadf6a006f1749a16a45fbe80 Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Tue, 27 Mar 2012 16:33:26 -0600 Subject: [PATCH] msm: kgsl: Return the correct A3XX GPU ID based on SoC type It turns out that A3XX_RBBM_HARDWARE_VERSION returns 0x0 for both A320 and A305. This, combined with some faulty logic in the GPU list, caused A320 to be reported as a A305. This had the immediate effect of costing A320 on apq8054 half the GMEM that it deserves and also triggering instabilities in the user mode driver. Instead of trying to read multiple registers to figure out the GPU ID, make the reasoned assumption that for now at least, GPU ID will match SoC ID. Construct the chip_id based on the SoC ID for A3XX targets and fix up the reported chip_id so it matches what user space expects. Change-Id: Ic0dedbadc74cb08fd7bc0bfb523b710ad33ed78c Signed-off-by: Jordan Crouse --- drivers/gpu/msm/adreno.c | 41 +++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/drivers/gpu/msm/adreno.c b/drivers/gpu/msm/adreno.c index 521564afba4..3db397bce1e 100644 --- a/drivers/gpu/msm/adreno.c +++ b/drivers/gpu/msm/adreno.c @@ -160,11 +160,11 @@ static const struct { "a225_pm4.fw", "a225_pfp.fw", &adreno_a2xx_gpudev, 1536, 768, 3, SZ_512K }, /* A3XX doesn't use the pix_shader_start */ - { ADRENO_REV_A305, 3, 1, ANY_ID, ANY_ID, + { ADRENO_REV_A305, 3, 0, 5, 0, "a300_pm4.fw", "a300_pfp.fw", &adreno_a3xx_gpudev, 512, 0, 2, SZ_256K }, /* A3XX doesn't use the pix_shader_start */ - { ADRENO_REV_A320, 3, 1, ANY_ID, ANY_ID, + { ADRENO_REV_A320, 3, 2, 0, 0, "a300_pm4.fw", "a300_pfp.fw", &adreno_a3xx_gpudev, 512, 0, 2, SZ_512K }, @@ -358,26 +358,29 @@ static void adreno_setstate(struct kgsl_device *device, static unsigned int a3xx_getchipid(struct kgsl_device *device) { - unsigned int chipid = 0; - unsigned int coreid, majorid, minorid, patchid; - unsigned int version; + unsigned int majorid, minorid, patchid; - adreno_regread(device, A3XX_RBBM_HW_VERSION, &version); + /* + * We could detect the chipID from the hardware but it takes multiple + * registers to find the right combination. Since we traffic exclusively + * in system on chips, we can be (mostly) confident that a SOC version + * will match a GPU (at this juncture at least). So do the lazy/quick + * thing and set the chip_id based on the SoC + */ - coreid = 0x03; + if (cpu_is_apq8064()) { + /* A320 */ + majorid = 2; + minorid = 0; + patchid = 0; + } else if (cpu_is_msm8930()) { + /* A305 */ + majorid = 0; + minorid = 5; + patchid = 0; + } - /* Version might not be set - if it isn't, assume this is 320 */ - if (version) - majorid = version & 0x0F; - else - majorid = 1; - - minorid = (version >> 4) & 0xFFF; - patchid = 0; - - chipid = (coreid << 24) | (majorid << 16) | (minorid << 8) | patchid; - - return chipid; + return (0x03 << 24) | (majorid << 16) | (minorid << 8) | patchid; } static unsigned int