Received: by 10.213.65.68 with SMTP id h4csp652028imn; Wed, 4 Apr 2018 05:07:12 -0700 (PDT) X-Google-Smtp-Source: AIpwx49u4EwZek37snkmSlgdnWtmev9jZTeXFS9I/2+zO6bv75rBjX/44SbyJP1UgmhgWzX4hJiH X-Received: by 10.99.123.70 with SMTP id k6mr11820408pgn.292.1522843632219; Wed, 04 Apr 2018 05:07:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1522843632; cv=none; d=google.com; s=arc-20160816; b=QD4g3NCeJt1xMy4QFSBZz5iridrR0ok4qtw2Vf75JeoaL/pbDYxqjO6YDhPpNV21Mk qBdtKjnlOkbMJEVsXt36WRzIWVw3t2dleHds/iafXtfADQafgI+9nRRDnx9cj21ZqO7N 22JMKczt3MUuec45PbcXIq4CXl4WHT0RiWMOY4hQXxLx3x9Kog0GCR2aBse0pRA/KzBH YYusHvqzeg/+MsGScpaCfrAI3cVAlG4c1NP+ykgLTWQGYsJfGuWyJws6oxqhI8XHuxSl FyyZnPaWJXBamRmIsRkc1b2jY9cUGuOhbdlXG3aohTNHmU65JwTXBkukm1xBKYMudk2n f13w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :references:in-reply-to:mime-version:dkim-signature :arc-authentication-results; bh=ch53WlAIdtq1UO0CSAfDETlXmXPQ4yZEOzjyOqvrwz4=; b=ct7oKlTT/SuBve30aUv3anon5uahFXbh6ykXRgYcgiDCDt03uimj6yOK9YX1EJwLPI XlWq85NdxcRXANY6cxUeWfFKef8T2n0N9rc9HTKh84cd2ddu3/M/t12Lg7ewL3zI334k Cn3zyciYj7g1duADbLurgpU22T6B23OHbra0TPbJFIua7xbj639Uvwk3qIR2XrhgvzCG CNRMBvj+CasE4ojfBnuLv13WJdnNpE0gsCTaqJ4xxtgD4Y0CiwTwV1Wm0QdehAL7hQu1 7PVMszoPFY1GjVZK/S21iGrv1j8+bi0PhA+Gc9S1FT3klt6B8RqTRQUrOm5d19O99i9P aEEA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=Nd864qr8; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id t4-v6si2994896plb.641.2018.04.04.05.06.58; Wed, 04 Apr 2018 05:07:12 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=Nd864qr8; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751700AbeDDMFT (ORCPT + 99 others); Wed, 4 Apr 2018 08:05:19 -0400 Received: from mail-it0-f66.google.com ([209.85.214.66]:36804 "EHLO mail-it0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751262AbeDDMFR (ORCPT ); Wed, 4 Apr 2018 08:05:17 -0400 Received: by mail-it0-f66.google.com with SMTP id 15-v6so17003805itl.1; Wed, 04 Apr 2018 05:05:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=ch53WlAIdtq1UO0CSAfDETlXmXPQ4yZEOzjyOqvrwz4=; b=Nd864qr8cUYohcqlLkdqeDYx0NO2z8dEsJCNr3/ov/hqULh46//QuMBHIzApj3oefF 8V6CAGKXY3Nju4E7MmifL8H9pLlMceClPfooEAo1vPIe4kw+WF9RIeVwbP8qEQBWGpnd 2IDb5gI0KxcQ6HSPp/0GZkFKQVO0cjB5PfK7HUEOKAWjlbRS5fRs1LUX710GXRDeRcT6 AYfxennBWUCnYCjzemgQfvOmItzJimCbWGPLAF8M1uRK22e8QFB71ZbZEPfFKl5+jlbH +8Sjc/749eO//OblxW5RLvvZP0ry5Yzzl+cJFWPIl6aTFQW85AZM6dfIJjTIfg7+glYH vI+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=ch53WlAIdtq1UO0CSAfDETlXmXPQ4yZEOzjyOqvrwz4=; b=ROS8EBJJ7RDfpli8Ae3lzC1V00lqhtPNpCRyMH5msNA9e74GR2xdcr9a0+g0PUDUe2 coRYvdGnnkt70GtH01oZ6tYd9VqeLoovpi6limm/4xKAIf19Xr53Q6aQO1+sW7Ei6Kz3 detL5+wpChNUEMBn/fhSDz+qt/SrOEBjNeUT10iMnoxDQ2dT7oeTsB97QIqVDjISClfE ZkUyXwZqVUOahjhk2VvhmAEuIFFB8k7FmGOnhl8m9P4XCEiW8JgyETsUd7noaamaQCs8 JHe7IPlO9CEdvGjzn77SUAt392GyQZe3HcxdvCLT1VCYCGjd9ZZOo3bVKlr7vBoHq/tN eosA== X-Gm-Message-State: AElRT7GO4tNe0mmntS5alpqLd70+I3jIXdBrK8CzcemwrPvVSTRAhoqx Tntd8wc+Mc1skA1lV8yQwTPeP2mJwxsqHeeUx1Q= X-Received: by 2002:a24:60b:: with SMTP id 11-v6mr9759856itv.45.1522843516714; Wed, 04 Apr 2018 05:05:16 -0700 (PDT) MIME-Version: 1.0 Received: by 10.213.85.204 with HTTP; Wed, 4 Apr 2018 05:05:16 -0700 (PDT) In-Reply-To: <4386c0a5-e8e4-34d7-a977-4136e1dec44f@linux.intel.com> References: <20180403224225.26776-1-robdclark@gmail.com> <20180404100300.GE3881@phenom.ffwll.local> <20180404102108.GF3881@phenom.ffwll.local> <4976c166-32b2-75ef-ee78-7e7893dd4121@linux.intel.com> <4386c0a5-e8e4-34d7-a977-4136e1dec44f@linux.intel.com> From: Rob Clark Date: Wed, 4 Apr 2018 08:05:16 -0400 Message-ID: Subject: Re: [RFC] drm/atomic+msm: add helper to implement legacy dirtyfb To: Maarten Lankhorst Cc: dri-devel , freedreno , linux-arm-msm , Thomas Hellstrom , =?UTF-8?B?VmlsbGUgU3lyasOkbMOk?= , Lukasz Spintzyk , Deepak Singh Rawat , Gustavo Padovan , Sean Paul , David Airlie , Linux Kernel Mailing List Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Apr 4, 2018 at 7:49 AM, Maarten Lankhorst wrote: > Op 04-04-18 om 13:37 schreef Rob Clark: >> On Wed, Apr 4, 2018 at 6:36 AM, Maarten Lankhorst >> wrote: >>> Op 04-04-18 om 12:21 schreef Daniel Vetter: >>>> On Wed, Apr 04, 2018 at 12:03:00PM +0200, Daniel Vetter wrote: >>>>> On Tue, Apr 03, 2018 at 06:42:23PM -0400, Rob Clark wrote: >>>>>> Add an atomic helper to implement dirtyfb support. This is needed to >>>>>> support DSI command-mode panels with x11 userspace (ie. when we can't >>>>>> rely on pageflips to trigger a flush to the panel). >>>>>> >>>>>> To signal to the driver that the async atomic update needs to >>>>>> synchronize with fences, even though the fb didn't change, the >>>>>> drm_atomic_state::dirty flag is added. >>>>>> >>>>>> Signed-off-by: Rob Clark >>>>>> --- >>>>>> Background: there are a number of different folks working on getting >>>>>> upstream kernel working on various different phones/tablets with qcom >>>>>> SoC's.. many of them have command mode panels, so we kind of need a >>>>>> way to support the legacy dirtyfb ioctl for x11 support. >>>>>> >>>>>> I know there is work on a proprer non-legacy atomic property for >>>>>> userspace to communicate dirty-rect(s) to the kernel, so this can >>>>>> be improved from triggering a full-frame flush once that is in >>>>>> place. But we kinda needa a stop-gap solution. >>>>>> >>>>>> I had considered an in-driver solution for this, but things get a >>>>>> bit tricky if userspace ands up combining dirtyfb ioctls with page- >>>>>> flips, because we need to synchronize setting various CTL.FLUSH bits >>>>>> with setting the CTL.START bit. (ie. really all we need to do for >>>>>> cmd mode panels is bang CTL.START, but is this ends up racing with >>>>>> pageflips setting FLUSH bits, then bad things.) The easiest soln >>>>>> is to wrap this up as an atomic commit and rely on the worker to >>>>>> serialize things. Hence adding an atomic dirtyfb helper. >>>>>> >>>>>> I guess at least the helper, with some small addition to translate >>>>>> and pass-thru the dirty rect(s) is useful to the final atomic dirty- >>>>>> rect property solution. Depending on how far off that is, a stop- >>>>>> gap solution could be useful. >>>>>> >>>>>> drivers/gpu/drm/drm_atomic_helper.c | 66 +++++++++++++++++++++++++++++++++++++ >>>>>> drivers/gpu/drm/msm/msm_atomic.c | 5 ++- >>>>>> drivers/gpu/drm/msm/msm_fb.c | 1 + >>>>>> include/drm/drm_atomic_helper.h | 4 +++ >>>>>> include/drm/drm_plane.h | 9 +++++ >>>>>> 5 files changed, 84 insertions(+), 1 deletion(-) >>>>>> >>>>>> diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c >>>>>> index c35654591c12..a578dc681b27 100644 >>>>>> --- a/drivers/gpu/drm/drm_atomic_helper.c >>>>>> +++ b/drivers/gpu/drm/drm_atomic_helper.c >>>>>> @@ -3504,6 +3504,7 @@ void __drm_atomic_helper_plane_duplicate_state(struct drm_plane *plane, >>>>>> if (state->fb) >>>>>> drm_framebuffer_get(state->fb); >>>>>> >>>>>> + state->dirty = false; >>>>>> state->fence = NULL; >>>>>> state->commit = NULL; >>>>>> } >>>>>> @@ -3847,6 +3848,71 @@ int drm_atomic_helper_legacy_gamma_set(struct drm_crtc *crtc, >>>>>> } >>>>>> EXPORT_SYMBOL(drm_atomic_helper_legacy_gamma_set); >>>>>> >>>>>> +/** >>>>>> + * drm_atomic_helper_dirtyfb - helper for dirtyfb >>>>>> + * >>>>>> + * A helper to implement drm_framebuffer_funcs::dirty >>>>>> + */ >>>>>> +int drm_atomic_helper_dirtyfb(struct drm_framebuffer *fb, >>>>>> + struct drm_file *file_priv, unsigned flags, >>>>>> + unsigned color, struct drm_clip_rect *clips, >>>>>> + unsigned num_clips) >>>>>> +{ >>>>>> + struct drm_modeset_acquire_ctx ctx; >>>>>> + struct drm_atomic_state *state; >>>>>> + struct drm_plane *plane; >>>>>> + int ret = 0; >>>>>> + >>>>>> + /* >>>>>> + * When called from ioctl, we are interruptable, but not when >>>>>> + * called internally (ie. defio worker) >>>>>> + */ >>>>>> + drm_modeset_acquire_init(&ctx, >>>>>> + file_priv ? DRM_MODESET_ACQUIRE_INTERRUPTIBLE : 0); >>>>>> + >>>>>> + state = drm_atomic_state_alloc(fb->dev); >>>>>> + if (!state) { >>>>>> + ret = -ENOMEM; >>>>>> + goto out; >>>>>> + } >>>>>> + state->acquire_ctx = &ctx; >>>>>> + >>>>>> +retry: >>>>>> + drm_for_each_plane(plane, fb->dev) { >>>>>> + struct drm_plane_state *plane_state; >>>>>> + >>>>>> + if (plane->state->fb != fb) >>>>>> + continue; >>>>>> + >>>>>> + plane_state = drm_atomic_get_plane_state(state, plane); >>>>>> + if (IS_ERR(plane_state)) { >>>>>> + ret = PTR_ERR(plane_state); >>>>>> + goto out; >>>>>> + } >>>>>> + >>>>>> + plane_state->dirty = true; >>>>>> + } >>>>>> + >>>>>> + ret = drm_atomic_nonblocking_commit(state); >>>>>> + >>>>>> +out: >>>>>> + if (ret == -EDEADLK) { >>>>>> + drm_atomic_state_clear(state); >>>>>> + ret = drm_modeset_backoff(&ctx); >>>>>> + if (!ret) >>>>>> + goto retry; >>>>>> + } >>>>>> + >>>>>> + drm_atomic_state_put(state); >>>>>> + >>>>>> + drm_modeset_drop_locks(&ctx); >>>>>> + drm_modeset_acquire_fini(&ctx); >>>>>> + >>>>>> + return ret; >>>>>> + >>>>>> +} >>>>>> +EXPORT_SYMBOL(drm_atomic_helper_dirtyfb); >>>>>> + >>>>>> /** >>>>>> * __drm_atomic_helper_private_duplicate_state - copy atomic private state >>>>>> * @obj: CRTC object >>>>>> diff --git a/drivers/gpu/drm/msm/msm_atomic.c b/drivers/gpu/drm/msm/msm_atomic.c >>>>>> index bf5f8c39f34d..bb55a048e98b 100644 >>>>>> --- a/drivers/gpu/drm/msm/msm_atomic.c >>>>>> +++ b/drivers/gpu/drm/msm/msm_atomic.c >>>>>> @@ -201,7 +201,10 @@ int msm_atomic_commit(struct drm_device *dev, >>>>>> * Figure out what fence to wait for: >>>>>> */ >>>>>> for_each_oldnew_plane_in_state(state, plane, old_plane_state, new_plane_state, i) { >>>>>> - if ((new_plane_state->fb != old_plane_state->fb) && new_plane_state->fb) { >>>>>> + bool sync_fb = new_plane_state->fb && >>>>>> + ((new_plane_state->fb != old_plane_state->fb) || >>>>>> + new_plane_state->dirty); >>>>> Why do you have this optimization even here? Imo flipping to the same fb >>>>> should result in the fb getting fully uploaded, whether you're doing a >>>>> legacy page_flip, and atomic one or just a plane update. >>>>> >>>>> Iirc some userspace does use that as essentially a full-plane frontbuffer >>>>> rendering flush already. IOW I don't think we need your >>>>> plane_state->dirty, it's implied to always be true - why would userspace >>>>> do a flip otherwise? >>>>> >>>>> The helper itself to map dirtyfb to a nonblocking atomic commit looks >>>>> reasonable, but misses a bunch of the trickery discussed with Noralf and >>>>> others I think. >>>> Ok, I've done some history digging: >>>> >>>> - i915 and nouveau unconditionally wait for fences, even for same-fb >>>> flips. >>>> - no idea what amdgpu and vmwgfx are doing, they're not using >>>> plane_state->fence for implicit fences. >>> I thought plane_state->fence was used for explicit fences, so its use by drivers >>> would interfere with it? I don't think fencing would work on msm or vc4.. >> for implicit fencing we fish out the implicit fence and stuff it in >> plane_state->fence.. > What happens when userspace passes a fence fd to in_fence_fd? mixing implicit sync and explicit sync is undefined BR, -R