diff options
| -rw-r--r-- | drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c | 9 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/mdp/mdp4/mdp4_irq.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c | 21 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.h | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/mdp/mdp5/mdp5_irq.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/msm_fbdev.c | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/msm_gem.c | 4 |
7 files changed, 36 insertions, 15 deletions
diff --git a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c index 3e6c0f3ed592..ef9957dbac94 100644 --- a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c +++ b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c | |||
| @@ -510,9 +510,8 @@ static void update_cursor(struct drm_crtc *crtc) | |||
| 510 | MDP4_DMA_CURSOR_BLEND_CONFIG_CURSOR_EN); | 510 | MDP4_DMA_CURSOR_BLEND_CONFIG_CURSOR_EN); |
| 511 | } else { | 511 | } else { |
| 512 | /* disable cursor: */ | 512 | /* disable cursor: */ |
| 513 | mdp4_write(mdp4_kms, REG_MDP4_DMA_CURSOR_BASE(dma), 0); | 513 | mdp4_write(mdp4_kms, REG_MDP4_DMA_CURSOR_BASE(dma), |
| 514 | mdp4_write(mdp4_kms, REG_MDP4_DMA_CURSOR_BLEND_CONFIG(dma), | 514 | mdp4_kms->blank_cursor_iova); |
| 515 | MDP4_DMA_CURSOR_BLEND_CONFIG_FORMAT(CURSOR_ARGB)); | ||
| 516 | } | 515 | } |
| 517 | 516 | ||
| 518 | /* and drop the iova ref + obj rev when done scanning out: */ | 517 | /* and drop the iova ref + obj rev when done scanning out: */ |
| @@ -574,11 +573,9 @@ static int mdp4_crtc_cursor_set(struct drm_crtc *crtc, | |||
| 574 | 573 | ||
| 575 | if (old_bo) { | 574 | if (old_bo) { |
| 576 | /* drop our previous reference: */ | 575 | /* drop our previous reference: */ |
| 577 | msm_gem_put_iova(old_bo, mdp4_kms->id); | 576 | drm_flip_work_queue(&mdp4_crtc->unref_cursor_work, old_bo); |
| 578 | drm_gem_object_unreference_unlocked(old_bo); | ||
| 579 | } | 577 | } |
| 580 | 578 | ||
| 581 | crtc_flush(crtc); | ||
| 582 | request_pending(crtc, PENDING_CURSOR); | 579 | request_pending(crtc, PENDING_CURSOR); |
| 583 | 580 | ||
| 584 | return 0; | 581 | return 0; |
diff --git a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_irq.c b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_irq.c index c740ccd1cc67..8edd531cb621 100644 --- a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_irq.c +++ b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_irq.c | |||
| @@ -70,12 +70,12 @@ irqreturn_t mdp4_irq(struct msm_kms *kms) | |||
| 70 | 70 | ||
| 71 | VERB("status=%08x", status); | 71 | VERB("status=%08x", status); |
| 72 | 72 | ||
| 73 | mdp_dispatch_irqs(mdp_kms, status); | ||
| 74 | |||
| 73 | for (id = 0; id < priv->num_crtcs; id++) | 75 | for (id = 0; id < priv->num_crtcs; id++) |
| 74 | if (status & mdp4_crtc_vblank(priv->crtcs[id])) | 76 | if (status & mdp4_crtc_vblank(priv->crtcs[id])) |
| 75 | drm_handle_vblank(dev, id); | 77 | drm_handle_vblank(dev, id); |
| 76 | 78 | ||
| 77 | mdp_dispatch_irqs(mdp_kms, status); | ||
| 78 | |||
| 79 | return IRQ_HANDLED; | 79 | return IRQ_HANDLED; |
| 80 | } | 80 | } |
| 81 | 81 | ||
diff --git a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c index 272e707c9487..0bb4faa17523 100644 --- a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c +++ b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c | |||
| @@ -144,6 +144,10 @@ static void mdp4_preclose(struct msm_kms *kms, struct drm_file *file) | |||
| 144 | static void mdp4_destroy(struct msm_kms *kms) | 144 | static void mdp4_destroy(struct msm_kms *kms) |
| 145 | { | 145 | { |
| 146 | struct mdp4_kms *mdp4_kms = to_mdp4_kms(to_mdp_kms(kms)); | 146 | struct mdp4_kms *mdp4_kms = to_mdp4_kms(to_mdp_kms(kms)); |
| 147 | if (mdp4_kms->blank_cursor_iova) | ||
| 148 | msm_gem_put_iova(mdp4_kms->blank_cursor_bo, mdp4_kms->id); | ||
| 149 | if (mdp4_kms->blank_cursor_bo) | ||
| 150 | drm_gem_object_unreference(mdp4_kms->blank_cursor_bo); | ||
| 147 | kfree(mdp4_kms); | 151 | kfree(mdp4_kms); |
| 148 | } | 152 | } |
| 149 | 153 | ||
| @@ -372,6 +376,23 @@ struct msm_kms *mdp4_kms_init(struct drm_device *dev) | |||
| 372 | goto fail; | 376 | goto fail; |
| 373 | } | 377 | } |
| 374 | 378 | ||
| 379 | mutex_lock(&dev->struct_mutex); | ||
| 380 | mdp4_kms->blank_cursor_bo = msm_gem_new(dev, SZ_16K, MSM_BO_WC); | ||
| 381 | mutex_unlock(&dev->struct_mutex); | ||
| 382 | if (IS_ERR(mdp4_kms->blank_cursor_bo)) { | ||
| 383 | ret = PTR_ERR(mdp4_kms->blank_cursor_bo); | ||
| 384 | dev_err(dev->dev, "could not allocate blank-cursor bo: %d\n", ret); | ||
| 385 | mdp4_kms->blank_cursor_bo = NULL; | ||
| 386 | goto fail; | ||
| 387 | } | ||
| 388 | |||
| 389 | ret = msm_gem_get_iova(mdp4_kms->blank_cursor_bo, mdp4_kms->id, | ||
| 390 | &mdp4_kms->blank_cursor_iova); | ||
| 391 | if (ret) { | ||
| 392 | dev_err(dev->dev, "could not pin blank-cursor bo: %d\n", ret); | ||
| 393 | goto fail; | ||
| 394 | } | ||
| 395 | |||
| 375 | return kms; | 396 | return kms; |
| 376 | 397 | ||
| 377 | fail: | 398 | fail: |
diff --git a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.h b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.h index 66a4d31aec80..715520c54cde 100644 --- a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.h +++ b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.h | |||
| @@ -44,6 +44,10 @@ struct mdp4_kms { | |||
| 44 | struct clk *lut_clk; | 44 | struct clk *lut_clk; |
| 45 | 45 | ||
| 46 | struct mdp_irq error_handler; | 46 | struct mdp_irq error_handler; |
| 47 | |||
| 48 | /* empty/blank cursor bo to use when cursor is "disabled" */ | ||
| 49 | struct drm_gem_object *blank_cursor_bo; | ||
| 50 | uint32_t blank_cursor_iova; | ||
| 47 | }; | 51 | }; |
| 48 | #define to_mdp4_kms(x) container_of(x, struct mdp4_kms, base) | 52 | #define to_mdp4_kms(x) container_of(x, struct mdp4_kms, base) |
| 49 | 53 | ||
diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_irq.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_irq.c index 353d494a497f..f2b985bc2adf 100644 --- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_irq.c +++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_irq.c | |||
| @@ -71,11 +71,11 @@ static void mdp5_irq_mdp(struct mdp_kms *mdp_kms) | |||
| 71 | 71 | ||
| 72 | VERB("status=%08x", status); | 72 | VERB("status=%08x", status); |
| 73 | 73 | ||
| 74 | mdp_dispatch_irqs(mdp_kms, status); | ||
| 75 | |||
| 74 | for (id = 0; id < priv->num_crtcs; id++) | 76 | for (id = 0; id < priv->num_crtcs; id++) |
| 75 | if (status & mdp5_crtc_vblank(priv->crtcs[id])) | 77 | if (status & mdp5_crtc_vblank(priv->crtcs[id])) |
| 76 | drm_handle_vblank(dev, id); | 78 | drm_handle_vblank(dev, id); |
| 77 | |||
| 78 | mdp_dispatch_irqs(mdp_kms, status); | ||
| 79 | } | 79 | } |
| 80 | 80 | ||
| 81 | irqreturn_t mdp5_irq(struct msm_kms *kms) | 81 | irqreturn_t mdp5_irq(struct msm_kms *kms) |
diff --git a/drivers/gpu/drm/msm/msm_fbdev.c b/drivers/gpu/drm/msm/msm_fbdev.c index 6c6d7d4c9b4e..a752ab83b810 100644 --- a/drivers/gpu/drm/msm/msm_fbdev.c +++ b/drivers/gpu/drm/msm/msm_fbdev.c | |||
| @@ -62,11 +62,8 @@ static int msm_fbdev_create(struct drm_fb_helper *helper, | |||
| 62 | dma_addr_t paddr; | 62 | dma_addr_t paddr; |
| 63 | int ret, size; | 63 | int ret, size; |
| 64 | 64 | ||
| 65 | /* only doing ARGB32 since this is what is needed to alpha-blend | ||
| 66 | * with video overlays: | ||
| 67 | */ | ||
| 68 | sizes->surface_bpp = 32; | 65 | sizes->surface_bpp = 32; |
| 69 | sizes->surface_depth = 32; | 66 | sizes->surface_depth = 24; |
| 70 | 67 | ||
| 71 | DBG("create fbdev: %dx%d@%d (%dx%d)", sizes->surface_width, | 68 | DBG("create fbdev: %dx%d@%d (%dx%d)", sizes->surface_width, |
| 72 | sizes->surface_height, sizes->surface_bpp, | 69 | sizes->surface_height, sizes->surface_bpp, |
diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c index 3da8264d3039..bb8026daebc9 100644 --- a/drivers/gpu/drm/msm/msm_gem.c +++ b/drivers/gpu/drm/msm/msm_gem.c | |||
| @@ -118,8 +118,10 @@ static void put_pages(struct drm_gem_object *obj) | |||
| 118 | 118 | ||
| 119 | if (iommu_present(&platform_bus_type)) | 119 | if (iommu_present(&platform_bus_type)) |
| 120 | drm_gem_put_pages(obj, msm_obj->pages, true, false); | 120 | drm_gem_put_pages(obj, msm_obj->pages, true, false); |
| 121 | else | 121 | else { |
| 122 | drm_mm_remove_node(msm_obj->vram_node); | 122 | drm_mm_remove_node(msm_obj->vram_node); |
| 123 | drm_free_large(msm_obj->pages); | ||
| 124 | } | ||
| 123 | 125 | ||
| 124 | msm_obj->pages = NULL; | 126 | msm_obj->pages = NULL; |
| 125 | } | 127 | } |
