[RFCv3 04/14] drm/exynos: Restrict plane loops to only operate on overlay planes
Daniel Vetter
daniel at ffwll.ch
Wed Mar 19 12:31:32 PDT 2014
On Wed, Mar 19, 2014 at 10:26:13PM +0800, Daniel Kurtz wrote:
> On Wed, Mar 19, 2014 at 7:51 PM, Daniel Vetter <daniel at ffwll.ch> wrote:
> > On Tue, Mar 18, 2014 at 05:22:49PM -0700, Matt Roper wrote:
> >> Before we add additional types of planes to the DRM plane list, ensure
> >> that existing loops over all planes continue to operate only on
> >> "overlay" planes and ignore primary & cursor planes.
> >>
> >> Cc: Inki Dae <inki.dae at samsung.com>
> >> Signed-off-by: Matt Roper <matthew.d.roper at intel.com>
> >> ---
> >> drivers/gpu/drm/exynos/exynos_drm_encoder.c | 6 ++++++
> >> 1 file changed, 6 insertions(+)
> >>
> >> diff --git a/drivers/gpu/drm/exynos/exynos_drm_encoder.c b/drivers/gpu/drm/exynos/exynos_drm_encoder.c
> >> index 06f1b2a..2fa2685 100644
> >> --- a/drivers/gpu/drm/exynos/exynos_drm_encoder.c
> >> +++ b/drivers/gpu/drm/exynos/exynos_drm_encoder.c
> >> @@ -127,6 +127,9 @@ static void disable_plane_to_crtc(struct drm_device *dev,
> >> * (encoder->crtc)
> >> */
> >> list_for_each_entry(plane, &dev->mode_config.plane_list, head) {
> >> + if (plane->type != DRM_PLANE_TYPE_OVERLAY)
> >
> > I think a drm_for_each_legacy_plane iteration helper would be neat for
> > this one and the following i915 patch.
> > -Daniel
> >
> >> + continue;
> >> +
> >> if (plane->crtc == old_crtc) {
> >> /*
> >> * do not change below call order.
> >> @@ -247,6 +250,9 @@ static void exynos_drm_encoder_disable(struct drm_encoder *encoder)
> >>
> >> /* all planes connected to this encoder should be also disabled. */
> >> list_for_each_entry(plane, &dev->mode_config.plane_list, head) {
> >> + if (plane->type != DRM_PLANE_TYPE_OVERLAY)
> >> + continue;
> >> +
> >> if (plane->crtc == encoder->crtc)
> >> plane->funcs->disable_plane(plane);
> >> }
>
> The original loop disables all planes attached to a crtc when
> disabling an encoder attached to the same crtc. It was added by:
>
> commit bcf4cef94294992f7cd11d5a90fa58b0eae6c795
> Author: Inki Dae <inki.dae at samsung.com>
> Date: Fri Aug 24 10:54:12 2012 -0700
>
> drm/exynos: Disable plane when released
>
> this patch ensures that each plane connected to encoder is disabled
> when released, by adding disable callback function of encoder helper
>
> we had faced with one issue that invalid memory is accessed by dma
> once drm is released and then the dma is turned on again. actually,
> in our case, page fault was incurred with iommu. the reason is that
> a gem buffer accessed by the dma is also released once drm is released.
>
> so this patch would fix this issue ensuring the dma is disabled
> when released.
>
>
> An encoder receives and encodes the mixed output of all of the
> planes/overlays. It would seem that whether the individual planes
> themselves are enabled or not should be completely independent of the
> status any encoder. However, I find the code in exynos_drm_encoder.c
> very difficult to follow, so perhaps there is some extra linkage
> between encoder/crtc/plane that is exynos specific.
>
> In any case, judging from the commit message, this disable loop should
> probably still iterate over all of the planes, not just the
> "DRM_PLANE_TYPE_OVERLAY" ones. So, I think this new patch is
> incorrect.
It keeps full backwars compatibility with existing semantics, which is the
right thing to do in such a case. It could be that exynos simply has a
bug, but imo that should be a separate patch outside of this series.
-Daniel
--
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch
More information about the dri-devel
mailing list