diff options
-rw-r--r-- | drivers/gpu/drm/msm/adreno/a3xx_gpu.c | 148 | ||||
-rw-r--r-- | drivers/gpu/drm/msm/adreno/a3xx_gpu.h | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/msm/adreno/adreno_gpu.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/msm/adreno/adreno_gpu.h | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/msm/msm_iommu.c | 2 |
5 files changed, 144 insertions, 23 deletions
diff --git a/drivers/gpu/drm/msm/adreno/a3xx_gpu.c b/drivers/gpu/drm/msm/adreno/a3xx_gpu.c index f4aa815b690a..461df93e825e 100644 --- a/drivers/gpu/drm/msm/adreno/a3xx_gpu.c +++ b/drivers/gpu/drm/msm/adreno/a3xx_gpu.c | |||
@@ -15,6 +15,10 @@ | |||
15 | * this program. If not, see <http://www.gnu.org/licenses/>. | 15 | * this program. If not, see <http://www.gnu.org/licenses/>. |
16 | */ | 16 | */ |
17 | 17 | ||
18 | #ifdef CONFIG_MSM_OCMEM | ||
19 | # include <mach/ocmem.h> | ||
20 | #endif | ||
21 | |||
18 | #include "a3xx_gpu.h" | 22 | #include "a3xx_gpu.h" |
19 | 23 | ||
20 | #define A3XX_INT0_MASK \ | 24 | #define A3XX_INT0_MASK \ |
@@ -63,6 +67,7 @@ static void a3xx_me_init(struct msm_gpu *gpu) | |||
63 | static int a3xx_hw_init(struct msm_gpu *gpu) | 67 | static int a3xx_hw_init(struct msm_gpu *gpu) |
64 | { | 68 | { |
65 | struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu); | 69 | struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu); |
70 | struct a3xx_gpu *a3xx_gpu = to_a3xx_gpu(adreno_gpu); | ||
66 | uint32_t *ptr, len; | 71 | uint32_t *ptr, len; |
67 | int i, ret; | 72 | int i, ret; |
68 | 73 | ||
@@ -105,6 +110,21 @@ static int a3xx_hw_init(struct msm_gpu *gpu) | |||
105 | gpu_write(gpu, REG_A3XX_VBIF_ABIT_SORT, 0x000000ff); | 110 | gpu_write(gpu, REG_A3XX_VBIF_ABIT_SORT, 0x000000ff); |
106 | gpu_write(gpu, REG_A3XX_VBIF_ABIT_SORT_CONF, 0x000000a4); | 111 | gpu_write(gpu, REG_A3XX_VBIF_ABIT_SORT_CONF, 0x000000a4); |
107 | 112 | ||
113 | } else if (adreno_is_a330v2(adreno_gpu)) { | ||
114 | /* | ||
115 | * Most of the VBIF registers on 8974v2 have the correct | ||
116 | * values at power on, so we won't modify those if we don't | ||
117 | * need to | ||
118 | */ | ||
119 | /* Enable 1k sort: */ | ||
120 | gpu_write(gpu, REG_A3XX_VBIF_ABIT_SORT, 0x0001003f); | ||
121 | gpu_write(gpu, REG_A3XX_VBIF_ABIT_SORT_CONF, 0x000000a4); | ||
122 | /* Enable WR-REQ: */ | ||
123 | gpu_write(gpu, REG_A3XX_VBIF_GATE_OFF_WRREQ_EN, 0x00003f); | ||
124 | gpu_write(gpu, REG_A3XX_VBIF_DDR_OUT_MAX_BURST, 0x0000303); | ||
125 | /* Set up VBIF_ROUND_ROBIN_QOS_ARB: */ | ||
126 | gpu_write(gpu, REG_A3XX_VBIF_ROUND_ROBIN_QOS_ARB, 0x0003); | ||
127 | |||
108 | } else if (adreno_is_a330(adreno_gpu)) { | 128 | } else if (adreno_is_a330(adreno_gpu)) { |
109 | /* Set up 16 deep read/write request queues: */ | 129 | /* Set up 16 deep read/write request queues: */ |
110 | gpu_write(gpu, REG_A3XX_VBIF_IN_RD_LIM_CONF0, 0x18181818); | 130 | gpu_write(gpu, REG_A3XX_VBIF_IN_RD_LIM_CONF0, 0x18181818); |
@@ -121,10 +141,10 @@ static int a3xx_hw_init(struct msm_gpu *gpu) | |||
121 | /* Set up VBIF_ROUND_ROBIN_QOS_ARB: */ | 141 | /* Set up VBIF_ROUND_ROBIN_QOS_ARB: */ |
122 | gpu_write(gpu, REG_A3XX_VBIF_ROUND_ROBIN_QOS_ARB, 0x0001); | 142 | gpu_write(gpu, REG_A3XX_VBIF_ROUND_ROBIN_QOS_ARB, 0x0001); |
123 | /* Set up AOOO: */ | 143 | /* Set up AOOO: */ |
124 | gpu_write(gpu, REG_A3XX_VBIF_OUT_AXI_AOOO_EN, 0x0000ffff); | 144 | gpu_write(gpu, REG_A3XX_VBIF_OUT_AXI_AOOO_EN, 0x0000003f); |
125 | gpu_write(gpu, REG_A3XX_VBIF_OUT_AXI_AOOO, 0xffffffff); | 145 | gpu_write(gpu, REG_A3XX_VBIF_OUT_AXI_AOOO, 0x003f003f); |
126 | /* Enable 1K sort: */ | 146 | /* Enable 1K sort: */ |
127 | gpu_write(gpu, REG_A3XX_VBIF_ABIT_SORT, 0x0001ffff); | 147 | gpu_write(gpu, REG_A3XX_VBIF_ABIT_SORT, 0x0001003f); |
128 | gpu_write(gpu, REG_A3XX_VBIF_ABIT_SORT_CONF, 0x000000a4); | 148 | gpu_write(gpu, REG_A3XX_VBIF_ABIT_SORT_CONF, 0x000000a4); |
129 | /* Disable VBIF clock gating. This is to enable AXI running | 149 | /* Disable VBIF clock gating. This is to enable AXI running |
130 | * higher frequency than GPU: | 150 | * higher frequency than GPU: |
@@ -162,14 +182,23 @@ static int a3xx_hw_init(struct msm_gpu *gpu) | |||
162 | gpu_write(gpu, REG_A3XX_UCHE_CACHE_MODE_CONTROL_REG, 0x00000001); | 182 | gpu_write(gpu, REG_A3XX_UCHE_CACHE_MODE_CONTROL_REG, 0x00000001); |
163 | 183 | ||
164 | /* Enable Clock gating: */ | 184 | /* Enable Clock gating: */ |
165 | gpu_write(gpu, REG_A3XX_RBBM_CLOCK_CTL, 0xbfffffff); | 185 | if (adreno_is_a320(adreno_gpu)) |
166 | 186 | gpu_write(gpu, REG_A3XX_RBBM_CLOCK_CTL, 0xbfffffff); | |
167 | /* Set the OCMEM base address for A330 */ | 187 | else if (adreno_is_a330v2(adreno_gpu)) |
168 | //TODO: | 188 | gpu_write(gpu, REG_A3XX_RBBM_CLOCK_CTL, 0xaaaaaaaa); |
169 | // if (adreno_is_a330(adreno_gpu)) { | 189 | else if (adreno_is_a330(adreno_gpu)) |
170 | // gpu_write(gpu, REG_A3XX_RB_GMEM_BASE_ADDR, | 190 | gpu_write(gpu, REG_A3XX_RBBM_CLOCK_CTL, 0xbffcffff); |
171 | // (unsigned int)(a3xx_gpu->ocmem_base >> 14)); | 191 | |
172 | // } | 192 | if (adreno_is_a330v2(adreno_gpu)) |
193 | gpu_write(gpu, REG_A3XX_RBBM_GPR0_CTL, 0x05515455); | ||
194 | else if (adreno_is_a330(adreno_gpu)) | ||
195 | gpu_write(gpu, REG_A3XX_RBBM_GPR0_CTL, 0x00000000); | ||
196 | |||
197 | /* Set the OCMEM base address for A330, etc */ | ||
198 | if (a3xx_gpu->ocmem_hdl) { | ||
199 | gpu_write(gpu, REG_A3XX_RB_GMEM_BASE_ADDR, | ||
200 | (unsigned int)(a3xx_gpu->ocmem_base >> 14)); | ||
201 | } | ||
173 | 202 | ||
174 | /* Turn on performance counters: */ | 203 | /* Turn on performance counters: */ |
175 | gpu_write(gpu, REG_A3XX_RBBM_PERFCTR_CTL, 0x01); | 204 | gpu_write(gpu, REG_A3XX_RBBM_PERFCTR_CTL, 0x01); |
@@ -238,12 +267,19 @@ static int a3xx_hw_init(struct msm_gpu *gpu) | |||
238 | gpu_write(gpu, REG_A3XX_CP_PFP_UCODE_DATA, ptr[i]); | 267 | gpu_write(gpu, REG_A3XX_CP_PFP_UCODE_DATA, ptr[i]); |
239 | 268 | ||
240 | /* CP ROQ queue sizes (bytes) - RB:16, ST:16, IB1:32, IB2:64 */ | 269 | /* CP ROQ queue sizes (bytes) - RB:16, ST:16, IB1:32, IB2:64 */ |
241 | if (adreno_is_a305(adreno_gpu) || adreno_is_a320(adreno_gpu)) | 270 | if (adreno_is_a305(adreno_gpu) || adreno_is_a320(adreno_gpu)) { |
242 | gpu_write(gpu, REG_AXXX_CP_QUEUE_THRESHOLDS, | 271 | gpu_write(gpu, REG_AXXX_CP_QUEUE_THRESHOLDS, |
243 | AXXX_CP_QUEUE_THRESHOLDS_CSQ_IB1_START(2) | | 272 | AXXX_CP_QUEUE_THRESHOLDS_CSQ_IB1_START(2) | |
244 | AXXX_CP_QUEUE_THRESHOLDS_CSQ_IB2_START(6) | | 273 | AXXX_CP_QUEUE_THRESHOLDS_CSQ_IB2_START(6) | |
245 | AXXX_CP_QUEUE_THRESHOLDS_CSQ_ST_START(14)); | 274 | AXXX_CP_QUEUE_THRESHOLDS_CSQ_ST_START(14)); |
246 | 275 | } else if (adreno_is_a330(adreno_gpu)) { | |
276 | /* NOTE: this (value take from downstream android driver) | ||
277 | * includes some bits outside of the known bitfields. But | ||
278 | * A330 has this "MERCIU queue" thing too, which might | ||
279 | * explain a new bitfield or reshuffling: | ||
280 | */ | ||
281 | gpu_write(gpu, REG_AXXX_CP_QUEUE_THRESHOLDS, 0x003e2008); | ||
282 | } | ||
247 | 283 | ||
248 | /* clear ME_HALT to start micro engine */ | 284 | /* clear ME_HALT to start micro engine */ |
249 | gpu_write(gpu, REG_AXXX_CP_ME_CNTL, 0); | 285 | gpu_write(gpu, REG_AXXX_CP_ME_CNTL, 0); |
@@ -253,6 +289,14 @@ static int a3xx_hw_init(struct msm_gpu *gpu) | |||
253 | return 0; | 289 | return 0; |
254 | } | 290 | } |
255 | 291 | ||
292 | static void a3xx_recover(struct msm_gpu *gpu) | ||
293 | { | ||
294 | gpu_write(gpu, REG_A3XX_RBBM_SW_RESET_CMD, 1); | ||
295 | gpu_read(gpu, REG_A3XX_RBBM_SW_RESET_CMD); | ||
296 | gpu_write(gpu, REG_A3XX_RBBM_SW_RESET_CMD, 0); | ||
297 | adreno_recover(gpu); | ||
298 | } | ||
299 | |||
256 | static void a3xx_destroy(struct msm_gpu *gpu) | 300 | static void a3xx_destroy(struct msm_gpu *gpu) |
257 | { | 301 | { |
258 | struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu); | 302 | struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu); |
@@ -261,6 +305,12 @@ static void a3xx_destroy(struct msm_gpu *gpu) | |||
261 | DBG("%s", gpu->name); | 305 | DBG("%s", gpu->name); |
262 | 306 | ||
263 | adreno_gpu_cleanup(adreno_gpu); | 307 | adreno_gpu_cleanup(adreno_gpu); |
308 | |||
309 | #ifdef CONFIG_MSM_OCMEM | ||
310 | if (a3xx_gpu->ocmem_base) | ||
311 | ocmem_free(OCMEM_GRAPHICS, a3xx_gpu->ocmem_hdl); | ||
312 | #endif | ||
313 | |||
264 | put_device(&a3xx_gpu->pdev->dev); | 314 | put_device(&a3xx_gpu->pdev->dev); |
265 | kfree(a3xx_gpu); | 315 | kfree(a3xx_gpu); |
266 | } | 316 | } |
@@ -371,7 +421,7 @@ static const struct adreno_gpu_funcs funcs = { | |||
371 | .hw_init = a3xx_hw_init, | 421 | .hw_init = a3xx_hw_init, |
372 | .pm_suspend = msm_gpu_pm_suspend, | 422 | .pm_suspend = msm_gpu_pm_suspend, |
373 | .pm_resume = msm_gpu_pm_resume, | 423 | .pm_resume = msm_gpu_pm_resume, |
374 | .recover = adreno_recover, | 424 | .recover = a3xx_recover, |
375 | .last_fence = adreno_last_fence, | 425 | .last_fence = adreno_last_fence, |
376 | .submit = adreno_submit, | 426 | .submit = adreno_submit, |
377 | .flush = adreno_flush, | 427 | .flush = adreno_flush, |
@@ -387,6 +437,7 @@ static const struct adreno_gpu_funcs funcs = { | |||
387 | struct msm_gpu *a3xx_gpu_init(struct drm_device *dev) | 437 | struct msm_gpu *a3xx_gpu_init(struct drm_device *dev) |
388 | { | 438 | { |
389 | struct a3xx_gpu *a3xx_gpu = NULL; | 439 | struct a3xx_gpu *a3xx_gpu = NULL; |
440 | struct adreno_gpu *adreno_gpu; | ||
390 | struct msm_gpu *gpu; | 441 | struct msm_gpu *gpu; |
391 | struct platform_device *pdev = a3xx_pdev; | 442 | struct platform_device *pdev = a3xx_pdev; |
392 | struct adreno_platform_config *config; | 443 | struct adreno_platform_config *config; |
@@ -406,7 +457,8 @@ struct msm_gpu *a3xx_gpu_init(struct drm_device *dev) | |||
406 | goto fail; | 457 | goto fail; |
407 | } | 458 | } |
408 | 459 | ||
409 | gpu = &a3xx_gpu->base.base; | 460 | adreno_gpu = &a3xx_gpu->base; |
461 | gpu = &adreno_gpu->base; | ||
410 | 462 | ||
411 | get_device(&pdev->dev); | 463 | get_device(&pdev->dev); |
412 | a3xx_gpu->pdev = pdev; | 464 | a3xx_gpu->pdev = pdev; |
@@ -421,11 +473,25 @@ struct msm_gpu *a3xx_gpu_init(struct drm_device *dev) | |||
421 | DBG("fast_rate=%u, slow_rate=%u, bus_freq=%u", | 473 | DBG("fast_rate=%u, slow_rate=%u, bus_freq=%u", |
422 | gpu->fast_rate, gpu->slow_rate, gpu->bus_freq); | 474 | gpu->fast_rate, gpu->slow_rate, gpu->bus_freq); |
423 | 475 | ||
424 | ret = adreno_gpu_init(dev, pdev, &a3xx_gpu->base, | 476 | ret = adreno_gpu_init(dev, pdev, adreno_gpu, &funcs, config->rev); |
425 | &funcs, config->rev); | ||
426 | if (ret) | 477 | if (ret) |
427 | goto fail; | 478 | goto fail; |
428 | 479 | ||
480 | /* if needed, allocate gmem: */ | ||
481 | if (adreno_is_a330(adreno_gpu)) { | ||
482 | #ifdef CONFIG_MSM_OCMEM | ||
483 | /* TODO this is different/missing upstream: */ | ||
484 | struct ocmem_buf *ocmem_hdl = | ||
485 | ocmem_allocate(OCMEM_GRAPHICS, adreno_gpu->gmem); | ||
486 | |||
487 | a3xx_gpu->ocmem_hdl = ocmem_hdl; | ||
488 | a3xx_gpu->ocmem_base = ocmem_hdl->addr; | ||
489 | adreno_gpu->gmem = ocmem_hdl->len; | ||
490 | DBG("using %dK of OCMEM at 0x%08x", adreno_gpu->gmem / 1024, | ||
491 | a3xx_gpu->ocmem_base); | ||
492 | #endif | ||
493 | } | ||
494 | |||
429 | if (!gpu->mmu) { | 495 | if (!gpu->mmu) { |
430 | /* TODO we think it is possible to configure the GPU to | 496 | /* TODO we think it is possible to configure the GPU to |
431 | * restrict access to VRAM carveout. But the required | 497 | * restrict access to VRAM carveout. But the required |
@@ -460,7 +526,42 @@ static int a3xx_probe(struct platform_device *pdev) | |||
460 | { | 526 | { |
461 | static struct adreno_platform_config config = {}; | 527 | static struct adreno_platform_config config = {}; |
462 | #ifdef CONFIG_OF | 528 | #ifdef CONFIG_OF |
463 | /* TODO */ | 529 | struct device_node *child, *node = pdev->dev.of_node; |
530 | u32 val; | ||
531 | int ret; | ||
532 | |||
533 | ret = of_property_read_u32(node, "qcom,chipid", &val); | ||
534 | if (ret) { | ||
535 | dev_err(&pdev->dev, "could not find chipid: %d\n", ret); | ||
536 | return ret; | ||
537 | } | ||
538 | |||
539 | config.rev = ADRENO_REV((val >> 24) & 0xff, | ||
540 | (val >> 16) & 0xff, (val >> 8) & 0xff, val & 0xff); | ||
541 | |||
542 | /* find clock rates: */ | ||
543 | config.fast_rate = 0; | ||
544 | config.slow_rate = ~0; | ||
545 | for_each_child_of_node(node, child) { | ||
546 | if (of_device_is_compatible(child, "qcom,gpu-pwrlevels")) { | ||
547 | struct device_node *pwrlvl; | ||
548 | for_each_child_of_node(child, pwrlvl) { | ||
549 | ret = of_property_read_u32(pwrlvl, "qcom,gpu-freq", &val); | ||
550 | if (ret) { | ||
551 | dev_err(&pdev->dev, "could not find gpu-freq: %d\n", ret); | ||
552 | return ret; | ||
553 | } | ||
554 | config.fast_rate = max(config.fast_rate, val); | ||
555 | config.slow_rate = min(config.slow_rate, val); | ||
556 | } | ||
557 | } | ||
558 | } | ||
559 | |||
560 | if (!config.fast_rate) { | ||
561 | dev_err(&pdev->dev, "could not find clk rates\n"); | ||
562 | return -ENXIO; | ||
563 | } | ||
564 | |||
464 | #else | 565 | #else |
465 | struct kgsl_device_platform_data *pdata = pdev->dev.platform_data; | 566 | struct kgsl_device_platform_data *pdata = pdev->dev.platform_data; |
466 | uint32_t version = socinfo_get_version(); | 567 | uint32_t version = socinfo_get_version(); |
@@ -519,10 +620,19 @@ static int a3xx_remove(struct platform_device *pdev) | |||
519 | return 0; | 620 | return 0; |
520 | } | 621 | } |
521 | 622 | ||
623 | static const struct of_device_id dt_match[] = { | ||
624 | { .compatible = "qcom,kgsl-3d0" }, | ||
625 | {} | ||
626 | }; | ||
627 | MODULE_DEVICE_TABLE(of, dt_match); | ||
628 | |||
522 | static struct platform_driver a3xx_driver = { | 629 | static struct platform_driver a3xx_driver = { |
523 | .probe = a3xx_probe, | 630 | .probe = a3xx_probe, |
524 | .remove = a3xx_remove, | 631 | .remove = a3xx_remove, |
525 | .driver.name = "kgsl-3d0", | 632 | .driver = { |
633 | .name = "kgsl-3d0", | ||
634 | .of_match_table = dt_match, | ||
635 | }, | ||
526 | }; | 636 | }; |
527 | 637 | ||
528 | void __init a3xx_register(void) | 638 | void __init a3xx_register(void) |
diff --git a/drivers/gpu/drm/msm/adreno/a3xx_gpu.h b/drivers/gpu/drm/msm/adreno/a3xx_gpu.h index 32c398c2d00a..bb9a8ca0507b 100644 --- a/drivers/gpu/drm/msm/adreno/a3xx_gpu.h +++ b/drivers/gpu/drm/msm/adreno/a3xx_gpu.h | |||
@@ -24,6 +24,10 @@ | |||
24 | struct a3xx_gpu { | 24 | struct a3xx_gpu { |
25 | struct adreno_gpu base; | 25 | struct adreno_gpu base; |
26 | struct platform_device *pdev; | 26 | struct platform_device *pdev; |
27 | |||
28 | /* if OCMEM is used for GMEM: */ | ||
29 | uint32_t ocmem_base; | ||
30 | void *ocmem_hdl; | ||
27 | }; | 31 | }; |
28 | #define to_a3xx_gpu(x) container_of(x, struct a3xx_gpu, base) | 32 | #define to_a3xx_gpu(x) container_of(x, struct a3xx_gpu, base) |
29 | 33 | ||
diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c b/drivers/gpu/drm/msm/adreno/adreno_gpu.c index 3f1c7b27e33e..d321099abdd4 100644 --- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c +++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c | |||
@@ -45,7 +45,7 @@ static const struct adreno_info gpulist[] = { | |||
45 | .pfpfw = "a300_pfp.fw", | 45 | .pfpfw = "a300_pfp.fw", |
46 | .gmem = SZ_512K, | 46 | .gmem = SZ_512K, |
47 | }, { | 47 | }, { |
48 | .rev = ADRENO_REV(3, 3, 0, 0), | 48 | .rev = ADRENO_REV(3, 3, 0, ANY_ID), |
49 | .revn = 330, | 49 | .revn = 330, |
50 | .name = "A330", | 50 | .name = "A330", |
51 | .pm4fw = "a330_pm4.fw", | 51 | .pm4fw = "a330_pm4.fw", |
@@ -71,7 +71,7 @@ int adreno_get_param(struct msm_gpu *gpu, uint32_t param, uint64_t *value) | |||
71 | *value = adreno_gpu->info->revn; | 71 | *value = adreno_gpu->info->revn; |
72 | return 0; | 72 | return 0; |
73 | case MSM_PARAM_GMEM_SIZE: | 73 | case MSM_PARAM_GMEM_SIZE: |
74 | *value = adreno_gpu->info->gmem; | 74 | *value = adreno_gpu->gmem; |
75 | return 0; | 75 | return 0; |
76 | default: | 76 | default: |
77 | DBG("%s: invalid param: %u", gpu->name, param); | 77 | DBG("%s: invalid param: %u", gpu->name, param); |
@@ -92,7 +92,7 @@ int adreno_hw_init(struct msm_gpu *gpu) | |||
92 | gpu_write(gpu, REG_AXXX_CP_RB_CNTL, | 92 | gpu_write(gpu, REG_AXXX_CP_RB_CNTL, |
93 | /* size is log2(quad-words): */ | 93 | /* size is log2(quad-words): */ |
94 | AXXX_CP_RB_CNTL_BUFSZ(ilog2(gpu->rb->size / 8)) | | 94 | AXXX_CP_RB_CNTL_BUFSZ(ilog2(gpu->rb->size / 8)) | |
95 | AXXX_CP_RB_CNTL_BLKSZ(RB_BLKSIZE)); | 95 | AXXX_CP_RB_CNTL_BLKSZ(ilog2(RB_BLKSIZE / 8))); |
96 | 96 | ||
97 | /* Setup ringbuffer address: */ | 97 | /* Setup ringbuffer address: */ |
98 | gpu_write(gpu, REG_AXXX_CP_RB_BASE, gpu->rb_iova); | 98 | gpu_write(gpu, REG_AXXX_CP_RB_BASE, gpu->rb_iova); |
@@ -318,6 +318,7 @@ int adreno_gpu_init(struct drm_device *drm, struct platform_device *pdev, | |||
318 | rev.core, rev.major, rev.minor, rev.patchid); | 318 | rev.core, rev.major, rev.minor, rev.patchid); |
319 | 319 | ||
320 | gpu->funcs = funcs; | 320 | gpu->funcs = funcs; |
321 | gpu->gmem = gpu->info->gmem; | ||
321 | gpu->rev = rev; | 322 | gpu->rev = rev; |
322 | 323 | ||
323 | ret = request_firmware(&gpu->pm4, gpu->info->pm4fw, drm->dev); | 324 | ret = request_firmware(&gpu->pm4, gpu->info->pm4fw, drm->dev); |
diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.h b/drivers/gpu/drm/msm/adreno/adreno_gpu.h index 451b741fbd12..ca11ea4da165 100644 --- a/drivers/gpu/drm/msm/adreno/adreno_gpu.h +++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.h | |||
@@ -51,6 +51,7 @@ struct adreno_gpu { | |||
51 | struct msm_gpu base; | 51 | struct msm_gpu base; |
52 | struct adreno_rev rev; | 52 | struct adreno_rev rev; |
53 | const struct adreno_info *info; | 53 | const struct adreno_info *info; |
54 | uint32_t gmem; /* actual gmem size */ | ||
54 | uint32_t revn; /* numeric revision name */ | 55 | uint32_t revn; /* numeric revision name */ |
55 | const struct adreno_gpu_funcs *funcs; | 56 | const struct adreno_gpu_funcs *funcs; |
56 | 57 | ||
@@ -97,6 +98,11 @@ static inline bool adreno_is_a330(struct adreno_gpu *gpu) | |||
97 | return gpu->revn == 330; | 98 | return gpu->revn == 330; |
98 | } | 99 | } |
99 | 100 | ||
101 | static inline bool adreno_is_a330v2(struct adreno_gpu *gpu) | ||
102 | { | ||
103 | return adreno_is_a330(gpu) && (gpu->rev.patchid > 0); | ||
104 | } | ||
105 | |||
100 | int adreno_get_param(struct msm_gpu *gpu, uint32_t param, uint64_t *value); | 106 | int adreno_get_param(struct msm_gpu *gpu, uint32_t param, uint64_t *value); |
101 | int adreno_hw_init(struct msm_gpu *gpu); | 107 | int adreno_hw_init(struct msm_gpu *gpu); |
102 | uint32_t adreno_last_fence(struct msm_gpu *gpu); | 108 | uint32_t adreno_last_fence(struct msm_gpu *gpu); |
diff --git a/drivers/gpu/drm/msm/msm_iommu.c b/drivers/gpu/drm/msm/msm_iommu.c index 014a3fd04f62..92b745986231 100644 --- a/drivers/gpu/drm/msm/msm_iommu.c +++ b/drivers/gpu/drm/msm/msm_iommu.c | |||
@@ -40,7 +40,7 @@ static int msm_iommu_attach(struct msm_mmu *mmu, const char **names, int cnt) | |||
40 | for (i = 0; i < cnt; i++) { | 40 | for (i = 0; i < cnt; i++) { |
41 | struct device *msm_iommu_get_ctx(const char *ctx_name); | 41 | struct device *msm_iommu_get_ctx(const char *ctx_name); |
42 | struct device *ctx = msm_iommu_get_ctx(names[i]); | 42 | struct device *ctx = msm_iommu_get_ctx(names[i]); |
43 | if (!ctx) | 43 | if (IS_ERR_OR_NULL(ctx)) |
44 | continue; | 44 | continue; |
45 | ret = iommu_attach_device(iommu->domain, ctx); | 45 | ret = iommu_attach_device(iommu->domain, ctx); |
46 | if (ret) { | 46 | if (ret) { |