msm: kgsl: Consolidate all GPU information in one spot

We are starting to accumulate a lot GPU specific information,
and it is handy to keep it all in one place where new core IDs,
firmware and device functions can be easily added.

Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>
diff --git a/drivers/gpu/msm/adreno.c b/drivers/gpu/msm/adreno.c
index 6638d8c..e6c463a 100644
--- a/drivers/gpu/msm/adreno.c
+++ b/drivers/gpu/msm/adreno.c
@@ -118,6 +118,30 @@
 	.pm4_fw = NULL,
 };
 
+/*
+ * This is the master list of all GPU cores that are supported by this
+ * driver.
+ */
+
+#define ANY_ID (~0)
+
+static const struct {
+	enum adreno_gpurev gpurev;
+	unsigned int core, major, minor;
+	const char *pm4fw;
+	const char *pfpfw;
+	struct adreno_gpudev *gpudev;
+} adreno_gpulist[] = {
+	{ ADRENO_REV_A200, 0, 2, ANY_ID,
+		"yamato_pm4.fw", "yamato_pfp.fw", &adreno_a2xx_gpudev },
+	{ ADRENO_REV_A205, 0, 1, 0,
+		"yamato_pm4.fw", "yamato_pfp.fw", &adreno_a2xx_gpudev },
+	{ ADRENO_REV_A220, 2, 1, ANY_ID,
+		"leia_pm4_470.fw", "leia_pfp_470.fw", &adreno_a2xx_gpudev },
+	{ ADRENO_REV_A225, 2, 2, ANY_ID,
+		"a225_pm4.fw", "a225_pfp.fw", &adreno_a2xx_gpudev },
+};
+
 static void adreno_gmeminit(struct adreno_device *adreno_dev)
 {
 	struct kgsl_device *device = &adreno_dev->dev;
@@ -353,31 +377,14 @@
 	return chipid;
 }
 
-/* all chipid fields are 8 bits wide so 256 won't occur in a real chipid */
-#define DONT_CARE 256
-static const struct {
-	unsigned int core;
-	unsigned int major;
-	unsigned int minor;
-	enum adreno_gpurev gpurev;
-} gpurev_table[] = {
-	/* major and minor may be DONT_CARE, but core must not be */
-	{0, 2, DONT_CARE, ADRENO_REV_A200},
-	{0, 1, 0, ADRENO_REV_A205},
-	{2, 1, DONT_CARE, ADRENO_REV_A220},
-	{2, 2, DONT_CARE, ADRENO_REV_A225},
-};
-
 static inline bool _rev_match(unsigned int id, unsigned int entry)
 {
-	return (entry == DONT_CARE || entry == id);
+	return (entry == ANY_ID || entry == id);
 }
-#undef DONT_CARE
 
 static void
 adreno_identify_gpu(struct adreno_device *adreno_dev)
 {
-	enum adreno_gpurev gpurev = ADRENO_REV_UNKNOWN;
 	unsigned int i, core, major, minor;
 
 	adreno_dev->chip_id = adreno_getchipid(&adreno_dev->dev);
@@ -386,17 +393,23 @@
 	major = (adreno_dev->chip_id >> 16) & 0xff;
 	minor = (adreno_dev->chip_id >> 8) & 0xff;
 
-	for (i = 0; i < ARRAY_SIZE(gpurev_table); i++) {
-		if (core == gpurev_table[i].core &&
-		    _rev_match(major, gpurev_table[i].major) &&
-		    _rev_match(minor, gpurev_table[i].minor)) {
-			gpurev = gpurev_table[i].gpurev;
+	for (i = 0; i < ARRAY_SIZE(adreno_gpulist); i++) {
+		if (core == adreno_gpulist[i].core &&
+		    _rev_match(major, adreno_gpulist[i].major) &&
+		    _rev_match(minor, adreno_gpulist[i].minor)) {
 			break;
 		}
 	}
 
-	adreno_dev->gpurev = gpurev;
-	adreno_dev->gpudev = &adreno_a2xx_gpudev;
+	if (i == ARRAY_SIZE(adreno_gpulist)) {
+		adreno_dev->gpurev = ADRENO_REV_UNKNOWN;
+		return;
+	}
+
+	adreno_dev->gpurev = adreno_gpulist[i].gpurev;
+	adreno_dev->gpudev = adreno_gpulist[i].gpudev;
+	adreno_dev->pfp_fwfile = adreno_gpulist[i].pfpfw;
+	adreno_dev->pm4_fwfile = adreno_gpulist[i].pm4fw;
 }
 
 static int __devinit
@@ -467,6 +480,12 @@
 	/* Identify the specific GPU */
 	adreno_identify_gpu(adreno_dev);
 
+	if (adreno_dev->gpurev == ADRENO_REV_UNKNOWN) {
+		KGSL_DRV_ERR(device, "Unknown chip ID %x\n",
+			adreno_dev->chip_id);
+		goto error_clk_off;
+	}
+
 	if (adreno_is_a20x(adreno_dev)) {
 		/*
 		 * the MH_CLNT_INTF_CTRL_CONFIG registers aren't present
diff --git a/drivers/gpu/msm/adreno.h b/drivers/gpu/msm/adreno.h
index 5b3d676..94b96a1 100644
--- a/drivers/gpu/msm/adreno.h
+++ b/drivers/gpu/msm/adreno.h
@@ -55,8 +55,10 @@
 	struct kgsl_memregion gmemspace;
 	struct adreno_context *drawctxt_active;
 	wait_queue_head_t ib1_wq;
+	const char *pfp_fwfile;
 	unsigned int *pfp_fw;
 	size_t pfp_fw_size;
+	const char *pm4_fwfile;
 	unsigned int *pm4_fw;
 	size_t pm4_fw_size;
 	struct adreno_ringbuffer ringbuffer;
diff --git a/drivers/gpu/msm/adreno_ringbuffer.c b/drivers/gpu/msm/adreno_ringbuffer.c
index ee123fb..a4a769c 100644
--- a/drivers/gpu/msm/adreno_ringbuffer.c
+++ b/drivers/gpu/msm/adreno_ringbuffer.c
@@ -167,25 +167,15 @@
 static int adreno_ringbuffer_load_pm4_ucode(struct kgsl_device *device)
 {
 	struct adreno_device *adreno_dev = ADRENO_DEVICE(device);
-	const char *fwfile;
 	int i, ret = 0;
 
-	if (adreno_is_a220(adreno_dev)) {
-		fwfile =  A220_PM4_470_FW;
-	} else if (adreno_is_a225(adreno_dev)) {
-		fwfile =  A225_PM4_FW;
-	} else if (adreno_is_a20x(adreno_dev)) {
-		fwfile =  A200_PM4_FW;
-	} else {
-		KGSL_DRV_ERR(device, "Could not load PM4 file\n");
-		return -EINVAL;
-	}
-
 	if (adreno_dev->pm4_fw == NULL) {
 		int len;
-		unsigned int *ptr;
+		void *ptr;
 
-		ret = _load_firmware(device, fwfile, (void *) &ptr, &len);
+		ret = _load_firmware(device, adreno_dev->pm4_fwfile,
+			&ptr, &len);
+
 		if (ret)
 			goto err;
 
@@ -215,25 +205,14 @@
 static int adreno_ringbuffer_load_pfp_ucode(struct kgsl_device *device)
 {
 	struct adreno_device *adreno_dev = ADRENO_DEVICE(device);
-	const char *fwfile;
 	int i, ret = 0;
 
-	if (adreno_is_a220(adreno_dev)) {
-		fwfile =  A220_PFP_470_FW;
-	} else if (adreno_is_a225(adreno_dev)) {
-		fwfile =  A225_PFP_FW;
-	} else if (adreno_is_a20x(adreno_dev)) {
-		fwfile = A200_PFP_FW;
-	} else {
-		KGSL_DRV_ERR(device, "Could not load PFP firmware\n");
-		return -EINVAL;
-	}
-
 	if (adreno_dev->pfp_fw == NULL) {
 		int len;
-		unsigned int *ptr;
+		void *ptr;
 
-		ret = _load_firmware(device, fwfile, (void *) &ptr, &len);
+		ret = _load_firmware(device, adreno_dev->pfp_fwfile,
+			&ptr, &len);
 		if (ret)
 			goto err;