Received: by 2002:ac0:a5a7:0:0:0:0:0 with SMTP id m36-v6csp3696239imm; Mon, 6 Aug 2018 09:02:59 -0700 (PDT) X-Google-Smtp-Source: AAOMgpcTg7TV4o/fACp30pAZ16AC1N61TaRsjW39pDcR7KyuSMhdaD+xhM2g2SCu3Kfzf7EWQraJ X-Received: by 2002:a63:9e0a:: with SMTP id s10-v6mr15013609pgd.326.1533571379647; Mon, 06 Aug 2018 09:02:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1533571379; cv=none; d=google.com; s=arc-20160816; b=XrhWKxLKYMNK+NZwg1J5BPtTQF3szY2PxjEu9fRd/yvwPuYtjLSaUDkL02uDsX368L DNXfaxYZRiIVL5eRHrjb/gKO0efQDdwC6Fo07qbP8F1BwlHD1RAXK+TuNDiV+tohME37 c9qNxLMhFriATxIHw8B0upYny332BGmzEr6WNxh576rGJ5/+NAQj2IKeVAIMgnIpBxeW n8lJnVdrYAuH90I7StEVL/d0vRKwscvODCv7OcngK+s1nz87g2rebMXq0HeWwenqbkc6 3DG3yjS9ULMGpZGoggMJ0VJ0/NqPnZttVARHYlmiMQDdDNX91CwHDFwnJvJnkRdBRSXA MXPQ== 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=3BqMoHAMVMtPmkKsSdC5gKMZkBNarYlx4309nixeW3s=; b=mU6Fl5Gvg3x6WQUA3oeVxw8O5HpQgfR5s9/GqbYE1m7G4zf38Q1uU5dp/0fLYJEFKo 6t8IF0R1hzPjWpAGjyYwEqnqaygimcSY/59EyKLoYt8PXStEjKgqA/Hp+zEaNXybEEWz Ngv/Hd4QDUX8S/vI82vuMG/GMZlrtT6cZsRjR9XkqackJVkpZCfa2YRIuGPQXftta/g+ v3ZreNigW8xc+LU4xVUI7bFcrPPTfVc/t9ZNn0d+qIutnnRKzasq4FaISh2fyYQj3H3y ksnegv6BDHLNCnKVmT2CZaRKY9UxpsL0hU0YrSuaCGRptLLyd9lwKML/V0IoPkC4vrhD /N+w== 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 184-v6si13423605pgj.421.2018.08.06.09.02.44; Mon, 06 Aug 2018 09:02:59 -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 S1733088AbeHFSK7 (ORCPT + 99 others); Mon, 6 Aug 2018 14:10:59 -0400 Received: from bhuna.collabora.co.uk ([46.235.227.227]:46002 "EHLO bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1733014AbeHFSK7 (ORCPT ); Mon, 6 Aug 2018 14:10:59 -0400 Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: eballetbo) with ESMTPSA id E7DB2260C4A 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: [PATCH] drm/atomic: add ATOMIC_AMEND flag to the Atomic IOCTL. Date: Mon, 6 Aug 2018 18:01:02 +0200 Message-Id: <20180806160102.11877-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. Note that for now it's only enabled for cursor planes. DRM_MODE_ATOMIC_AMEND 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 ATOMIC_AMEND flag for atomic operations, see the commit message for a more detailed description. This 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 ATOMIC_AMEND 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. 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 Changes in v1: - Only enable it if userspace requests it. - Only allow async update for cursor type planes. - Rename ASYNC_UPDATE for ATOMIC_AMEND. drivers/gpu/drm/drm_atomic.c | 5 +++++ drivers/gpu/drm/drm_atomic_helper.c | 10 +++++++++- include/uapi/drm/drm_mode.h | 4 +++- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c index 895741e9cd7d..7b3e4aa2874d 100644 --- a/drivers/gpu/drm/drm_atomic.c +++ b/drivers/gpu/drm/drm_atomic.c @@ -2338,6 +2338,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_AMEND)) + return -EINVAL; + drm_modeset_acquire_init(&ctx, DRM_MODESET_ACQUIRE_INTERRUPTIBLE); state = drm_atomic_state_alloc(dev); @@ -2346,6 +2350,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_AMEND); retry: plane_mask = 0; diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c index 81e32199d3ef..59495f61c583 100644 --- a/drivers/gpu/drm/drm_atomic_helper.c +++ b/drivers/gpu/drm/drm_atomic_helper.c @@ -902,7 +902,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; @@ -1539,6 +1539,14 @@ int drm_atomic_helper_async_check(struct drm_device *dev, if (new_plane_state->fence) return -EINVAL; + /* Only allow async update for cursor type planes. */ + if (plane->type != DRM_PLANE_TYPE_CURSOR) + return -EINVAL; + + /* Don't do an async update if there isn't 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 diff --git a/include/uapi/drm/drm_mode.h b/include/uapi/drm/drm_mode.h index 4b3a1bb58e68..6dae18428123 100644 --- a/include/uapi/drm/drm_mode.h +++ b/include/uapi/drm/drm_mode.h @@ -724,13 +724,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_AMEND 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_AMEND) struct drm_mode_atomic { __u32 flags; -- 2.18.0