From patchwork Tue Jun 27 03:58:39 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zack Rusin X-Patchwork-Id: 13293965 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 37184EB64DC for ; Tue, 27 Jun 2023 03:59:06 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 7B6FE10E283; Tue, 27 Jun 2023 03:59:05 +0000 (UTC) Received: from letterbox.kde.org (letterbox.kde.org [46.43.1.242]) by gabe.freedesktop.org (Postfix) with ESMTPS id E570810E288 for ; Tue, 27 Jun 2023 03:58:56 +0000 (UTC) Received: from vertex.localdomain (pool-173-49-113-140.phlapa.fios.verizon.net [173.49.113.140]) (Authenticated sender: zack) by letterbox.kde.org (Postfix) with ESMTPSA id 46CC0324E14; Tue, 27 Jun 2023 04:58:54 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kde.org; s=users; t=1687838335; bh=6LtiDH/RagZR6SRmgaynb8uq39Dm7Bmp02G31q5VBcE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=RQ/m2Ad7LAo2dbwDBlxdUcmw0HzZ/Hp9WV7UPZeP6uB1hebc+zvr0BvLqDjCancyG jfcbcHJgTsOsWW/fV7stq07GqZmCXAEgF4IOtHYSrIA3JPk1rWzD8AlRI0p2JdSlC3 hWS11h58KPYprEphg2b8x7GyRAchEv+AO1rwq3c/5/8kvyhUDulWm8+RYNhlmsyyWA i4ZBZiapfLEfpNCs/j+K/gPRqxdOfcGNugz3Jnog9N915Ku0rrzAgPrvMCGnBZRkv7 OHCamFqxXQuUp9538SSp6bIVeBhdQFgzi3fMZ6JfsHEuNcino5E/KMzHHO5o4dqcl1 iEemPoSENz8cQ== From: Zack Rusin To: dri-devel@lists.freedesktop.org Subject: [PATCH v3 8/8] drm: Introduce DRM_CLIENT_CAP_VIRTUALIZED_CURSOR_PLANE Date: Mon, 26 Jun 2023 23:58:39 -0400 Message-Id: <20230627035839.496399-9-zack@kde.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230627035839.496399-1-zack@kde.org> References: <20230627035839.496399-1-zack@kde.org> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Zack Rusin Cc: Maxime Ripard , Thomas Zimmermann , David Airlie , javierm@redhat.com, banackm@vmware.com, krastevm@vmware.com, ppaalanen@gmail.com, iforbes@vmware.com, mombasawalam@vmware.com Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" From: Zack Rusin Virtualized drivers place additional restrictions on the cursor plane which breaks the contract of universal planes. To allow atomic modesettings with virtualized drivers the clients need to advertise that they're capable of dealing with those extra restrictions. To do that introduce DRM_CLIENT_CAP_VIRTUALIZED_CURSOR_PLANE which lets DRM know that the client is aware of and capable of dealing with the extra restrictions on the virtual cursor plane. Setting this option to true makes DRM expose the cursor plane on virtualized drivers. The userspace is expected to set the hotspots and handle mouse events on that plane. Signed-off-by: Zack Rusin Cc: Maarten Lankhorst Cc: Maxime Ripard Cc: Thomas Zimmermann Cc: David Airlie Cc: Daniel Vetter Cc: dri-devel@lists.freedesktop.org Acked-by: Pekka Paalanen Reviewed-by: Javier Martinez Canillas --- drivers/gpu/drm/drm_ioctl.c | 9 +++++++++ include/uapi/drm/drm.h | 26 ++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c index 8e9afe7af19c..6fd17ff14656 100644 --- a/drivers/gpu/drm/drm_ioctl.c +++ b/drivers/gpu/drm/drm_ioctl.c @@ -361,6 +361,15 @@ drm_setclientcap(struct drm_device *dev, void *data, struct drm_file *file_priv) return -EINVAL; file_priv->writeback_connectors = req->value; break; + case DRM_CLIENT_CAP_VIRTUALIZED_CURSOR_PLANE: + if (!drm_core_check_feature(dev, DRIVER_CURSOR_HOTSPOT)) + return -EOPNOTSUPP; + if (!file_priv->atomic) + return -EINVAL; + if (req->value > 1) + return -EINVAL; + file_priv->supports_virtualized_cursor_plane = req->value; + break; default: return -EINVAL; } diff --git a/include/uapi/drm/drm.h b/include/uapi/drm/drm.h index a87bbbbca2d4..057ef2a16d31 100644 --- a/include/uapi/drm/drm.h +++ b/include/uapi/drm/drm.h @@ -836,6 +836,32 @@ struct drm_get_cap { */ #define DRM_CLIENT_CAP_WRITEBACK_CONNECTORS 5 +/** + * DRM_CLIENT_CAP_VIRTUALIZED_CURSOR_PLANE + * + * Drivers for para-virtualized hardware (e.g. vmwgfx, qxl, virtio and + * virtualbox) have additional restrictions for cursor planes (thus + * making cursor planes on those drivers not truly universal,) e.g. + * they need cursor planes to act like one would expect from a mouse + * cursor and have correctly set hotspot properties. + * If this client cap is not set the DRM core will hide cursor plane on + * those virtualized drivers because not setting it implies that the + * client is not capable of dealing with those extra restictions. + * Clients which do set cursor hotspot and treat the cursor plane + * like a mouse cursor should set this property. + * The client must enable &DRM_CLIENT_CAP_ATOMIC first. + * + * Setting this property on drivers which do not special case + * cursor planes (i.e. non-virtualized drivers) will return + * EOPNOTSUPP, which can be used by userspace to gauge + * requirements of the hardware/drivers they're running on. + * + * This capability is always supported for atomic-capable virtualized + * drivers starting from kernel version 6.5. + */ +#define DRM_CLIENT_CAP_VIRTUALIZED_CURSOR_PLANE 6 + + /* DRM_IOCTL_SET_CLIENT_CAP ioctl argument type */ struct drm_set_client_cap { __u64 capability;