aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2017-05-31 22:06:34 -0400
committerDave Airlie <airlied@redhat.com>2017-05-31 22:06:34 -0400
commit58b58f6ef582426710724a2b01ac230a0d542b5f (patch)
tree62b7cf8d452b576ce0190fc74cb8053974e59b0f
parent25f480e89a022d382ddc5badc23b49426e89eabc (diff)
parentd72fea538fe6d783c1e63a2fc304019abf4be93a (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/Kconfig1
-rw-r--r--drivers/gpu/drm/msm/mdp/mdp5/mdp5_mdss.c2
-rw-r--r--drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c9
-rw-r--r--drivers/gpu/drm/msm/msm_drv.c1
-rw-r--r--drivers/gpu/drm/msm/msm_drv.h1
-rw-r--r--drivers/gpu/drm/msm/msm_fence.c10
-rw-r--r--drivers/gpu/drm/msm/msm_gem.c6
-rw-r--r--drivers/gpu/drm/msm/msm_gem_prime.c7
-rw-r--r--drivers/gpu/drm/msm/msm_gem_submit.c14
-rw-r--r--drivers/gpu/drm/msm/msm_gpu.c4
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
119static struct irq_domain_ops mdss_hw_irqdomain_ops = { 119static 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);
224void *msm_gem_prime_vmap(struct drm_gem_object *obj); 224void *msm_gem_prime_vmap(struct drm_gem_object *obj);
225void msm_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr); 225void msm_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr);
226int msm_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma); 226int msm_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma);
227struct reservation_object *msm_gem_prime_res_obj(struct drm_gem_object *obj);
227struct drm_gem_object *msm_gem_prime_import_sg_table(struct drm_device *dev, 228struct 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);
229int msm_gem_prime_pin(struct drm_gem_object *obj); 230int 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
101struct msm_fence { 101struct 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
106static inline struct msm_fence *to_msm_fence(struct dma_fence *fence) 106static 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
133static 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
139static const struct dma_fence_ops msm_fence_ops = { 133static 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
148struct dma_fence * 142struct 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
74struct 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.