[PATCH] drm: Set the plane's crtc before calling disable_plane.
Stéphane Marchesin
marcheu at chromium.org
Mon Mar 3 14:51:03 PST 2014
On Mon, Mar 3, 2014 at 2:06 PM, Rob Clark <robdclark at gmail.com> wrote:
> On Mon, Mar 3, 2014 at 4:45 PM, Jesse Barnes <jbarnes at virtuousgeek.org> wrote:
>> On Mon, 3 Mar 2014 13:38:36 -0800
>> Stéphane Marchesin <marcheu at chromium.org> wrote:
>>
>>> Some drivers like exynos need the crtc to be able to disable the plane,
>>> so set it before calling disable_plane.
>>>
>>> Signed-off-by: Stéphane Marchesin <marcheu at chromium.org>
>>> ---
>>> drivers/gpu/drm/drm_crtc.c | 21 +++++++++++----------
>>> 1 file changed, 11 insertions(+), 10 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
>>> index 3b7d32d..0943316 100644
>>> --- a/drivers/gpu/drm/drm_crtc.c
>>> +++ b/drivers/gpu/drm/drm_crtc.c
>>> @@ -1947,10 +1947,21 @@ int drm_mode_setplane(struct drm_device *dev, void *data,
>>> }
>>> plane = obj_to_plane(obj);
>>>
>>> + obj = drm_mode_object_find(dev, plane_req->crtc_id,
>>> + DRM_MODE_OBJECT_CRTC);
>>> + if (!obj) {
>>> + DRM_DEBUG_KMS("Unknown crtc ID %d\n",
>>> + plane_req->crtc_id);
>>> + ret = -ENOENT;
>>> + goto out;
>>> + }
>>> + crtc = obj_to_crtc(obj);
>>> +
>>> /* No fb means shut it down */
>>> if (!plane_req->fb_id) {
>>> drm_modeset_lock_all(dev);
>>> old_fb = plane->fb;
>>> + plane->crtc = crtc;
>
> just curious, but how is the plane ending up enabled *without* a crtc?
> That sounds a bit.. odd..
Yup it has a crtc, but the plane->crtc is set to NULL just before we
call disable_plane(), and so disable_plane() can't rely on the crtc...
Stéphane
>
> BR,
> -R
>
>>> plane->funcs->disable_plane(plane);
>>> plane->crtc = NULL;
>>> plane->fb = NULL;
>>> @@ -1958,16 +1969,6 @@ int drm_mode_setplane(struct drm_device *dev, void *data,
>>> goto out;
>>> }
>>>
>>> - obj = drm_mode_object_find(dev, plane_req->crtc_id,
>>> - DRM_MODE_OBJECT_CRTC);
>>> - if (!obj) {
>>> - DRM_DEBUG_KMS("Unknown crtc ID %d\n",
>>> - plane_req->crtc_id);
>>> - ret = -ENOENT;
>>> - goto out;
>>> - }
>>> - crtc = obj_to_crtc(obj);
>>> -
>>> fb = drm_framebuffer_lookup(dev, plane_req->fb_id);
>>> if (!fb) {
>>> DRM_DEBUG_KMS("Unknown framebuffer ID %d\n",
>>
>> I'm pretty sure this is ok since we don't have much userspace using
>> this that might fail to pass in a crtc when shutting down a plane...
>>
>> Reviewed-by: Jesse Barnes <jbarnes at virtuousgeek.org>
>>
>> --
>> Jesse Barnes, Intel Open Source Technology Center
>> _______________________________________________
>> dri-devel mailing list
>> dri-devel at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/dri-devel
More information about the dri-devel
mailing list