diff options
Diffstat (limited to 'drivers/gpu/drm/msm/mdp')
-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 |
5 files changed, 32 insertions, 10 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) |