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;