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