diff options
author | Jordan Crouse <jcrouse@codeaurora.org> | 2018-02-01 14:15:16 -0500 |
---|---|---|
committer | Rob Clark <robdclark@gmail.com> | 2018-02-20 10:41:22 -0500 |
commit | c5e3548c295ace44c2ec8c3af1c10e82bc47f9b3 (patch) | |
tree | 8b237973ae71b2aafa1e8e8569fa057595317e8a | |
parent | f306953fdb1145020dd2a838698792d686feb2e3 (diff) |
drm/msm/adreno: Define a list of firmware files to load per target
The number and type of firmware files required differs for each
target. Instead of using a fixed struct member for each possible
firmware file use a generic list of files that should be loaded
on boot. Use some semi-target specific enums to help each target
find the appropriate firmware(s) that it needs to load.
Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>
Signed-off-by: Rob Clark <robdclark@gmail.com>
-rw-r--r-- | drivers/gpu/drm/msm/adreno/a3xx_gpu.c | 8 | ||||
-rw-r--r-- | drivers/gpu/drm/msm/adreno/a4xx_gpu.c | 8 | ||||
-rw-r--r-- | drivers/gpu/drm/msm/adreno/a5xx_debugfs.c | 13 | ||||
-rw-r--r-- | drivers/gpu/drm/msm/adreno/a5xx_gpu.c | 8 | ||||
-rw-r--r-- | drivers/gpu/drm/msm/adreno/a5xx_power.c | 26 | ||||
-rw-r--r-- | drivers/gpu/drm/msm/adreno/adreno_device.c | 44 | ||||
-rw-r--r-- | drivers/gpu/drm/msm/adreno/adreno_gpu.c | 33 | ||||
-rw-r--r-- | drivers/gpu/drm/msm/adreno/adreno_gpu.h | 12 |
8 files changed, 80 insertions, 72 deletions
diff --git a/drivers/gpu/drm/msm/adreno/a3xx_gpu.c b/drivers/gpu/drm/msm/adreno/a3xx_gpu.c index 4baef2738178..1dd84d3489ae 100644 --- a/drivers/gpu/drm/msm/adreno/a3xx_gpu.c +++ b/drivers/gpu/drm/msm/adreno/a3xx_gpu.c | |||
@@ -256,8 +256,8 @@ static int a3xx_hw_init(struct msm_gpu *gpu) | |||
256 | */ | 256 | */ |
257 | 257 | ||
258 | /* Load PM4: */ | 258 | /* Load PM4: */ |
259 | ptr = (uint32_t *)(adreno_gpu->pm4->data); | 259 | ptr = (uint32_t *)(adreno_gpu->fw[ADRENO_FW_PM4]->data); |
260 | len = adreno_gpu->pm4->size / 4; | 260 | len = adreno_gpu->fw[ADRENO_FW_PM4]->size / 4; |
261 | DBG("loading PM4 ucode version: %x", ptr[1]); | 261 | DBG("loading PM4 ucode version: %x", ptr[1]); |
262 | 262 | ||
263 | gpu_write(gpu, REG_AXXX_CP_DEBUG, | 263 | gpu_write(gpu, REG_AXXX_CP_DEBUG, |
@@ -268,8 +268,8 @@ static int a3xx_hw_init(struct msm_gpu *gpu) | |||
268 | gpu_write(gpu, REG_AXXX_CP_ME_RAM_DATA, ptr[i]); | 268 | gpu_write(gpu, REG_AXXX_CP_ME_RAM_DATA, ptr[i]); |
269 | 269 | ||
270 | /* Load PFP: */ | 270 | /* Load PFP: */ |
271 | ptr = (uint32_t *)(adreno_gpu->pfp->data); | 271 | ptr = (uint32_t *)(adreno_gpu->fw[ADRENO_FW_PFP]->data); |
272 | len = adreno_gpu->pfp->size / 4; | 272 | len = adreno_gpu->fw[ADRENO_FW_PFP]->size / 4; |
273 | DBG("loading PFP ucode version: %x", ptr[5]); | 273 | DBG("loading PFP ucode version: %x", ptr[5]); |
274 | 274 | ||
275 | gpu_write(gpu, REG_A3XX_CP_PFP_UCODE_ADDR, 0); | 275 | gpu_write(gpu, REG_A3XX_CP_PFP_UCODE_ADDR, 0); |
diff --git a/drivers/gpu/drm/msm/adreno/a4xx_gpu.c b/drivers/gpu/drm/msm/adreno/a4xx_gpu.c index 8199a4b9f2fa..2884b1b1660c 100644 --- a/drivers/gpu/drm/msm/adreno/a4xx_gpu.c +++ b/drivers/gpu/drm/msm/adreno/a4xx_gpu.c | |||
@@ -274,16 +274,16 @@ static int a4xx_hw_init(struct msm_gpu *gpu) | |||
274 | return ret; | 274 | return ret; |
275 | 275 | ||
276 | /* Load PM4: */ | 276 | /* Load PM4: */ |
277 | ptr = (uint32_t *)(adreno_gpu->pm4->data); | 277 | ptr = (uint32_t *)(adreno_gpu->fw[ADRENO_FW_PM4]->data); |
278 | len = adreno_gpu->pm4->size / 4; | 278 | len = adreno_gpu->fw[ADRENO_FW_PM4]->size / 4; |
279 | DBG("loading PM4 ucode version: %u", ptr[0]); | 279 | DBG("loading PM4 ucode version: %u", ptr[0]); |
280 | gpu_write(gpu, REG_A4XX_CP_ME_RAM_WADDR, 0); | 280 | gpu_write(gpu, REG_A4XX_CP_ME_RAM_WADDR, 0); |
281 | for (i = 1; i < len; i++) | 281 | for (i = 1; i < len; i++) |
282 | gpu_write(gpu, REG_A4XX_CP_ME_RAM_DATA, ptr[i]); | 282 | gpu_write(gpu, REG_A4XX_CP_ME_RAM_DATA, ptr[i]); |
283 | 283 | ||
284 | /* Load PFP: */ | 284 | /* Load PFP: */ |
285 | ptr = (uint32_t *)(adreno_gpu->pfp->data); | 285 | ptr = (uint32_t *)(adreno_gpu->fw[ADRENO_FW_PFP]->data); |
286 | len = adreno_gpu->pfp->size / 4; | 286 | len = adreno_gpu->fw[ADRENO_FW_PFP]->size / 4; |
287 | DBG("loading PFP ucode version: %u", ptr[0]); | 287 | DBG("loading PFP ucode version: %u", ptr[0]); |
288 | 288 | ||
289 | gpu_write(gpu, REG_A4XX_CP_PFP_UCODE_ADDR, 0); | 289 | gpu_write(gpu, REG_A4XX_CP_PFP_UCODE_ADDR, 0); |
diff --git a/drivers/gpu/drm/msm/adreno/a5xx_debugfs.c b/drivers/gpu/drm/msm/adreno/a5xx_debugfs.c index cef09780ef17..6b279414b9c0 100644 --- a/drivers/gpu/drm/msm/adreno/a5xx_debugfs.c +++ b/drivers/gpu/drm/msm/adreno/a5xx_debugfs.c | |||
@@ -123,15 +123,12 @@ reset_set(void *data, u64 val) | |||
123 | 123 | ||
124 | mutex_lock(&dev->struct_mutex); | 124 | mutex_lock(&dev->struct_mutex); |
125 | 125 | ||
126 | if (adreno_gpu->pm4) { | 126 | release_firmware(adreno_gpu->fw[ADRENO_FW_PM4]); |
127 | release_firmware(adreno_gpu->pm4); | 127 | adreno_gpu->fw[ADRENO_FW_PM4] = NULL; |
128 | adreno_gpu->pm4 = NULL; | 128 | |
129 | } | 129 | release_firmware(adreno_gpu->fw[ADRENO_FW_PFP]); |
130 | adreno_gpu->fw[ADRENO_FW_PFP] = NULL; | ||
130 | 131 | ||
131 | if (adreno_gpu->pfp) { | ||
132 | release_firmware(adreno_gpu->pfp); | ||
133 | adreno_gpu->pfp = NULL; | ||
134 | } | ||
135 | if (a5xx_gpu->pm4_bo) { | 132 | if (a5xx_gpu->pm4_bo) { |
136 | if (a5xx_gpu->pm4_iova) | 133 | if (a5xx_gpu->pm4_iova) |
137 | msm_gem_put_iova(a5xx_gpu->pm4_bo, gpu->aspace); | 134 | msm_gem_put_iova(a5xx_gpu->pm4_bo, gpu->aspace); |
diff --git a/drivers/gpu/drm/msm/adreno/a5xx_gpu.c b/drivers/gpu/drm/msm/adreno/a5xx_gpu.c index 795fe11a9371..517e19c3f9ed 100644 --- a/drivers/gpu/drm/msm/adreno/a5xx_gpu.c +++ b/drivers/gpu/drm/msm/adreno/a5xx_gpu.c | |||
@@ -523,8 +523,8 @@ static int a5xx_ucode_init(struct msm_gpu *gpu) | |||
523 | int ret; | 523 | int ret; |
524 | 524 | ||
525 | if (!a5xx_gpu->pm4_bo) { | 525 | if (!a5xx_gpu->pm4_bo) { |
526 | a5xx_gpu->pm4_bo = a5xx_ucode_load_bo(gpu, adreno_gpu->pm4, | 526 | a5xx_gpu->pm4_bo = a5xx_ucode_load_bo(gpu, |
527 | &a5xx_gpu->pm4_iova); | 527 | adreno_gpu->fw[ADRENO_FW_PM4], &a5xx_gpu->pm4_iova); |
528 | 528 | ||
529 | if (IS_ERR(a5xx_gpu->pm4_bo)) { | 529 | if (IS_ERR(a5xx_gpu->pm4_bo)) { |
530 | ret = PTR_ERR(a5xx_gpu->pm4_bo); | 530 | ret = PTR_ERR(a5xx_gpu->pm4_bo); |
@@ -536,8 +536,8 @@ static int a5xx_ucode_init(struct msm_gpu *gpu) | |||
536 | } | 536 | } |
537 | 537 | ||
538 | if (!a5xx_gpu->pfp_bo) { | 538 | if (!a5xx_gpu->pfp_bo) { |
539 | a5xx_gpu->pfp_bo = a5xx_ucode_load_bo(gpu, adreno_gpu->pfp, | 539 | a5xx_gpu->pfp_bo = a5xx_ucode_load_bo(gpu, |
540 | &a5xx_gpu->pfp_iova); | 540 | adreno_gpu->fw[ADRENO_FW_PFP], &a5xx_gpu->pfp_iova); |
541 | 541 | ||
542 | if (IS_ERR(a5xx_gpu->pfp_bo)) { | 542 | if (IS_ERR(a5xx_gpu->pfp_bo)) { |
543 | ret = PTR_ERR(a5xx_gpu->pfp_bo); | 543 | ret = PTR_ERR(a5xx_gpu->pfp_bo); |
diff --git a/drivers/gpu/drm/msm/adreno/a5xx_power.c b/drivers/gpu/drm/msm/adreno/a5xx_power.c index 6630e6c0c8be..e9c0e56dbec0 100644 --- a/drivers/gpu/drm/msm/adreno/a5xx_power.c +++ b/drivers/gpu/drm/msm/adreno/a5xx_power.c | |||
@@ -261,7 +261,6 @@ void a5xx_gpmu_ucode_init(struct msm_gpu *gpu) | |||
261 | struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu); | 261 | struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu); |
262 | struct a5xx_gpu *a5xx_gpu = to_a5xx_gpu(adreno_gpu); | 262 | struct a5xx_gpu *a5xx_gpu = to_a5xx_gpu(adreno_gpu); |
263 | struct drm_device *drm = gpu->dev; | 263 | struct drm_device *drm = gpu->dev; |
264 | const struct firmware *fw; | ||
265 | uint32_t dwords = 0, offset = 0, bosize; | 264 | uint32_t dwords = 0, offset = 0, bosize; |
266 | unsigned int *data, *ptr, *cmds; | 265 | unsigned int *data, *ptr, *cmds; |
267 | unsigned int cmds_size; | 266 | unsigned int cmds_size; |
@@ -269,15 +268,7 @@ void a5xx_gpmu_ucode_init(struct msm_gpu *gpu) | |||
269 | if (a5xx_gpu->gpmu_bo) | 268 | if (a5xx_gpu->gpmu_bo) |
270 | return; | 269 | return; |
271 | 270 | ||
272 | /* Get the firmware */ | 271 | data = (unsigned int *) adreno_gpu->fw[ADRENO_FW_GPMU]->data; |
273 | fw = adreno_request_fw(adreno_gpu, adreno_gpu->info->powerfw); | ||
274 | if (IS_ERR(fw)) { | ||
275 | DRM_ERROR("%s: Could not get GPMU firmware. GPMU will not be active\n", | ||
276 | gpu->name); | ||
277 | return; | ||
278 | } | ||
279 | |||
280 | data = (unsigned int *) fw->data; | ||
281 | 272 | ||
282 | /* | 273 | /* |
283 | * The first dword is the size of the remaining data in dwords. Use it | 274 | * The first dword is the size of the remaining data in dwords. Use it |
@@ -285,12 +276,14 @@ void a5xx_gpmu_ucode_init(struct msm_gpu *gpu) | |||
285 | * the firmware that we read | 276 | * the firmware that we read |
286 | */ | 277 | */ |
287 | 278 | ||
288 | if (fw->size < 8 || (data[0] < 2) || (data[0] >= (fw->size >> 2))) | 279 | if (adreno_gpu->fw[ADRENO_FW_GPMU]->size < 8 || |
289 | goto out; | 280 | (data[0] < 2) || (data[0] >= |
281 | (adreno_gpu->fw[ADRENO_FW_GPMU]->size >> 2))) | ||
282 | return; | ||
290 | 283 | ||
291 | /* The second dword is an ID - look for 2 (GPMU_FIRMWARE_ID) */ | 284 | /* The second dword is an ID - look for 2 (GPMU_FIRMWARE_ID) */ |
292 | if (data[1] != 2) | 285 | if (data[1] != 2) |
293 | goto out; | 286 | return; |
294 | 287 | ||
295 | cmds = data + data[2] + 3; | 288 | cmds = data + data[2] + 3; |
296 | cmds_size = data[0] - data[2] - 2; | 289 | cmds_size = data[0] - data[2] - 2; |
@@ -325,8 +318,7 @@ void a5xx_gpmu_ucode_init(struct msm_gpu *gpu) | |||
325 | msm_gem_put_vaddr(a5xx_gpu->gpmu_bo); | 318 | msm_gem_put_vaddr(a5xx_gpu->gpmu_bo); |
326 | a5xx_gpu->gpmu_dwords = dwords; | 319 | a5xx_gpu->gpmu_dwords = dwords; |
327 | 320 | ||
328 | goto out; | 321 | return; |
329 | |||
330 | err: | 322 | err: |
331 | if (a5xx_gpu->gpmu_iova) | 323 | if (a5xx_gpu->gpmu_iova) |
332 | msm_gem_put_iova(a5xx_gpu->gpmu_bo, gpu->aspace); | 324 | msm_gem_put_iova(a5xx_gpu->gpmu_bo, gpu->aspace); |
@@ -336,8 +328,4 @@ err: | |||
336 | a5xx_gpu->gpmu_bo = NULL; | 328 | a5xx_gpu->gpmu_bo = NULL; |
337 | a5xx_gpu->gpmu_iova = 0; | 329 | a5xx_gpu->gpmu_iova = 0; |
338 | a5xx_gpu->gpmu_dwords = 0; | 330 | a5xx_gpu->gpmu_dwords = 0; |
339 | |||
340 | out: | ||
341 | /* No need to keep that firmware laying around anymore */ | ||
342 | release_firmware(fw); | ||
343 | } | 331 | } |
diff --git a/drivers/gpu/drm/msm/adreno/adreno_device.c b/drivers/gpu/drm/msm/adreno/adreno_device.c index d64ceeb0d6f0..f07d3ec7d77b 100644 --- a/drivers/gpu/drm/msm/adreno/adreno_device.c +++ b/drivers/gpu/drm/msm/adreno/adreno_device.c | |||
@@ -30,61 +30,75 @@ static const struct adreno_info gpulist[] = { | |||
30 | .rev = ADRENO_REV(3, 0, 5, ANY_ID), | 30 | .rev = ADRENO_REV(3, 0, 5, ANY_ID), |
31 | .revn = 305, | 31 | .revn = 305, |
32 | .name = "A305", | 32 | .name = "A305", |
33 | .pm4fw = "a300_pm4.fw", | 33 | .fw = { |
34 | .pfpfw = "a300_pfp.fw", | 34 | [ADRENO_FW_PM4] = "a300_pm4.fw", |
35 | [ADRENO_FW_PFP] = "a300_pfp.fw", | ||
36 | }, | ||
35 | .gmem = SZ_256K, | 37 | .gmem = SZ_256K, |
36 | .init = a3xx_gpu_init, | 38 | .init = a3xx_gpu_init, |
37 | }, { | 39 | }, { |
38 | .rev = ADRENO_REV(3, 0, 6, 0), | 40 | .rev = ADRENO_REV(3, 0, 6, 0), |
39 | .revn = 307, /* because a305c is revn==306 */ | 41 | .revn = 307, /* because a305c is revn==306 */ |
40 | .name = "A306", | 42 | .name = "A306", |
41 | .pm4fw = "a300_pm4.fw", | 43 | .fw = { |
42 | .pfpfw = "a300_pfp.fw", | 44 | [ADRENO_FW_PM4] = "a300_pm4.fw", |
45 | [ADRENO_FW_PFP] = "a300_pfp.fw", | ||
46 | }, | ||
43 | .gmem = SZ_128K, | 47 | .gmem = SZ_128K, |
44 | .init = a3xx_gpu_init, | 48 | .init = a3xx_gpu_init, |
45 | }, { | 49 | }, { |
46 | .rev = ADRENO_REV(3, 2, ANY_ID, ANY_ID), | 50 | .rev = ADRENO_REV(3, 2, ANY_ID, ANY_ID), |
47 | .revn = 320, | 51 | .revn = 320, |
48 | .name = "A320", | 52 | .name = "A320", |
49 | .pm4fw = "a300_pm4.fw", | 53 | .fw = { |
50 | .pfpfw = "a300_pfp.fw", | 54 | [ADRENO_FW_PM4] = "a300_pm4.fw", |
55 | [ADRENO_FW_PFP] = "a300_pfp.fw", | ||
56 | }, | ||
51 | .gmem = SZ_512K, | 57 | .gmem = SZ_512K, |
52 | .init = a3xx_gpu_init, | 58 | .init = a3xx_gpu_init, |
53 | }, { | 59 | }, { |
54 | .rev = ADRENO_REV(3, 3, 0, ANY_ID), | 60 | .rev = ADRENO_REV(3, 3, 0, ANY_ID), |
55 | .revn = 330, | 61 | .revn = 330, |
56 | .name = "A330", | 62 | .name = "A330", |
57 | .pm4fw = "a330_pm4.fw", | 63 | .fw = { |
58 | .pfpfw = "a330_pfp.fw", | 64 | [ADRENO_FW_PM4] = "a330_pm4.fw", |
65 | [ADRENO_FW_PFP] = "a330_pfp.fw", | ||
66 | }, | ||
59 | .gmem = SZ_1M, | 67 | .gmem = SZ_1M, |
60 | .init = a3xx_gpu_init, | 68 | .init = a3xx_gpu_init, |
61 | }, { | 69 | }, { |
62 | .rev = ADRENO_REV(4, 2, 0, ANY_ID), | 70 | .rev = ADRENO_REV(4, 2, 0, ANY_ID), |
63 | .revn = 420, | 71 | .revn = 420, |
64 | .name = "A420", | 72 | .name = "A420", |
65 | .pm4fw = "a420_pm4.fw", | 73 | .fw = { |
66 | .pfpfw = "a420_pfp.fw", | 74 | [ADRENO_FW_PM4] = "a420_pm4.fw", |
75 | [ADRENO_FW_PFP] = "a420_pfp.fw", | ||
76 | }, | ||
67 | .gmem = (SZ_1M + SZ_512K), | 77 | .gmem = (SZ_1M + SZ_512K), |
68 | .init = a4xx_gpu_init, | 78 | .init = a4xx_gpu_init, |
69 | }, { | 79 | }, { |
70 | .rev = ADRENO_REV(4, 3, 0, ANY_ID), | 80 | .rev = ADRENO_REV(4, 3, 0, ANY_ID), |
71 | .revn = 430, | 81 | .revn = 430, |
72 | .name = "A430", | 82 | .name = "A430", |
73 | .pm4fw = "a420_pm4.fw", | 83 | .fw = { |
74 | .pfpfw = "a420_pfp.fw", | 84 | [ADRENO_FW_PM4] = "a420_pm4.fw", |
85 | [ADRENO_FW_PFP] = "a420_pfp.fw", | ||
86 | }, | ||
75 | .gmem = (SZ_1M + SZ_512K), | 87 | .gmem = (SZ_1M + SZ_512K), |
76 | .init = a4xx_gpu_init, | 88 | .init = a4xx_gpu_init, |
77 | }, { | 89 | }, { |
78 | .rev = ADRENO_REV(5, 3, 0, 2), | 90 | .rev = ADRENO_REV(5, 3, 0, 2), |
79 | .revn = 530, | 91 | .revn = 530, |
80 | .name = "A530", | 92 | .name = "A530", |
81 | .pm4fw = "a530_pm4.fw", | 93 | .fw = { |
82 | .pfpfw = "a530_pfp.fw", | 94 | [ADRENO_FW_PM4] = "a530_pm4.fw", |
95 | [ADRENO_FW_PFP] = "a530_pfp.fw", | ||
96 | [ADRENO_FW_GPMU] = "a530v3_gpmu.fw2", | ||
97 | }, | ||
83 | .gmem = SZ_1M, | 98 | .gmem = SZ_1M, |
84 | .quirks = ADRENO_QUIRK_TWO_PASS_USE_WFI | | 99 | .quirks = ADRENO_QUIRK_TWO_PASS_USE_WFI | |
85 | ADRENO_QUIRK_FAULT_DETECT_MASK, | 100 | ADRENO_QUIRK_FAULT_DETECT_MASK, |
86 | .init = a5xx_gpu_init, | 101 | .init = a5xx_gpu_init, |
87 | .powerfw = "a530v3_gpmu.fw2", | ||
88 | .zapfw = "a530_zap.mdt", | 102 | .zapfw = "a530_zap.mdt", |
89 | }, | 103 | }, |
90 | }; | 104 | }; |
diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c b/drivers/gpu/drm/msm/adreno/adreno_gpu.c index de63ff26a062..4a8ee5ec571e 100644 --- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c +++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c | |||
@@ -140,23 +140,24 @@ adreno_request_fw(struct adreno_gpu *adreno_gpu, const char *fwname) | |||
140 | 140 | ||
141 | static int adreno_load_fw(struct adreno_gpu *adreno_gpu) | 141 | static int adreno_load_fw(struct adreno_gpu *adreno_gpu) |
142 | { | 142 | { |
143 | const struct firmware *fw; | 143 | int i; |
144 | 144 | ||
145 | if (adreno_gpu->pm4) | 145 | for (i = 0; i < ARRAY_SIZE(adreno_gpu->info->fw); i++) { |
146 | return 0; | 146 | const struct firmware *fw; |
147 | 147 | ||
148 | fw = adreno_request_fw(adreno_gpu, adreno_gpu->info->pm4fw); | 148 | if (!adreno_gpu->info->fw[i]) |
149 | if (IS_ERR(fw)) | 149 | continue; |
150 | return PTR_ERR(fw); | ||
151 | adreno_gpu->pm4 = fw; | ||
152 | 150 | ||
153 | fw = adreno_request_fw(adreno_gpu, adreno_gpu->info->pfpfw); | 151 | /* Skip if the firmware has already been loaded */ |
154 | if (IS_ERR(fw)) { | 152 | if (adreno_gpu->fw[i]) |
155 | release_firmware(adreno_gpu->pm4); | 153 | continue; |
156 | adreno_gpu->pm4 = NULL; | 154 | |
157 | return PTR_ERR(fw); | 155 | fw = adreno_request_fw(adreno_gpu, adreno_gpu->info->fw[i]); |
156 | if (IS_ERR(fw)) | ||
157 | return PTR_ERR(fw); | ||
158 | |||
159 | adreno_gpu->fw[i] = fw; | ||
158 | } | 160 | } |
159 | adreno_gpu->pfp = fw; | ||
160 | 161 | ||
161 | return 0; | 162 | return 0; |
162 | } | 163 | } |
@@ -569,8 +570,10 @@ int adreno_gpu_init(struct drm_device *drm, struct platform_device *pdev, | |||
569 | 570 | ||
570 | void adreno_gpu_cleanup(struct adreno_gpu *adreno_gpu) | 571 | void adreno_gpu_cleanup(struct adreno_gpu *adreno_gpu) |
571 | { | 572 | { |
572 | release_firmware(adreno_gpu->pm4); | 573 | unsigned int i; |
573 | release_firmware(adreno_gpu->pfp); | 574 | |
575 | for (i = 0; i < ARRAY_SIZE(adreno_gpu->info->fw); i++) | ||
576 | release_firmware(adreno_gpu->fw[i]); | ||
574 | 577 | ||
575 | msm_gpu_cleanup(&adreno_gpu->base); | 578 | msm_gpu_cleanup(&adreno_gpu->base); |
576 | } | 579 | } |
diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.h b/drivers/gpu/drm/msm/adreno/adreno_gpu.h index 0a869bb8ee9d..499092af81a2 100644 --- a/drivers/gpu/drm/msm/adreno/adreno_gpu.h +++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.h | |||
@@ -48,6 +48,13 @@ enum adreno_regs { | |||
48 | REG_ADRENO_REGISTER_MAX, | 48 | REG_ADRENO_REGISTER_MAX, |
49 | }; | 49 | }; |
50 | 50 | ||
51 | enum { | ||
52 | ADRENO_FW_PM4 = 0, | ||
53 | ADRENO_FW_PFP = 1, | ||
54 | ADRENO_FW_GPMU = 2, | ||
55 | ADRENO_FW_MAX, | ||
56 | }; | ||
57 | |||
51 | enum adreno_quirks { | 58 | enum adreno_quirks { |
52 | ADRENO_QUIRK_TWO_PASS_USE_WFI = 1, | 59 | ADRENO_QUIRK_TWO_PASS_USE_WFI = 1, |
53 | ADRENO_QUIRK_FAULT_DETECT_MASK = 2, | 60 | ADRENO_QUIRK_FAULT_DETECT_MASK = 2, |
@@ -72,8 +79,7 @@ struct adreno_info { | |||
72 | struct adreno_rev rev; | 79 | struct adreno_rev rev; |
73 | uint32_t revn; | 80 | uint32_t revn; |
74 | const char *name; | 81 | const char *name; |
75 | const char *pm4fw, *pfpfw; | 82 | const char *fw[ADRENO_FW_MAX]; |
76 | const char *powerfw; | ||
77 | uint32_t gmem; | 83 | uint32_t gmem; |
78 | enum adreno_quirks quirks; | 84 | enum adreno_quirks quirks; |
79 | struct msm_gpu *(*init)(struct drm_device *dev); | 85 | struct msm_gpu *(*init)(struct drm_device *dev); |
@@ -115,7 +121,7 @@ struct adreno_gpu { | |||
115 | } fwloc; | 121 | } fwloc; |
116 | 122 | ||
117 | /* firmware: */ | 123 | /* firmware: */ |
118 | const struct firmware *pm4, *pfp; | 124 | const struct firmware *fw[ADRENO_FW_MAX]; |
119 | 125 | ||
120 | /* | 126 | /* |
121 | * Register offsets are different between some GPUs. | 127 | * Register offsets are different between some GPUs. |