From patchwork Fri Sep 8 19:24:19 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Gustavo Padovan X-Patchwork-Id: 9944927 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 49A49604D4 for ; Fri, 8 Sep 2017 19:24:48 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 36912288AA for ; Fri, 8 Sep 2017 19:24:48 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 2B651288AE; Fri, 8 Sep 2017 19:24:48 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-3.7 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, RCVD_IN_SORBS_SPAM autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 8863B288AA for ; Fri, 8 Sep 2017 19:24:47 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id B47E76EC0D; Fri, 8 Sep 2017 19:24:44 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-qt0-f194.google.com (mail-qt0-f194.google.com [209.85.216.194]) by gabe.freedesktop.org (Postfix) with ESMTPS id C75D66EC0D for ; Fri, 8 Sep 2017 19:24:43 +0000 (UTC) Received: by mail-qt0-f194.google.com with SMTP id h15so2118605qta.0 for ; Fri, 08 Sep 2017 12:24:43 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=0N24BSSTu2Nay5Y9JdIQ5YJhA9jgyGLql/fAfS5QqKI=; b=oktoKtKN/dqZAS9ziRWttvwn84acSN773yLAWlFW0CnEKmKj6Bf//4sOAhWMX66dXF 8i4woCyo29AJyNcQtzApzHD93nUy4FhWsG06StUF4AlTg7SeRFtJbPQ86lX/yJDZdF2o vUgg5P0m0Nj73dp+GYK6dJ0Hp4aWVrXhab/YdJP4cL9BZBmpHdHWQyeB4dM57VsrwgGY 0ClG1Ap/8MQRNhYs+x9VeHOjdOOazhAKqGbhH6Bo6t4DSI2lH2Ha4/xVpAPzT4I4KXGq XjYvIchLG+azsFu3J67TGN96lnJDvAPguHBNV95Dgm7i87ib22W9vuHuW6BWttNcPh2h lLrw== X-Gm-Message-State: AHPjjUil8MxXKixYuP8ETDTUoY4nVhfHlhK4OuDIpOi8sa4VKMksTF5k XnTVMqfnA2pbmrWruIM= X-Google-Smtp-Source: AOwi7QAdXv4fyHGE0sZKkjFaa7ZEe70P26h/gDyGl+V95Pj0QAg+44QFgPCnpPtMGR32Y878UUSi5g== X-Received: by 10.200.43.188 with SMTP id m57mr5476389qtm.241.1504898682671; Fri, 08 Sep 2017 12:24:42 -0700 (PDT) Received: from localhost.localdomain ([187.35.193.7]) by smtp.gmail.com with ESMTPSA id f69sm1712471qke.27.2017.09.08.12.24.40 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 08 Sep 2017 12:24:42 -0700 (PDT) From: Gustavo Padovan To: dri-devel@lists.freedesktop.org Subject: [-PATCH v5 5/5] drm/vc4: update cursors asynchronously through atomic Date: Fri, 8 Sep 2017 16:24:19 -0300 Message-Id: <20170908192419.21172-5-gustavo@padovan.org> X-Mailer: git-send-email 2.13.5 In-Reply-To: <20170908192419.21172-1-gustavo@padovan.org> References: <20170908192419.21172-1-gustavo@padovan.org> MIME-Version: 1.0 Cc: Gustavo Padovan X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: Gustavo Padovan Add support for async updates of cursors by using the new atomic interface for that. Basically what this commit does is do what vc4_update_plane() did but through atomic. v5: add missing call to vc4_plane_atomic_check() (Eric Anholt) v4: add drm_atomic_helper_async() commit (Eric Anholt) v3: move size checks back to drivers (Ville Syrjälä) v2: move fb setting to core and use new state (Eric Anholt) Cc: Eric Anholt Signed-off-by: Gustavo Padovan Reviewed-by: Eric Anholt Signed-off-by: Eric Anholt --- drivers/gpu/drm/vc4/vc4_kms.c | 20 +++++++ drivers/gpu/drm/vc4/vc4_plane.c | 128 ++++++++++++++++------------------------ 2 files changed, 71 insertions(+), 77 deletions(-) diff --git a/drivers/gpu/drm/vc4/vc4_kms.c b/drivers/gpu/drm/vc4/vc4_kms.c index 50c4959b5bd3..e006b4849f73 100644 --- a/drivers/gpu/drm/vc4/vc4_kms.c +++ b/drivers/gpu/drm/vc4/vc4_kms.c @@ -96,6 +96,26 @@ static int vc4_atomic_commit(struct drm_device *dev, struct vc4_dev *vc4 = to_vc4_dev(dev); int ret; + if (state->async_update) { + ret = down_interruptible(&vc4->async_modeset); + if (ret) + return ret; + + ret = drm_atomic_helper_prepare_planes(dev, state); + if (ret) { + up(&vc4->async_modeset); + return ret; + } + + drm_atomic_helper_async_commit(dev, state); + + drm_atomic_helper_cleanup_planes(dev, state); + + up(&vc4->async_modeset); + + return 0; + } + ret = drm_atomic_helper_setup_commit(state, nonblock); if (ret) return ret; diff --git a/drivers/gpu/drm/vc4/vc4_plane.c b/drivers/gpu/drm/vc4/vc4_plane.c index 2968b3ebb895..36d41b172919 100644 --- a/drivers/gpu/drm/vc4/vc4_plane.c +++ b/drivers/gpu/drm/vc4/vc4_plane.c @@ -759,87 +759,41 @@ void vc4_plane_async_set_fb(struct drm_plane *plane, struct drm_framebuffer *fb) vc4_state->dlist[vc4_state->ptr0_offset] = addr; } -static int vc4_prepare_fb(struct drm_plane *plane, - struct drm_plane_state *state) +static int vc4_plane_atomic_async_check(struct drm_plane *plane, + struct drm_plane_state *state) { - struct vc4_bo *bo; - struct dma_fence *fence; + if (plane != state->crtc->cursor) + return -EINVAL; - if ((plane->state->fb == state->fb) || !state->fb) - return 0; + if (!plane->state) + return -EINVAL; - bo = to_vc4_bo(&drm_fb_cma_get_gem_obj(state->fb, 0)->base); - fence = reservation_object_get_excl_rcu(bo->resv); - drm_atomic_set_fence_for_plane(state, fence); + /* No configuring new scaling in the fast path. */ + if (state->crtc_w != plane->state->crtc_w || + state->crtc_h != plane->state->crtc_h || + state->src_w != plane->state->src_w || + state->src_h != plane->state->src_h) { + return -EINVAL; + } return 0; } -static const struct drm_plane_helper_funcs vc4_plane_helper_funcs = { - .atomic_check = vc4_plane_atomic_check, - .atomic_update = vc4_plane_atomic_update, - .prepare_fb = vc4_prepare_fb, -}; - -static void vc4_plane_destroy(struct drm_plane *plane) -{ - drm_plane_helper_disable(plane); - drm_plane_cleanup(plane); -} - -/* Implements immediate (non-vblank-synced) updates of the cursor - * position, or falls back to the atomic helper otherwise. - */ -static int -vc4_update_plane(struct drm_plane *plane, - struct drm_crtc *crtc, - struct drm_framebuffer *fb, - int crtc_x, int crtc_y, - unsigned int crtc_w, unsigned int crtc_h, - uint32_t src_x, uint32_t src_y, - uint32_t src_w, uint32_t src_h, - struct drm_modeset_acquire_ctx *ctx) +static void vc4_plane_atomic_async_update(struct drm_plane *plane, + struct drm_plane_state *new_state) { - struct drm_plane_state *plane_state; - struct vc4_plane_state *vc4_state; - - if (plane != crtc->cursor) - goto out; - - plane_state = plane->state; - vc4_state = to_vc4_plane_state(plane_state); - - if (!plane_state) - goto out; - - /* No configuring new scaling in the fast path. */ - if (crtc_w != plane_state->crtc_w || - crtc_h != plane_state->crtc_h || - src_w != plane_state->src_w || - src_h != plane_state->src_h) { - goto out; - } - - if (fb != plane_state->fb) { - drm_atomic_set_fb_for_plane(plane->state, fb); - vc4_plane_async_set_fb(plane, fb); - } + struct vc4_plane_state *vc4_state = to_vc4_plane_state(plane->state); - /* Set the cursor's position on the screen. This is the - * expected change from the drm_mode_cursor_universal() - * helper. - */ - plane_state->crtc_x = crtc_x; - plane_state->crtc_y = crtc_y; + plane->state->src_x = new_state->src_x; + plane->state->src_y = new_state->src_y; + plane->state->crtc_x = new_state->crtc_x; + plane->state->crtc_y = new_state->crtc_y; - /* Allow changing the start position within the cursor BO, if - * that matters. - */ - plane_state->src_x = src_x; - plane_state->src_y = src_y; + if (plane->state->fb != new_state->fb) + vc4_plane_async_set_fb(plane, new_state->fb); /* Update the display list based on the new crtc_x/y. */ - vc4_plane_atomic_check(plane, plane_state); + vc4_plane_atomic_check(plane, plane->state); /* Note that we can't just call vc4_plane_write_dlist() * because that would smash the context data that the HVS is @@ -851,20 +805,40 @@ vc4_update_plane(struct drm_plane *plane, &vc4_state->hw_dlist[vc4_state->pos2_offset]); writel(vc4_state->dlist[vc4_state->ptr0_offset], &vc4_state->hw_dlist[vc4_state->ptr0_offset]); +} + +static int vc4_prepare_fb(struct drm_plane *plane, + struct drm_plane_state *state) +{ + struct vc4_bo *bo; + struct dma_fence *fence; + + if ((plane->state->fb == state->fb) || !state->fb) + return 0; + + bo = to_vc4_bo(&drm_fb_cma_get_gem_obj(state->fb, 0)->base); + fence = reservation_object_get_excl_rcu(bo->resv); + drm_atomic_set_fence_for_plane(state, fence); return 0; +} + +static const struct drm_plane_helper_funcs vc4_plane_helper_funcs = { + .atomic_check = vc4_plane_atomic_check, + .atomic_update = vc4_plane_atomic_update, + .atomic_async_check = vc4_plane_atomic_async_check, + .atomic_async_update = vc4_plane_atomic_async_update, + .prepare_fb = vc4_prepare_fb, +}; -out: - return drm_atomic_helper_update_plane(plane, crtc, fb, - crtc_x, crtc_y, - crtc_w, crtc_h, - src_x, src_y, - src_w, src_h, - ctx); +static void vc4_plane_destroy(struct drm_plane *plane) +{ + drm_plane_helper_disable(plane); + drm_plane_cleanup(plane); } static const struct drm_plane_funcs vc4_plane_funcs = { - .update_plane = vc4_update_plane, + .update_plane = drm_atomic_helper_update_plane, .disable_plane = drm_atomic_helper_disable_plane, .destroy = vc4_plane_destroy, .set_property = NULL,