diff options
| author | Dave Airlie <airlied@redhat.com> | 2017-05-31 22:06:34 -0400 |
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2017-05-31 22:06:34 -0400 |
| commit | 58b58f6ef582426710724a2b01ac230a0d542b5f (patch) | |
| tree | 62b7cf8d452b576ce0190fc74cb8053974e59b0f | |
| parent | 25f480e89a022d382ddc5badc23b49426e89eabc (diff) | |
| parent | d72fea538fe6d783c1e63a2fc304019abf4be93a (diff) | |
Merge branch 'msm-fixes-4.12-rc4' of git://people.freedesktop.org/~robclark/linux into drm-fixes
a few fixes for 4.12..
* 'msm-fixes-4.12-rc4' of git://people.freedesktop.org/~robclark/linux:
drm/msm: Fix the check for the command size
drm/msm: Take the mutex before calling msm_gem_new_impl
drm/msm: for array in-fences, check if all backing fences are from our own context before waiting
drm/msm: constify irq_domain_ops
drm/msm/mdp5: release hwpipe(s) for unused planes
drm/msm: Reuse dma_fence_release.
drm/msm: Expose our reservation object when exporting a dmabuf.
drm/msm/gpu: check legacy clk names in get_clocks()
drm/msm/mdp5: use __drm_atomic_helper_plane_duplicate_state()
drm/msm: select PM_OPP
| -rw-r--r-- | drivers/gpu/drm/msm/Kconfig | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/mdp/mdp5/mdp5_mdss.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c | 9 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/msm_drv.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/msm_drv.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/msm_fence.c | 10 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/msm_gem.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/msm_gem_prime.c | 7 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/msm_gem_submit.c | 14 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/msm_gpu.c | 4 |
10 files changed, 35 insertions, 20 deletions
diff --git a/drivers/gpu/drm/msm/Kconfig b/drivers/gpu/drm/msm/Kconfig index 5b8e23d051f2..0a31cd6d01ce 100644 --- a/drivers/gpu/drm/msm/Kconfig +++ b/drivers/gpu/drm/msm/Kconfig | |||
| @@ -13,6 +13,7 @@ config DRM_MSM | |||
| 13 | select QCOM_SCM | 13 | select QCOM_SCM |
| 14 | select SND_SOC_HDMI_CODEC if SND_SOC | 14 | select SND_SOC_HDMI_CODEC if SND_SOC |
| 15 | select SYNC_FILE | 15 | select SYNC_FILE |
| 16 | select PM_OPP | ||
| 16 | default y | 17 | default y |
| 17 | help | 18 | help |
| 18 | DRM/KMS driver for MSM/snapdragon. | 19 | DRM/KMS driver for MSM/snapdragon. |
diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_mdss.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_mdss.c index f8f48d014978..9c34d7824988 100644 --- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_mdss.c +++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_mdss.c | |||
| @@ -116,7 +116,7 @@ static int mdss_hw_irqdomain_map(struct irq_domain *d, unsigned int irq, | |||
| 116 | return 0; | 116 | return 0; |
| 117 | } | 117 | } |
| 118 | 118 | ||
| 119 | static struct irq_domain_ops mdss_hw_irqdomain_ops = { | 119 | static const struct irq_domain_ops mdss_hw_irqdomain_ops = { |
| 120 | .map = mdss_hw_irqdomain_map, | 120 | .map = mdss_hw_irqdomain_map, |
| 121 | .xlate = irq_domain_xlate_onecell, | 121 | .xlate = irq_domain_xlate_onecell, |
| 122 | }; | 122 | }; |
diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c index a38c5fe6cc19..7d3741215387 100644 --- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c +++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c | |||
| @@ -225,9 +225,10 @@ mdp5_plane_duplicate_state(struct drm_plane *plane) | |||
| 225 | 225 | ||
| 226 | mdp5_state = kmemdup(to_mdp5_plane_state(plane->state), | 226 | mdp5_state = kmemdup(to_mdp5_plane_state(plane->state), |
| 227 | sizeof(*mdp5_state), GFP_KERNEL); | 227 | sizeof(*mdp5_state), GFP_KERNEL); |
| 228 | if (!mdp5_state) | ||
| 229 | return NULL; | ||
| 228 | 230 | ||
| 229 | if (mdp5_state && mdp5_state->base.fb) | 231 | __drm_atomic_helper_plane_duplicate_state(plane, &mdp5_state->base); |
| 230 | drm_framebuffer_reference(mdp5_state->base.fb); | ||
| 231 | 232 | ||
| 232 | return &mdp5_state->base; | 233 | return &mdp5_state->base; |
| 233 | } | 234 | } |
| @@ -444,6 +445,10 @@ static int mdp5_plane_atomic_check_with_state(struct drm_crtc_state *crtc_state, | |||
| 444 | mdp5_pipe_release(state->state, old_hwpipe); | 445 | mdp5_pipe_release(state->state, old_hwpipe); |
| 445 | mdp5_pipe_release(state->state, old_right_hwpipe); | 446 | mdp5_pipe_release(state->state, old_right_hwpipe); |
| 446 | } | 447 | } |
| 448 | } else { | ||
| 449 | mdp5_pipe_release(state->state, mdp5_state->hwpipe); | ||
| 450 | mdp5_pipe_release(state->state, mdp5_state->r_hwpipe); | ||
| 451 | mdp5_state->hwpipe = mdp5_state->r_hwpipe = NULL; | ||
| 447 | } | 452 | } |
| 448 | 453 | ||
| 449 | return 0; | 454 | return 0; |
diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c index 87b5695d4034..9d498eb81906 100644 --- a/drivers/gpu/drm/msm/msm_drv.c +++ b/drivers/gpu/drm/msm/msm_drv.c | |||
| @@ -830,6 +830,7 @@ static struct drm_driver msm_driver = { | |||
| 830 | .prime_fd_to_handle = drm_gem_prime_fd_to_handle, | 830 | .prime_fd_to_handle = drm_gem_prime_fd_to_handle, |
| 831 | .gem_prime_export = drm_gem_prime_export, | 831 | .gem_prime_export = drm_gem_prime_export, |
| 832 | .gem_prime_import = drm_gem_prime_import, | 832 | .gem_prime_import = drm_gem_prime_import, |
| 833 | .gem_prime_res_obj = msm_gem_prime_res_obj, | ||
| 833 | .gem_prime_pin = msm_gem_prime_pin, | 834 | .gem_prime_pin = msm_gem_prime_pin, |
| 834 | .gem_prime_unpin = msm_gem_prime_unpin, | 835 | .gem_prime_unpin = msm_gem_prime_unpin, |
| 835 | .gem_prime_get_sg_table = msm_gem_prime_get_sg_table, | 836 | .gem_prime_get_sg_table = msm_gem_prime_get_sg_table, |
diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h index 28b6f9ba5066..1b26ca626528 100644 --- a/drivers/gpu/drm/msm/msm_drv.h +++ b/drivers/gpu/drm/msm/msm_drv.h | |||
| @@ -224,6 +224,7 @@ struct sg_table *msm_gem_prime_get_sg_table(struct drm_gem_object *obj); | |||
| 224 | void *msm_gem_prime_vmap(struct drm_gem_object *obj); | 224 | void *msm_gem_prime_vmap(struct drm_gem_object *obj); |
| 225 | void msm_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr); | 225 | void msm_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr); |
| 226 | int msm_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma); | 226 | int msm_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma); |
| 227 | struct reservation_object *msm_gem_prime_res_obj(struct drm_gem_object *obj); | ||
| 227 | struct drm_gem_object *msm_gem_prime_import_sg_table(struct drm_device *dev, | 228 | struct drm_gem_object *msm_gem_prime_import_sg_table(struct drm_device *dev, |
| 228 | struct dma_buf_attachment *attach, struct sg_table *sg); | 229 | struct dma_buf_attachment *attach, struct sg_table *sg); |
| 229 | int msm_gem_prime_pin(struct drm_gem_object *obj); | 230 | int msm_gem_prime_pin(struct drm_gem_object *obj); |
diff --git a/drivers/gpu/drm/msm/msm_fence.c b/drivers/gpu/drm/msm/msm_fence.c index 3f299c537b77..a2f89bac9c16 100644 --- a/drivers/gpu/drm/msm/msm_fence.c +++ b/drivers/gpu/drm/msm/msm_fence.c | |||
| @@ -99,8 +99,8 @@ void msm_update_fence(struct msm_fence_context *fctx, uint32_t fence) | |||
| 99 | } | 99 | } |
| 100 | 100 | ||
| 101 | struct msm_fence { | 101 | struct msm_fence { |
| 102 | struct msm_fence_context *fctx; | ||
| 103 | struct dma_fence base; | 102 | struct dma_fence base; |
| 103 | struct msm_fence_context *fctx; | ||
| 104 | }; | 104 | }; |
| 105 | 105 | ||
| 106 | static inline struct msm_fence *to_msm_fence(struct dma_fence *fence) | 106 | static inline struct msm_fence *to_msm_fence(struct dma_fence *fence) |
| @@ -130,19 +130,13 @@ static bool msm_fence_signaled(struct dma_fence *fence) | |||
| 130 | return fence_completed(f->fctx, f->base.seqno); | 130 | return fence_completed(f->fctx, f->base.seqno); |
| 131 | } | 131 | } |
| 132 | 132 | ||
| 133 | static void msm_fence_release(struct dma_fence *fence) | ||
| 134 | { | ||
| 135 | struct msm_fence *f = to_msm_fence(fence); | ||
| 136 | kfree_rcu(f, base.rcu); | ||
| 137 | } | ||
| 138 | |||
| 139 | static const struct dma_fence_ops msm_fence_ops = { | 133 | static const struct dma_fence_ops msm_fence_ops = { |
| 140 | .get_driver_name = msm_fence_get_driver_name, | 134 | .get_driver_name = msm_fence_get_driver_name, |
| 141 | .get_timeline_name = msm_fence_get_timeline_name, | 135 | .get_timeline_name = msm_fence_get_timeline_name, |
| 142 | .enable_signaling = msm_fence_enable_signaling, | 136 | .enable_signaling = msm_fence_enable_signaling, |
| 143 | .signaled = msm_fence_signaled, | 137 | .signaled = msm_fence_signaled, |
| 144 | .wait = dma_fence_default_wait, | 138 | .wait = dma_fence_default_wait, |
| 145 | .release = msm_fence_release, | 139 | .release = dma_fence_free, |
| 146 | }; | 140 | }; |
| 147 | 141 | ||
| 148 | struct dma_fence * | 142 | struct dma_fence * |
diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c index 68e509b3b9e4..50289a23baf8 100644 --- a/drivers/gpu/drm/msm/msm_gem.c +++ b/drivers/gpu/drm/msm/msm_gem.c | |||
| @@ -758,6 +758,8 @@ static int msm_gem_new_impl(struct drm_device *dev, | |||
| 758 | struct msm_gem_object *msm_obj; | 758 | struct msm_gem_object *msm_obj; |
| 759 | bool use_vram = false; | 759 | bool use_vram = false; |
| 760 | 760 | ||
| 761 | WARN_ON(!mutex_is_locked(&dev->struct_mutex)); | ||
| 762 | |||
| 761 | switch (flags & MSM_BO_CACHE_MASK) { | 763 | switch (flags & MSM_BO_CACHE_MASK) { |
| 762 | case MSM_BO_UNCACHED: | 764 | case MSM_BO_UNCACHED: |
| 763 | case MSM_BO_CACHED: | 765 | case MSM_BO_CACHED: |
| @@ -853,7 +855,11 @@ struct drm_gem_object *msm_gem_import(struct drm_device *dev, | |||
| 853 | 855 | ||
| 854 | size = PAGE_ALIGN(dmabuf->size); | 856 | size = PAGE_ALIGN(dmabuf->size); |
| 855 | 857 | ||
| 858 | /* Take mutex so we can modify the inactive list in msm_gem_new_impl */ | ||
| 859 | mutex_lock(&dev->struct_mutex); | ||
| 856 | ret = msm_gem_new_impl(dev, size, MSM_BO_WC, dmabuf->resv, &obj); | 860 | ret = msm_gem_new_impl(dev, size, MSM_BO_WC, dmabuf->resv, &obj); |
| 861 | mutex_unlock(&dev->struct_mutex); | ||
| 862 | |||
| 857 | if (ret) | 863 | if (ret) |
| 858 | goto fail; | 864 | goto fail; |
| 859 | 865 | ||
diff --git a/drivers/gpu/drm/msm/msm_gem_prime.c b/drivers/gpu/drm/msm/msm_gem_prime.c index 60bb290700ce..13403c6da6c7 100644 --- a/drivers/gpu/drm/msm/msm_gem_prime.c +++ b/drivers/gpu/drm/msm/msm_gem_prime.c | |||
| @@ -70,3 +70,10 @@ void msm_gem_prime_unpin(struct drm_gem_object *obj) | |||
| 70 | if (!obj->import_attach) | 70 | if (!obj->import_attach) |
| 71 | msm_gem_put_pages(obj); | 71 | msm_gem_put_pages(obj); |
| 72 | } | 72 | } |
| 73 | |||
| 74 | struct reservation_object *msm_gem_prime_res_obj(struct drm_gem_object *obj) | ||
| 75 | { | ||
| 76 | struct msm_gem_object *msm_obj = to_msm_bo(obj); | ||
| 77 | |||
| 78 | return msm_obj->resv; | ||
| 79 | } | ||
diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c b/drivers/gpu/drm/msm/msm_gem_submit.c index 1c545ebe6a5a..7832e6421d25 100644 --- a/drivers/gpu/drm/msm/msm_gem_submit.c +++ b/drivers/gpu/drm/msm/msm_gem_submit.c | |||
| @@ -410,12 +410,11 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data, | |||
| 410 | if (!in_fence) | 410 | if (!in_fence) |
| 411 | return -EINVAL; | 411 | return -EINVAL; |
| 412 | 412 | ||
| 413 | /* TODO if we get an array-fence due to userspace merging multiple | 413 | /* |
| 414 | * fences, we need a way to determine if all the backing fences | 414 | * Wait if the fence is from a foreign context, or if the fence |
| 415 | * are from our own context.. | 415 | * array contains any fence from a foreign context. |
