Received: by 2002:ac0:a581:0:0:0:0:0 with SMTP id m1-v6csp6941457imm; Wed, 27 Jun 2018 16:36:24 -0700 (PDT) X-Google-Smtp-Source: AAOMgpc/IJ4SE+9nDWcm0IdPCL8IEgl954sijEQMZYMUFSyh0VyWEpOj/iCxmLvGpHz3MrcpBW3L X-Received: by 2002:a62:1358:: with SMTP id b85-v6mr7827619pfj.238.1530142584916; Wed, 27 Jun 2018 16:36:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1530142584; cv=none; d=google.com; s=arc-20160816; b=Ga7UFJgocsVyXAjgEG2wsJmbJJQxB1TbEVT1NwU/XrAbXYXeaftfdq2+UOATDC89An Gv0B9XdWHZ26o/JFN+4oFidJt7POHIb/xV0z0dHBAaYuWh2QB+ccsqwm0w1FpYYkjVDf i/Xpt3GfbaLdK0bprLsHJ3o8Bjf4P8rbxd/+PIZJZWaC/DWqJFyOTdRWNyRzjx5VRzEf w6C+J+K5dhrpckNDmEUtm8JmccjPiAjqns3jQMM55HJfogkP9cKe0NzusVd4efyW5FnJ eEAQgWHCEJh8JwiNPZTdDxDQVXmUmI+M/peTmJquTfGDsl1/cKkoRzhdwhCHJ41y7LuQ QDKg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:arc-authentication-results; bh=uEg3F9h3F69T8ebSCGNXtSf7dS41HYUIz8cgjrFDpRY=; b=B01QGr5qe5ETTRJzAZjWdfbl/yzS1otuUMqSOBcD/UWPzT3mIIIWsI+7q/S8/niJiq 2zU7sqsknW8SOeJKQWpGy6/V6E1ghRqdZ2UQBLwcWoXTe5twF2VtaOAGZk71EKM2huS2 +e/vE1rflpTenAypRqcNU+3EYqSsuAHLqK/Rv6nJstD09wnGCMnI/kHsxRD4uXxXMSTZ ngpD55mjOEiskuY1f30+QBAc1kA98TE9rKNe5NSmtAY0WvezKxOtZuQEl88s5jrBCDY5 3tu23PebZYjkzyWNB57zJgNeJpz4NvvR5ibavaYZXyuDv9JvxFl82t15pebqOW4K9Car wmPg== ARC-Authentication-Results: i=1; mx.google.com; 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=fail (p=NONE sp=NONE dis=NONE) header.from=collabora.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id b1-v6si5286747pld.323.2018.06.27.16.36.10; Wed, 27 Jun 2018 16:36:24 -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; 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=fail (p=NONE sp=NONE dis=NONE) header.from=collabora.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S966196AbeF0VZQ (ORCPT + 99 others); Wed, 27 Jun 2018 17:25:16 -0400 Received: from bhuna.collabora.co.uk ([46.235.227.227]:55918 "EHLO bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S965912AbeF0VZP (ORCPT ); Wed, 27 Jun 2018 17:25:15 -0400 Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: eballetbo) with ESMTPSA id 15E45263BFB From: Enric Balletbo i Serra To: David Airlie Cc: dnicoara@chromium.org, alexandros.frantzis@collabora.com, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, Gustavo Padovan , tomasz Figa , Sean Paul , kernel@collabora.com, =?UTF-8?q?St=C3=A9phane=20Marchesin?= , Gustavo Padovan , Maarten Lankhorst , Sean Paul Subject: [RFC PATCH] drm/atomic: add ASYNC_UPDATE flag to the Atomic IOCTL. Date: Wed, 27 Jun 2018 23:25:06 +0200 Message-Id: <20180627212506.24061-1-enric.balletbo@collabora.com> X-Mailer: git-send-email 2.18.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Gustavo Padovan This flag tells core to jump ahead the queued update if the conditions in drm_atomic_async_check() are met. That means we are only able to do an async update if no modeset is pending and update for the same plane is not queued. It uses the already in place infrastructure for async updates. It is useful for cursor updates and async PageFlips over the atomic ioctl, otherwise in some cases updates may be delayed to the point the user will notice it. DRM_MODE_ATOMIC_ASYNC_UPDATE should be passed to the Atomic IOCTL to use this feature. Signed-off-by: Gustavo Padovan Signed-off-by: Enric Balletbo i Serra --- Hi, This is an attempt to introduce the new ASYNC_UPDATE flag for atomic operations, see the commit message for a more detailed description. To test this patch we have created an IGT test that we plan to send to the ML but also was tested using a small program that exercises the uAPI for easy sanity testing. The program created by Alexandros can be found here [2]. To test, just build the program and use the --atomic flag to use the cursor plane in normal (blocking mode), and --atomic-async to use the cursor plane with the ASYNC_UPDATE flag.E.g. drm_cursor --atomic or drm_cursor --atomic-async The test worked on a Samsung Chromebook Plus on top of mainline plus the patch to update cursors asynchronously through atomic for the drm/rockchip driver [3]. Alexandros also did a proof-of-concept to use this flag and draw cursors using atomic if possible on ozone [1]. Best regards, Enric [1] https://chromium-review.googlesource.com/c/chromium/src/+/1092711 [2] https://gitlab.collabora.com/alf/drm-cursor [3] https://patchwork.kernel.org/patch/10492693/ drivers/gpu/drm/drm_atomic.c | 6 ++++++ drivers/gpu/drm/drm_atomic_helper.c | 9 ++++++--- include/uapi/drm/drm_mode.h | 4 +++- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c index c825c76edc1d..15b799f46982 100644 --- a/drivers/gpu/drm/drm_atomic.c +++ b/drivers/gpu/drm/drm_atomic.c @@ -80,6 +80,7 @@ drm_atomic_state_init(struct drm_device *dev, struct drm_atomic_state *state) * setting this appropriately? */ state->allow_modeset = true; + state->async_update = true; state->crtcs = kcalloc(dev->mode_config.num_crtc, sizeof(*state->crtcs), GFP_KERNEL); @@ -2320,6 +2321,10 @@ int drm_mode_atomic_ioctl(struct drm_device *dev, (arg->flags & DRM_MODE_PAGE_FLIP_EVENT)) return -EINVAL; + if ((arg->flags & DRM_MODE_ATOMIC_ALLOW_MODESET) && + (arg->flags & DRM_MODE_ATOMIC_ASYNC_UPDATE)) + return -EINVAL; + drm_modeset_acquire_init(&ctx, DRM_MODESET_ACQUIRE_INTERRUPTIBLE); state = drm_atomic_state_alloc(dev); @@ -2328,6 +2333,7 @@ int drm_mode_atomic_ioctl(struct drm_device *dev, state->acquire_ctx = &ctx; state->allow_modeset = !!(arg->flags & DRM_MODE_ATOMIC_ALLOW_MODESET); + state->async_update = !!(arg->flags & DRM_MODE_ATOMIC_ASYNC_UPDATE); retry: plane_mask = 0; diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c index c35654591c12..aeb0523d3bcf 100644 --- a/drivers/gpu/drm/drm_atomic_helper.c +++ b/drivers/gpu/drm/drm_atomic_helper.c @@ -891,7 +891,7 @@ int drm_atomic_helper_check(struct drm_device *dev, if (ret) return ret; - if (state->legacy_cursor_update) + if (state->async_update || state->legacy_cursor_update) state->async_update = !drm_atomic_helper_async_check(dev, state); return ret; @@ -1526,13 +1526,16 @@ int drm_atomic_helper_async_check(struct drm_device *dev, if (new_plane_state->fence) return -EINVAL; + /* Only do an async update if there is a pending commit. */ + if (!old_plane_state->commit) + return -EINVAL; + /* * Don't do an async update if there is an outstanding commit modifying * the plane. This prevents our async update's changes from getting * overridden by a previous synchronous update's state. */ - if (old_plane_state->commit && - !try_wait_for_completion(&old_plane_state->commit->hw_done)) + if (!try_wait_for_completion(&old_plane_state->commit->hw_done)) return -EBUSY; return funcs->atomic_async_check(plane, new_plane_state); diff --git a/include/uapi/drm/drm_mode.h b/include/uapi/drm/drm_mode.h index 50bcf4214ff9..772e84f0edeb 100644 --- a/include/uapi/drm/drm_mode.h +++ b/include/uapi/drm/drm_mode.h @@ -718,13 +718,15 @@ struct drm_mode_destroy_dumb { #define DRM_MODE_ATOMIC_TEST_ONLY 0x0100 #define DRM_MODE_ATOMIC_NONBLOCK 0x0200 #define DRM_MODE_ATOMIC_ALLOW_MODESET 0x0400 +#define DRM_MODE_ATOMIC_ASYNC_UPDATE 0x0800 #define DRM_MODE_ATOMIC_FLAGS (\ DRM_MODE_PAGE_FLIP_EVENT |\ DRM_MODE_PAGE_FLIP_ASYNC |\ DRM_MODE_ATOMIC_TEST_ONLY |\ DRM_MODE_ATOMIC_NONBLOCK |\ - DRM_MODE_ATOMIC_ALLOW_MODESET) + DRM_MODE_ATOMIC_ALLOW_MODESET |\ + DRM_MODE_ATOMIC_ASYNC_UPDATE) struct drm_mode_atomic { __u32 flags; -- 2.18.0