From nobody Sun Feb 8 08:48:25 2026 Received: from smtpout-03.galae.net (smtpout-03.galae.net [185.246.85.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 329891B425C; Sat, 18 Oct 2025 02:01:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.85.4 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752915; cv=none; b=HqJ0+PALJL9chxspjUYIPuxOLKo2ohTZioeAqF6yzgsAFlu+A4+gUV2kvPluOMmaLSC56q7t4VO+8vOKZhgQ1hvWwAijM9i54JxRx4gupveVo8ADXGA3f4J6HEYXhiqhz/vEAFSVOR0L/LjFtS7b8vYdXNvd4c++Xbc6cA+LTfs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752915; c=relaxed/simple; bh=MLS9g/NpckWYbbJ6erVOl7QRiaiJ2oNsg6Sk2z+gRnQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=XS6jvSWdxNGbFkAkg9cIqdh6abelC5Zlykeqe72loHjNoPjIy6+N2AEaMld229M24t0mCCFnBvaU84umwGfEFz4/VazTAS6epiTiXPjRIF3AlEL1Om/mSWLadnCilkZLOSx5UHbm4+1FvNUqbVee3HABufBTPiWZuAGR1LQscZ4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=nmgII/h1; arc=none smtp.client-ip=185.246.85.4 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="nmgII/h1" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 7E59A4E4115B; Sat, 18 Oct 2025 02:01:50 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 5417B60701; Sat, 18 Oct 2025 02:01:50 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id CC69C102F236F; Sat, 18 Oct 2025 04:01:47 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1760752909; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=Mnv27ovYNz38usZbzkAYTlGQ14nBpYD431Z4+TIHANM=; b=nmgII/h1krwbElwZn8xpCGJU+b78/hg9w91qEAW8pbSXhX6W3WbOK8JXyTasrWysvz9XsI 45+oPOBYJEkSCTGsyll0WtJsoMipIEqK/pB3rq+VGVUiQD0Sh1RWXUgovlvTZWEc4FVJT7 mTBhNpO814Xv+KXwXbf3GHtqoLdTd1HHdb/h145ofDZdTIoN4c0V39zBzGGj/q8zGueItG m8k14kaqvc8TAFhpU4nhR3Gzb3zXRlcf/GHNvM3bugKe0nF0JG3GURa2fcKgqq98d51kfs 4Aip95PIeLSnpJS8nTreYrzPQzyERi1AUa5Eqc+euh1WR/1BdKcHgsr1nkiRvg== From: Louis Chauvet Date: Sat, 18 Oct 2025 04:01:01 +0200 Subject: [PATCH 01/22] drm/vkms: Introduce config for plane name Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251018-vkms-all-config-v1-1-a7760755d92d@bootlin.com> References: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> In-Reply-To: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=5960; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=MLS9g/NpckWYbbJ6erVOl7QRiaiJ2oNsg6Sk2z+gRnQ=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBo8vT9pcd2hSq9HuzMJddMH+kvfVu4GWWq1vSXs zsoTOFU24eJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaPL0/QAKCRAgrS7GWxAs 4jEeD/0R73U6k89+5gVeDYqTQ6fkhZpG2tOpKK4T+QeQeOC0LLDxXWIle3xRl26ZbJWo6vLzT9F mDHqTB3ZVz8kGXRrDxZ2PW+LJOruz4sxuymNZEtWfrczc7jLKiBR7fpBevaUToxrTSe9vU4NsqG /nXnoOujAhTmR9gZqCZ/C4Yyt3mVCMSf+TyD3oQOBpXMQ5Z+IDXNVF8/hGlkTfcXgrIzqZpqZLJ mxgphAh6sblseKPKn7NZ3/A+YsPkOcBrEGFRLJoOncoEdJfsr5Fpn5fn+TLWKjW6i3SyG7Nqujn afSQKjopvmOsjIHE9ue4LQZx+VJ6vYvSwhYOfkfcuYzF2qvhFefxk21Q+4dUiWI9IAKJ1RSGyoh s/huHiWsOMgeA5gq8YYpFwxRGEqkVM7PnjGiDxbv8Sq6OXqJFVHVWMa8BqLpcjqcvcZUiPj8aEB U+dNgml19i9/ckuY1W76iyq2eIfDtaewTfVmA6y62OrSs2kSzkfSeToDoPYNGmyFLxfi3FeyL4v bHmxJQBQX9+VF8h97EoAYHmp91rejk3mTTcJb7mFAnBTr3H8gWVqxTnI6ZOS2Ti4cE2dtesv/Xp ftM8pLHIYsDwPRQkYwxcSwbyiiqo0n7Lr+1R1+gpySRh46pBKGshE5afzvM8ouxkysZ4+xEI1TD PN61p2JrGxIPj9Q== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 As planes can have a name in DRM, prepare VKMS to configure it using ConfigFS. Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/vkms_config.c | 4 ++++ drivers/gpu/drm/vkms/vkms_config.h | 26 ++++++++++++++++++++++++++ drivers/gpu/drm/vkms/vkms_drv.h | 5 +++-- drivers/gpu/drm/vkms/vkms_output.c | 6 +----- drivers/gpu/drm/vkms/vkms_plane.c | 6 ++++-- 5 files changed, 38 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index f8394a063ecf..ed172f800685 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -350,6 +350,8 @@ static int vkms_config_show(struct seq_file *m, void *d= ata) seq_puts(m, "plane:\n"); seq_printf(m, "\ttype=3D%d\n", vkms_config_plane_get_type(plane_cfg)); + seq_printf(m, "\tname=3D%s\n", + vkms_config_plane_get_name(plane_cfg)); } =20 vkms_config_for_each_crtc(vkmsdev->config, crtc_cfg) { @@ -390,6 +392,7 @@ struct vkms_config_plane *vkms_config_create_plane(stru= ct vkms_config *config) =20 plane_cfg->config =3D config; vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_OVERLAY); + vkms_config_plane_set_name(plane_cfg, NULL); xa_init_flags(&plane_cfg->possible_crtcs, XA_FLAGS_ALLOC); =20 list_add_tail(&plane_cfg->link, &config->planes); @@ -402,6 +405,7 @@ void vkms_config_destroy_plane(struct vkms_config_plane= *plane_cfg) { xa_destroy(&plane_cfg->possible_crtcs); list_del(&plane_cfg->link); + kfree_const(plane_cfg->name); kfree(plane_cfg); } EXPORT_SYMBOL_IF_KUNIT(vkms_config_destroy_plane); diff --git a/drivers/gpu/drm/vkms/vkms_config.h b/drivers/gpu/drm/vkms/vkms= _config.h index 4c8d668e7ef8..b69c35097ba0 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -35,6 +35,7 @@ struct vkms_config { * * @link: Link to the others planes in vkms_config * @config: The vkms_config this plane belongs to + * @name: Name of the plane * @type: Type of the plane. The creator of configuration needs to ensures= that * at least one primary plane is present. * @possible_crtcs: Array of CRTCs that can be used with this plane @@ -47,6 +48,7 @@ struct vkms_config_plane { struct list_head link; struct vkms_config *config; =20 + const char *name; enum drm_plane_type type; struct xarray possible_crtcs; =20 @@ -288,6 +290,30 @@ vkms_config_plane_set_type(struct vkms_config_plane *p= lane_cfg, plane_cfg->type =3D type; } =20 +/** + * vkms_config_plane_set_name() - Set the plane name + * @plane_cfg: Plane to set the name to + * @name: New plane name. The name is copied. + */ +static inline void +vkms_config_plane_set_name(struct vkms_config_plane *plane_cfg, + const char *name) +{ + if (plane_cfg->name) + kfree_const(plane_cfg->name); + plane_cfg->name =3D kstrdup_const(name, GFP_KERNEL); +} + +/** + * vkms_config_plane_get_name - Get the plane name + * @plane_cfg: Plane to get the name from + */ +static inline const char * +vkms_config_plane_get_name(struct vkms_config_plane *plane_cfg) +{ + return plane_cfg->name; +} + /** * vkms_config_plane_attach_crtc - Attach a plane to a CRTC * @plane_cfg: Plane to attach diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_dr= v.h index db260df1d4f6..9ad286f043b5 100644 --- a/drivers/gpu/drm/vkms/vkms_drv.h +++ b/drivers/gpu/drm/vkms/vkms_drv.h @@ -225,6 +225,7 @@ struct vkms_output { }; =20 struct vkms_config; +struct vkms_config_plane; =20 /** * struct vkms_device - Description of a VKMS device @@ -298,10 +299,10 @@ int vkms_output_init(struct vkms_device *vkmsdev); * vkms_plane_init() - Initialize a plane * * @vkmsdev: VKMS device containing the plane - * @type: type of plane to initialize + * @config: plane configuration */ struct vkms_plane *vkms_plane_init(struct vkms_device *vkmsdev, - enum drm_plane_type type); + struct vkms_config_plane *config); =20 /* CRC Support */ const char *const *vkms_get_crc_sources(struct drm_crtc *crtc, diff --git a/drivers/gpu/drm/vkms/vkms_output.c b/drivers/gpu/drm/vkms/vkms= _output.c index 2ee3749e2b28..22208d02afa4 100644 --- a/drivers/gpu/drm/vkms/vkms_output.c +++ b/drivers/gpu/drm/vkms/vkms_output.c @@ -19,11 +19,7 @@ int vkms_output_init(struct vkms_device *vkmsdev) return -EINVAL; =20 vkms_config_for_each_plane(vkmsdev->config, plane_cfg) { - enum drm_plane_type type; - - type =3D vkms_config_plane_get_type(plane_cfg); - - plane_cfg->plane =3D vkms_plane_init(vkmsdev, type); + plane_cfg->plane =3D vkms_plane_init(vkmsdev, plane_cfg); if (IS_ERR(plane_cfg->plane)) { DRM_DEV_ERROR(dev->dev, "Failed to init vkms plane\n"); return PTR_ERR(plane_cfg->plane); diff --git a/drivers/gpu/drm/vkms/vkms_plane.c b/drivers/gpu/drm/vkms/vkms_= plane.c index e592e47a5736..263376686794 100644 --- a/drivers/gpu/drm/vkms/vkms_plane.c +++ b/drivers/gpu/drm/vkms/vkms_plane.c @@ -11,6 +11,7 @@ =20 #include "vkms_drv.h" #include "vkms_formats.h" +#include "vkms_config.h" =20 static const u32 vkms_formats[] =3D { DRM_FORMAT_ARGB8888, @@ -217,7 +218,7 @@ static const struct drm_plane_helper_funcs vkms_plane_h= elper_funcs =3D { }; =20 struct vkms_plane *vkms_plane_init(struct vkms_device *vkmsdev, - enum drm_plane_type type) + struct vkms_config_plane *config) { struct drm_device *dev =3D &vkmsdev->drm; struct vkms_plane *plane; @@ -225,7 +226,8 @@ struct vkms_plane *vkms_plane_init(struct vkms_device *= vkmsdev, plane =3D drmm_universal_plane_alloc(dev, struct vkms_plane, base, 0, &vkms_plane_funcs, vkms_formats, ARRAY_SIZE(vkms_formats), - NULL, type, NULL); + NULL, vkms_config_plane_get_type(config), + vkms_config_plane_get_name(config)); if (IS_ERR(plane)) return plane; =20 --=20 2.51.0 From nobody Sun Feb 8 08:48:25 2026 Received: from smtpout-03.galae.net (smtpout-03.galae.net [185.246.85.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 560911D61A3 for ; Sat, 18 Oct 2025 02:01:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.85.4 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752916; cv=none; b=GKciYCWvB791PVB/Kt83T7ioVa3DHXbycBPbOXJrGRrEB30yBXi+jkrGTDhzdkGAf56EVqHVe/ErpmWIJjOYpqVlSLO/ikih/BiWY5XMYdjq5QhbkyfUJrKKzCmdYz68ssK/mVGqQhfuRYxozbB3jx1XLMGYUQG/GhgJQ6j3Q1E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752916; c=relaxed/simple; bh=gn1dFtDuTIsqMj8v2HvytQlrUom5dRjvfBu0zKRM9Ko=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Yqe4Yx5D8J1Q93V27gybYxopOu+hNZigAt3zdXHe99sOwqzGFpjMWWz8R+8plRiJjjZf7BTYmSe7u95IgD9K3sR1VdIr67YGJdQC4ZKBfJZe78lD64mCjbCwh70Cqqty8JuhCWLo7s68+79LP7Nau7HCjyaD+oES1IM/56oByns= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=2RRIpWmq; arc=none smtp.client-ip=185.246.85.4 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="2RRIpWmq" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 8FF1B4E4115C; Sat, 18 Oct 2025 02:01:52 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 63FD560701; Sat, 18 Oct 2025 02:01:52 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 21F27102F2374; Sat, 18 Oct 2025 04:01:49 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1760752911; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=IWd8MEnu7MYdo1XAQJUp9AjirYXBeykWt+5fZ1PTMBk=; b=2RRIpWmqxmwhXoiZ1DZsBfDp7Yeo/IDz5ccvEqIKRiG4XLWFNwK2+huCVWRNUwSRk+m48t KA1y/XYCygnZfBf5zrpOSOg8welopT+ypXDpphiGt/FJdOHy5xble6hFAmlIDgQSZQfl1I udV6P0gCaR/3DRZv7fcuxc2KVRaxi+LfGGAhghDvISBnUM+WQ7v54nkf5IzXisPpgDViuN p+GUevbE3pSDxVIEoLB2LpjmCtvnmxFjOZJQj8ksdDVRj7WsJ8DKig79Iw+8OXlB3+R/Dl r7AaCxE/GfHpp9RvF1AKaeB3Y0TuNHZKp9rtwNylcFz5V61VT908d+o4Ln0Vuw== From: Louis Chauvet Date: Sat, 18 Oct 2025 04:01:02 +0200 Subject: [PATCH 02/22] drm/vkms: Introduce configfs for plane name Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251018-vkms-all-config-v1-2-a7760755d92d@bootlin.com> References: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> In-Reply-To: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=709; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=gn1dFtDuTIsqMj8v2HvytQlrUom5dRjvfBu0zKRM9Ko=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBo8vT9jLLPBYDiM4Vcw5XHlQXCeI6iAYkdBdx3W 5KkpL2ihI2JAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaPL0/QAKCRAgrS7GWxAs 4hpXEACpCvTcjmGIZqYMTAju6yjWUWyUkikb2iWoD2Dw26Kmr5lJErTqKiHATWqw5MQcGkQFBk4 6O/0VeGSnfMY7/OBO7K0yAZztVRtb5ZqvyFtnfq5Z9p/5q8mK9qr9rMcJsiHp8ytbAeUwdfZBmS KeE/zOotuD55SLWaJyQCSmUiRb0GYosRklYqFKPPo1NVcmZzUxPSsRsBTFsT01gcv0DyQHLBjHj GobWIzi1t9vo0pbquyVf2eYrmLeNBz23t8Ub9C5XE0OEeZhc7w9lkoT+1zzPnuJlfrwpeaboibZ m9pID+hbueWbVZCgVrj0RxgE0GLDGdznfybFW6ZJDf3B68n4aMZNLYbo4pw9EWPwGcCM5xginW7 AXH0UNHuADtHdg+/VDII7aYAZQd//Ga+Y7kXsNx7RXfkpOsul22xRbpzVmiHmmSMILtvapdSRBz iW6R51IBEFVqTeriY6EmWi8RBghujY8TfZ8YnGIqvhhUBA3I6zUCvDklOFq+kO4vGLEGcgpSS9H 6aUNW7wSnmrZWSQ1iPrwe4eKweN3PUEk3AFZFMVVzwYuPwBHUK3feZGHTjIDdYvI3XrqYyUkxJG KXSIRp3WanKitGZPG5ByQQeXFchnPUZZrnla6f55wtwWZotTiMI9lGoF+xrvA9AWiYHm+3MKWR+ p8In2xo/2gf1lKQ== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Use directory name as name for the plane. Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/vkms_configfs.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vk= ms_configfs.c index 07ab794e1052..ea245e2e2fd2 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -376,6 +376,7 @@ static struct config_group *make_plane_group(struct con= fig_group *group, kfree(plane); return ERR_CAST(plane->config); } + vkms_config_plane_set_name(plane->config, name); =20 config_group_init_type_name(&plane->group, name, &plane_item_type); =20 --=20 2.51.0 From nobody Sun Feb 8 08:48:25 2026 Received: from smtpout-04.galae.net (smtpout-04.galae.net [185.171.202.116]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4FBEE20D4E9 for ; Sat, 18 Oct 2025 02:01:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752918; cv=none; b=rU6PByaN5gg2e3J490bfs3T4lwDSN6h7+S9t/EYMxcJXx1ySPiZ7XLKhXXu18SRDFVl2rLoJpi7YPY9nKKgyejzQaQFLihxqzKudZmiZLbCJ7D2+xx2ns36gFbSLe6pA8WqNVefzmim7wWU6cTfap11o4ekK34e3ePJTXnS3Tbc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752918; c=relaxed/simple; bh=bMqgzxaPOkbUjyJt7vujalDG4HEZknk683/aA6OSnyE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JbvOtp53umZ9PjFr9ZOaJjLLEQ5kKKZ5nMAS/WNNnH+elwdscX2ePJDqDHxTY9KR3YoBjDHIlJi3IkliX6GH3Uqq1jefOK9CkKDFOU7lkrA6kSTv3orF7cO0r46bc5xjYfNG+gtr/VLUHivVaYhohNlUVyS5WHsNXPa5TGshIkQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=E7IVOwf5; arc=none smtp.client-ip=185.171.202.116 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="E7IVOwf5" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 2BC74C003FD; Sat, 18 Oct 2025 02:01:35 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 8113060701; Sat, 18 Oct 2025 02:01:54 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 12038102F236C; Sat, 18 Oct 2025 04:01:51 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1760752913; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=ESq4Ftul8ZQ5lD/S/H9FzihryysQij/M8JZfPZn0lNc=; b=E7IVOwf5ZoAhvGlzMR58h7n/OiTXVY4ZOQ5avgxDtOs+NARcH0RixdEbPFcZiPlzhLeZe4 9/O093Gltfn6RFWVseU2pTyr7oiSz8Cn7pV25eJarb9oqehHfNTM8ggLOoZLKkI0xaHqVq XeFUzSj0C4c/IuDceVf/yZH9prGj7k/aorPejuDkdABw1Ku2RGGAqviiYDzbraB/QzZ9lU /UjvdRKNg1TEm5jWsp6JhkQflvMl0Kyhb2P2xq8N/h4nisAQ3yk575x11TD0QxS335LimB PCxK/q3uOKUC50tHPRTgmSyccCAqnFdDZDzR1MHHqRuLcCKr/hipigqeJKdHyw== From: Louis Chauvet Date: Sat, 18 Oct 2025 04:01:03 +0200 Subject: [PATCH 03/22] drm/vkms: Introduce config for plane rotation Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251018-vkms-all-config-v1-3-a7760755d92d@bootlin.com> References: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> In-Reply-To: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=6587; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=bMqgzxaPOkbUjyJt7vujalDG4HEZknk683/aA6OSnyE=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBo8vT9PrlWxxIk6AfW7+HHB1AyKB3MX+LdBcuEO sep1StPz/mJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaPL0/QAKCRAgrS7GWxAs 4mV7EACAoBGdVE1vgHcQAI7TqRjn3gy7WNRfBCeIjoA2t0FD6Yz8o1No6wwfMHlykdx6TgW3jug 5/nUUDMhfLVIkcC45wd8SSbLcTE+4PKkLZsPy9MIg8CtS5wzIqPm8W2uQft6xWjK4MDlaF6Mr+3 MK9QECIe1qAHwMP92lY8Mzlkh+XFsZjlE7PGgg1csIuo093341AAACA9tq1+rNjKSs/9P1ZAK6n htEM/jlHN6EjmpOycCzx+VIxBZIKwetmzSVaDlwHNq46YVy7ccuuTvu5YbDBAgnPXm7lZl69lnG uMbzIlUYzyNVuLzbe6P030s9ZYgA9p3r46/yBLoIaibCvkFlJKhVMY+98pe5YUtLbVbwrDUh/49 cCAbgZ61Q3fxAch+rXdpRONntKzbsfKQGo3JinI4xxIPvynf0mxEdVDBMOb6GTCLcItzTV4OyxO Dq1wGwsW2KEaus3bMyfniCBjyk3Y+kpnAjpPb2aQbbqHOo5VlxzmSp0pEhAovRSDIofFaxPX236 7ukxc+gRD6QPycPsWr1ql7q3roCNehh3K4e6ltAU3l5Se13yQnrqIRUqtgCK5dQXlSd86k6xTNR MXVZsq66CUTMUowhnc/47I9rhbJRtX0J3PG7pEqej78RRycO02IbN6S7VFo8VTMWiFJV6VrGZ01 JypOs1aYLs9CjlQ== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 VKMS driver supports all the rotation on planes, but for testing it can be useful to only advertise few of them. This new configuration interface will allow configuring the rotation per planes. Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/vkms_config.c | 26 ++++++++++++++++++ drivers/gpu/drm/vkms/vkms_config.h | 54 ++++++++++++++++++++++++++++++++++= ++++ drivers/gpu/drm/vkms/vkms_plane.c | 6 +++-- 3 files changed, 84 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index ed172f800685..b8cabe6f6cf8 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -144,6 +144,22 @@ static bool valid_plane_number(const struct vkms_confi= g *config) return true; } =20 +static bool valid_plane_properties(const struct vkms_config *config) +{ + struct drm_device *dev =3D config->dev ? &config->dev->drm : NULL; + struct vkms_config_plane *plane_cfg; + + vkms_config_for_each_plane(config, plane_cfg) { + if ((vkms_config_plane_get_default_rotation(plane_cfg) & + vkms_config_plane_get_supported_rotations(plane_cfg)) !=3D + vkms_config_plane_get_default_rotation(plane_cfg)) { + drm_info(dev, "Configured default rotation is not supported by the plan= e\n"); + return false; + } + } + return true; +} + static bool valid_planes_for_crtc(const struct vkms_config *config, struct vkms_config_crtc *crtc_cfg) { @@ -302,6 +318,9 @@ bool vkms_config_is_valid(const struct vkms_config *con= fig) { struct vkms_config_crtc *crtc_cfg; =20 + if (!valid_plane_properties(config)) + return false; + if (!valid_plane_number(config)) return false; =20 @@ -352,6 +371,10 @@ static int vkms_config_show(struct seq_file *m, void *= data) vkms_config_plane_get_type(plane_cfg)); seq_printf(m, "\tname=3D%s\n", vkms_config_plane_get_name(plane_cfg)); + seq_printf(m, "\tsupported rotations: 0x%x\n", + vkms_config_plane_get_supported_rotations(plane_cfg)); + seq_printf(m, "\tdefault rotation: 0x%x\n", + vkms_config_plane_get_default_rotation(plane_cfg)); } =20 vkms_config_for_each_crtc(vkmsdev->config, crtc_cfg) { @@ -393,6 +416,9 @@ struct vkms_config_plane *vkms_config_create_plane(stru= ct vkms_config *config) plane_cfg->config =3D config; vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_OVERLAY); vkms_config_plane_set_name(plane_cfg, NULL); + vkms_config_plane_set_supported_rotations(plane_cfg, DRM_MODE_ROTATE_MASK= ); + vkms_config_plane_set_default_rotation(plane_cfg, DRM_MODE_ROTATE_0); + xa_init_flags(&plane_cfg->possible_crtcs, XA_FLAGS_ALLOC); =20 list_add_tail(&plane_cfg->link, &config->planes); diff --git a/drivers/gpu/drm/vkms/vkms_config.h b/drivers/gpu/drm/vkms/vkms= _config.h index b69c35097ba0..3c3cbefcc67f 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -39,6 +39,8 @@ struct vkms_config { * @type: Type of the plane. The creator of configuration needs to ensures= that * at least one primary plane is present. * @possible_crtcs: Array of CRTCs that can be used with this plane + * @default_rotation: Default rotation that should be used by this plane + * @supported_rotation: Rotation that this plane will support * @plane: Internal usage. This pointer should never be considered as vali= d. * It can be used to store a temporary reference to a VKMS plane d= uring * device creation. This pointer is not managed by the configurati= on and @@ -50,6 +52,8 @@ struct vkms_config_plane { =20 const char *name; enum drm_plane_type type; + unsigned int default_rotation; + unsigned int supported_rotations; struct xarray possible_crtcs; =20 /* Internal usage */ @@ -290,6 +294,56 @@ vkms_config_plane_set_type(struct vkms_config_plane *p= lane_cfg, plane_cfg->type =3D type; } =20 +/** + * vkms_config_plane_get_default_rotation() - Get the default rotation for= a plane + * @plane_cfg: Plane to get the default rotation from + * + * Returns: + * The default rotation for the plane. + */ +static inline unsigned int +vkms_config_plane_get_default_rotation(struct vkms_config_plane *plane_cfg) +{ + return plane_cfg->default_rotation; +} + +/** + * vkms_config_plane_set_default_rotation() - Set the default rotation for= a plane + * @plane_cfg: Plane to set the default rotation to + * @default_rotation: New default rotation for the plane + */ +static inline void +vkms_config_plane_set_default_rotation(struct vkms_config_plane *plane_cfg, + unsigned int default_rotation) +{ + plane_cfg->default_rotation =3D default_rotation; +} + +/** + * vkms_config_plane_get_supported_rotations() - Get the supported rotatio= ns for a plane + * @plane_cfg: Plane to get the supported rotations from + * + * Returns: + * The supported rotations for the plane. + */ +static inline unsigned int +vkms_config_plane_get_supported_rotations(struct vkms_config_plane *plane_= cfg) +{ + return plane_cfg->supported_rotations; +} + +/** + * vkms_config_plane_set_supported_rotations() - Set the supported rotatio= ns for a plane + * @plane_cfg: Plane to set the supported rotations to + * @supported_rotations: New supported rotations for the plane + */ +static inline void +vkms_config_plane_set_supported_rotations(struct vkms_config_plane *plane_= cfg, + unsigned int supported_rotations) +{ + plane_cfg->supported_rotations =3D supported_rotations; +} + /** * vkms_config_plane_set_name() - Set the plane name * @plane_cfg: Plane to set the name to diff --git a/drivers/gpu/drm/vkms/vkms_plane.c b/drivers/gpu/drm/vkms/vkms_= plane.c index 263376686794..6e6bfe1b7400 100644 --- a/drivers/gpu/drm/vkms/vkms_plane.c +++ b/drivers/gpu/drm/vkms/vkms_plane.c @@ -1,5 +1,6 @@ // SPDX-License-Identifier: GPL-2.0+ =20 +#include "vkms_config.h" #include =20 #include @@ -233,8 +234,9 @@ struct vkms_plane *vkms_plane_init(struct vkms_device *= vkmsdev, =20 drm_plane_helper_add(&plane->base, &vkms_plane_helper_funcs); =20 - drm_plane_create_rotation_property(&plane->base, DRM_MODE_ROTATE_0, - DRM_MODE_ROTATE_MASK | DRM_MODE_REFLECT_MASK); + drm_plane_create_rotation_property(&plane->base, + vkms_config_plane_get_default_rotation(config), + vkms_config_plane_get_supported_rotations(config)); =20 drm_plane_create_color_properties(&plane->base, BIT(DRM_COLOR_YCBCR_BT601) | --=20 2.51.0 From nobody Sun Feb 8 08:48:25 2026 Received: from smtpout-04.galae.net (smtpout-04.galae.net [185.171.202.116]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 633D221FF26; Sat, 18 Oct 2025 02:01:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752920; cv=none; b=pK2MZlR/fX5zLjMBGHQRgqimd2Liv1o2qJfGCZZb0SQWMylUl5GcJfa7nRJvuTTw1+AELZqzSQi7TWzZFm+G+wa7jBsgFdjsg09pVVmmucmbB5A67jy0ql3ZNkZng35UCSlCilGg3ocx8XAKhZsvuY7KSchC+1nip6YkvJKIXJ8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752920; c=relaxed/simple; bh=jLseadG4liEn2N5pyi/KD1v5Q5WKn00ARvAN7rBRh1k=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Vti3LBqoEriE8jo1mWfxZcHlyrLn7N+ZbEd6eIjPKUVC3+cp3sH25a9eTfotpDRVTrkp6AkHBcldHns/MOB51rapx1NVuplkb4AW547gPbpuepsoNxe4Azqtl5LcVhDAMlegeRVdSEqxsLLGKsAV3Uts5AFnqDtMhHTSeE9afJ8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=gHoQs7fK; arc=none smtp.client-ip=185.171.202.116 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="gHoQs7fK" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 767FBC041FD; Sat, 18 Oct 2025 02:01:37 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id CC36160701; Sat, 18 Oct 2025 02:01:56 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 15304102F236F; Sat, 18 Oct 2025 04:01:53 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1760752915; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=d1kn9HeUTtSXJBlNNXm4t8OytepygXuiiRcvBqcRHBE=; b=gHoQs7fK3MII6jnNA4GD5i1a2DSVXBLvivX9Jps064MEJptiz3Nmd0cgoebFjVfWpLtWMc sxPzBahYAlAIhgMql5WeJQNwtmCEwUlXJal6/Y1TguVxC57icToZozqq3OfSlL1fhVdEKJ FMbwbc2IGoX8H+7ssrDXZYoVn/vAUbdaWI6HEpxzZKoi5SyC0WQb/Bv0X64FiuJbM76MQv GRi57anu75Df0BWDanHRosyVNF7wRPeHGmeTFn93LAbudX5NSxDK7p7m6919aN5dInCE58 hoZEd/zgK6YzkdVRO6zL3eIKVlbOb4JwTg05Npi7lNAmks6IBnNJVdsKQoYi0g== From: Louis Chauvet Date: Sat, 18 Oct 2025 04:01:04 +0200 Subject: [PATCH 04/22] drm/vkms: Introduce configfs for plane rotation Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251018-vkms-all-config-v1-4-a7760755d92d@bootlin.com> References: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> In-Reply-To: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=5015; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=jLseadG4liEn2N5pyi/KD1v5Q5WKn00ARvAN7rBRh1k=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBo8vT9xhb2k+gfTY9euP4jA9UrA/sZZs3Ny/V8s PQlGai7HQiJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaPL0/QAKCRAgrS7GWxAs 4qA5D/9zVzaA8+0a4QvRPHPKU40gFSQJin+8MLjZc4C0X8CPWWW/ZGtF2ZvGbT33S7K2LFsRzl1 obuFDYtfo1xz38f7Fku98v0bYepqPQm1h+wJj/C6T+G9z+S+lFctc+oGqWR3Ky65ObVHXEACtk3 YbVKHJoz7h/oTyPEtYL3192BR3pffP3h4rs7vuXo4KTdR6sdBj3H0Z96v976Nup5uv+09FyRXr/ VntGXiIqU+Ej+rt0T5sy0XIZ2UrJhMadFGHtNaDyEkkpEvpVwEREV6N1X18HIRdcLVd0NiJlrLE qZ7nmvgyKhHA5s+oh9NY1H2ta5T/FcKFc0rtQzRoS8HU9KanOczHiEn4mYoeKkrAqTFkUZ33Fwp /E0vgxs5ycPHuspgBUNYhlyqs8JiBj1GolQBwZ+PbtxGlM2vx7CjOH06oit4Z0uvGOFOhzWRigw NTbt38vHqXXK7kpfp9Nz39h5MtBzuSDO62HLXm5jKVK8Upt5r52polzUUL1ICkXJYH6GIVPR+vF cjbFFfBLWLOZJdX669GM2zi2MrCVoDnry3KAX7jRdiMfLsHW6P1ZtnXWXReZuhi/nKtY8x/ZgLs iI6QBrvmaUmuKsFEZNuFG561uaEL+dAgRVVtY9B60ET7ieQ2lVMYhXQ7ttzZovJ1JWRV98XhV8P 2z0DDB0MEkoRsFQ== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 To allows the userspace to test many hardware configuration, introduce a new interface to configure the available rotation per planes. VKMS supports any rotation and reflection, so the userspace can choose any combination. The supported rotations are configured by writing a rotation bitmask to the file `supported_rotations` and the default rotation is chosen by writing a rotation bitmask to `default_rotation`. Signed-off-by: Louis Chauvet --- Documentation/gpu/vkms.rst | 7 ++- drivers/gpu/drm/vkms/vkms_configfs.c | 94 ++++++++++++++++++++++++++++++++= ++++ 2 files changed, 100 insertions(+), 1 deletion(-) diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index 3574e01b928d..a432968cc711 100644 --- a/Documentation/gpu/vkms.rst +++ b/Documentation/gpu/vkms.rst @@ -87,10 +87,15 @@ Start by creating one or more planes:: =20 sudo mkdir /config/vkms/my-vkms/planes/plane0 =20 -Planes have 1 configurable attribute: +Planes have 3 configurable attribute: =20 - type: Plane type: 0 overlay, 1 primary, 2 cursor (same values as those exposed by the "type" property of a plane) +- possible_rotations: Available rotation for a plane, as a bitmask: 0x01 n= o rotation, + 0x02 rotate 90=C2=B0, 0x04 rotate 180=C2=B0, 0x08 rotate 270=C2=B0, 0x10= reflect x, 0x20 reflect y + (same values as those exposed by the "rotation" property of a plane) +- default_rotation: Default rotation presented to the userspace, same valu= es as + possible_rotations. =20 Continue by creating one or more CRTCs:: =20 diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vk= ms_configfs.c index ea245e2e2fd2..450e45e66a45 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -322,10 +322,104 @@ static ssize_t plane_type_store(struct config_item *= item, const char *page, return (ssize_t)count; } =20 +static ssize_t plane_supported_rotations_show(struct config_item *item, ch= ar *page) +{ + struct vkms_configfs_plane *plane; + unsigned int plane_supported_rotations; + + plane =3D plane_item_to_vkms_configfs_plane(item); + + scoped_guard(mutex, &plane->dev->lock) { + plane_supported_rotations =3D vkms_config_plane_get_supported_rotations(= plane->config); + } + + return sprintf(page, "%u", plane_supported_rotations); +} + +static ssize_t plane_supported_rotations_store(struct config_item *item, + const char *page, size_t count) +{ + struct vkms_configfs_plane *plane =3D plane_item_to_vkms_configfs_plane(i= tem); + int ret, val =3D 0; + + ret =3D kstrtouint(page, 0, &val); + if (ret) + return ret; + + /* Should be a supported value */ + if (val & ~(DRM_MODE_ROTATE_MASK | DRM_MODE_REFLECT_MASK)) + return -EINVAL; + /* Should at least provide one rotation */ + if (!(val & DRM_MODE_ROTATE_MASK)) + return -EINVAL; + + scoped_guard(mutex, &plane->dev->lock) { + /* Ensures that the default rotation is included in supported rotation */ + if (plane->dev->enabled || + (val & vkms_config_plane_get_default_rotation(plane->config)) !=3D + vkms_config_plane_get_default_rotation(plane->config)) + return -EINVAL; + + vkms_config_plane_set_supported_rotations(plane->config, val); + } + + return count; +} + +static ssize_t plane_default_rotation_show(struct config_item *item, char = *page) +{ + struct vkms_configfs_plane *plane; + unsigned int plane_default_rotation; + + plane =3D plane_item_to_vkms_configfs_plane(item); + + scoped_guard(mutex, &plane->dev->lock) { + plane_default_rotation =3D vkms_config_plane_get_default_rotation(plane-= >config); + } + + return sprintf(page, "%u", plane_default_rotation); +} + +static ssize_t plane_default_rotation_store(struct config_item *item, + const char *page, size_t count) +{ + struct vkms_configfs_plane *plane =3D plane_item_to_vkms_configfs_plane(i= tem); + int ret, val =3D 0; + + ret =3D kstrtouint(page, 10, &val); + if (ret) + return ret; + + /* Should be a supported value */ + if (val & ~(DRM_MODE_ROTATE_MASK | DRM_MODE_REFLECT_MASK)) + return -EINVAL; + /* Should at least provide one rotation */ + if ((val & DRM_MODE_ROTATE_MASK) =3D=3D 0) + return -EINVAL; + /* Should contains only one rotation */ + if (!is_power_of_2(val & DRM_MODE_ROTATE_MASK)) + return -EINVAL; + + scoped_guard(mutex, &plane->dev->lock) { + /* Ensures that the default rotation is included in supported rotation */ + if (plane->dev->enabled || + (val & vkms_config_plane_get_supported_rotations(plane->config)) != =3D val) + return -EINVAL; + + vkms_config_plane_set_default_rotation(plane->config, val); + } + + return count; +} + CONFIGFS_ATTR(plane_, type); +CONFIGFS_ATTR(plane_, supported_rotations); +CONFIGFS_ATTR(plane_, default_rotation); =20 static struct configfs_attribute *plane_item_attrs[] =3D { &plane_attr_type, + &plane_attr_supported_rotations, + &plane_attr_default_rotation, NULL, }; =20 --=20 2.51.0 From nobody Sun Feb 8 08:48:25 2026 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 247852236F0; Sat, 18 Oct 2025 02:02:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752923; cv=none; b=FlFUFfSmHJiH1QDhz4bnPZj83crEciw7Dny58+aEwictj3WHY6m49cfH/ACqVfiYhwNDpAXUQSTYeRtybISKaHlFHlh8QiV0D4r+OQ3v8f5KaSs0j5LwBL4gX78/L70c/VruYFbHdBvjVYkQfquKD78AKv4TvccKSfeptFQJEdA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752923; c=relaxed/simple; bh=FBi9wj02YrH6AcpfOsoy4T2nViBT0k8WVr4xLZc3ieA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=hl8mDQgDob/SoxuwFfVEMKhJNs8lqPguuCFXR/zgRZSIodGrsQe9wQotW401Fjs91/XocmHEhK2ltIQo44f950KKYJEG+bwpy48bAIl0n04xqswoPdrIAXauaieKnFjnU7+qGk5G+eHh6yZVL37blC4ZJYHHE1YjCeTzB/DNet0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=JzdnpRlR; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="JzdnpRlR" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 557601A14AA; Sat, 18 Oct 2025 02:01:59 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 2540C60701; Sat, 18 Oct 2025 02:01:59 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 64D08102F237B; Sat, 18 Oct 2025 04:01:56 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1760752917; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=SVWglRXAb3sduyLpdPObgcLLPU6kNFYMuqUjpNzcatw=; b=JzdnpRlRCnnQtM5MjcbGajA2T00BGxnLdKt1azfP/PC8h8KoZsk4r/4tF17u3t79KRQdAK n5fqZHYDbMLpGY+mnm8fdzMV9CuXENLpxN71D1sq0mZfEMbY1SkbfkpVPSmMs86hnXRjAQ Kxz7qv92g8o3qfE28d9UH+AnNsi4hTFjDgMGDSy+qqNu1OP0ZdRUZd+5PBrLH+kYeVdyCY xbVCubyKU/v0rd5pXhyl1+19CWFzVFg2DrZzwIk+cxKtHjFtNgddK6OQ/zuHpItfutOo02 MOfeBzgmpFGRYqxOCPv5yx+ff74jO8Py7IT17y2GtACLzR/WVeDlmtqmenhssw== From: Louis Chauvet Date: Sat, 18 Oct 2025 04:01:05 +0200 Subject: [PATCH 05/22] drm/vkms: Introduce config for plane color encoding Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251018-vkms-all-config-v1-5-a7760755d92d@bootlin.com> References: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> In-Reply-To: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=5382; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=FBi9wj02YrH6AcpfOsoy4T2nViBT0k8WVr4xLZc3ieA=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBo8vT9+XgSREWK0HTSgMLz7+zkkAWeHa+71gdfK 5J3f323XL6JAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaPL0/QAKCRAgrS7GWxAs 4stcEAC9mmtne2kuCw5/VuRopbmGem2c5kJzFqjOH9i9ls7NQspD4GC0o+8c/zZFduqFTJJ8QgO NEznRUaEhwUGWOIchnlMFHXeY/s7TNBHGfiFLBltOF7s2UkiYLrShWDswfFW9Gg7PvMXTDMy1sM lf7yHobBTKoS0S9ERr81LTB91jpNJX/kCfZnO+bp8jXz1YUe1+9JY61Zs7HKI5MpF6EIvaBntP8 bNRhXDThJDdNtKHrKIMmvoyA1+jLw8i7URmGGY6y39F/OUOhULB4hodrnBsBhbA/d0lNfjA1Zyy qwJqOci2HnG+ZDjZk/VHC/Y2mb9SwYB0+rfkE1tEugk06AqxRSLkFXppO32irmoyu0JNbT/mqhI zym1YPkmgix97ZzH8feopupl9qUGJSiEh1KrblFrpt3ZObXlj8W2il0e6LA8HZFyhryb21Cre3E ga5FZHXCKKNTFLqmXKlDc+XqyNq01mwDkBxfg9qkXKeJf5iFjaS1W8yw/sHp8nBjrINLcVl04Z5 9k+jDOa8TxqTR6aGDDvx23ELL6WNZJhXlaIpEEm+fASvmRk5bhcjVjr9xxdZ1krOmtUjYnXGqrT bM3bTKIokpUV1MBz5EIKg3LDFaUI5NsJOTIeA/asKlAer1YaBH7pKrnxr2+h+qB8e4w55FqDGbD uuQP2hijzQznD1w== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 VKMS driver supports all the color encoding on planes, but for testing it can be useful to only advertise few of them. This new configuration interface will allow configuring the color encoding per planes. Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/vkms_config.c | 15 +++++++++++++++ drivers/gpu/drm/vkms/vkms_config.h | 30 ++++++++++++++++++++++++++++++ drivers/gpu/drm/vkms/vkms_plane.c | 6 ++---- 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index b8cabe6f6cf8..5353719a476d 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -156,6 +156,13 @@ static bool valid_plane_properties(const struct vkms_c= onfig *config) drm_info(dev, "Configured default rotation is not supported by the plan= e\n"); return false; } + + if ((BIT(vkms_config_plane_get_default_color_encoding(plane_cfg)) & + vkms_config_plane_get_supported_color_encoding(plane_cfg)) !=3D + BIT(vkms_config_plane_get_default_color_encoding(plane_cfg))) { + drm_info(dev, "Configured default color encoding is not supported by th= e plane\n"); + return false; + } } return true; } @@ -375,6 +382,10 @@ static int vkms_config_show(struct seq_file *m, void *= data) vkms_config_plane_get_supported_rotations(plane_cfg)); seq_printf(m, "\tdefault rotation: 0x%x\n", vkms_config_plane_get_default_rotation(plane_cfg)); + seq_printf(m, "\tsupported color encoding: 0x%x\n", + vkms_config_plane_get_supported_color_encoding(plane_cfg)); + seq_printf(m, "\tdefault color encoding: %d\n", + vkms_config_plane_get_default_color_encoding(plane_cfg)); } =20 vkms_config_for_each_crtc(vkmsdev->config, crtc_cfg) { @@ -418,6 +429,10 @@ struct vkms_config_plane *vkms_config_create_plane(str= uct vkms_config *config) vkms_config_plane_set_name(plane_cfg, NULL); vkms_config_plane_set_supported_rotations(plane_cfg, DRM_MODE_ROTATE_MASK= ); vkms_config_plane_set_default_rotation(plane_cfg, DRM_MODE_ROTATE_0); + vkms_config_plane_set_supported_color_encoding(plane_cfg, BIT(DRM_COLOR_Y= CBCR_BT601) | + BIT(DRM_COLOR_YCBCR_BT709) | + BIT(DRM_COLOR_YCBCR_BT2020)); + vkms_config_plane_set_default_color_encoding(plane_cfg, DRM_COLOR_YCBCR_B= T601); =20 xa_init_flags(&plane_cfg->possible_crtcs, XA_FLAGS_ALLOC); =20 diff --git a/drivers/gpu/drm/vkms/vkms_config.h b/drivers/gpu/drm/vkms/vkms= _config.h index 3c3cbefcc67f..11160c3c13bc 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -45,6 +45,8 @@ struct vkms_config { * It can be used to store a temporary reference to a VKMS plane d= uring * device creation. This pointer is not managed by the configurati= on and * must be managed by other means. + * @default_color_encoding: Default color encoding that should be used by = this plane + * @supported_color_encoding: Color encoding that this plane will support */ struct vkms_config_plane { struct list_head link; @@ -54,6 +56,8 @@ struct vkms_config_plane { enum drm_plane_type type; unsigned int default_rotation; unsigned int supported_rotations; + enum drm_color_encoding default_color_encoding; + unsigned int supported_color_encoding; struct xarray possible_crtcs; =20 /* Internal usage */ @@ -344,6 +348,32 @@ vkms_config_plane_set_supported_rotations(struct vkms_= config_plane *plane_cfg, plane_cfg->supported_rotations =3D supported_rotations; } =20 +static inline enum drm_color_encoding +vkms_config_plane_get_default_color_encoding(struct vkms_config_plane *pla= ne_cfg) +{ + return plane_cfg->default_color_encoding; +} + +static inline void +vkms_config_plane_set_default_color_encoding(struct vkms_config_plane *pla= ne_cfg, + enum drm_color_encoding default_color_encoding) +{ + plane_cfg->default_color_encoding =3D default_color_encoding; +} + +static inline unsigned int +vkms_config_plane_get_supported_color_encoding(struct vkms_config_plane *p= lane_cfg) +{ + return plane_cfg->supported_color_encoding; +} + +static inline void +vkms_config_plane_set_supported_color_encoding(struct vkms_config_plane *p= lane_cfg, + unsigned int supported_color_encoding) +{ + plane_cfg->supported_color_encoding =3D supported_color_encoding; +} + /** * vkms_config_plane_set_name() - Set the plane name * @plane_cfg: Plane to set the name to diff --git a/drivers/gpu/drm/vkms/vkms_plane.c b/drivers/gpu/drm/vkms/vkms_= plane.c index 6e6bfe1b7400..5869000415e4 100644 --- a/drivers/gpu/drm/vkms/vkms_plane.c +++ b/drivers/gpu/drm/vkms/vkms_plane.c @@ -239,12 +239,10 @@ struct vkms_plane *vkms_plane_init(struct vkms_device= *vkmsdev, vkms_config_plane_get_supported_rotations(config)); =20 drm_plane_create_color_properties(&plane->base, - BIT(DRM_COLOR_YCBCR_BT601) | - BIT(DRM_COLOR_YCBCR_BT709) | - BIT(DRM_COLOR_YCBCR_BT2020), + vkms_config_plane_get_supported_color_encoding(config), BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) | BIT(DRM_COLOR_YCBCR_FULL_RANGE), - DRM_COLOR_YCBCR_BT601, + vkms_config_plane_get_default_color_encoding(config), DRM_COLOR_YCBCR_FULL_RANGE); =20 return plane; --=20 2.51.0 From nobody Sun Feb 8 08:48:25 2026 Received: from smtpout-04.galae.net (smtpout-04.galae.net [185.171.202.116]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9F74F224AEF for ; Sat, 18 Oct 2025 02:02:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752924; cv=none; b=oMg69gP71IWK/bsFbaSJqCCehQVKqpAbiWOjjtpDPitjgCdIy5prmypwl/PfLGBfBSOUF4aw/5E0Uoaah5F8nM/RG4ktDzdnuojd7E4HLpbj1MFdUY7aj+LxOcAE/uJgY+JU3EZ7xC0Jd0GtFXJ0yoe45djkYdnOtj6tgulsy+M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752924; c=relaxed/simple; bh=mh+IW1eZTRLhBSalLL+EiK3RLAsPJbyKHaX58DjJBaE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=iP3KkVWYTWjLd7ZpiNRadK/NTQLChNGZwKwHGXC114HAkS9bQLMJd8xHHXv1TGRFatgNIiVRNOg6fNULa3c61hM3lAukN+Ee3ExkLm43m8HlCdLkQ9W6Ojz/iH3cT+/SBkXD1fzvFrQpc6cqSA4LAGiL2Iogw7K5IxO/Bgq3HT4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=bC3/FC3P; arc=none smtp.client-ip=185.171.202.116 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="bC3/FC3P" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id CAAD4C041FD; Sat, 18 Oct 2025 02:01:41 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 2B24560701; Sat, 18 Oct 2025 02:02:01 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 4CE9D102F237F; Sat, 18 Oct 2025 04:01:58 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1760752920; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=JnSE13gC1MR7BSBM0cc/TrTHLHePZlRwuf5e8aoIewk=; b=bC3/FC3PB960vSvW2WTWYO29IAeDmNuP3CjTNq/5R5auQuY+4PewFUO9tQQN5aVzakxMGd EmFzgUM65DUZlj4oKdm8e3BVbqnQcXpVeLYcVsmeFo+OPH8ww+VTP7o/A9FN8990n6/7gG ZIiCE2PyWOpKkGyNse3RW8XmAnEblRl1bXbPi9JyWYqA91BqQiY//K8jC3QDSCCAzEjKRH Mh16LDYFVLlWM3+HW5li2fLpRu/5robJggGq8/9AZOWJI7S1YYr03E/4BS8romNn4rly/5 V5v3bTzM6rTVQscije4ehjZSiPbwmKVeReohD1ajTKHcHNqO4348lr3OcmQUUw== From: Louis Chauvet Date: Sat, 18 Oct 2025 04:01:06 +0200 Subject: [PATCH 06/22] drm/vkms: Introduce configfs for plane color encoding Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251018-vkms-all-config-v1-6-a7760755d92d@bootlin.com> References: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> In-Reply-To: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=5765; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=mh+IW1eZTRLhBSalLL+EiK3RLAsPJbyKHaX58DjJBaE=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBo8vT9tDEWWjD8RRzDB0vNgImJpbLT7tuO+oOBS uzK1l+0uy+JAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaPL0/QAKCRAgrS7GWxAs 4nkkEACEWEuXEcvgqoi4XwnApjOwsDHXnduvhCTDdU+pmx9HmrboSxoaI5D28RPz2AfUmPK5zB7 hDfx71bUCriEhR5qTQgJDk4Piu/zn7eihYvLt+WUGurMVKIFwMI8lM4+kHBqYfUuRgdRsFGHnQv r0hevEl/IjkOTYl+fei5dX/p8au3ubUuh9hS/nEr14sKTKBoH9TuPay+QokeHpNSwLaZAn/JzUA iYlXKHeDVnAzxB5bOrm8RYuceYSZV3XvAholWyLRAN6BibHUsXf34A25s6QRbytM96J6YV7TRyv m4dLH3ZSb8k0ISwxxrGqM3dFhgK3vh1+eRhCDmxri6IxRSAsA0KpmTmWCcfyoCGbojQ2k+qY40X dOhrAsFxshbiGwyl8k1N52kYzB8KrU2fD9S622k7uwdqHH6TrwGtC4Y2dXYl1xchmX79qMQkKeU 1HjtY6nCd0d1xdmKhqgZNRhfBY+Q0JxDlzbi5PQcW3lpo7ZsGZXIs14+7Z4cbIkBhU1ihykgDlM 3DM2mHot3dJC1i7D5nv4xc2LcUlvU717viRYgVVzkZ31n8k0EfOHxBGDIm2Ml57HN6Zh+7xRaFP uZm21tyWYH7reHPTCeN1tBYlNYnLgEHCKB5empnJn5HYdL8GUdszc9JgGSN4wMGsuy7xeRzGr3S RNSzEvEmIcDPEeQ== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 To allows the userspace to test many hardware configuration, introduce a new interface to configure the available color encoding per planes. VKMS supports multiple color encoding, so the userspace can choose any combination. The supported color encoding are configured by writing a color encoding bitmask to the file `supported_color_encoding` and the default color encoding is chosen by writing a color encoding bitmask to `default_color_encoding`. Signed-off-by: Louis Chauvet --- Documentation/gpu/vkms.rst | 7 ++- drivers/gpu/drm/vkms/vkms_configfs.c | 102 +++++++++++++++++++++++++++++++= ++++ 2 files changed, 108 insertions(+), 1 deletion(-) diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index a432968cc711..4ff75b53a386 100644 --- a/Documentation/gpu/vkms.rst +++ b/Documentation/gpu/vkms.rst @@ -87,7 +87,7 @@ Start by creating one or more planes:: =20 sudo mkdir /config/vkms/my-vkms/planes/plane0 =20 -Planes have 3 configurable attribute: +Planes have 5 configurable attribute: =20 - type: Plane type: 0 overlay, 1 primary, 2 cursor (same values as those exposed by the "type" property of a plane) @@ -96,6 +96,11 @@ Planes have 3 configurable attribute: (same values as those exposed by the "rotation" property of a plane) - default_rotation: Default rotation presented to the userspace, same valu= es as possible_rotations. +- supported_color_encoding: Available encoding for a plane, as a bitmask: + 0x01 YCBCR_BT601, 0x02: YCBCR_BT709, 0x04 YCBCR_BT2020 (same values as t= hose exposed + by the COLOR_ENCODING property of a plane) +- default_color_encoding: Default color encoding presented to the userspac= e, same + values as supported_color_encoding =20 Continue by creating one or more CRTCs:: =20 diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vk= ms_configfs.c index 450e45e66a45..a4e0e054cf2d 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -412,14 +412,116 @@ static ssize_t plane_default_rotation_store(struct c= onfig_item *item, return count; } =20 +static ssize_t plane_supported_color_encoding_show(struct config_item *ite= m, char *page) +{ + struct vkms_configfs_plane *plane; + unsigned int supported_color_encoding; + + plane =3D plane_item_to_vkms_configfs_plane(item); + + scoped_guard(mutex, &plane->dev->lock) { + supported_color_encoding =3D vkms_config_plane_get_supported_color_encod= ing(plane->config); + } + + return sprintf(page, "%u", supported_color_encoding); +} + +static ssize_t plane_supported_color_encoding_store(struct config_item *it= em, + const char *page, size_t count) +{ + struct vkms_configfs_plane *plane =3D plane_item_to_vkms_configfs_plane(i= tem); + int ret, val =3D 0; + + ret =3D kstrtouint(page, 10, &val); + if (ret) + return ret; + + /* Should be a supported value */ + if (val & ~(BIT(DRM_COLOR_YCBCR_BT601) | + BIT(DRM_COLOR_YCBCR_BT709) | + BIT(DRM_COLOR_YCBCR_BT2020))) + return -EINVAL; + /* Should at least provide one color range */ + if ((val & (BIT(DRM_COLOR_YCBCR_BT601) | + BIT(DRM_COLOR_YCBCR_BT709) | + BIT(DRM_COLOR_YCBCR_BT2020))) =3D=3D 0) + return -EINVAL; + + scoped_guard(mutex, &plane->dev->lock) { + /* Ensures that the default rotation is included in supported rotation */ + if (plane->dev->enabled || + (val & vkms_config_plane_get_default_color_encoding(plane->config)) = !=3D + vkms_config_plane_get_default_color_encoding(plane->config)) + return -EINVAL; + + vkms_config_plane_set_supported_color_encoding(plane->config, val); + } + + return count; +} + +/* Plane default_color_encoding : vkms//planes//default_col= or_encoding */ + +static ssize_t plane_default_color_encoding_show(struct config_item *item,= char *page) +{ + struct vkms_configfs_plane *plane; + unsigned int default_color_encoding; + + plane =3D plane_item_to_vkms_configfs_plane(item); + + scoped_guard(mutex, &plane->dev->lock) { + default_color_encoding =3D vkms_config_plane_get_default_color_encoding(= plane->config); + } + + return sprintf(page, "%u", default_color_encoding); +} + +static ssize_t plane_default_color_encoding_store(struct config_item *item, + const char *page, size_t count) +{ + struct vkms_configfs_plane *plane =3D plane_item_to_vkms_configfs_plane(i= tem); + int ret, val =3D 0; + + ret =3D kstrtouint(page, 10, &val); + if (ret) + return ret; + + /* Should be a supported value */ + if (val & ~(BIT(DRM_COLOR_YCBCR_BT601) | + BIT(DRM_COLOR_YCBCR_BT709) | + BIT(DRM_COLOR_YCBCR_BT2020))) + return -EINVAL; + /* Should at least provide one color range */ + if ((val & (BIT(DRM_COLOR_YCBCR_BT601) | + BIT(DRM_COLOR_YCBCR_BT709) | + BIT(DRM_COLOR_YCBCR_BT2020))) =3D=3D 0) + return -EINVAL; + + scoped_guard(mutex, &plane->dev->lock) { + /* Ensures that the default rotation is included in supported rotation */ + if (plane->dev->enabled || + (val & vkms_config_plane_get_supported_color_encoding(plane->config)= ) !=3D + val) + return -EINVAL; + + vkms_config_plane_set_default_color_encoding(plane->config, val); + } + + return count; +} + CONFIGFS_ATTR(plane_, type); CONFIGFS_ATTR(plane_, supported_rotations); CONFIGFS_ATTR(plane_, default_rotation); +CONFIGFS_ATTR(plane_, supported_color_encoding); +CONFIGFS_ATTR(plane_, default_color_encoding); =20 static struct configfs_attribute *plane_item_attrs[] =3D { &plane_attr_type, &plane_attr_supported_rotations, &plane_attr_default_rotation, + &plane_attr_supported_color_encoding, + &plane_attr_default_color_encoding, NULL, }; =20 --=20 2.51.0 From nobody Sun Feb 8 08:48:25 2026 Received: from smtpout-04.galae.net (smtpout-04.galae.net [185.171.202.116]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B5725227EB9 for ; Sat, 18 Oct 2025 02:02:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752928; cv=none; b=qOx1rdrZyil8JvjDP0oesriUYC3NreH9BSP9Rnx3A0sfD4hcUDuiLlZQl2yuql9tFI7pIUdNvlJzWyQ9G9FRk9d7fYL2+oiKDW46tlMWhrSdicqDLaTp0659uiTCy1qthVxv0cIPfZDWNVqB7t3S0X1xt8BrD1FLeG1E4cwwXoE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752928; c=relaxed/simple; bh=gfv2BQBOZAy9jJ2tfKGQ6nr7uZbAqBeZPxmntTqESvA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ARSYbm/1rKa816NnCTWNw0iYqSCbVHKwUnL91XiB4t0tZ79vwmbpCsbTq26+/XHh6T3NTFJCcxWq5Y1fvm3GVL56Hzs73e9EcAodBqPKOALGk7lmOsqcOdqnTGES+S83Lw1O12BFpIHajo/W1xKrLksAa2tSOuxNJym4X8JFzkM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=a87nOdCB; arc=none smtp.client-ip=185.171.202.116 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="a87nOdCB" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id E85A5C035A7; Sat, 18 Oct 2025 02:01:43 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 4867E60701; Sat, 18 Oct 2025 02:02:03 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id D2ABD102F236C; Sat, 18 Oct 2025 04:02:00 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1760752922; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=uC+LBZs8BYsUf6d367L33XjtRRfZ9EajiPX+Z3nZuU8=; b=a87nOdCBwF+OkvkmhaF5ZHzClJOYpUtPTMwuYxVbidu4D0QivN/uR+DdZKuKBiuBabkBqg o/PHs5dao2zHcN+sw3uS0M1GxqrAHbw0vlkFyHu5PCK5sYfFxXKsspUltdzcpr7Jb5PlRq +MLq7EIb6K/nykSKGab2sRrmqSDWCKgHAfgCupvaFgWC9lfnhs8CCpi/RQHeO7G+ze9qxd LN7zmZYfO4h+TogX1L/HjfB95J0wTl7tQE4nNDc4+1JAoYFk6GOtw/i6dIARpd6wQR5/qk gIU+MbN8vhrveVSVchgeMtWjyFKuJL5MXlkeUr1j95E7QTnMn8oHlcKX7gwahA== From: Louis Chauvet Date: Sat, 18 Oct 2025 04:01:07 +0200 Subject: [PATCH 07/22] drm/vkms: Introduce config for plane color range Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251018-vkms-all-config-v1-7-a7760755d92d@bootlin.com> References: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> In-Reply-To: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=5199; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=gfv2BQBOZAy9jJ2tfKGQ6nr7uZbAqBeZPxmntTqESvA=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBo8vT9TiOfgRfGFzig74lsDu958RZAJa404WQzT +WBpy5/bLSJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaPL0/QAKCRAgrS7GWxAs 4mk7D/sFRUh1GqjzPqh4AOA8J0szuIjCKdZqorsi5U+GxtoXRWZEx1P1QS2TzZ7gxnvrqh776eY HO261zPgqFycG05Jbp/y+AFMrtK64/VEnUejD5XINfX8q0Yggds+ssRkir6HLu6wq1F/9dSJAOE w3HPRR0AgyVESLj8VuekQRD+baYuNZw/qeYvMKVCxjYuT21mFlSC9H0nIiw5pOqz2ZLcYDFrhUx IkdA/0q9bXeT36NU9jiIQ652HGdD26wPuk5yMopg3LgwyP0feYh4xVSDeMtPzvxjjYxJixvxAEF 29FemDNV8Xw+UpfsphtFWdZzZruQBlFMwjlG+r25aa+Cs66rSXhMeTlTj2z4xABh/OHKpmPDpwh 5KlIMKUhz3cqreheVhX/ZXtOOMisCodBlaUbRQxXQdLlHUMh/dRN16qTCTz+jvJTrINk3IPuSYh /7lCfm1zghngBfFSvoTi8sf4WY2GtfKQXdvlyGTk2smAmVJ83xMTTx3T+6nL5IBFUahx8BJgR+U WfW3HQGHlTkl30Tk+ha/REhsK0JgMQn6Q7vDaXj3gQ6QBrVNB4Gn7pJ7xxtps2wfcfBuVqsTXMk wuk3JYe7o1eN0T74v2H4Mx8pZrghE8jLc1UZdqlyMTbOjhMToD+7ysQBYmYozo0jP3nY/pCNLA4 cV8YAqtvbB4QVMA== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 VKMS driver supports all the color range on planes, but for testing it can be useful to only advertise few of them. This new configuration interface will allow configuring the color range per planes. Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/vkms_config.c | 14 ++++++++++++++ drivers/gpu/drm/vkms/vkms_config.h | 30 ++++++++++++++++++++++++++++++ drivers/gpu/drm/vkms/vkms_plane.c | 5 ++--- 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index 5353719a476d..8f00ca21ed6e 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -163,6 +163,13 @@ static bool valid_plane_properties(const struct vkms_c= onfig *config) drm_info(dev, "Configured default color encoding is not supported by th= e plane\n"); return false; } + + if ((BIT(vkms_config_plane_get_default_color_range(plane_cfg)) & + vkms_config_plane_get_supported_color_range(plane_cfg)) !=3D + BIT(vkms_config_plane_get_default_color_range(plane_cfg))) { + drm_info(dev, "Configured default color range is not supported by the p= lane\n"); + return false; + } } return true; } @@ -386,6 +393,10 @@ static int vkms_config_show(struct seq_file *m, void *= data) vkms_config_plane_get_supported_color_encoding(plane_cfg)); seq_printf(m, "\tdefault color encoding: %d\n", vkms_config_plane_get_default_color_encoding(plane_cfg)); + seq_printf(m, "\tsupported color range: 0x%x\n", + vkms_config_plane_get_supported_color_range(plane_cfg)); + seq_printf(m, "\tdefault color range: %d\n", + vkms_config_plane_get_default_color_range(plane_cfg)); } =20 vkms_config_for_each_crtc(vkmsdev->config, crtc_cfg) { @@ -433,6 +444,9 @@ struct vkms_config_plane *vkms_config_create_plane(stru= ct vkms_config *config) BIT(DRM_COLOR_YCBCR_BT709) | BIT(DRM_COLOR_YCBCR_BT2020)); vkms_config_plane_set_default_color_encoding(plane_cfg, DRM_COLOR_YCBCR_B= T601); + vkms_config_plane_set_supported_color_range(plane_cfg, BIT(DRM_COLOR_YCBC= R_LIMITED_RANGE) | + BIT(DRM_COLOR_YCBCR_FULL_RANGE)); + vkms_config_plane_set_default_color_range(plane_cfg, DRM_COLOR_YCBCR_FULL= _RANGE); =20 xa_init_flags(&plane_cfg->possible_crtcs, XA_FLAGS_ALLOC); =20 diff --git a/drivers/gpu/drm/vkms/vkms_config.h b/drivers/gpu/drm/vkms/vkms= _config.h index 11160c3c13bc..8127e12f00dc 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -47,6 +47,8 @@ struct vkms_config { * must be managed by other means. * @default_color_encoding: Default color encoding that should be used by = this plane * @supported_color_encoding: Color encoding that this plane will support + * @default_color_range: Default color range that should be used by this p= lane + * @supported_color_range: Color range that this plane will support */ struct vkms_config_plane { struct list_head link; @@ -58,6 +60,8 @@ struct vkms_config_plane { unsigned int supported_rotations; enum drm_color_encoding default_color_encoding; unsigned int supported_color_encoding; + enum drm_color_range default_color_range; + unsigned int supported_color_range; struct xarray possible_crtcs; =20 /* Internal usage */ @@ -374,6 +378,32 @@ vkms_config_plane_set_supported_color_encoding(struct = vkms_config_plane *plane_c plane_cfg->supported_color_encoding =3D supported_color_encoding; } =20 +static inline enum drm_color_range +vkms_config_plane_get_default_color_range(struct vkms_config_plane *plane_= cfg) +{ + return plane_cfg->default_color_range; +} + +static inline void +vkms_config_plane_set_default_color_range(struct vkms_config_plane *plane_= cfg, + enum drm_color_range default_color_range) +{ + plane_cfg->default_color_range =3D default_color_range; +} + +static inline unsigned int +vkms_config_plane_get_supported_color_range(struct vkms_config_plane *plan= e_cfg) +{ + return plane_cfg->supported_color_range; +} + +static inline void +vkms_config_plane_set_supported_color_range(struct vkms_config_plane *plan= e_cfg, + unsigned int supported_color_range) +{ + plane_cfg->supported_color_range =3D supported_color_range; +} + /** * vkms_config_plane_set_name() - Set the plane name * @plane_cfg: Plane to set the name to diff --git a/drivers/gpu/drm/vkms/vkms_plane.c b/drivers/gpu/drm/vkms/vkms_= plane.c index 5869000415e4..ab719da2ca0b 100644 --- a/drivers/gpu/drm/vkms/vkms_plane.c +++ b/drivers/gpu/drm/vkms/vkms_plane.c @@ -240,10 +240,9 @@ struct vkms_plane *vkms_plane_init(struct vkms_device = *vkmsdev, =20 drm_plane_create_color_properties(&plane->base, vkms_config_plane_get_supported_color_encoding(config), - BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) | - BIT(DRM_COLOR_YCBCR_FULL_RANGE), + vkms_config_plane_get_supported_color_range(config), vkms_config_plane_get_default_color_encoding(config), - DRM_COLOR_YCBCR_FULL_RANGE); + vkms_config_plane_get_default_color_range(config)); =20 return plane; } --=20 2.51.0 From nobody Sun Feb 8 08:48:25 2026 Received: from smtpout-04.galae.net (smtpout-04.galae.net [185.171.202.116]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2C39022A4F6; Sat, 18 Oct 2025 02:02:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752930; cv=none; b=BYq4tfKaxSI+yXpi8YhbimzgH9He5PjqbJ5l4yR2J5qgcp4yi4UvPzubY1Ma1/vkU1MUKzJaPPD0aLvIsc+9N2rlBzyN7jMjWesWrlYmGDm96GjqotPv7L8vZs+lZ5GqREcG4nwuETHB5Z3r7bGzzR4jQRQUZ5CT9d5b1RM4ywY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752930; c=relaxed/simple; bh=/b9xPd8YaiacLRDm2YN6LLTzKy1Exvm8U/k97YcQ6S4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=XAUhyaBmf1foB/UCRgbEF8O16eBWebs9ck5KVh3C+4pVvO4PujDepYOv0dZ+/vrVCOLWFVmxb0XQKijZfk3AbN0rH/u4raWtG1SrfyrowfgdHHLdl1IE1asqPPk3PUVBHaqdnPm0H9EMnjmBl5qBSpCG7m0MtsImhBHmBfiLeZk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=MG8XqxBb; arc=none smtp.client-ip=185.171.202.116 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="MG8XqxBb" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 0CE86C041FD; Sat, 18 Oct 2025 02:01:47 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 62B3960701; Sat, 18 Oct 2025 02:02:06 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 18902102F2374; Sat, 18 Oct 2025 04:02:02 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1760752925; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=mUC/vEkoGcXyZ75OJMbMdVS3GQepVe8NXgqtCKnbu8s=; b=MG8XqxBbhtzHtKE3Rbi7qq92o7l6lKRDN39PwNMFxjRFESoMQCz/GOwFG4qv19c7P+IwHA XkWTJnC8noJ3S0A1E/bodsAjDj86Dmf9NQMnvchss2eSyuRWTK82mPgtWcy7ZDaShYI91V MYJ66O/RWQf2rJHCOWH2EwYRAhJVv12rU6mrSn+ltWBkzSfs3Kn3fb+gqj0MmxURzBc84z u1etgs0UmQETn6oJbh9QfNWAS4REcKi39vgw0SSloJr0huj50o9BnbwByb62f3T2iPOTCb KJi4fMM02ZJ8J5IkrJNtK2uNkhP6+4vVCkHqK+XeqDoFRSFMtmR4Mkz0e4mUmw== From: Louis Chauvet Date: Sat, 18 Oct 2025 04:01:08 +0200 Subject: [PATCH 08/22] drm/vkms: Introduce configfs for plane color range Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251018-vkms-all-config-v1-8-a7760755d92d@bootlin.com> References: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> In-Reply-To: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=5887; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=/b9xPd8YaiacLRDm2YN6LLTzKy1Exvm8U/k97YcQ6S4=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBo8vT9Q5gxuxkfUXK1xhgoVTs0uZ/MGBCv8tX0c La3ktFmyiOJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaPL0/QAKCRAgrS7GWxAs 4gVxD/9clV2LbSo3hSWwXpfE0TS9smFi5xG4lS7M/QE9lwhC7YW8vy+T3PMJvZIS1QB67u2eSl2 KcIzxdqN3qPl25/Fz+5eVy2HApKpEF3LoO4gnbeAO6j6gAWAWT0aXkVhDdhFivhyz/1880iFKnR CHavexbpc3lW9gGV6ag2zOFPcDLUzy/8nYeLh202t4DuFv/dYJCLoadZvxCsC9s1bGjVeiA+sos ggO0TK5czcfH5oCfy18NgwFwygV8FNLXSGboPqZHbLSoup8VjfN8vytcUxvJf5yck3V08BxSbO2 Qhafposo9X2PecE0FKwgsBihC33UeplYyFbEUhRoHw25Tn/h9GSD3s4LWcQl4oUEl8sLEvMXwrf jgEsorWE+9MGMuS4iJBHHbDUX4WxxLdYBLOyebk34rssS1l4UjaM9vLzknwCbQx2Wvl4+gNBTyz VF0Qd5UB4v4AnZyCPR+51PSEHuE8nWURE13AgPWbvMJoVPxn+drXSMEciTWfNaGhiGh0QZLC5rQ yQ0OVKqYK4WGYFJWPcD+C2L03ngpd6Di+bMs2WJe/5A5vQq3piE8zUcFQekMyS6+83Iw85upI5A 6rOsd5upPxYCvtDnxuCXp0+54FaL80mhc+SKjRsen28Os4b3CfeCCSycAARNsDrQk1pqTHOCadZ p0SZ3ha6w3XdqFA== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 To allows the userspace to test many hardware configuration, introduce a new interface to configure the available color ranges per planes. VKMS supports multiple color ranges, so the userspace can choose any combination. The supported color ranges are configured by writing a color range bitmask to the file `supported_color_ranges` and the default color range is chosen by writing a color encoding bitmask to `default_color_range`. Signed-off-by: Louis Chauvet --- Documentation/gpu/vkms.rst | 7 ++- drivers/gpu/drm/vkms/vkms_configfs.c | 93 ++++++++++++++++++++++++++++++++= ++++ 2 files changed, 99 insertions(+), 1 deletion(-) diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index 4ff75b53a386..979f8a545498 100644 --- a/Documentation/gpu/vkms.rst +++ b/Documentation/gpu/vkms.rst @@ -87,7 +87,7 @@ Start by creating one or more planes:: =20 sudo mkdir /config/vkms/my-vkms/planes/plane0 =20 -Planes have 5 configurable attribute: +Planes have 7 configurable attribute: =20 - type: Plane type: 0 overlay, 1 primary, 2 cursor (same values as those exposed by the "type" property of a plane) @@ -101,6 +101,11 @@ Planes have 5 configurable attribute: by the COLOR_ENCODING property of a plane) - default_color_encoding: Default color encoding presented to the userspac= e, same values as supported_color_encoding +- supported_color_range: Available color range for a plane, as a bitmask: + 0x1 DRM_COLOR_YCBCR_LIMITED_RANGE, 0x2 DRM_COLOR_YCBCR_FULL_RANGE (same = values as + those exposed by the COLOR_RANGE property of a plane) +- default_color_range: Default color range presented to the userspace, same + values as supported_color_range =20 Continue by creating one or more CRTCs:: =20 diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vk= ms_configfs.c index a4e0e054cf2d..0b280c73b0cc 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -412,6 +412,95 @@ static ssize_t plane_default_rotation_store(struct con= fig_item *item, return count; } =20 +static ssize_t plane_supported_color_range_show(struct config_item *item, = char *page) +{ + struct vkms_configfs_plane *plane; + unsigned int supported_color_range; + + plane =3D plane_item_to_vkms_configfs_plane(item); + + scoped_guard(mutex, &plane->dev->lock) { + supported_color_range =3D vkms_config_plane_get_supported_color_range(pl= ane->config); + } + + return sprintf(page, "%u", supported_color_range); +} + +static ssize_t plane_supported_color_range_store(struct config_item *item, + const char *page, size_t count) +{ + struct vkms_configfs_plane *plane =3D plane_item_to_vkms_configfs_plane(i= tem); + int ret, val =3D 0; + + ret =3D kstrtouint(page, 10, &val); + if (ret) + return ret; + + /* Should be a supported value */ + if (val & ~(BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) | + BIT(DRM_COLOR_YCBCR_FULL_RANGE))) + return -EINVAL; + /* Should at least provide one color range */ + if ((val & (BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) | + BIT(DRM_COLOR_YCBCR_FULL_RANGE))) =3D=3D 0) + return -EINVAL; + + scoped_guard(mutex, &plane->dev->lock) { + /* Ensures that the default rotation is included in supported rotation */ + if (plane->dev->enabled || + (val & vkms_config_plane_get_default_color_range(plane->config)) != =3D + vkms_config_plane_get_default_color_range(plane->config)) + return -EINVAL; + vkms_config_plane_set_supported_color_range(plane->config, val); + } + + return count; +} + +static ssize_t plane_default_color_range_show(struct config_item *item, ch= ar *page) +{ + struct vkms_configfs_plane *plane; + unsigned int default_color_range; + + plane =3D plane_item_to_vkms_configfs_plane(item); + + scoped_guard(mutex, &plane->dev->lock) + default_color_range =3D vkms_config_plane_get_default_color_range(plane-= >config); + + return sprintf(page, "%u", default_color_range); +} + +static ssize_t plane_default_color_range_store(struct config_item *item, + const char *page, size_t count) +{ + struct vkms_configfs_plane *plane =3D plane_item_to_vkms_configfs_plane(i= tem); + int ret, val =3D 0; + + ret =3D kstrtouint(page, 10, &val); + if (ret) + return ret; + + /* Should be a supported value */ + if (val & ~(BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) | + BIT(DRM_COLOR_YCBCR_FULL_RANGE))) + return -EINVAL; + /* Should at least provide one color range */ + if ((val & (BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) | + BIT(DRM_COLOR_YCBCR_FULL_RANGE))) =3D=3D 0) + return -EINVAL; + + scoped_guard(mutex, &plane->dev->lock) { + /* Ensures that the default rotation is included in supported rotation */ + if (plane->dev->enabled || + (val & vkms_config_plane_get_supported_color_range(plane->config)) != =3D + val) + return -EINVAL; + vkms_config_plane_set_default_color_range(plane->config, val); + } + + return count; +} + static ssize_t plane_supported_color_encoding_show(struct config_item *ite= m, char *page) { struct vkms_configfs_plane *plane; @@ -513,6 +602,8 @@ static ssize_t plane_default_color_encoding_store(struc= t config_item *item, CONFIGFS_ATTR(plane_, type); CONFIGFS_ATTR(plane_, supported_rotations); CONFIGFS_ATTR(plane_, default_rotation); +CONFIGFS_ATTR(plane_, supported_color_range); +CONFIGFS_ATTR(plane_, default_color_range); CONFIGFS_ATTR(plane_, supported_color_encoding); CONFIGFS_ATTR(plane_, default_color_encoding); =20 @@ -520,6 +611,8 @@ static struct configfs_attribute *plane_item_attrs[] = =3D { &plane_attr_type, &plane_attr_supported_rotations, &plane_attr_default_rotation, + &plane_attr_supported_color_range, + &plane_attr_default_color_range, &plane_attr_supported_color_encoding, &plane_attr_default_color_encoding, NULL, --=20 2.51.0 From nobody Sun Feb 8 08:48:25 2026 Received: from smtpout-04.galae.net (smtpout-04.galae.net [185.171.202.116]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 43B4922E004 for ; Sat, 18 Oct 2025 02:02:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752932; cv=none; b=JO+VvIKq4CMZeRmFXK2V4ybkJlMbSX/oIHm5HyKGZzEE6nLgCXOWquHmuHNc63827EWQVZXXw/36B+13ERmbHg3+LEUOeze9qxyGVBHvOLX/x9NPb0uwSJeGKDX90GHYj6VdwptfG5DMfMo5y4P3//8nfG/nyqJ5t/4VwK/qerk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752932; c=relaxed/simple; bh=x5UcdtPSeHv8EtJLCVPWtV+JLqf6qMO+6bUS9mui3fo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=L8ZVzRL3PFsPu4sM7fZU4l7cTInHoohNeH1NdqV7+58k7utOZKlwXol6SexvykoIhSg1quNCPJp4bKnC8irDlXbReNbwV5SlLn/iKVZD64iQZ8hn7h59XcJhleeXvIZ2NAAO2b3jhLbsJF9QpTlHziofYmhBYPE8fY77lapJjN8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=kmKPl6GO; arc=none smtp.client-ip=185.171.202.116 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="kmKPl6GO" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 87A4CC035A7; Sat, 18 Oct 2025 02:01:49 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id DCF4A60701; Sat, 18 Oct 2025 02:02:08 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id EA8A8102F236C; Sat, 18 Oct 2025 04:02:05 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1760752927; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=pJyOUxsJdvV2xhwBg531OEd5ACjsjyJphAUTsaQMRVg=; b=kmKPl6GO27HANwd9eQD3Eg9BzNVt86qcxYZUItjYx09hqZLcKX+xNrOMbsRff1awt3rQAj xbtUL+sJP3+wCEpcQma9M3I/pXoNe/koRbqXyyCfIa5Zz4CDvXgJ5FjdUj7gQOzOgEuqjM JvFJd0jmgwqg8MXLZU7KvivJekcc4bS7Oska+wUZ57eUvsdkcG1It9Lcxh5hHcVZ4zPaeB AjTZiluRVP8zM1YBQQk1g01Ou9xru8T5YaQZe/y9wRmCeW/1R47Xx50KbVaTplK9V3slG1 fDw4Iahv3QWCphM6ACUbf3EnMrlPUG0AH2cBjN7bX5a7pQrOGZgc/DyfFm2Bfg== From: Louis Chauvet Date: Sat, 18 Oct 2025 04:01:09 +0200 Subject: [PATCH 09/22] drm/vkms: Introduce config for plane format Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251018-vkms-all-config-v1-9-a7760755d92d@bootlin.com> References: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> In-Reply-To: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=8463; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=x5UcdtPSeHv8EtJLCVPWtV+JLqf6qMO+6bUS9mui3fo=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBo8vT+7l0GfVXF6pn9pHryMPiulJanIItnFuOE6 lyNG7wd2q+JAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaPL0/gAKCRAgrS7GWxAs 4lOXD/41He5uDPKRAmSQvYtlzDvsul4GV+SQ9rEIIuWF9y57MgBa9fIgpSC4+NRs3lg5pWRCI4Y yMy3MDudup45Glz2O4zHGSW+FmtjV8d30Agl/nFTNOVOyh2ZjMV9ltk+vzd3rd9qOt09VDFx11B wITIohPzANtV49prJbIsXmZLPM6tLeoPYXBCWiaFzVwzEyw6Aj74RBDNDzE2hXX1MkYFE+/jvvo /LoTzqTDsxxy+BPKlxsWVFt1kWox0Ot9Irur2xRScH/nlnXP4L9hB/YtHJwxsGlsTKWsTdNtaoY Ufw73BHwXYakyeUM76sGEuWlsAfi518xrxz/8Gy9hmHpERbLLPQv4Q+3C/oqAbfJ6REXcJGiSeV j2zA5vqI0SPmfnYSaopTr+4Hb2p3MmInr68Hk1Vm5BFgjUVX5s8ACVQLkB/gVQ/n6NfV4QhsmtE XvgDTDzkKfpgKdHmB+j3iQ2YXM5c62FO8aAkbxpr/q0V4QTUoHi5lEvV/xuL+C94DRx1y9J4Kdi TfqsENWNKhFfFAWw9LhQBsbxoBs9th6UQy7dm3Bg+nlgfPw5YsNR2L1dXfXgVMcEkHy6UvyRwmH xteXj3gpA8b4Y09hHtRlcRi6vYV7pIh+vwMNcjGVKlDubBu5v7jIs6pYEmCOjzpFwNPiHNBtOtU 76Rli0mhCJfhOfg== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 VKMS driver supports all the pixel formats for planes, but for testing it can be useful to only advertise few of them. This new configuration interface will allow configuring the pixel format per planes. Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/vkms_config.c | 99 ++++++++++++++++++++++++++++++++++= ++++ drivers/gpu/drm/vkms/vkms_config.h | 49 +++++++++++++++++++ drivers/gpu/drm/vkms/vkms_plane.c | 39 +-------------- 3 files changed, 150 insertions(+), 37 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index 8f00ca21ed6e..0b975a0d47aa 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -8,6 +8,42 @@ =20 #include "vkms_config.h" =20 +static const u32 vkms_supported_plane_formats[] =3D { + DRM_FORMAT_ARGB8888, + DRM_FORMAT_ABGR8888, + DRM_FORMAT_BGRA8888, + DRM_FORMAT_RGBA8888, + DRM_FORMAT_XRGB8888, + DRM_FORMAT_XBGR8888, + DRM_FORMAT_RGB888, + DRM_FORMAT_BGR888, + DRM_FORMAT_XRGB16161616, + DRM_FORMAT_XBGR16161616, + DRM_FORMAT_ARGB16161616, + DRM_FORMAT_ABGR16161616, + DRM_FORMAT_RGB565, + DRM_FORMAT_BGR565, + DRM_FORMAT_NV12, + DRM_FORMAT_NV16, + DRM_FORMAT_NV24, + DRM_FORMAT_NV21, + DRM_FORMAT_NV61, + DRM_FORMAT_NV42, + DRM_FORMAT_YUV420, + DRM_FORMAT_YUV422, + DRM_FORMAT_YUV444, + DRM_FORMAT_YVU420, + DRM_FORMAT_YVU422, + DRM_FORMAT_YVU444, + DRM_FORMAT_P010, + DRM_FORMAT_P012, + DRM_FORMAT_P016, + DRM_FORMAT_R1, + DRM_FORMAT_R2, + DRM_FORMAT_R4, + DRM_FORMAT_R8, +}; + struct vkms_config *vkms_config_create(const char *dev_name) { struct vkms_config *config; @@ -435,6 +471,11 @@ struct vkms_config_plane *vkms_config_create_plane(str= uct vkms_config *config) if (!plane_cfg) return ERR_PTR(-ENOMEM); =20 + if (vkms_config_plane_add_all_formats(plane_cfg)) { + kfree(plane_cfg); + return ERR_PTR(-ENOMEM); + } + plane_cfg->config =3D config; vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_OVERLAY); vkms_config_plane_set_name(plane_cfg, NULL); @@ -563,6 +604,64 @@ static struct vkms_config_plane *vkms_config_crtc_get_= plane(const struct vkms_co return NULL; } =20 +int __must_check vkms_config_plane_add_all_formats(struct vkms_config_plan= e *plane_cfg) +{ + u32 *ret =3D krealloc_array(plane_cfg->supported_formats, + ARRAY_SIZE(vkms_supported_plane_formats), + sizeof(uint32_t), GFP_KERNEL); + if (!ret) + return -ENOMEM; + plane_cfg->supported_formats =3D ret; + + memcpy(plane_cfg->supported_formats, vkms_supported_plane_formats, + sizeof(vkms_supported_plane_formats)); + plane_cfg->supported_formats_count =3D ARRAY_SIZE(vkms_supported_plane_fo= rmats); + return 0; +} + +int __must_check vkms_config_plane_add_format(struct vkms_config_plane *pl= ane_cfg, u32 drm_format) +{ + bool found =3D false; + + for (int i =3D 0; i < ARRAY_SIZE(vkms_supported_plane_formats); i++) { + if (vkms_supported_plane_formats[i] =3D=3D drm_format) + found =3D true; + } + + if (!found) + return -EINVAL; + for (unsigned int i =3D 0; i < plane_cfg->supported_formats_count; i++) { + if (plane_cfg->supported_formats[i] =3D=3D drm_format) + return 0; + } + u32 *new_ptr =3D krealloc_array(plane_cfg->supported_formats, + plane_cfg->supported_formats_count + 1, + sizeof(*plane_cfg->supported_formats), GFP_KERNEL); + if (!new_ptr) + return -ENOMEM; + + plane_cfg->supported_formats =3D new_ptr; + plane_cfg->supported_formats[plane_cfg->supported_formats_count] =3D drm_= format; + plane_cfg->supported_formats_count++; + + return 0; +} + +void vkms_config_plane_remove_all_formats(struct vkms_config_plane *plane_= cfg) +{ + plane_cfg->supported_formats_count =3D 0; +} + +void vkms_config_plane_remove_format(struct vkms_config_plane *plane_cfg, = u32 drm_format) +{ + for (unsigned int i =3D 0; i < plane_cfg->supported_formats_count; i++) { + if (plane_cfg->supported_formats[i] =3D=3D drm_format) { + plane_cfg->supported_formats[i] =3D plane_cfg->supported_formats[plane_= cfg->supported_formats_count - 1]; + plane_cfg->supported_formats_count--; + } + } +} + struct vkms_config_plane *vkms_config_crtc_primary_plane(const struct vkms= _config *config, struct vkms_config_crtc *crtc_cfg) { diff --git a/drivers/gpu/drm/vkms/vkms_config.h b/drivers/gpu/drm/vkms/vkms= _config.h index 8127e12f00dc..0b7067508e5f 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -62,6 +62,8 @@ struct vkms_config_plane { unsigned int supported_color_encoding; enum drm_color_range default_color_range; unsigned int supported_color_range; + u32 *supported_formats; + unsigned int supported_formats_count; struct xarray possible_crtcs; =20 /* Internal usage */ @@ -404,6 +406,53 @@ vkms_config_plane_set_supported_color_range(struct vkm= s_config_plane *plane_cfg, plane_cfg->supported_color_range =3D supported_color_range; } =20 +static inline u32 * +vkms_config_plane_get_supported_formats(struct vkms_config_plane *plane_cf= g) +{ + return plane_cfg->supported_formats; +} + +static inline unsigned int +vkms_config_plane_get_supported_formats_count(struct vkms_config_plane *pl= ane_cfg) +{ + return plane_cfg->supported_formats_count; +} + +/** vkms_config_plane_add_format - Add a format to the list of supported f= ormat of a plane + * + * The passed drm_format can already be present in the list. This may fail= if the allocation of a + * bigger array fails. + * + * @plane_cfg: Plane to add the format to + * @drm_format: Format to add to this plane + * + * Returns: 0 on success, -ENOMEM if array allocation fails, -EINVAL if th= e format is not supported + * by VKMS + */ +int __must_check vkms_config_plane_add_format(struct vkms_config_plane *pl= ane_cfg, u32 drm_format); + +/** + * vkms_config_plane_add_all_formats - Helper to quickly add all the suppo= rted formats + * @plane_cfg: Plane to add the formats to + * + * Returns: 0 on success, -ENOMEM if array allocation fails, -EINVAL if th= e format is not supported + * by VKMS + */ +int __must_check vkms_config_plane_add_all_formats(struct vkms_config_plan= e *plane_cfg); + +/** + * vkms_config_plane_remove_format - Remove a specific format from a plane + * @plane_cfg: Plane to remove the format to + * @drm_format: Format to remove + */ +void vkms_config_plane_remove_format(struct vkms_config_plane *plane_cfg, = u32 drm_format); + +/** + * vkms_config_plane_remove_all_formats - Remove all formast from a plane + * @plane_cfg: Plane to remove the formats from + */ +void vkms_config_plane_remove_all_formats(struct vkms_config_plane *plane_= cfg); + /** * vkms_config_plane_set_name() - Set the plane name * @plane_cfg: Plane to set the name to diff --git a/drivers/gpu/drm/vkms/vkms_plane.c b/drivers/gpu/drm/vkms/vkms_= plane.c index ab719da2ca0b..0414865915d8 100644 --- a/drivers/gpu/drm/vkms/vkms_plane.c +++ b/drivers/gpu/drm/vkms/vkms_plane.c @@ -14,42 +14,6 @@ #include "vkms_formats.h" #include "vkms_config.h" =20 -static const u32 vkms_formats[] =3D { - DRM_FORMAT_ARGB8888, - DRM_FORMAT_ABGR8888, - DRM_FORMAT_BGRA8888, - DRM_FORMAT_RGBA8888, - DRM_FORMAT_XRGB8888, - DRM_FORMAT_XBGR8888, - DRM_FORMAT_RGB888, - DRM_FORMAT_BGR888, - DRM_FORMAT_XRGB16161616, - DRM_FORMAT_XBGR16161616, - DRM_FORMAT_ARGB16161616, - DRM_FORMAT_ABGR16161616, - DRM_FORMAT_RGB565, - DRM_FORMAT_BGR565, - DRM_FORMAT_NV12, - DRM_FORMAT_NV16, - DRM_FORMAT_NV24, - DRM_FORMAT_NV21, - DRM_FORMAT_NV61, - DRM_FORMAT_NV42, - DRM_FORMAT_YUV420, - DRM_FORMAT_YUV422, - DRM_FORMAT_YUV444, - DRM_FORMAT_YVU420, - DRM_FORMAT_YVU422, - DRM_FORMAT_YVU444, - DRM_FORMAT_P010, - DRM_FORMAT_P012, - DRM_FORMAT_P016, - DRM_FORMAT_R1, - DRM_FORMAT_R2, - DRM_FORMAT_R4, - DRM_FORMAT_R8, -}; - static struct drm_plane_state * vkms_plane_duplicate_state(struct drm_plane *plane) { @@ -226,7 +190,8 @@ struct vkms_plane *vkms_plane_init(struct vkms_device *= vkmsdev, =20 plane =3D drmm_universal_plane_alloc(dev, struct vkms_plane, base, 0, &vkms_plane_funcs, - vkms_formats, ARRAY_SIZE(vkms_formats), + vkms_config_plane_get_supported_formats(config), + vkms_config_plane_get_supported_formats_count(config), NULL, vkms_config_plane_get_type(config), vkms_config_plane_get_name(config)); if (IS_ERR(plane)) --=20 2.51.0 From nobody Sun Feb 8 08:48:25 2026 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C15352144D7 for ; Sat, 18 Oct 2025 02:02:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752934; cv=none; b=bL8+o5t8nNwH1Jmm9KGaMvm8DiIHAjONhXO/Qwx/bc/GaXtkp0T6B0S1qnE6gq4MHF9Ch9fnsZ/JDM3dC7FJOjdoKuvZIknpvSLEwkflnuVx2xDOkSrmEB2ZwdP2D+l4DF2SWQ+VGnNg5WzyFfbj98vC8a7KlyE3wfs4WlALuhU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752934; c=relaxed/simple; bh=2mNbkLDFLzCOZFQ6ci6dI5H4l8UxAsXqJTQKymqgUTs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=hktI2KgqOcPrIxHZ5PQPoqBgeIALqpHcicn6IiXySITVQGCgF6h36dQuX9tMxYn31lNqE6neqQBa2IYVuVpLl8oW11ahFZA8hzZEzbih7NsIhtqS6TxtbCvOxodTKlNzTIMMcpW1xGltT2honPThlcQYjJ3F66lhZReC1Xj8NVI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=YS09XkyB; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="YS09XkyB" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 50EC31A14AA; Sat, 18 Oct 2025 02:02:11 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 2660960701; Sat, 18 Oct 2025 02:02:11 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 59F0E102F237F; Sat, 18 Oct 2025 04:02:07 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1760752930; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=6hPeezFEK8fFUjlqG2IDHzYvBSjLQwDfcFS+n/juJTY=; b=YS09XkyB68cPwVaPxsefZMB0FogT97D3R8wHmoWhfEKQXxlbCOJgQNuhvX/BZJPefR5r16 wlRdKoJF0nDCHygQ4EuujVBs3Xjnb3JO6DFnJq5zcN7jioD+pJhHg6mcwIKGxmndd+c2vE 4PTTYQ27q/khHJyz7KcnVSF1gILQYuPcmIl9ORc/Yt3FhgDEgNS0R0XlVKg4FBz3C/u3O+ 4FszEt6xlhohkhfuZ4Uo9VcmFpxcTOmDPA3c6nwzjUpC5GJJn80GYUIKNg3zy203eN4+uh z/O3dXTsAeHyR0bIZ+6tHs2DfMo+Uizcjz/QtKK2GERxo27bHm5NJTAUAfTmGw== From: Louis Chauvet Date: Sat, 18 Oct 2025 04:01:10 +0200 Subject: [PATCH 10/22] drm/vkms: Introduce configfs for plane format Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251018-vkms-all-config-v1-10-a7760755d92d@bootlin.com> References: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> In-Reply-To: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=5175; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=2mNbkLDFLzCOZFQ6ci6dI5H4l8UxAsXqJTQKymqgUTs=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBo8vT+I0II7TfpO7rU5VavNZfCeHY2NWiG5clr+ nqIqu6L2MiJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaPL0/gAKCRAgrS7GWxAs 4lK5D/9LQYak6q+u2zx53xekb9Fp4hX0sIKRYXeysmmMj4mJf+jOzTjRExvxPU/0d4ImoM17Mnb TLUcGqoN1tjUm8idcxEGIEzOGGZ6z0AuIqfa1JlF5mO/xdMLAnLSuQhm+QcVNLBgWC2cTB2hCeu yUYHwIfyxGwXTcFfcBAE7JB3QYnTpmMrFmvh8c4sabgPCVvVgbFQA2gr0nPXaWSXpriEAXq4f1z OcCaL0wWyBeLVpXjR8GBUcm8xmLiQDzKIrDKm1YaRxIyW1+VDgmrnXCvz8mzuCnpEzhgsPv6nrw TG5XfjSzuucEClJg1WASFSz/D+ULLgscSJZIdlwY2wguk1shF+A1P0e+MZNIxOLoxRDfuIHN3ih XMgpH1yI8zfKV0IlHhC/u6Zv/vPm4iksrDrbXvw71aJTZWmnP5gJrTTVhlzIRxvSS/ownG0IY9g qzp2qrN+JnLcbHd6v5r0XKpqqNBfN82ZoC4yDb5ZTuFcoOGoiXQC2ru63UMJfaGI0dZ4EES4ltT 58tL6iTIG1jEXuYLBYjfjmcBZae4VHzMPuvD49DfjNTUCJmTl9KHbeE/o8GZekgqka4cPEjcvMc 6kXo7fCmq8ZHCjhPEUZ70lVt3mS/qAR6OT2e5B7x9ZGZEXJIH6sjNeV0saEQOm94ZkTRlHuVBFF ci9iZkuEvrTT1Ig== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 To allow the userspace to test many hardware configuration, introduce a new interface to configure the available formats per planes. VKMS supports multiple formats, so the userspace can choose any combination. The supported formats are configured by writing the fourcc code in supported_formats: # enable AR24 format echo '+AR24' > /config/vkms/DEVICE_1/planes/PLANE_1/supported_formats # disable AR24 format echo '-AR24' > /config/vkms/DEVICE_1/planes/PLANE_1/supported_formats # enable all format supported by VKMS echo '+*' > /config/vkms/DEVICE_1/planes/PLANE_1/supported_formats # disable all formats echo '-*' > /config/vkms/DEVICE_1/planes/PLANE_1/supported_formats Signed-off-by: Louis Chauvet --- Documentation/gpu/vkms.rst | 7 ++- drivers/gpu/drm/vkms/vkms_configfs.c | 82 ++++++++++++++++++++++++++++++++= ++++ 2 files changed, 88 insertions(+), 1 deletion(-) diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index 979f8a545498..deb14e7c48ea 100644 --- a/Documentation/gpu/vkms.rst +++ b/Documentation/gpu/vkms.rst @@ -87,7 +87,7 @@ Start by creating one or more planes:: =20 sudo mkdir /config/vkms/my-vkms/planes/plane0 =20 -Planes have 7 configurable attribute: +Planes have 8 configurable attribute: =20 - type: Plane type: 0 overlay, 1 primary, 2 cursor (same values as those exposed by the "type" property of a plane) @@ -106,6 +106,11 @@ Planes have 7 configurable attribute: those exposed by the COLOR_RANGE property of a plane) - default_color_range: Default color range presented to the userspace, same values as supported_color_range +- supported_formats: List of supported formats for this plane. To add a ne= w item in the + list, write it using a plus its fourcc code: +XR24 + To remove a format, use a minus and its fourcc: -XR24 + To add all formats use +* + To remove all formats, use -* =20 Continue by creating one or more CRTCs:: =20 diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vk= ms_configfs.c index 0b280c73b0cc..528f22fa2df1 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -599,6 +599,86 @@ static ssize_t plane_default_color_encoding_store(stru= ct config_item *item, return count; } =20 +static ssize_t plane_supported_formats_show(struct config_item *item, char= *page) +{ + struct vkms_configfs_plane *plane; + + plane =3D plane_item_to_vkms_configfs_plane(item); + + page[0] =3D '\0'; + + scoped_guard(mutex, &plane->dev->lock) + { + u32 *formats =3D vkms_config_plane_get_supported_formats(plane->config); + + for (int i =3D 0; + i < vkms_config_plane_get_supported_formats_count(plane->config); + i++) { + char tmp[6] =3D { 0 }; + const ssize_t ret =3D snprintf(tmp, ARRAY_SIZE(tmp), "%.*s\n", + (int)sizeof(*formats), + (char *)&formats[i]); + if (ret < 0) + return ret; + /* + * Limitation of ConfigFS attributes, an attribute can't be bigger + * than PAGE_SIZE. This will crop the result if this plane support + * more than =E2=89=881000 formats. + */ + if (ret + strlen(page) > PAGE_SIZE - 1) + return -ENOMEM; + strncat(page, tmp, ARRAY_SIZE(tmp)); + } + } + + return strlen(page); +} + +static ssize_t plane_supported_formats_store(struct config_item *item, + const char *page, size_t count) +{ + struct vkms_configfs_plane *plane; + + plane =3D plane_item_to_vkms_configfs_plane(item); + int ret =3D 0; + int ptr =3D 0; + + scoped_guard(mutex, &plane->dev->lock) + { + while (ptr < count) { + char tmp[4] =3D { ' ', ' ', ' ', ' ' }; + + memcpy(tmp, &page[ptr + 1], min(sizeof(tmp), count - (ptr + 1))); + if (page[ptr] =3D=3D '+') { + if (tmp[0] =3D=3D '*') { + ret =3D vkms_config_plane_add_all_formats(plane->config); + if (ret) + return ret; + ptr +=3D 1; + } else { + ret =3D vkms_config_plane_add_format(plane->config, + *(int *)tmp); + if (ret) + return ret; + ptr +=3D 4; + } + } else if (page[ptr] =3D=3D '-') { + if (tmp[0] =3D=3D '*') { + vkms_config_plane_remove_all_formats(plane->config); + ptr +=3D 1; + } else { + vkms_config_plane_remove_format(plane->config, *(int *)tmp); + ptr +=3D 4; + } + } + /* Skip anything that is not a + or a - */ + ptr +=3D 1; + } + } + + return count; +} + CONFIGFS_ATTR(plane_, type); CONFIGFS_ATTR(plane_, supported_rotations); CONFIGFS_ATTR(plane_, default_rotation); @@ -606,6 +686,7 @@ CONFIGFS_ATTR(plane_, supported_color_range); CONFIGFS_ATTR(plane_, default_color_range); CONFIGFS_ATTR(plane_, supported_color_encoding); CONFIGFS_ATTR(plane_, default_color_encoding); +CONFIGFS_ATTR(plane_, supported_formats); =20 static struct configfs_attribute *plane_item_attrs[] =3D { &plane_attr_type, @@ -615,6 +696,7 @@ static struct configfs_attribute *plane_item_attrs[] = =3D { &plane_attr_default_color_range, &plane_attr_supported_color_encoding, &plane_attr_default_color_encoding, + &plane_attr_supported_formats, NULL, }; =20 --=20 2.51.0 From nobody Sun Feb 8 08:48:25 2026 Received: from smtpout-04.galae.net (smtpout-04.galae.net [185.171.202.116]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E083E23536C; Sat, 18 Oct 2025 02:02:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752936; cv=none; b=UAOhH2ATyuQ2lLJ2po1pC2RUw7WFsmqgStNCT0LVBFvJXhg/wWGxr2er2yroqoOjiToxAjOslEXTwgQkI8YT9CaL7H4TibzYMC38rh37APhDaygEppNCmFi8KBFESPmAOfSoJAmzW9QKBynfEz6b4TyUzX7sS8TuDWlGdF0Ib60= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752936; c=relaxed/simple; bh=rnZm7r0xEd9LrIvetwHGtyd26t99JexCbu1jReAcAkA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=OgW5P5wx763C+qWKh+q76+oenPR/p1ivwk/zWdvlEImFXuCDRV0N71Sxrt2gG/PSliyRjmtNF2cRIWMXU/iLeSXlbvYALLKgu410ii5c9bu7GNcrnhEzdLCx6Ab72JNhSJFBKQllYxDH5GcD5IppDO0MN7tLLqgcCyn5p7wLHR4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=G6PTXMbJ; arc=none smtp.client-ip=185.171.202.116 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="G6PTXMbJ" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 18F93C035A7; Sat, 18 Oct 2025 02:01:54 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 6EB9D60701; Sat, 18 Oct 2025 02:02:13 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id C4D10102F236F; Sat, 18 Oct 2025 04:02:10 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1760752932; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=wuzcvgdxKucfzXi8j9im5vi/vTJhBZGMa5n+dwDEVE8=; b=G6PTXMbJ2EaohODqgvnjVzWRhmqz/rtYZmiCb9ifBrVZxX4qToO8NttU3cVVLGoHzHc9e6 3btjYWvTZMxCUiLEToLnyBhnC7DHTzMBWbrDEazYoALYhYM0McJBwueWaa7IIsNvkfcnZI lnLbMONXzDJWBxdjn1rAFNP/E17J5NKIFVm+sViXiwRDIrIE5Z4fH02CHSyDaXk7SKMlUA xMXyjo6yFIVV35NrilWVFORS+0ogSBM464dJ7wPYDf12SlW1Y9U9q4VZNSElnoJdjzkWhY 0EuWlY8OKag9kIt55e9HYc9CO5F0xCnQRq5C8sQbLh0B4yR0bhArhKuzBffXJg== From: Louis Chauvet Date: Sat, 18 Oct 2025 04:01:11 +0200 Subject: [PATCH 11/22] drm/vkms: Properly render plane using their zpos Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251018-vkms-all-config-v1-11-a7760755d92d@bootlin.com> References: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> In-Reply-To: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1521; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=rnZm7r0xEd9LrIvetwHGtyd26t99JexCbu1jReAcAkA=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBo8vT+xoIue1CpAIt4T6KN7jou+Bm1RD5sZk06R Y9MqZmRzrGJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaPL0/gAKCRAgrS7GWxAs 4gswD/9uz11YdVk/AI3/365zjvg18lMdo4jHtEy8xMti9+hcxrUil51n1yf5iwXrhkIToD6zHf4 i/PAkjqr/R59R+btkABHQUm7fOmiVKzDLpmGXOsMBU5eXlm4g6KaPKLH/oUyd0Tax7cEaEJUJYh /y1JkEj1r32BYFJp2EaGl+tbX6B4FfabljJzeR2pG+1KJIrwH0U7t8s7t1WjelTSjd5DLF8/rYs rOrA5N7Svo4d1LYOhdOgySm+Mu8JghwH+bD6RlE6BeMEESNnUhhXHFI9BPic7l3/L2hZMbdl1xm Gv7KVU7hhqzRwn7iZSM2WLfk7T3XbpuA+YSIBN5DbvVcOru3fFl9aTwicRfiR+nAA6ezG8THBLR QUx27OZ287igzrR/0BPnJdSfE3Mjfh7P9I1qwGtaswrMeJIA+mWAoxr/cRkKezeQLe/L+LSBuJ1 YRHU5iiDFqWXAyAmnotVNVZBZGrjuxyXIsW2bP1Icq1y5KUg9KmmXY71kpxRcK4ynmbg54JvIR2 SAlyos/XtBMZbaxVTWcYL51ALTI/WSH68MwVbEEaMgwf3IMDOXsGxJy2x7asKcknsyntYJP6ou9 LYkkjTs4HYygNQhyurMd0DERmZ1FUAkEARbhYW/pA1WPIAJgMEYZJ0Cc3SsO6aML4YQRA1cKcq2 7B23EQ03kCe447Q== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Currently planes are rendered in creation order. This is not an issue, but with the introduction of new zpos configuration, it is required to properly render planes. Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/vkms_crtc.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c b/drivers/gpu/drm/vkms/vkms_c= rtc.c index bac0790c6577..0524c47460fb 100644 --- a/drivers/gpu/drm/vkms/vkms_crtc.c +++ b/drivers/gpu/drm/vkms/vkms_crtc.c @@ -4,6 +4,7 @@ =20 #include #include +#include #include #include #include @@ -141,14 +142,20 @@ static int vkms_crtc_atomic_check(struct drm_crtc *cr= tc, return -ENOMEM; vkms_state->num_active_planes =3D i; =20 - i =3D 0; + ret =3D drm_atomic_normalize_zpos(crtc->dev, state); + if (ret) + return ret; + drm_for_each_plane_mask(plane, crtc->dev, crtc_state->plane_mask) { plane_state =3D drm_atomic_get_new_plane_state(crtc_state->state, plane); =20 if (!plane_state->visible) continue; =20 - vkms_state->active_planes[i++] =3D + // Order planes according to their normalized_zpos + // After drm_atomic_normalize_zpos, the possible values are 0..n_planes-1 + // so store them using this index + vkms_state->active_planes[plane_state->normalized_zpos] =3D to_vkms_plane_state(plane_state); } =20 --=20 2.51.0 From nobody Sun Feb 8 08:48:25 2026 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1E53023BCF7; Sat, 18 Oct 2025 02:02:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752939; cv=none; b=XXSiUPEdEgHmr+eJ8ZoEZEj/ccWe2nVqvR9vhWYVHe14HQ01PCesvrii12vCfrsPFCKUe1LgklH91UpMyei/+hW7mVjbXroEJBBWGRv4q5k/lY7kN8Z5UwzRcgtsJD7z8AtK82NEAUXy4iIHYQrmC7bbW/rm30Uk78DuyySzqeY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752939; c=relaxed/simple; bh=3inMoYuFvz6b6Vnx0vhN2esmm+Crj3NEKedA0WYqm5w=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=EgSVc73a9BrocbtxkC7f6XN70f1zZlfwhcnFyCsk6DBjDQTkCJDPFohl0+H2DwkO1DrB6nBmBtH6DPJJJlkZ5OzqGjaM6Athpbgjqkfoyu/os7ByCYmZMQpt9Wpfo+UKTSrkXjDXP0FX5k829JkppCnFCMvwxdTCUNwlaZAHgM0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=hJUME3HW; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="hJUME3HW" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id B1E0B1A14AA; Sat, 18 Oct 2025 02:02:15 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 87FAD60701; Sat, 18 Oct 2025 02:02:15 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 2E5CA102F2374; Sat, 18 Oct 2025 04:02:12 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1760752934; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=uW/SzXAmiByxQbYpC030fldcG+6jHM28dCuK/8g5jw8=; b=hJUME3HW+gzWIB0I+xaK0Yot1xHfZTgVMwgFFOSOae87kewLEVR/bWuGW1pfdMV15QTYGC 9rpfAiQI9eQ4KPk00FPdNUU+S57bRYAl7MYraj5Wj9Ha8Y2r2F7eSAg13ylJZAG/lV+xcN LPH8yN7bxeOTgJKHbnc2iTxENJ0kkOUzIrNppaFzALwyNjQJ1+dA9Ss2LV0LmGWGKYZoEP G7JrhtC42K3n7lpSmwWV7Nb9TWLaM5PkaAXXU/GwdX501/BkcyKoXVVFwaC0Mnr0E7e5bE fMoPjXzUioe2ChM+OjXG4Ce8UFGkgJPQtmlwb+6T53MKaVQAfH5RCTRXwjkWJg== From: Louis Chauvet Date: Sat, 18 Oct 2025 04:01:12 +0200 Subject: [PATCH 12/22] drm/vkms: Introduce config for plane zpos property Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251018-vkms-all-config-v1-12-a7760755d92d@bootlin.com> References: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> In-Reply-To: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=9374; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=3inMoYuFvz6b6Vnx0vhN2esmm+Crj3NEKedA0WYqm5w=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBo8vT+e12Zu5eJQ6udRU0TtXxMauWwL/TMmlBZZ c6+/TmWvN6JAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaPL0/gAKCRAgrS7GWxAs 4hyjD/9TQjgvg1PyBqwrDwqrYiie/CNlH1FQ1KfPDPOMh6dTAKbDDoKeOVajjRww+RAi24dNkvy 0zBVbwXdnitlwN4k12kC0u+XRzADhilaASDqIu3a2BsfweZtztiTaeIq7CiFYLs4LwID304V497 gd7Vqn//bxllfLrrREDaM79SSUpsVO6QULlXzbyWvzoOfCXPZVukTLnfmw96LVhON1lJfeP4g1n 8bB+7aIMfuQKMs3eHBAKVDLc4HZFdZkadG2JIswL2Igq6eJ35kEwBu6+7Z3CWT1Gnh60cbt8Bkh c3PqlyzkTLKx2qQu0akDJCx+9jkSPvRSdNHHe423Z0PDF9DgfesKRA9dZIQDARmCd4HegMzMvaO zTCnac/cEA7DNUtl6woh9wWVQPVXdIcBt7dn421qpp7Qww8ZpsfvUnJQ2LNvuBNdb0HMl40tY5G wzAlq4FNN5r6mVR5VfQki/kpb/mcKE3d0iXXp52iizw7IA2kFuImxOyZI7Cate/0VyaZqBUMBii W7Z2Bvg8MpbvNyDZcQZq5VBXG1HUDS0Qyb6Ygn5BdDJrUCblS+U+1ZLtD/5cou9hWM1ZZo8PEfl YXvmjYyZDQwid8gxLJIq/YVdYc24ZRj4Ij+k7crE5+0gizdxG15DYOfKMRW9xhLZQWG7iQCTqG1 ATPQJgPREa9qaZg== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 VKMS can render plane in any order. Introduce the appropriate configuration. Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/tests/vkms_config_test.c | 3 + drivers/gpu/drm/vkms/vkms_config.c | 21 ++++ drivers/gpu/drm/vkms/vkms_config.h | 142 ++++++++++++++++++++++= ++++ drivers/gpu/drm/vkms/vkms_plane.c | 11 ++ 4 files changed, 177 insertions(+) diff --git a/drivers/gpu/drm/vkms/tests/vkms_config_test.c b/drivers/gpu/dr= m/vkms/tests/vkms_config_test.c index d75a6252e4d2..f2b38b436252 100644 --- a/drivers/gpu/drm/vkms/tests/vkms_config_test.c +++ b/drivers/gpu/drm/vkms/tests/vkms_config_test.c @@ -172,6 +172,9 @@ static void vkms_config_test_default_config(struct kuni= t *test) n_possible_crtcs++; } KUNIT_EXPECT_EQ(test, n_possible_crtcs, 1); + KUNIT_EXPECT_EQ(test, vkms_config_plane_get_zpos_enabled(plane_cfg), fal= se); + // No need to test the other zpos configurations as they are discarded if + // the zpos property is not created. } =20 /* Encoders */ diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index 0b975a0d47aa..5da34a3e8114 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -86,6 +86,7 @@ struct vkms_config *vkms_config_default_create(bool enabl= e_cursor, if (IS_ERR(plane_cfg)) goto err_alloc; vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_PRIMARY); + vkms_config_plane_set_zpos_enabled(plane_cfg, false); =20 crtc_cfg =3D vkms_config_create_crtc(config); if (IS_ERR(crtc_cfg)) @@ -103,6 +104,7 @@ struct vkms_config *vkms_config_default_create(bool ena= ble_cursor, =20 vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_OVERLAY); + vkms_config_plane_set_zpos_enabled(plane_cfg, false); =20 if (vkms_config_plane_attach_crtc(plane_cfg, crtc_cfg)) goto err_alloc; @@ -115,6 +117,7 @@ struct vkms_config *vkms_config_default_create(bool ena= ble_cursor, goto err_alloc; =20 vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_CURSOR); + vkms_config_plane_set_zpos_enabled(plane_cfg, false); =20 if (vkms_config_plane_attach_crtc(plane_cfg, crtc_cfg)) goto err_alloc; @@ -206,6 +209,24 @@ static bool valid_plane_properties(const struct vkms_c= onfig *config) drm_info(dev, "Configured default color range is not supported by the p= lane\n"); return false; } + if (vkms_config_plane_get_zpos_initial(plane_cfg) > + vkms_config_plane_get_zpos_max(plane_cfg)) { + drm_info(dev, "Configured initial zpos value bigger than zpos max\n"); + return false; + } + + if (vkms_config_plane_get_zpos_max(plane_cfg) < + vkms_config_plane_get_zpos_min(plane_cfg)) { + drm_info(dev, "Configured zpos max value smaller than zpos min\n"); + return false; + } + + if (vkms_config_plane_get_zpos_initial(plane_cfg) < + vkms_config_plane_get_zpos_min(plane_cfg)) { + drm_info(dev, "Configured initial zpos value smaller than zpos min\n"); + return false; + } + } return true; } diff --git a/drivers/gpu/drm/vkms/vkms_config.h b/drivers/gpu/drm/vkms/vkms= _config.h index 0b7067508e5f..267e45f5a617 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -49,6 +49,11 @@ struct vkms_config { * @supported_color_encoding: Color encoding that this plane will support * @default_color_range: Default color range that should be used by this p= lane * @supported_color_range: Color range that this plane will support + * @zpos_enable: Enable or disable the zpos property + * @zpos_mutable: Make the zpos property mutable or not (ignored if @zpos_= enable is false) + * @zpos_initial: Initial value for zpos property (ignored if @zpos_enable= is false) + * @zpos_min: Minimal value for zpos property (ignored if @zpos_enable is = false) + * @zpos_max: Maximal value for zpos property (ignored if @zpos_enable is = false) */ struct vkms_config_plane { struct list_head link; @@ -65,6 +70,11 @@ struct vkms_config_plane { u32 *supported_formats; unsigned int supported_formats_count; struct xarray possible_crtcs; + bool zpos_enabled; + bool zpos_mutable; + unsigned int zpos_initial; + unsigned int zpos_min; + unsigned int zpos_max; =20 /* Internal usage */ struct vkms_plane *plane; @@ -477,6 +487,138 @@ vkms_config_plane_get_name(struct vkms_config_plane *= plane_cfg) return plane_cfg->name; } =20 +/** + * vkms_config_plane_set_zpos_enabled() - Enable or disable zpos property = for a plane + * @plane_cfg: Plane configuration to modify + * @zpos_enabled: Whether to enable the zpos property + */ +static inline +void vkms_config_plane_set_zpos_enabled(struct vkms_config_plane *plane_cf= g, + bool zpos_enabled) +{ + plane_cfg->zpos_enabled =3D zpos_enabled; +} + +/** + * vkms_config_plane_set_zpos_mutable() - Set whether zpos property is mut= able + * @plane_cfg: Plane configuration to modify + * @zpos_mutable: Whether the zpos property should be mutable + */ +static inline +void vkms_config_plane_set_zpos_mutable(struct vkms_config_plane *plane_cf= g, + bool zpos_mutable) +{ + plane_cfg->zpos_mutable =3D zpos_mutable; +} + +/** + * vkms_config_plane_set_zpos_initial() - Set the initial zpos value + * @plane_cfg: Plane configuration to modify + * @zpos_initial: Initial zpos value + */ +static inline +void vkms_config_plane_set_zpos_initial(struct vkms_config_plane *plane_cf= g, + unsigned int zpos_initial) +{ + plane_cfg->zpos_initial =3D zpos_initial; +} + +/** + * vkms_config_plane_set_zpos_min() - Set the minimum zpos value + * @plane_cfg: Plane configuration to modify + * @zpos_min: Minimum zpos value + */ +static inline +void vkms_config_plane_set_zpos_min(struct vkms_config_plane *plane_cfg, + unsigned int zpos_min) +{ + plane_cfg->zpos_min =3D zpos_min; +} + +/** + * vkms_config_plane_set_zpos_max() - Set the maximum zpos value + * @plane_cfg: Plane configuration to modify + * @zpos_max: Maximum zpos value + * + * Sets the maximum allowed value for the zpos property. This setting is + * ignored if zpos is disabled. + */ +static inline +void vkms_config_plane_set_zpos_max(struct vkms_config_plane *plane_cfg, + unsigned int zpos_max) +{ + plane_cfg->zpos_max =3D zpos_max; +} + +/** + * vkms_config_plane_get_zpos_enabled() - Check if zpos property is enabled + * @plane_cfg: Plane configuration to check + * + * Returns: + * True if the zpos property is enabled for this plane, false otherwise. + */ +static inline +bool vkms_config_plane_get_zpos_enabled(struct vkms_config_plane *plane_cf= g) +{ + return plane_cfg->zpos_enabled; +} + +/** + * vkms_config_plane_get_zpos_mutable() - Check if zpos property is mutable + * @plane_cfg: Plane configuration to check + * + * Returns: + * True if the zpos property is mutable for this plane, false otherwise. + * Returns false if zpos is disabled. + */ +static inline +bool vkms_config_plane_get_zpos_mutable(struct vkms_config_plane *plane_cf= g) +{ + return plane_cfg->zpos_mutable; +} + +/** + * vkms_config_plane_get_zpos_initial() - Get the initial zpos value + * @plane_cfg: Plane configuration to check + * + * Returns: + * The initial zpos value for this plane. The return value is undefined if + * zpos is disabled. + */ +static inline +unsigned int vkms_config_plane_get_zpos_initial(struct vkms_config_plane *= plane_cfg) +{ + return plane_cfg->zpos_initial; +} + +/** + * vkms_config_plane_get_zpos_min() - Get the minimum zpos value + * @plane_cfg: Plane configuration to check + * + * Returns: + * The minimum allowed zpos value for this plane. The return value is unde= fined + * if zpos is disabled. + */ +static inline +unsigned int vkms_config_plane_get_zpos_min(struct vkms_config_plane *plan= e_cfg) +{ + return plane_cfg->zpos_min; +} + +/** + * vkms_config_plane_get_zpos_max() - Get the maximum zpos value + * @plane_cfg: Plane configuration to check + * + * Returns: + * The maximum allowed zpos value for this plane. The return value is unde= fined + * if zpos is disabled. + */ +static inline +unsigned int vkms_config_plane_get_zpos_max(struct vkms_config_plane *plan= e_cfg) +{ + return plane_cfg->zpos_max; +} + /** * vkms_config_plane_attach_crtc - Attach a plane to a CRTC * @plane_cfg: Plane to attach diff --git a/drivers/gpu/drm/vkms/vkms_plane.c b/drivers/gpu/drm/vkms/vkms_= plane.c index 0414865915d8..51f6372a6f72 100644 --- a/drivers/gpu/drm/vkms/vkms_plane.c +++ b/drivers/gpu/drm/vkms/vkms_plane.c @@ -209,5 +209,16 @@ struct vkms_plane *vkms_plane_init(struct vkms_device = *vkmsdev, vkms_config_plane_get_default_color_encoding(config), vkms_config_plane_get_default_color_range(config)); =20 + if (vkms_config_plane_get_zpos_enabled(config)) { + if (vkms_config_plane_get_zpos_mutable(config)) + drm_plane_create_zpos_property(&plane->base, + vkms_config_plane_get_zpos_initial(config), + vkms_config_plane_get_zpos_min(config), + vkms_config_plane_get_zpos_max(config)); + else + drm_plane_create_zpos_immutable_property(&plane->base, + vkms_config_plane_get_zpos_initial(config)); + } + return plane; } --=20 2.51.0 From nobody Sun Feb 8 08:48:25 2026 Received: from smtpout-04.galae.net (smtpout-04.galae.net [185.171.202.116]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A591E23EAAF; Sat, 18 Oct 2025 02:02:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752941; cv=none; b=XLJ/mwNmaOn7w+uFQSfCbMxmMEQLXQc/+xQ69uzYLDqxNIh7IAA5fLnihiLEL+GFZ9hlJ4lEiQOe7pDy+wMWqHI/vzcNNun1eIx3ZfePtioVyPmEjGuYHzzt2W42aoc279DIa6lzT9r19aNOkV7RTfZTYsXw+FjLRaR68+dR4r4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752941; c=relaxed/simple; bh=fVDdjCNEywuKVVR+ob87bJbT3yLrYxF6TuXZfqLFmFk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=h/vwVFNUR7lplfIeL6fNC5b0yfZdwBa0xePGdnCbBoMoEPfIwGRW7198DifjQUaZJS2YEfUBf4vws/wXedYfoLSfciJv8Uc35jXGyY5q4f5K9B7NNm6esoEuaZGSNnyr5M6lQA4KvkKWZax48Wktyi5Melzt9FfU8rS7umxjRE4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=0t2FDjH/; arc=none smtp.client-ip=185.171.202.116 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="0t2FDjH/" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 016D5C041FD; Sat, 18 Oct 2025 02:01:59 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 5710F60701; Sat, 18 Oct 2025 02:02:18 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 43605102F236C; Sat, 18 Oct 2025 04:02:15 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1760752937; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=a2sDvV26J4EK9UXYPJ7YJdfjFfAkgIEqv/WKwtJBGL0=; b=0t2FDjH/Lf8R/TTZoPdq6MUmxPwcBfEJXUH+OqH31wjVQxHRFF8gFake/3BAgCT7VcMSei +LWucmpiLCgNho3E88XXd6/WL90c9aG3pyKN6Ji/mvgwBUlMlGVitrpMslPJ/W9WxrLisr DzpPidXXdadZZe2o1B7ScBacCKySpAtDEWX0/gdXHGo67ejRTQd5KVyxS9HZNoZsoMLro7 Zk+AkgJjJagfX/Jvu4zaewcVHcyfc7noD4HgLMuggmXejgze8L9VCy43OhVM7eKFEmrISi H7GTDxlUG1z533Z/4A5VGNleRNonbQzlNZZpqA/MeUUxrUjWnlHnK1vbRhy21g== From: Louis Chauvet Date: Sat, 18 Oct 2025 04:01:13 +0200 Subject: [PATCH 13/22] drm/vkms: Introduce configfs for plane zpos property Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251018-vkms-all-config-v1-13-a7760755d92d@bootlin.com> References: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> In-Reply-To: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=8351; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=fVDdjCNEywuKVVR+ob87bJbT3yLrYxF6TuXZfqLFmFk=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBo8vT+WZSXbTuj7/DTf+HAhR9Do2164ES3I8v6N 9OEk/emZ26JAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaPL0/gAKCRAgrS7GWxAs 4sx6EAC15yign8j6nSsVp1cdrXAftYtyhyXg3yG9yAGfY0LBg2VNfCO4M94pXxYQRkENVopCzPU 4SkuWR/ixgPtkrqCcM5pX9Chy7agJ53k529J3m9jcATsYNwaWPVuwgThBshYf92Xfm/BEL1qh7n r7CwGn9H3eyq8NpB/1SjnCpu0mmhbIu5hlMH7m7WpVtpIg4+EVMiVXrLbIFWqHeOphEdghbW9eV KeD+Dp8jS0wJfuklkGMxyC20V22nZAip3LD9KziYZ7T54ShhLK3Yh0GhzJ2j0UZsWDPlyvKWez6 Wh6PcXoGupFHQ3w4ioydXaqcAfISgGMsclUlk7uyX/WrczVmE59LK3uzG43SLZXaoW3IA1xyQd8 NpT3lSIn5U8JyfS5jcj2chsDmuwnkol9ErLsK2Rh+MEZdfk0HZWxUsOTx1zUmOC3GkYT1iAyrou bjPKmJOIhjnSIgmo5HPiryjhfEdDLFGn0ujU7n8Iyf4aeLCzR91zOpAJFzDT+M22ocpQjhDeO+8 ZQNzCnImwOcXo3BNCzOzdE86yqKUWpEuPZ6XjbX6IxlZ0yTTReqz7838aVFlDi3IzxXifVU2cmH Drt51XNWXScwNvegqgMaBKrjgk6i9RAi623cr0koTsTEkm8Uo82U1lVovKGeOhah7YKqijZFyCy IbTAty8G2Vi9xCA== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Modern compositor rely on zpos managment to offload some processing to deticated hardware. In order to test multiple configurations, add zpos configuration to configFS. Introduce multiple attributes to configure zpos: - zpos_enabled - Create or not the zpos property. If not created, the zpos is undefined. - zpos_mutable - If the zpos property is created, allow or not the userspace to modify it - zpos_initial - Intial value for zpos property. Must be between zpos_min and zpos_max - zpos_min - Minimal zpos value for this plane. Must be smaller than or equals to zpos_max - zpos_max - Maximal zpos value for this plane. Must be greater than or equals to zpos_min Signed-off-by: Louis Chauvet --- Documentation/gpu/vkms.rst | 9 +- drivers/gpu/drm/vkms/vkms_configfs.c | 199 +++++++++++++++++++++++++++++++= ++++ 2 files changed, 207 insertions(+), 1 deletion(-) diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index deb14e7c48ea..d4ad4af45414 100644 --- a/Documentation/gpu/vkms.rst +++ b/Documentation/gpu/vkms.rst @@ -87,7 +87,7 @@ Start by creating one or more planes:: =20 sudo mkdir /config/vkms/my-vkms/planes/plane0 =20 -Planes have 8 configurable attribute: +Planes have 13 configurable attribute: =20 - type: Plane type: 0 overlay, 1 primary, 2 cursor (same values as those exposed by the "type" property of a plane) @@ -111,6 +111,13 @@ Planes have 8 configurable attribute: To remove a format, use a minus and its fourcc: -XR24 To add all formats use +* To remove all formats, use -* +- zpos_enabled: Enable or not the zpos property: 1 enable, 0 disable +- zpos_mutable: Create the zpos property as a mutable or imutable property= : 1 mutable, + 0 disable. No effect if zpos_enabled is not set. +- zpos_initial: Set the initial zpos value. Must be between zpos_min and z= pos_max. No + effect if zpos_enabled is not set. +- zpos_min: Set the minimal zpos value. No effect if zpos_enabled is not s= et. +- zpos_max: Set the maximal zpos value. No effect if zpos_enabled is not s= et. =20 Continue by creating one or more CRTCs:: =20 diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vk= ms_configfs.c index 528f22fa2df1..fd1be7292058 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -1,4 +1,5 @@ // SPDX-License-Identifier: GPL-2.0+ +#include "asm-generic/errno-base.h" #include #include #include @@ -679,6 +680,194 @@ static ssize_t plane_supported_formats_store(struct c= onfig_item *item, return count; } =20 +static ssize_t plane_zpos_enabled_show(struct config_item *item, char *pag= e) +{ + struct vkms_configfs_plane *plane; + bool enabled; + + plane =3D plane_item_to_vkms_configfs_plane(item); + + scoped_guard(mutex, &plane->dev->lock) + enabled =3D vkms_config_plane_get_zpos_enabled(plane->config); + + return sprintf(page, "%d\n", enabled); +} + +static ssize_t plane_zpos_enabled_store(struct config_item *item, const ch= ar *page, + size_t count) +{ + struct vkms_configfs_plane *plane; + bool enabled; + + plane =3D plane_item_to_vkms_configfs_plane(item); + + if (kstrtobool(page, &enabled)) + return -EINVAL; + + scoped_guard(mutex, &plane->dev->lock) { + if (plane->dev->enabled) + return -EBUSY; + + vkms_config_plane_set_zpos_enabled(plane->config, enabled); + } + + return (ssize_t)count; +} + +static ssize_t plane_zpos_mutable_show(struct config_item *item, char *pag= e) +{ + struct vkms_configfs_plane *plane; + bool mutable; + + plane =3D plane_item_to_vkms_configfs_plane(item); + + scoped_guard(mutex, &plane->dev->lock) + mutable =3D vkms_config_plane_get_zpos_mutable(plane->config); + + return sprintf(page, "%d\n", mutable); +} + +static ssize_t plane_zpos_mutable_store(struct config_item *item, const ch= ar *page, + size_t count) +{ + struct vkms_configfs_plane *plane; + bool mutable; + + plane =3D plane_item_to_vkms_configfs_plane(item); + + if (kstrtobool(page, &mutable)) + return -EINVAL; + + scoped_guard(mutex, &plane->dev->lock) { + if (plane->dev->enabled) + return -EBUSY; + + vkms_config_plane_set_zpos_mutable(plane->config, mutable); + } + + return (ssize_t)count; +} + +static ssize_t plane_zpos_initial_show(struct config_item *item, char *pag= e) +{ + struct vkms_configfs_plane *plane; + unsigned int initial; + + plane =3D plane_item_to_vkms_configfs_plane(item); + + scoped_guard(mutex, &plane->dev->lock) + initial =3D vkms_config_plane_get_zpos_initial(plane->config); + + return sprintf(page, "%u\n", initial); +} + +static ssize_t plane_zpos_initial_store(struct config_item *item, const ch= ar *page, + size_t count) +{ + struct vkms_configfs_plane *plane; + unsigned int initial; + + plane =3D plane_item_to_vkms_configfs_plane(item); + + if (kstrtouint(page, 10, &initial)) + return -EINVAL; + + scoped_guard(mutex, &plane->dev->lock) { + if (plane->dev->enabled) + return -EBUSY; + + if (initial > vkms_config_plane_get_zpos_max(plane->config)) + return -EINVAL; + + if (initial < vkms_config_plane_get_zpos_min(plane->config)) + return -EINVAL; + + vkms_config_plane_set_zpos_initial(plane->config, initial); + } + + return (ssize_t)count; +} + +static ssize_t plane_zpos_min_show(struct config_item *item, char *page) +{ + struct vkms_configfs_plane *plane; + unsigned int min; + + plane =3D plane_item_to_vkms_configfs_plane(item); + + scoped_guard(mutex, &plane->dev->lock) + min =3D vkms_config_plane_get_zpos_min(plane->config); + + return sprintf(page, "%u\n", min); +} + +static ssize_t plane_zpos_min_store(struct config_item *item, const char *= page, + size_t count) +{ + struct vkms_configfs_plane *plane; + unsigned int min; + + plane =3D plane_item_to_vkms_configfs_plane(item); + + if (kstrtouint(page, 10, &min)) + return -EINVAL; + + scoped_guard(mutex, &plane->dev->lock) { + if (plane->dev->enabled) + return -EBUSY; + + if (min > vkms_config_plane_get_zpos_max(plane->config)) + return -EINVAL; + + if (min > vkms_config_plane_get_zpos_initial(plane->config)) + return -EINVAL; + + vkms_config_plane_set_zpos_min(plane->config, min); + } + + return (ssize_t)count; +} + +static ssize_t plane_zpos_max_show(struct config_item *item, char *page) +{ + struct vkms_configfs_plane *plane; + unsigned int max; + + plane =3D plane_item_to_vkms_configfs_plane(item); + + scoped_guard(mutex, &plane->dev->lock) + max =3D vkms_config_plane_get_zpos_max(plane->config); + + return sprintf(page, "%u\n", max); +} + +static ssize_t plane_zpos_max_store(struct config_item *item, const char *= page, + size_t count) +{ + struct vkms_configfs_plane *plane; + unsigned int max; + + plane =3D plane_item_to_vkms_configfs_plane(item); + + if (kstrtouint(page, 10, &max)) + return -EINVAL; + + scoped_guard(mutex, &plane->dev->lock) { + if (plane->dev->enabled) + return -EBUSY; + + if (max < vkms_config_plane_get_zpos_min(plane->config)) + return -EINVAL; + + if (max < vkms_config_plane_get_zpos_initial(plane->config)) + return -EINVAL; + + vkms_config_plane_set_zpos_max(plane->config, max); + } + + return (ssize_t)count; +} + CONFIGFS_ATTR(plane_, type); CONFIGFS_ATTR(plane_, supported_rotations); CONFIGFS_ATTR(plane_, default_rotation); @@ -687,6 +876,11 @@ CONFIGFS_ATTR(plane_, default_color_range); CONFIGFS_ATTR(plane_, supported_color_encoding); CONFIGFS_ATTR(plane_, default_color_encoding); CONFIGFS_ATTR(plane_, supported_formats); +CONFIGFS_ATTR(plane_, zpos_enabled); +CONFIGFS_ATTR(plane_, zpos_mutable); +CONFIGFS_ATTR(plane_, zpos_initial); +CONFIGFS_ATTR(plane_, zpos_min); +CONFIGFS_ATTR(plane_, zpos_max); =20 static struct configfs_attribute *plane_item_attrs[] =3D { &plane_attr_type, @@ -697,6 +891,11 @@ static struct configfs_attribute *plane_item_attrs[] = =3D { &plane_attr_supported_color_encoding, &plane_attr_default_color_encoding, &plane_attr_supported_formats, + &plane_attr_zpos_enabled, + &plane_attr_zpos_mutable, + &plane_attr_zpos_initial, + &plane_attr_zpos_min, + &plane_attr_zpos_max, NULL, }; =20 --=20 2.51.0 From nobody Sun Feb 8 08:48:25 2026 Received: from smtpout-04.galae.net (smtpout-04.galae.net [185.171.202.116]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7EC8E23F424; Sat, 18 Oct 2025 02:02:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752943; cv=none; b=aOK98xVNYCCwsgY4f1H7n+0eUM3ULVJxt3V60zhZ6nhO5VI8DDSAngurG+tfyszU2mji+74gUfypFmY8kr8HduKan2SHocP6j1OgVYXiSvR72+R57pYmlyxIBOH0nPHdL21p7pRweMGZAoerRqZXaDdFfo+rDVsLDxK2Pmu4KTA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752943; c=relaxed/simple; bh=mlVitEKgPRWXex7IDiZvIpJldU+tXkQjiow9dXAQlR4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JhHEGcc2dTzv2RVWs+mT50yblFMO0L9cgkW4FWzbqLM2KXxnV7dRG3TbP6uR1QarxR8NPP99cOZFp5gYOS9Fpcxias2ri5YDG8adSs4mVmBiNuGw0JAhkV+sVfMvROTAeWyIEXh3qNnmGpm+IT1e+VGGbMsYsC8Pla+MbBLXltw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=Zmt70XMT; arc=none smtp.client-ip=185.171.202.116 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="Zmt70XMT" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 05BFFC035A7; Sat, 18 Oct 2025 02:02:01 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 5BF3560701; Sat, 18 Oct 2025 02:02:20 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id D0C90102F2380; Sat, 18 Oct 2025 04:02:17 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1760752939; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=OSSumRs3rNpXnBUd0cppRmxG66Aojnzy15R3KfAeBrQ=; b=Zmt70XMTf1skdRiNA4G8ysE+BRB6fShH1wFmQkJFgFI2J7Z7f17kGVywa2/uG199FefvTZ plfX4gZhTg2EGfPMhwE5ZODF6WK/L17+buIBgfA6eWQeZxo784wy6xdAIpPMKqYAQCT19q SlEUV2oDkHgcGF7np6aWrXld0OL0SS3m9lf2jT9fhQIvIkN/M2E9gP4x9jQ2EMHFjN7ruQ Kd8KM8XsMWsccV3wl/oGnSj/vl4HS3vukwDCDPTuuszxstFyDtXTIb00ZfW4m53TnJFyhw R7QHip4N7/Pye14BZSkSvoRH5Fb9f2OwtCRuwY0MlbWPawsVCDAxZ/2vKSjiPA== From: Louis Chauvet Date: Sat, 18 Oct 2025 04:01:14 +0200 Subject: [PATCH 14/22] drm/vkms: Introduce config for connector type Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251018-vkms-all-config-v1-14-a7760755d92d@bootlin.com> References: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> In-Reply-To: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=6691; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=mlVitEKgPRWXex7IDiZvIpJldU+tXkQjiow9dXAQlR4=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBo8vT+PtjrYP9moT4P2zE3J+YIL4PjpllBJo6iD lrwHxXfuYaJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaPL0/gAKCRAgrS7GWxAs 4oNXD/9ojy5OVd19/m+p7byF/GH7mCqTZuCk4J3on6t48G2pW2rUvESb/bqaN8joxTMkl7RFbfs qQzKmTEpjtyYXulEHexRtjm2uyStAAz6j40ky3+AcEo8SF6UwW60r96N3z/vrqo9vf5TZkLAuhn Jv4hqb/xcfBbmJK+/4pi84JlzYjddsVNcmTagH7qR49Gbge33UdsF6N2sKQV4ylvzsApbBqIsqA xu0fKei1hZ2s3i8t2+uJdtPSCN/n+hPeX2rn/VcylMp8diuv5QkZxoX+eAXGuaqpbpKB5zZsJSD Thx/vj/UCEmZiohBii8CrCIKS4NVcrSCNIF3Wcg0ARLftmI/fMPd5USfoAC0vWX6DemH1rEOv+u S9celWcV3x1pDszjVOaMov0Dcswfj8syV06sLNJt1K4U6zNCQg1CikIjDjw9PtqCew8wUajYIvT 62gb8oGbI/pD1GF9GQTyx8KG5MwgaC5OOOc4gBXDoNm0jHHOwHvoSm1FNmJTULGsXwMn3/X0bkJ C2sICxEV7qpoEvZ20ArkLN1CXTkioMxiAM6a0YC88U6WjM/MQ0cGTPJO7yZNSHb/6geRI5LyiBt tMnGkVm302JRCrrvhV84SQhUMnVZjND7Z0QEXqQccNfH2CiKMmYuPwCV0PhzzZ4VFpXGRyNhy1N Gg+ImvYK/qSCf+w== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 In order to emulate connector-specific behavior, add connector type configuration. Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/tests/vkms_config_test.c | 6 ++++++ drivers/gpu/drm/vkms/vkms_config.c | 1 + drivers/gpu/drm/vkms/vkms_config.h | 24 ++++++++++++++++++++++++ drivers/gpu/drm/vkms/vkms_connector.c | 5 +++-- drivers/gpu/drm/vkms/vkms_connector.h | 3 ++- drivers/gpu/drm/vkms/vkms_drv.h | 1 + drivers/gpu/drm/vkms/vkms_output.c | 2 +- 7 files changed, 38 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/vkms/tests/vkms_config_test.c b/drivers/gpu/dr= m/vkms/tests/vkms_config_test.c index f2b38b436252..8633210342a4 100644 --- a/drivers/gpu/drm/vkms/tests/vkms_config_test.c +++ b/drivers/gpu/drm/vkms/tests/vkms_config_test.c @@ -1,5 +1,6 @@ // SPDX-License-Identifier: GPL-2.0+ =20 +#include "drm/drm_mode.h" #include =20 #include "../vkms_config.h" @@ -126,6 +127,7 @@ static void vkms_config_test_default_config(struct kuni= t *test) struct vkms_config *config; struct vkms_config_plane *plane_cfg; struct vkms_config_crtc *crtc_cfg; + struct vkms_config_connector *connector_cfg; int n_primaries =3D 0; int n_cursors =3D 0; int n_overlays =3D 0; @@ -182,6 +184,10 @@ static void vkms_config_test_default_config(struct kun= it *test) =20 /* Connectors */ KUNIT_EXPECT_EQ(test, vkms_config_get_num_connectors(config), 1); + vkms_config_for_each_connector(config, connector_cfg) { + KUNIT_EXPECT_EQ(test, vkms_config_connector_get_type(connector_cfg), + DRM_MODE_CONNECTOR_VIRTUAL); + } =20 KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); =20 diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index 5da34a3e8114..20750c9f6d08 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -771,6 +771,7 @@ struct vkms_config_connector *vkms_config_create_connec= tor(struct vkms_config *c =20 connector_cfg->config =3D config; connector_cfg->status =3D connector_status_connected; + vkms_config_connector_set_type(connector_cfg, DRM_MODE_CONNECTOR_VIRTUAL); xa_init_flags(&connector_cfg->possible_encoders, XA_FLAGS_ALLOC); =20 list_add_tail(&connector_cfg->link, &config->connectors); diff --git a/drivers/gpu/drm/vkms/vkms_config.h b/drivers/gpu/drm/vkms/vkms= _config.h index 267e45f5a617..36d289a010f6 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -126,6 +126,7 @@ struct vkms_config_encoder { * struct vkms_config_connector * * @link: Link to the others connector in vkms_config + * @type: Store the type of connector using DRM_MODE_CONNECTOR_* values * @config: The vkms_config this connector belongs to * @status: Status (connected, disconnected...) of the connector * @possible_encoders: Array of encoders that can be used with this connec= tor @@ -138,6 +139,7 @@ struct vkms_config_connector { struct list_head link; struct vkms_config *config; =20 + int type; enum drm_connector_status status; struct xarray possible_encoders; =20 @@ -315,6 +317,28 @@ vkms_config_plane_set_type(struct vkms_config_plane *p= lane_cfg, } =20 /** + * vkms_config_connector_get_type() - Return the connector type + * @connector_cfg: Connector to get the type from + */ +static inline int +vkms_config_connector_get_type(struct vkms_config_connector *connector_cfg) +{ + return connector_cfg->type; +} + +/** + * vkms_config_connector_set_type() - Set the connector type + * @connector_cfg: Connector to set the type to + * @type: New connector type + */ +static inline void +vkms_config_connector_set_type(struct vkms_config_connector *connector_cfg, + int type) +{ + connector_cfg->type =3D type; +} + +/* * vkms_config_plane_get_default_rotation() - Get the default rotation for= a plane * @plane_cfg: Plane to get the default rotation from * diff --git a/drivers/gpu/drm/vkms/vkms_connector.c b/drivers/gpu/drm/vkms/v= kms_connector.c index b0a6b212d3f4..5a87dc2d4c63 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.c +++ b/drivers/gpu/drm/vkms/vkms_connector.c @@ -68,7 +68,8 @@ static const struct drm_connector_helper_funcs vkms_conn_= helper_funcs =3D { .best_encoder =3D vkms_conn_best_encoder, }; =20 -struct vkms_connector *vkms_connector_init(struct vkms_device *vkmsdev) +struct vkms_connector *vkms_connector_init(struct vkms_device *vkmsdev, + struct vkms_config_connector *connector_cfg) { struct drm_device *dev =3D &vkmsdev->drm; struct vkms_connector *connector; @@ -79,7 +80,7 @@ struct vkms_connector *vkms_connector_init(struct vkms_de= vice *vkmsdev) return ERR_PTR(-ENOMEM); =20 ret =3D drmm_connector_init(dev, &connector->base, &vkms_connector_funcs, - DRM_MODE_CONNECTOR_VIRTUAL, NULL); + vkms_config_connector_get_type(connector_cfg), NULL); if (ret) return ERR_PTR(ret); =20 diff --git a/drivers/gpu/drm/vkms/vkms_connector.h b/drivers/gpu/drm/vkms/v= kms_connector.h index ed312f4eff3a..a124c5403697 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.h +++ b/drivers/gpu/drm/vkms/vkms_connector.h @@ -24,7 +24,8 @@ struct vkms_connector { * Returns: * The connector or an error on failure. */ -struct vkms_connector *vkms_connector_init(struct vkms_device *vkmsdev); +struct vkms_connector *vkms_connector_init(struct vkms_device *vkmsdev, + struct vkms_config_connector *connector_cfg); =20 /** * vkms_trigger_connector_hotplug() - Update the device's connectors status diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_dr= v.h index 9ad286f043b5..07bdf3f550ae 100644 --- a/drivers/gpu/drm/vkms/vkms_drv.h +++ b/drivers/gpu/drm/vkms/vkms_drv.h @@ -226,6 +226,7 @@ struct vkms_output { =20 struct vkms_config; struct vkms_config_plane; +struct vkms_config_connector; =20 /** * struct vkms_device - Description of a VKMS device diff --git a/drivers/gpu/drm/vkms/vkms_output.c b/drivers/gpu/drm/vkms/vkms= _output.c index 22208d02afa4..217f054d9598 100644 --- a/drivers/gpu/drm/vkms/vkms_output.c +++ b/drivers/gpu/drm/vkms/vkms_output.c @@ -96,7 +96,7 @@ int vkms_output_init(struct vkms_device *vkmsdev) struct vkms_config_encoder *possible_encoder; unsigned long idx =3D 0; =20 - connector_cfg->connector =3D vkms_connector_init(vkmsdev); + connector_cfg->connector =3D vkms_connector_init(vkmsdev, connector_cfg); if (IS_ERR(connector_cfg->connector)) { DRM_ERROR("Failed to init connector\n"); return PTR_ERR(connector_cfg->connector); --=20 2.51.0 From nobody Sun Feb 8 08:48:25 2026 Received: from smtpout-04.galae.net (smtpout-04.galae.net [185.171.202.116]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9C8F523ED5E for ; Sat, 18 Oct 2025 02:02:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752945; cv=none; b=ILtxYElmnDIAqyOHxDAigk/wblx+hzo6/nhbryhODSQ6yFxa0JN1tp2utlIImMHoLNxiwFgddvYbiQhq5RGSPf12HOvUIYKfw3O0tWtL4hfNOlnPGbtmHvU2ox8/I8RsI5EIX16X0Ec9JPhMn9OxttN7R+mQtz1BM87zGjlGaD8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752945; c=relaxed/simple; bh=UHrEecd+6C0vF0Cs7qQiOFJxWa/yui46MpN97PZb7A4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=BhTD5Yt8ak0yxDzCdf6biUbbHV6tvmhQ4oSXVLoPbHHjAtdyE7DQUZqXq7/jFpudBzlwGsL2u4g+MDu7cxoSJcjxincZMJ+YTJP6UaWjvnkOxWSJIiD0WaxehkjrYnqIl1Me6cVDdTs+pzxEL7C9to3ts8ShC6BQTPlwCr4+qc0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=Q1S3Rn7g; arc=none smtp.client-ip=185.171.202.116 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="Q1S3Rn7g" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 0B532C041FD; Sat, 18 Oct 2025 02:02:03 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 60D6760701; Sat, 18 Oct 2025 02:02:22 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 14D87102F236F; Sat, 18 Oct 2025 04:02:19 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1760752941; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=etjMW6U4L5LchIOPFungAA/drZk/ZnoC4fdKX7Yq4YA=; b=Q1S3Rn7gqaBWbuZxYizgqUxqJ+nkwrlb3Le0Mr5XbvP60xwcaU7m9nrdQl0/Qg+y8g1g0b Rw37INj0oMkmKSkeqMCShbNLSrbGDAWJuEE8zMTq27Cxm0VCuz5gd/Fl+dAhETQ4sQuAz7 wYmBIJeLpBmJnbV0PgeStEbyatFhoRaMxVUY16dOGHxEuhgkw1V+C12dT4n5SmEC1OZnBu 0bSs3cylugvkapdjkKNCKvGlKgibONvw/e2wpCDaWryjaGQRpany5PUee3fWBoi/bJK85Q pUDxHPkhYGinpSxjNvZxdj1WX5YlsTeeMB1LHHfiFTyBNXNGz/uWpu11SgJu7A== From: Louis Chauvet Date: Sat, 18 Oct 2025 04:01:15 +0200 Subject: [PATCH 15/22] drm/vkms: Introduce configfs for connector type Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251018-vkms-all-config-v1-15-a7760755d92d@bootlin.com> References: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> In-Reply-To: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=3281; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=UHrEecd+6C0vF0Cs7qQiOFJxWa/yui46MpN97PZb7A4=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBo8vT+M3oBga6pCnMTm4riIa8Zm2SKecDtdGm1J 8SlFiQzjjqJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaPL0/gAKCRAgrS7GWxAs 4ipeD/9qQfUEabrEd3JjdVzvcIiD4Tc9szZXhXtoIq3zCo/p769JUny/BTO9BOXwPmSTDuz4Vre omW/7EvBEgaUNtaGaEk+nOYUxTwN+FCQmiPDskpESwrlooYoodg5MaMzra8SpnClHDs0eB3r1f0 OrKH7CciY+q9YiKYVyfGN/60f2LcKyZoUEvHG8ZkVg0L5gWhNA9HG+dnangEx4iH02H3ByIe2ze 4V9Bolx8JYcx5CweajRdT1CgT247Y7En4Cwcak/LFwHqcnbD02LwFdulTZ8gtyaDByVKyZB4xJk XhNsS7EwHDpuBTfQkBBZXCyWq8IFpGzIkrz/bf9iVt+MuJzipxl5neiaZL8t+GGFtEkmTTFChvl JyrLW/WDjf4UCxmzmV55nUSEh6Fg+oGJXcxax0/Fd/blJOLmBd7x3OHVAOwssylgTZxWttd8tt3 9hkKYrGnjvG+OKHB9SGWfKrw0uB2h3wW7MlvHolqEtF/v8xBmeUP0pGzQreNmAV9RHD2V5bRJ7E CFu9zNzWCpsKpU4d6gJnIiI05mSG6gNqk9Chbq+Z+rqb6265kWaaV7VQoIpuHoEfwuOxP0dmYqB yKJh9e813ikUIlFGRL1coIXXZBRo3DvPm2Qd/dAirsrUKvOE2zzfw/oiahEqmoEWZWB8OCM3tFB CprgVBwUXoLMjDg== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Add a new attribute to connector to change its type. This is mostly cosmetic and don't have direct effect in VKMS behavior. Signed-off-by: Louis Chauvet --- Documentation/gpu/vkms.rst | 3 +- drivers/gpu/drm/vkms/vkms_configfs.c | 64 ++++++++++++++++++++++++++++++++= ++++ 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index d4ad4af45414..97ea11a86bd1 100644 --- a/Documentation/gpu/vkms.rst +++ b/Documentation/gpu/vkms.rst @@ -135,10 +135,11 @@ Last but not least, create one or more connectors:: =20 sudo mkdir /config/vkms/my-vkms/connectors/connector0 =20 -Connectors have 1 configurable attribute: +Connectors have 2 configurable attribute: =20 - status: Connection status: 1 connected, 2 disconnected, 3 unknown (same = values as those exposed by the "status" property of a connector) +- type: Type of connector. Same values as exposed by the "type" field in d= rm_connector. =20 To finish the configuration, link the different pipeline items:: =20 diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vk= ms_configfs.c index fd1be7292058..0cf7cee4eb0f 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -1123,10 +1123,74 @@ static ssize_t connector_status_store(struct config= _item *item, return (ssize_t)count; } =20 +static ssize_t connector_type_show(struct config_item *item, char *page) +{ + struct vkms_configfs_connector *connector; + int type; + + connector =3D connector_item_to_vkms_configfs_connector(item); + + scoped_guard(mutex, &connector->dev->lock) { + type =3D vkms_config_connector_get_type(connector->config); + } + + return sprintf(page, "%u", type); +} + +static ssize_t connector_type_store(struct config_item *item, + const char *page, size_t count) +{ + struct vkms_configfs_connector *connector; + int val, ret; + + connector =3D connector_item_to_vkms_configfs_connector(item); + + ret =3D kstrtouint(page, 10, &val); + + if (ret) + return ret; + + switch (val) { + case DRM_MODE_CONNECTOR_Unknown: + case DRM_MODE_CONNECTOR_VGA: + case DRM_MODE_CONNECTOR_DVII: + case DRM_MODE_CONNECTOR_DVID: + case DRM_MODE_CONNECTOR_DVIA: + case DRM_MODE_CONNECTOR_Composite: + case DRM_MODE_CONNECTOR_SVIDEO: + case DRM_MODE_CONNECTOR_LVDS: + case DRM_MODE_CONNECTOR_Component: + case DRM_MODE_CONNECTOR_9PinDIN: + case DRM_MODE_CONNECTOR_DisplayPort: + case DRM_MODE_CONNECTOR_HDMIA: + case DRM_MODE_CONNECTOR_HDMIB: + case DRM_MODE_CONNECTOR_TV: + case DRM_MODE_CONNECTOR_eDP: + case DRM_MODE_CONNECTOR_VIRTUAL: + case DRM_MODE_CONNECTOR_DSI: + case DRM_MODE_CONNECTOR_DPI: + case DRM_MODE_CONNECTOR_SPI: + case DRM_MODE_CONNECTOR_USB: + break; + default: + return -EINVAL; + } + + scoped_guard(mutex, &connector->dev->lock) { + if (connector->dev->enabled) + return -EINVAL; + vkms_config_connector_set_type(connector->config, val); + } + + return count; +} + CONFIGFS_ATTR(connector_, status); +CONFIGFS_ATTR(connector_, type); =20 static struct configfs_attribute *connector_item_attrs[] =3D { &connector_attr_status, + &connector_attr_type, NULL, }; =20 --=20 2.51.0 From nobody Sun Feb 8 08:48:25 2026 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AE8CA23D7F3; Sat, 18 Oct 2025 02:02:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752948; cv=none; b=dY/4HlcL4KlJ/vzWbJ6aFBOBk+OeXAsCUVzMO2ar79B4PaGQDalJwYFAR1EIN1AhbwWBT4q99zlcEyKWELEOdKcq4wxeDuHWtyqJGAJcPDToo/OzN+fAqMNsoFvfCl/Tp/XvgtshUwEltU1SmbaeOxRJFM/rmzkXj4JFDc1C60Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752948; c=relaxed/simple; bh=gp/as8jslPeYVJaMphS7S8r4C2Q8kY1KGjqD1XYJms4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=CPqSxKAsxh+GtsFVk/j0lZpRo5VezX/dwTlo5cmWb45nWl+6+tp0FI0vLhxh6vL50ftAZPOC8L3+/NcJtCgrJkK7+kIXHl1Yze9zMGso25NgjpcWg0CDxAi/I55j90MxmZzG9h2uiVkaqrAOGHEBsous5h+86yPRdpy1IYqZYXE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=AjclbMl5; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="AjclbMl5" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id DE4781A14AB; Sat, 18 Oct 2025 02:02:24 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id B3FD260701; Sat, 18 Oct 2025 02:02:24 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id EFE73102F236C; Sat, 18 Oct 2025 04:02:21 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1760752943; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=XrzBloffEesAzM4+cYe1LjABY2oUa0qa917OjW4iAmA=; b=AjclbMl5fx0w0ScnEnIPJKon9gF5HKAvmi1JJ+Ndi+rATxEWN/zy8Hqv/IoAy7xZebN7w6 mk3n1XxOJrxN1CpNpxESJKFgicHaXETQef2YTg0iZxoqmd6u0zcVp+0UoREvYqJin3dFmX T5b6GLozi1KnKKUVS16k7UWkR3VxOUnCgfYMC5ybhy9CeMEQ6LIw2XR/KU1V0nSdQQoLo2 kPFcO4PJyTiFPaM1Arae/rTN22ZJkuo1rA8OfuDutSMslBzvIAcmxvFQGY0h2nGVZy3KFa GXqaN+AMXOYK6Bnzc4g7sYbZri2gJ4NHzfkHgJNlXe0eVSbkt7dVZO6QxlaN9g== From: Louis Chauvet Date: Sat, 18 Oct 2025 04:01:16 +0200 Subject: [PATCH 16/22] drm/vkms: Introduce config for connector supported colorspace Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251018-vkms-all-config-v1-16-a7760755d92d@bootlin.com> References: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> In-Reply-To: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=4737; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=gp/as8jslPeYVJaMphS7S8r4C2Q8kY1KGjqD1XYJms4=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBo8vT+/TjTwuE9NbM24YpWBq9aPvOtzhn1Jer0K iQ98kpH2RCJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaPL0/gAKCRAgrS7GWxAs 4sUhEACw0SouOSO0spLRYfDp0bG36dxyvtlCPxkKQzM2uh6TPBOOpH9jL17xZt5SeYX9tG6C9s6 Uoq8SPO5iYDzeUyJyQKpIKOeA1cYcxPOnWlef/yoBART8Omda9gT3WX/XIS9W/qiKEuA0+vzZJl gh3KGJ2CSH/MFbuZIb7mykU+uBAqL3D+vpd7RVvdBFKrCsqANOtVavitwFEjk2CQKwYLo+uGtoA OFznZ+HMNA2wekGAJDxy3+eyFgQOit8GQcjdL+aUIxoHl31hCMFVUaNPX9Chi5rG0WuJTy+gjhz f14Mzsc0wOBDEXjy6STfa00N9anme50wc6+jh0d2MWEW5ZEIqp77iOPBkd44hkSKTK4tmL4eLvG rFVSD36zSyRH/rShVJrA5R/6ysvgmsLD9Ut/vMbG+yGVdZdxPxiV+zDDzoGr90t9gLe3LrNOnXV atrpdi2Vrhn8m+nemApfR6A9hnyuZHVI2GUea0+XayisbEiM9o8XfC3/cb3NvMgM9/YMrKnyEXu EOpztPcJVWEeLWyP2d7kglrL4fE4hsalPq7hjM95+yjliCZT9V0rnPGk+j7pWmPezGfF1HmlpY0 U1hcxPBtFZBdmVGMnFtN6sAGtdf49Ieuyd5usKWobugD8OYBeueOA/FxCeWjdWZsXzF+uJqbPEG 9CmD3httFMdh3LA== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 To emulate some HDR features of displays, it is required to expose some properties on HDMI, eDP and DP connectors. Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/tests/vkms_config_test.c | 3 +++ drivers/gpu/drm/vkms/vkms_config.c | 1 + drivers/gpu/drm/vkms/vkms_config.h | 26 +++++++++++++++++++++++= +++ drivers/gpu/drm/vkms/vkms_connector.c | 15 +++++++++++++++ 4 files changed, 45 insertions(+) diff --git a/drivers/gpu/drm/vkms/tests/vkms_config_test.c b/drivers/gpu/dr= m/vkms/tests/vkms_config_test.c index 8633210342a4..a89ccd75060d 100644 --- a/drivers/gpu/drm/vkms/tests/vkms_config_test.c +++ b/drivers/gpu/drm/vkms/tests/vkms_config_test.c @@ -187,6 +187,9 @@ static void vkms_config_test_default_config(struct kuni= t *test) vkms_config_for_each_connector(config, connector_cfg) { KUNIT_EXPECT_EQ(test, vkms_config_connector_get_type(connector_cfg), DRM_MODE_CONNECTOR_VIRTUAL); + KUNIT_EXPECT_EQ(test, + vkms_config_connector_get_supported_colorspaces(connector_cfg), + 0); } =20 KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index 20750c9f6d08..56e2082b91c9 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -772,6 +772,7 @@ struct vkms_config_connector *vkms_config_create_connec= tor(struct vkms_config *c connector_cfg->config =3D config; connector_cfg->status =3D connector_status_connected; vkms_config_connector_set_type(connector_cfg, DRM_MODE_CONNECTOR_VIRTUAL); + vkms_config_connector_set_supported_colorspaces(connector_cfg, 0); xa_init_flags(&connector_cfg->possible_encoders, XA_FLAGS_ALLOC); =20 list_add_tail(&connector_cfg->link, &config->connectors); diff --git a/drivers/gpu/drm/vkms/vkms_config.h b/drivers/gpu/drm/vkms/vkms= _config.h index 36d289a010f6..ec614c2d4a30 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -141,6 +141,7 @@ struct vkms_config_connector { =20 int type; enum drm_connector_status status; + u32 supported_colorspaces; struct xarray possible_encoders; =20 /* Internal usage */ @@ -239,6 +240,31 @@ struct vkms_config *vkms_config_default_create(bool en= able_cursor, */ void vkms_config_destroy(struct vkms_config *config); =20 +/** + * vkms_config_connector_set_supported_colorspaces() - Set the supported c= olorspaces for a connector + * @connector_cfg: Connector configuration to modify + * @supported_colorspaces: Bitmask of supported colorspaces (DRM_COLOR_YCB= CR_*) + */ +static inline void +vkms_config_connector_set_supported_colorspaces(struct vkms_config_connect= or *connector_cfg, + u32 supported_colorspaces) +{ + connector_cfg->supported_colorspaces =3D supported_colorspaces; +} + +/** + * vkms_config_connector_get_supported_colorspaces() - Get the supported c= olorspaces for a connector + * @connector_cfg: Connector configuration to query + * + * Returns: + * Bitmask of supported colorspaces (DRM_COLOR_YCBCR_*) + */ +static inline u32 +vkms_config_connector_get_supported_colorspaces(struct vkms_config_connect= or *connector_cfg) +{ + return connector_cfg->supported_colorspaces; +} + /** * vkms_config_get_device_name() - Return the name of the device * @config: Configuration to get the device name from diff --git a/drivers/gpu/drm/vkms/vkms_connector.c b/drivers/gpu/drm/vkms/v= kms_connector.c index 5a87dc2d4c63..cc59d13c2d22 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.c +++ b/drivers/gpu/drm/vkms/vkms_connector.c @@ -84,6 +84,21 @@ struct vkms_connector *vkms_connector_init(struct vkms_d= evice *vkmsdev, if (ret) return ERR_PTR(ret); =20 + if (vkms_config_connector_get_supported_colorspaces(connector_cfg)) { + if (connector_cfg->type =3D=3D DRM_MODE_CONNECTOR_HDMIA) { + drm_mode_create_hdmi_colorspace_property(&connector->base, + vkms_config_connector_get_supported_colorspaces(connector_cfg)); + drm_connector_attach_hdr_output_metadata_property(&connector->base); + drm_connector_attach_colorspace_property(&connector->base); + } else if (connector_cfg->type =3D=3D DRM_MODE_CONNECTOR_DisplayPort || + connector_cfg->type =3D=3D DRM_MODE_CONNECTOR_eDP) { + drm_mode_create_dp_colorspace_property(&connector->base, + vkms_config_connector_get_supported_colorspaces(connector_cf= g)); + drm_connector_attach_hdr_output_metadata_property(&connector->base); + drm_connector_attach_colorspace_property(&connector->base); + } + } + drm_connector_helper_add(&connector->base, &vkms_conn_helper_funcs); =20 return connector; --=20 2.51.0 From nobody Sun Feb 8 08:48:25 2026 Received: from smtpout-03.galae.net (smtpout-03.galae.net [185.246.85.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6B3CD248176 for ; Sat, 18 Oct 2025 02:02:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.85.4 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752950; cv=none; b=IBheCs2TWmNwlJ7WRFKTA+AGgUg0xkyMPwza9wsq66ixax27Td9CSe7bZSZAmMloI7UU3oHuxDhwR07nTxW/PYUAM1OnC/35fDl3Ry/5Ccz70bSJ0KuUEzDe4WEVLyBFjsGUNYrPvSs/OoJOkD3mTFK2kfZEqBSl07O8WeS5DfA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752950; c=relaxed/simple; bh=hRacqbEqpcRVbYp59Qv1f5zGs1dDRy0uDoAy0TH4mtk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=DM8RL9ydS5b6Ni/cAufwH8h4rx396o3glToRWtiEB+9ly73/g5HSaSQ0iMKUGoyol3z6F6cdriSKbgvlNzTma4EnosZyd9K3x0EFuMjl3arY+xuRPIhlBXg/CvMyFml/bkj7GGIxHPvZFs9XOpuiYfD1ZWJ6M7dOTzwVTuyP5Zw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=RzabVN2q; arc=none smtp.client-ip=185.246.85.4 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="RzabVN2q" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id F32854E4115A; Sat, 18 Oct 2025 02:02:26 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id C39BE60701; Sat, 18 Oct 2025 02:02:26 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 4183E102F2374; Sat, 18 Oct 2025 04:02:24 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1760752945; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=/8I2MEdh++U8+vOGiB+Dp1EDa9gPj+KSXHZv6j9iBNk=; b=RzabVN2qsRox24jUqmDInDDPVj8gidOdnRHh3XlsMEmSiVlp8WiHqILOUgzUQfGr6OBID9 kTydwRdj6P19VyUeisFh9k2inTHgWJYOZ7NqbnShIMVau/7GSGy6fsxahG3upojApLT6xa KH6jF989IWxoH8ccUPIVr6E7iM4zwZJtQa0M+xyE3rOX6cp5UdG/j7C96YFUeewF3Ur7OT 7pCf0H59AYQQH6/MrH/QiBn0dPRD3zgp65FnsPJXXfIk0MMN8/GekEe1VlXmU7TQDxAYdq 2nc0C/3HNc+Ogl3hpKByyoW5RD5PxYv6KitWVR/++aN7aIGBR5PrDCyh2E7FSA== From: Louis Chauvet Date: Sat, 18 Oct 2025 04:01:17 +0200 Subject: [PATCH 17/22] drm/vkms: Introduce configfs for connector supported colorspace Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251018-vkms-all-config-v1-17-a7760755d92d@bootlin.com> References: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> In-Reply-To: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=3130; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=hRacqbEqpcRVbYp59Qv1f5zGs1dDRy0uDoAy0TH4mtk=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBo8vT+4veHiMOYckghRdQd54KpIwQAUKA+dI5GA k0xc8vjpeiJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaPL0/gAKCRAgrS7GWxAs 4j9MD/wMCq+88WFwqju/f3HhR2LrUP5noLYTCHemnPUVap6yNyHlXiQ1Rc6yk6gJFH4eWupRnys YTC+dGD+3hpyKTfwINm3bz6kJ3knWOVSC/NN+coJAEWfYRow3/Y6iyX7jJW9etCZsjtOjbzZYrl 8ZcTjodLj1aJ3IcIT0psa3zVnUNAWtXQIJ1kwEgtX9jKEzSgIHto6joBaMcPLuR/GaZI/6jX/02 IUytMIiTsv/kyx83IXc3JnpyhpOKd1RBI5789+c13dnnq4no5KPNFB96PbA+9JisQnesTMAghmo IulCxAcXPZH+5n1q3pf+7/5feAZiyZFLQITNY31sZmmVouHG1oliyhzh6z3n2CTalRxxfAIuI3c VEZ4Ktg5mrhhdGGm8O4VwDbPHhDRasPXN2d8vQ4Qop3hz0yyUXzJhIarK+6rbKwYcWkrMCh85ET 9uTtGcBP9yzO+DTEmr3+DL1so2gKoenFNPKcBYEQIMTmnAoiM4QNaCYO34Tj7/sSgthpL0+jo50 AlHhnPbCYwyfpziHIN4FPMJrz5ZgNqybS/dHOnZZjzGcUOCrc26Oaayfdx8FjIoX+PKWRuhW7fF 5mv68UeR/72o+F8sLix/TDkh+D6G8VbjY2cxvq6qXxGT3makb8DyYRT6NbhVvSJoMKi5PYO0yBl 107iG05zVOtR7kw== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Add the attribute supported_colorspaces to configure the supported colorspace of a connector. It will allows emulating some HDR features of displays. This feature is only supported for HDMI, DP and eDP connectors. Signed-off-by: Louis Chauvet --- Documentation/gpu/vkms.rst | 7 ++++++- drivers/gpu/drm/vkms/vkms_configfs.c | 39 ++++++++++++++++++++++++++++++++= ++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index 97ea11a86bd1..650d6f6e79fd 100644 --- a/Documentation/gpu/vkms.rst +++ b/Documentation/gpu/vkms.rst @@ -135,11 +135,16 @@ Last but not least, create one or more connectors:: =20 sudo mkdir /config/vkms/my-vkms/connectors/connector0 =20 -Connectors have 2 configurable attribute: +Connectors have 3 configurable attribute: =20 - status: Connection status: 1 connected, 2 disconnected, 3 unknown (same = values as those exposed by the "status" property of a connector) - type: Type of connector. Same values as exposed by the "type" field in d= rm_connector. +- supported_colorspaces: Supported colorspaces values for HDMI, DP and eDP= connectors. + If supported_colorspaces is not 0, the HDR_OUTPUT_METADATA will also be = created. + Value is a bitfield, 0x1 =3D NO_DATA, 0x2 =3D SMPTE_170M_YCC... see enum= drm_colorspace + for full list. + =20 To finish the configuration, link the different pipeline items:: =20 diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vk= ms_configfs.c index 0cf7cee4eb0f..909f4557caec 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -1185,12 +1185,51 @@ static ssize_t connector_type_store(struct config_i= tem *item, return count; } =20 +static ssize_t connector_supported_colorspaces_show(struct config_item *it= em, char *page) +{ + struct vkms_configfs_connector *connector; + int type; + + connector =3D connector_item_to_vkms_configfs_connector(item); + + scoped_guard(mutex, &connector->dev->lock) + type =3D vkms_config_connector_get_supported_colorspaces(connector->conf= ig); + + return sprintf(page, "%u", type); +} + +static ssize_t connector_supported_colorspaces_store(struct config_item *i= tem, + const char *page, size_t count) +{ + struct vkms_configfs_connector *connector; + int val, ret; + + connector =3D connector_item_to_vkms_configfs_connector(item); + + ret =3D kstrtouint(page, 10, &val); + if (ret) + return ret; + + if ((val & -BIT(DRM_MODE_COLORIMETRY_COUNT)) !=3D 0) + return -EINVAL; + + scoped_guard(mutex, &connector->dev->lock) { + if (connector->dev->enabled) + return -EBUSY; + vkms_config_connector_set_supported_colorspaces(connector->config, val); + } + + return count; +} + CONFIGFS_ATTR(connector_, status); CONFIGFS_ATTR(connector_, type); +CONFIGFS_ATTR(connector_, supported_colorspaces); =20 static struct configfs_attribute *connector_item_attrs[] =3D { &connector_attr_status, &connector_attr_type, + &connector_attr_supported_colorspaces, NULL, }; =20 --=20 2.51.0 From nobody Sun Feb 8 08:48:25 2026 Received: from smtpout-04.galae.net (smtpout-04.galae.net [185.171.202.116]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BBA2E23ED5E for ; Sat, 18 Oct 2025 02:02:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752951; cv=none; b=s7dkCjkUJbxkOgxSclpwZxL/EKpCEaZ3FpgUaJ9Lk7MCVycfFQucH3NuXAU3bhOzYWUKbX2tcgF9LHLE/mEI+J34kqsjdneHWS8rPoR1beerIYl8OQIfB8YOBdrYOwiCTYKhYk8ADLTT+/mcX71s3y9GuOBRIh+hyVN6R34AR1E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752951; c=relaxed/simple; bh=YCshRJ9iZSgkDt526dfmqKnCSvnelBSFC+J5vxTUkug=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=PjoKB+jr2fgBkGX3MQdfFIkDs3So3i2uRWnqW5mjOBQjlJ/e8ehH8IF72f/IJP2O2t/pbmSaGAVvAOXrCaspyKJA03ASbNRlFwoYNAmMb4EmpEMziGWK0vz4pAkfHgthY2ZFZY18Qm/B04xI2h3E7D7u0oK8hOJ281apgkbJY4o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=BIkNl81f; arc=none smtp.client-ip=185.171.202.116 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="BIkNl81f" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 2ED2CC035A7; Sat, 18 Oct 2025 02:02:09 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 84FA160701; Sat, 18 Oct 2025 02:02:28 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 3613A102F236F; Sat, 18 Oct 2025 04:02:25 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1760752947; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=j18n1xqJ/n23mu+nfKOjoC1n/Jmz1a8pcemwIbutF6s=; b=BIkNl81fl8h1nBwz1l3scG0jT2tGql2LiD9ucYWJAmWyJ0bUGhD/snTIcQZB2yI+NDX6NX 8wTF90u6Ryv4456NAhbOckE5YrqtDrn9lDiHkDAI9s6X8UgVTmOwb98miFzg8f8cqtNgWW jNFtSGSu2ABJfiQohj8VJpvlExq1mJ6A3KbfiD8M57zFIg56dQAwK5fESkmibNvK2Dn2GY lyAqkamFlybgbfUrK0BqfBuRsmNj425f4pOmfBnpw5Sk7JsyGkkJhhliTuDr+hsZTrjVig acGNLRPR3dVrMDvPIZeyyEMA2j4iLaWysge3OMcsPgE4GxwfTIHII5A3kTaUrw== From: Louis Chauvet Date: Sat, 18 Oct 2025 04:01:18 +0200 Subject: [PATCH 18/22] drm/vkms: Introduce config for connector EDID Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251018-vkms-all-config-v1-18-a7760755d92d@bootlin.com> References: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> In-Reply-To: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=6834; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=YCshRJ9iZSgkDt526dfmqKnCSvnelBSFC+J5vxTUkug=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBo8vT+YGVaIJ0xr2TExZUChUmUDy1OTr7xeemzL 4bkQfvLbGqJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaPL0/gAKCRAgrS7GWxAs 4p09EAC6HAAgNB9DxaV4KUipen+esFrnBuI0hN04CR/puyupBa+U+BRVmcvIIotQWNuPEb1ieXc caR14SAHF5Zzfi5fW/5mR+Atj1qpufcopudhSuWsFGu4QcELvGSS287knuriZhmj8HYl7tpuBgS 4cUKY7gr21tOEkpuCOyD+7lALB43tBVXLiCUGZqrJ5kL4+QYP5knTnf8Y2FGI7fO3BCyQzVL40r Fu+QUvsU5O7H5dCXvxXnkNmrZHmj7EqvdCif/GpEL9VLDMEGma4rpCYIT1WJJRq+yABmTkkjzhI MJ5x99ZJj4L9FbXFwdpOW6Mxm3acSOFgjjUqfV2I/pRd/BBEvQ0TFPRU7nkIgJF5m8ICyszpxc6 rA/3dJ0DWfnILzim0F48UqRiVAnTCgZYGme7w9NjWag1Pyy1B8BB4jjf2PFWtaJAOKqu0YH8VYY 0ga2uVmCZpiPGvDq1nvGVRUpkVi+n+5ZkGVsOEH53Vg5tPHoauZrIg0rSjEQo+A3fyADsHRYYGi ASZUAM3dJpRR51N7PngRCyvQoMDYghLXAx9E3iArB+T9N2Bxr+wCorSEKJOatr3Ags0+H622cfF 846KP0p7iS6Ohn0QSLP18wNpUj5CDumCqS5XZap10wdOL002vdQtHJF0SlDQzqMTl2I/WXZvXRz bnWGpDixqn6R0hA== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Allows configuration of EDID for each connector. Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/tests/vkms_config_test.c | 2 + drivers/gpu/drm/vkms/vkms_config.h | 77 +++++++++++++++++++++++= ++++ drivers/gpu/drm/vkms/vkms_connector.c | 48 +++++++++++++++-- 3 files changed, 123 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/vkms/tests/vkms_config_test.c b/drivers/gpu/dr= m/vkms/tests/vkms_config_test.c index a89ccd75060d..d1e380da31ff 100644 --- a/drivers/gpu/drm/vkms/tests/vkms_config_test.c +++ b/drivers/gpu/drm/vkms/tests/vkms_config_test.c @@ -190,6 +190,8 @@ static void vkms_config_test_default_config(struct kuni= t *test) KUNIT_EXPECT_EQ(test, vkms_config_connector_get_supported_colorspaces(connector_cfg), 0); + KUNIT_EXPECT_EQ(test, vkms_config_connector_get_edid_enabled(connector_c= fg), + false); } =20 KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); diff --git a/drivers/gpu/drm/vkms/vkms_config.h b/drivers/gpu/drm/vkms/vkms= _config.h index ec614c2d4a30..eaf76a58aab6 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -129,6 +129,8 @@ struct vkms_config_encoder { * @type: Store the type of connector using DRM_MODE_CONNECTOR_* values * @config: The vkms_config this connector belongs to * @status: Status (connected, disconnected...) of the connector + * @edid: Stores the current EDID + * @edid_len: Current EDID length * @possible_encoders: Array of encoders that can be used with this connec= tor * @connector: Internal usage. This pointer should never be considered as = valid. * It can be used to store a temporary reference to a VKMS con= nector @@ -142,6 +144,9 @@ struct vkms_config_connector { int type; enum drm_connector_status status; u32 supported_colorspaces; + bool edid_enabled; + u8 *edid; + unsigned int edid_len; struct xarray possible_encoders; =20 /* Internal usage */ @@ -265,6 +270,78 @@ vkms_config_connector_get_supported_colorspaces(struct= vkms_config_connector *co return connector_cfg->supported_colorspaces; } =20 +/** + * vkms_config_connector_get_edid_enabled() - Check if EDID is enabled for= a connector + * @connector_cfg: Connector configuration to check + * + * Returns: + * True if EDID is enabled for this connector, false otherwise. + */ +static inline bool +vkms_config_connector_get_edid_enabled(struct vkms_config_connector *conne= ctor_cfg) +{ + return connector_cfg->edid_enabled; +} + +/** + * vkms_config_connector_set_edid_enabled() - Enable or disable EDID for a= connector + * @connector_cfg: Connector configuration to modify + * @enabled: Whether to enable EDID for this connector + */ +static inline void +vkms_config_connector_set_edid_enabled(struct vkms_config_connector *conne= ctor_cfg, + bool enabled) +{ + connector_cfg->edid_enabled =3D enabled; +} + +/** + * vkms_config_connector_get_edid() - Get the EDID data for a connector + * @connector_cfg: Connector configuration to get the EDID from + * @len: Pointer to store the length of the EDID data + * + * Returns: + * Pointer to the EDID data buffer, or NULL if no EDID is set. + * The length of the EDID data is stored in @len. + */ +static inline const u8 * +vkms_config_connector_get_edid(const struct vkms_config_connector *connect= or_cfg, int *len) +{ + *len =3D connector_cfg->edid_len; + return connector_cfg->edid; +} + +/** + * vkms_config_connector_set_edid() - Set the EDID data for a connector + * @connector_cfg: Connector configuration to modify + * @edid: Pointer to the EDID data buffer + * @len: Length of the EDID data + * + * If @len is 0, the EDID data will be cleared. If memory allocation fails, + * the existing EDID data will be preserved. + */ +static inline void +vkms_config_connector_set_edid(struct vkms_config_connector *connector_cfg, + const u8 *edid, unsigned int len) +{ + if (len) { + void *edid_tmp =3D krealloc(connector_cfg->edid, len, GFP_KERNEL); + + if (edid_tmp) { + connector_cfg->edid =3D edid_tmp; + memcpy(connector_cfg->edid, edid, len); + connector_cfg->edid_len =3D len; + } else { + kfree(connector_cfg->edid); + connector_cfg->edid_len =3D 0; + } + } else { + kfree(connector_cfg->edid); + connector_cfg->edid =3D NULL; + connector_cfg->edid_len =3D len; + } +} + /** * vkms_config_get_device_name() - Return the name of the device * @config: Configuration to get the device name from diff --git a/drivers/gpu/drm/vkms/vkms_connector.c b/drivers/gpu/drm/vkms/v= kms_connector.c index cc59d13c2d22..339d747e729e 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.c +++ b/drivers/gpu/drm/vkms/vkms_connector.c @@ -42,13 +42,53 @@ static const struct drm_connector_funcs vkms_connector_= funcs =3D { .atomic_destroy_state =3D drm_atomic_helper_connector_destroy_state, }; =20 +static int vkms_connector_read_block(void *context, u8 *buf, unsigned int = block, size_t len) +{ + struct vkms_config_connector *config =3D context; + unsigned int edid_len; + const u8 *edid =3D vkms_config_connector_get_edid(config, &edid_len); + + if (block * len + len > edid_len) + return 1; + memcpy(buf, &edid[block * len], len); + return 0; +} + static int vkms_conn_get_modes(struct drm_connector *connector) { - int count; + struct vkms_connector *vkms_connector =3D drm_connector_to_vkms_connector= (connector); + const struct drm_edid *drm_edid =3D NULL; + int count =3D 0; + struct vkms_config_connector *context =3D NULL; + struct drm_device *dev =3D connector->dev; + struct vkms_device *vkmsdev =3D drm_device_to_vkms_device(dev); + struct vkms_config_connector *connector_cfg; =20 - /* Use the default modes list from DRM */ - count =3D drm_add_modes_noedid(connector, XRES_MAX, YRES_MAX); - drm_set_preferred_mode(connector, XRES_DEF, YRES_DEF); + vkms_config_for_each_connector(vkmsdev->config, connector_cfg) { + if (connector_cfg->connector =3D=3D vkms_connector) + context =3D connector_cfg; + } + if (context) { + if (vkms_config_connector_get_edid_enabled(context)) { + drm_edid =3D drm_edid_read_custom(connector, + vkms_connector_read_block, context); + + /* + * Unconditionally update the connector. If the EDID was read + * successfully, fill in the connector information derived from the + * EDID. Otherwise, if the EDID is NULL, clear the connector + * information. + */ + drm_edid_connector_update(connector, drm_edid); + + count =3D drm_edid_connector_add_modes(connector); + + drm_edid_free(drm_edid); + } else { + count =3D drm_add_modes_noedid(connector, XRES_MAX, YRES_MAX); + drm_set_preferred_mode(connector, XRES_DEF, YRES_DEF); + } + } =20 return count; } --=20 2.51.0 From nobody Sun Feb 8 08:48:25 2026 Received: from smtpout-04.galae.net (smtpout-04.galae.net [185.171.202.116]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DC6902512C8 for ; Sat, 18 Oct 2025 02:02:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752955; cv=none; b=MsLr+ygHRnRD0aSplCIcEA+fMxZE5hOGUPhB3pRV28ijLjWaivAy9USrWa3WomcyA4WpHIUipGZL1HvwOn714WlM10sqCQv7SbfEAeM8J84Dzi0BANZmFbnz3ptTSVyFvOxVNu7ydIx5Bh+bsfuLDv3DfTpwt2+0fesRG6Ihz0o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752955; c=relaxed/simple; bh=29+P4pWa8FWUP1XwE/tCMa4X1wBauIadGEuAgBL8wcs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=uTy3Gde7F5eq2cGZ/+wuImzm03P6YMmZzJvTxUYWJJ23H48MuXlT6HC8F7baaRCBCWNrcO5UOR8gpg2Hnc0Wyvf3eLX4TlZM1tvE7h5kDudw6ES+zTfWz5pdyJzw3RkWCEIfPUtyG9ZUIvbP4WM/rZH05uWobWfappt8GN1tAcs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=e3/+m6pa; arc=none smtp.client-ip=185.171.202.116 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="e3/+m6pa" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 5269EC041FD; Sat, 18 Oct 2025 02:02:11 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id A72FE60701; Sat, 18 Oct 2025 02:02:30 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 45F7E102F236C; Sat, 18 Oct 2025 04:02:28 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1760752949; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=3WsXha5E73t8H3r1jXZgYyBkA1sGJtDmBUPYHsAPgho=; b=e3/+m6paQCIv/rZUbfcao0pEFooQwtorz9C3j91XWW0gJAu5PLHhN4mcXXjugPumMAsdQJ ZPduGQF6mPCIJDxpSF58lpxXtZ7SkdOPu3NBHaajGbYAOl/RiO6owRyGoR4E2b3oNlVrpS 3hKrRsewvxLRMoZ2J+cwG5LWmCTwNjE68eY9I9uUOT2TmvmU+W8VkItnzqNY33KRarHsGY Pa/3tLgizGCWUaRDZhjTQtGfYoOkQk6vTZq0flVggUtZ8n2iehePL/G8paGMYYckmToNrh 9WgTPJ0JzppGhUw74p8/EIY5mZYaHZvX+JAME/qG4Q9+Zt+WuneCIvI0ttt0bQ== From: Louis Chauvet Date: Sat, 18 Oct 2025 04:01:19 +0200 Subject: [PATCH 19/22] drm/vkms: Introduce configfs for connector EDID Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251018-vkms-all-config-v1-19-a7760755d92d@bootlin.com> References: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> In-Reply-To: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=4873; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=29+P4pWa8FWUP1XwE/tCMa4X1wBauIadGEuAgBL8wcs=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBo8vT/s/CkQqnu5wUsyu7DMmkVLS/BHAGpY03MX eDbMs4G4RyJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaPL0/wAKCRAgrS7GWxAs 4gdsEACi8ysFOTzAs6OWBQ0nBsvZF0gjkHu9dgzrC+VUepM8QCoRO1Lp8Yd4UukCcZVnmqEqY52 nMMdJFWNT2wBTduT0zIk40lLwPUMnh5gtTKcerulGPg1r1N2AXJZ1XOhZZcsX4ec3tHB6gInJ9l Ql68HZsMbY7U+/Kcx3Q6Ca5+3Y+be98fk6orfSv3lEkPNNC8utDUlexF7tX6Bz37ghWBykC0n41 phtGlwidsgZBtNEENF/zvOI8kn0cmo5W8UtfIPmsfXxlSi57KgZUapSAzQpqgQtKOIcHFxwOGa0 TD27JS3+4WBNxIqbtsuHlBKyoE77VJzO2JASJvLGvRHwGsOY+FD10hrDA53d3wZkjSyH+GUF8Qp hR3K1p6FJgZcsHBBzdpioAbTDVniMmaNRSQy2M6DvqnGT1e6mNEqEsoRqq7z//ULlOckQrshQDV M6HVxhFH1bxMDh5+9LyXmn1y/BuxpXhm53QH5dfqscDCOXFL299GO4+HniZB66YapPUCSaFX8Tr GXrYC+967k0TuWC/aDOTNUL9xuGtEPR9pFdqElYt7IVEHfJ+kJtCJNr7GX08d/wxytgyO2AobxH LloEw0XMBoEt/QoSwN8dVFdybfq7fWusuarO9adN3odt7jMAbM7fJKHZVhFXXqxd+/hVw9Ydorc 5AQWORh2bVuTW7Q== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Introduce new attributes to configure EDID of a connector: - edid_enable - chose if the connector will have an EDD or not - edid - raw edid content Due to limitation of ConfigFS, the max len of EDID is PAGE_SIZE (4kB on x86), it should be sufficient for many tests. One possible evolution is using a ConfigFS blob to allow bigger EDID. Signed-off-by: Louis Chauvet --- Documentation/gpu/vkms.rst | 5 ++- drivers/gpu/drm/vkms/vkms_configfs.c | 81 ++++++++++++++++++++++++++++++++= +++- 2 files changed, 84 insertions(+), 2 deletions(-) diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index 650d6f6e79fd..bbd03f61e61c 100644 --- a/Documentation/gpu/vkms.rst +++ b/Documentation/gpu/vkms.rst @@ -135,7 +135,7 @@ Last but not least, create one or more connectors:: =20 sudo mkdir /config/vkms/my-vkms/connectors/connector0 =20 -Connectors have 3 configurable attribute: +Connectors have 5 configurable attribute: =20 - status: Connection status: 1 connected, 2 disconnected, 3 unknown (same = values as those exposed by the "status" property of a connector) @@ -144,6 +144,9 @@ Connectors have 3 configurable attribute: If supported_colorspaces is not 0, the HDR_OUTPUT_METADATA will also be = created. Value is a bitfield, 0x1 =3D NO_DATA, 0x2 =3D SMPTE_170M_YCC... see enum= drm_colorspace for full list. +- edid_enabled: Enable or not EDID for this connector. Some connectors may= not have an + EDID but just a list of modes, this attribute allows to disable EDID pro= perty. +- edid: Content of the EDID. Ignored if edid_enabled is not set =20 =20 To finish the configuration, link the different pipeline items:: diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vk= ms_configfs.c index 909f4557caec..a977c0842cd6 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -1,5 +1,4 @@ // SPDX-License-Identifier: GPL-2.0+ -#include "asm-generic/errno-base.h" #include #include #include @@ -1222,14 +1221,94 @@ static ssize_t connector_supported_colorspaces_stor= e(struct config_item *item, return count; } =20 +static ssize_t connector_edid_enabled_show(struct config_item *item, char = *page) +{ + struct vkms_configfs_connector *connector; + bool enabled; + + connector =3D connector_item_to_vkms_configfs_connector(item); + + scoped_guard(mutex, &connector->dev->lock) + enabled =3D vkms_config_connector_get_edid_enabled(connector->config); + + return sprintf(page, "%d\n", enabled); +} + +static ssize_t connector_edid_enabled_store(struct config_item *item, + const char *page, size_t count) +{ + struct vkms_configfs_connector *connector; + struct vkms_config_connector *connector_cfg; + bool enabled; + + connector =3D connector_item_to_vkms_configfs_connector(item); + connector_cfg =3D connector->config; + + if (kstrtobool(page, &enabled)) + return -EINVAL; + + scoped_guard(mutex, &connector->dev->lock) + { + vkms_config_connector_set_edid_enabled(connector_cfg, enabled); + + if (connector->dev->enabled && + vkms_config_connector_get_status(connector_cfg) !=3D + connector_status_disconnected) + vkms_trigger_connector_hotplug(connector->dev->config->dev); + } + return count; +} + +static ssize_t connector_edid_show(struct config_item *item, char *page) +{ + struct vkms_configfs_connector *connector; + + connector =3D connector_item_to_vkms_configfs_connector(item); + + scoped_guard(mutex, &connector->dev->lock) + { + unsigned int len =3D 0; + const u8 *edid =3D vkms_config_connector_get_edid(connector->config, &le= n); + + memcpy(page, edid, min(len, PAGE_SIZE)); + return min(len, PAGE_SIZE); + } + + return -EINVAL; +} + +static ssize_t connector_edid_store(struct config_item *item, + const char *page, size_t count) +{ + struct vkms_configfs_connector *connector; + + connector =3D connector_item_to_vkms_configfs_connector(item); + + scoped_guard(mutex, &connector->dev->lock) + { + vkms_config_connector_set_edid(connector->config, page, count); + + if (connector->dev->enabled && + vkms_config_connector_get_status(connector->config) !=3D + connector_status_disconnected) + vkms_trigger_connector_hotplug(connector->dev->config->dev); + } + + return count; +} + CONFIGFS_ATTR(connector_, status); CONFIGFS_ATTR(connector_, type); CONFIGFS_ATTR(connector_, supported_colorspaces); +CONFIGFS_ATTR(connector_, edid_enabled); +CONFIGFS_ATTR(connector_, edid); =20 static struct configfs_attribute *connector_item_attrs[] =3D { &connector_attr_status, &connector_attr_type, &connector_attr_supported_colorspaces, + &connector_attr_edid_enabled, + &connector_attr_edid, NULL, }; =20 --=20 2.51.0 From nobody Sun Feb 8 08:48:25 2026 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C5DDB252906; Sat, 18 Oct 2025 02:02:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752956; cv=none; b=uVRCLw0klOCsL/HmRqE6TdPQb/I+JqPxtGTHWrWxDmS8bdfpZ/Bbfnrx7LeMqEtDYJCcDB9iLUNQjzeDw+DzQr1DLUIXTc7UrhcFHiIFkqy86o4o1nJ1NQo0RJ2q7IyE6/yVlxgbQl6PWt/aDbMUXV6GqZJ147YvgLCkMkO0Tek= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752956; c=relaxed/simple; bh=8VvJUvuGWIERwcAsm32j+6lc7oBxnvtA0YFDiz8tItI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=pmFDa8GodMsWZdqHDWxkDZOUtwXy4JuUqY11EV4q+kRv76GRiKq0T+aqPS1jO/gySiHQmnkdt5g0Iur20cfAgZPY1fMKhZ4E/2y4biwl8C1PyGQp4Hklhvne06hrdvjGE1ir+HYroISrIE+Q31cncGp7HFk1HtsNnA2j/dwreNI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=CMQjxjPe; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="CMQjxjPe" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 81D7C1A14AA; Sat, 18 Oct 2025 02:02:33 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 570FA60701; Sat, 18 Oct 2025 02:02:33 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 45AD0102F2380; Sat, 18 Oct 2025 04:02:29 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1760752952; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=fTuFMJDTvbkZgKvZRV0c+t3F6zz7i8FZBsHDq+i8lt0=; b=CMQjxjPe61gbADGaU9ran+x6EE9Cr4amkxJ+p9wkq6n0pfd+YozDqODVziDkSAShkkbyDD paZBGCO3om0YWVI5o7ItLju63WgSxsqpFIcHkEdcZA19XQI7GHE/lLbBagyza0PK3xgS06 FO6CG9BN8POZ5GRKZOAm2EKCqNOkdfUax1Bcv0hSjI97Rp2wa6yJzCRzcPNlPicNgzpcOY 5buKOvm40M9QD6LlcBVP6IoMIA427ZBZw9GevWaXJ1lFqpfWym46sOZ8iLBZ5X7kBwb6Pz u+Uc+VNLZaosIUHCk2R5fuExqUNQ3t+YmlyGNiTD3mcknN1gJuHHohHp4Jwd0Q== From: Louis Chauvet Date: Sat, 18 Oct 2025 04:01:20 +0200 Subject: [PATCH 20/22] drm/vkms: Store the enabled/disabled status for connector Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251018-vkms-all-config-v1-20-a7760755d92d@bootlin.com> References: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> In-Reply-To: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=5650; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=8VvJUvuGWIERwcAsm32j+6lc7oBxnvtA0YFDiz8tItI=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBo8vT/Bv3MRelY543npUk9NJCYaoZLtSGsFfzcw IZgewWwZeyJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaPL0/wAKCRAgrS7GWxAs 4mTJEACMNq03jBv61NTt1qmfPj9DsRIHmD1AYVxKPVrw8Q3c0N4fHvf81okgQ4d4L1rShy/olic 7jEKDzzL7CqfzsMI4lZwgQFMQQJKySy07UBoNT7AAfPvu+4GjBIAmGcCjD96OXO/9uwgl8H8pV+ XXKNbGywXVhyFKFeeFBd2NJm9enLWFByMc0zCOQLPs0gf5KRXzb+MCf3Buz7fTdUX3aXEcTyuPS oEQOvv+O1zmpudKjkSCrBFl+IZNcZ7KZhgvyKszRVWXBMfo0QyOMqcrbbxMSDiKCv97MBZFkJ3X KT5tp9sEUNTLMwKXfb7mgO27A/GE4wOWSZz5TD/4dFbXxvbsmMdOxl5yUvxri8zzRbmYs9ftlIg lgN3VasAim/Icj8MpESAaMuAWcm1LNqtiHBgMXt2lJ024uDg2mD+6ECc5BoBz+ooEXp8WKaaLvb WBkJqc/kmv5MRZw5Ma7TJ8X9a1uoTRv6m6rZkHQObk3azX1/BDTKTQm20zuX74RXRmHUzlwHBrb 0LQK63sBIYu/JF5yHozvnUo2vVXJ3YIGhcpr/FVeaoqALIEgeykkqagjC03BSM0qisAd/JxFsuX 8ecwXH06JJb3I91NM2DJlhBiplfcljyMajjJpTJ4U2WIu/I4kpwIiELl17VAUkwSKPKgW63kh8w Nqio4lsCDJM/+cg== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 In order to prepare for dynamic connector configuration, we need to store if a connector is dynamic and if it is enabled. The two new vkms_config_connector fields will helps for that. Co-developed-by: Jos=C3=A9 Exp=C3=B3sito Signed-off-by: Jos=C3=A9 Exp=C3=B3sito Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/tests/vkms_config_test.c | 4 ++ drivers/gpu/drm/vkms/vkms_config.c | 2 + drivers/gpu/drm/vkms/vkms_config.h | 66 +++++++++++++++++++++++= ++++ 3 files changed, 72 insertions(+) diff --git a/drivers/gpu/drm/vkms/tests/vkms_config_test.c b/drivers/gpu/dr= m/vkms/tests/vkms_config_test.c index d1e380da31ff..f4b5f8f59fab 100644 --- a/drivers/gpu/drm/vkms/tests/vkms_config_test.c +++ b/drivers/gpu/drm/vkms/tests/vkms_config_test.c @@ -192,6 +192,10 @@ static void vkms_config_test_default_config(struct kun= it *test) 0); KUNIT_EXPECT_EQ(test, vkms_config_connector_get_edid_enabled(connector_c= fg), false); + KUNIT_EXPECT_EQ(test, vkms_config_connector_is_enabled(connector_cfg), + true); + KUNIT_EXPECT_EQ(test, vkms_config_connector_is_dynamic(connector_cfg), + false); } =20 KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index 56e2082b91c9..fd724ae2ebc9 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -773,6 +773,8 @@ struct vkms_config_connector *vkms_config_create_connec= tor(struct vkms_config *c connector_cfg->status =3D connector_status_connected; vkms_config_connector_set_type(connector_cfg, DRM_MODE_CONNECTOR_VIRTUAL); vkms_config_connector_set_supported_colorspaces(connector_cfg, 0); + vkms_config_connector_set_dynamic(connector_cfg, false); + vkms_config_connector_set_enabled(connector_cfg, true); xa_init_flags(&connector_cfg->possible_encoders, XA_FLAGS_ALLOC); =20 list_add_tail(&connector_cfg->link, &config->connectors); diff --git a/drivers/gpu/drm/vkms/vkms_config.h b/drivers/gpu/drm/vkms/vkms= _config.h index eaf76a58aab6..6716b5a85f0d 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -128,6 +128,8 @@ struct vkms_config_encoder { * @link: Link to the others connector in vkms_config * @type: Store the type of connector using DRM_MODE_CONNECTOR_* values * @config: The vkms_config this connector belongs to + * @dynamic: Store if a connector should be created with drm_connector_dyn= amic_init + * @enabled: If @dynamic, this means that the correct is currently registe= red in drm * @status: Status (connected, disconnected...) of the connector * @edid: Stores the current EDID * @edid_len: Current EDID length @@ -142,6 +144,8 @@ struct vkms_config_connector { struct vkms_config *config; =20 int type; + bool enabled; + bool dynamic; enum drm_connector_status status; u32 supported_colorspaces; bool edid_enabled; @@ -185,6 +189,24 @@ struct vkms_config_connector { #define vkms_config_for_each_connector(config, connector_cfg) \ list_for_each_entry((connector_cfg), &(config)->connectors, link) =20 +/** + * vkms_config_for_each_connector_static - Iterate over the static vkms_co= nfig connectors + * @config: &struct vkms_config pointer + * @connector_cfg: &struct vkms_config_connector pointer used as cursor + */ +#define vkms_config_for_each_connector_static(config, connector_cfg) \ + vkms_config_for_each_connector((config), (connector_cfg)) \ + if (!(connector_cfg)->dynamic) + +/** + * vkms_config_for_each_connector_dynamic - Iterate over the dynamic vkms_= config connectors + * @config: &struct vkms_config pointer + * @connector_cfg: &struct vkms_config_connector pointer used as cursor + */ +#define vkms_config_for_each_connector_dynamic(config, connector_cfg) \ + vkms_config_for_each_connector((config), (connector_cfg)) \ + if ((connector_cfg)->dynamic) + /** * vkms_config_plane_for_each_possible_crtc - Iterate over the vkms_config= _plane * possible CRTCs @@ -441,6 +463,50 @@ vkms_config_connector_set_type(struct vkms_config_conn= ector *connector_cfg, connector_cfg->type =3D type; } =20 +/** + * vkms_config_connector_set_enabled() - If the connector is part of the d= evice + * @crtc_cfg: Target connector + * @enabled: Add or remove the connector + */ +static inline void +vkms_config_connector_set_enabled(struct vkms_config_connector *connector_= cfg, + bool enabled) +{ + connector_cfg->enabled =3D enabled; +} + +/** + * vkms_config_connector_is_enabled() - If the connector is part of the de= vice + * @connector_cfg: The connector + */ +static inline bool +vkms_config_connector_is_enabled(struct vkms_config_connector *connector_c= fg) +{ + return connector_cfg->enabled; +} + +/** + * vkms_config_connector_set_dynamic() - If the connector is dynamic + * @crtc_cfg: Target connector + * @enabled: Enable or disable the dynamic status + */ +static inline void +vkms_config_connector_set_dynamic(struct vkms_config_connector *connector_= cfg, + bool dynamic) +{ + connector_cfg->dynamic =3D dynamic; +} + +/** + * vkms_config_connector_is_enabled() - If the connector is dynamic + * @connector_cfg: The connector + */ +static inline bool +vkms_config_connector_is_dynamic(struct vkms_config_connector *connector_c= fg) +{ + return connector_cfg->dynamic; +} + /* * vkms_config_plane_get_default_rotation() - Get the default rotation for= a plane * @plane_cfg: Plane to get the default rotation from --=20 2.51.0 From nobody Sun Feb 8 08:48:25 2026 Received: from smtpout-03.galae.net (smtpout-03.galae.net [185.246.85.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 28A9D257AEC for ; Sat, 18 Oct 2025 02:02:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.85.4 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752959; cv=none; b=BAEaUtBzhWEQE0/2YAkTgnSVaF7NcNlFtr1GVEsFwArRsiURpAEZjyPF4DTnBWxqAkvU5Aj+UGtcw1Y3Ua69dzX4u2S5OJ8qInZUNxKNi/OviQoGV8hrqCsbwqRJNHLeUl2jagC//kDvB/f9CSEaQF5T7fHGe+dWRa6lYCIp4ic= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752959; c=relaxed/simple; bh=n/TUWMmpq4dd0zrl97U7Cy/fzIJ7zW/B559BiiwA9cc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=oYxGYOW5dD8xF93sedmi/Ygokm+b1wpfy1uMSFsQzwNkLLIcchetuBz8gXYLGyMOnKvNDwoEOs4ZM1ABJ6CCKriE3pt23kAlaKZmJXDZL/zSHAbOYv5UxMUpaDOktrGPr4rUbuf7It8SQiOabRICfDVpB4d+A+8QtQlL1w278Zg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=1S1NU44p; arc=none smtp.client-ip=185.246.85.4 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="1S1NU44p" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id AB0474E4115A; Sat, 18 Oct 2025 02:02:35 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 7B3FB60701; Sat, 18 Oct 2025 02:02:35 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id DE74B102F236C; Sat, 18 Oct 2025 04:02:32 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1760752954; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=ta6irOMcEcp1YBicQLuCCFuYYSODKhAhGoGBn99PT74=; b=1S1NU44pxqunPlUcrTsYORW3h+j1VEvyDMgSt4q+J8xlMskItpb/iHfdEz9m+D/H7sdb/o euKh/SpNhdmaE5cyNEuKObrLvgKQjrk3vBxD566Uyqmil0gSLVDzlVJA0g+SiHApiR8k68 lf3KEpAls/WqAXHYmiIYVajK3tBCpoAoxRQs3Cszqbwr0csrIpjN0iujyvgqrRKyb4L/5v Dvsbc25NgAs4Wbs5yMFgVGTtRw9mae2AK8xNTdmu+I990rLKF1g44p9ug0deVXKwbpBFpG Np0Y83ksd218r1PPKmaTYb4jSZwoedrpwxR0GMlqKNgwd+o+BA7qi9tGeZxAPA== From: Louis Chauvet Date: Sat, 18 Oct 2025 04:01:21 +0200 Subject: [PATCH 21/22] drm/vkms: Allow to hot-add connectors Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251018-vkms-all-config-v1-21-a7760755d92d@bootlin.com> References: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> In-Reply-To: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=6113; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=n/TUWMmpq4dd0zrl97U7Cy/fzIJ7zW/B559BiiwA9cc=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBo8vT/Dx6boJfYf+1K3S1vAkYUMR23xQgAzYfsV fLBlYs8QuaJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaPL0/wAKCRAgrS7GWxAs 4nYlD/9JnMB0cqhbJMmUVgQ94B2IpRyWVixk8/yWS1mZwWE37KRpkmqzDUBgaNLDhfJBpq2q/BL dSW9WaiIFRROFNeVAqeWrStkyPw2thaB/SE/3DYxmP37asUOUOD0k38vGUqNT+SpLkx4L5f9oyw r6fB4mVVxMChtrMtaSZLca+rB0u5zDdoQwx8bhTBZGE57RlhQsSgF6wLLTog2NN92eGEuBVDDRy uNbviAd+hcq+wQr7m8UI8kBgfvJA16PnxWm7muELnP3dAhtetIoyRqmz4wmADfc0EZP7RfjazW0 LuUJP/7cG77AXHaiuwxhbyj1iEg3b/vu3vvc85OrC0O6l8En9XLmqKy6+nyjzFL/LdwR0oWBq8g xLNRYdzy0SfCRkMmUN+keMPrLvCc6K+Ri4YdDnhA3CWNaMXLSauzznQC1++zVyCJPaa5yYhKzqc fB/zBpKupor6554e/zX60O/3n2zcUlVMTvlkh6QF7LI0nWWAkIWBKt34m5qkDO83eh7aNvc0B1j REnpgL/UAqy08HiEhVPswYWYKztkQJgp9hmKEGe3gzMaefbL890rqJ0irl4ev4M2SMmob32VGz5 ++82Ob8N4bF6m+3ULLy+RrxnFhbBwWHsD+D7JJuDCw2PymiSxHTJMEBiDObAlGP4UKEaEEMDBul llwDNrQrg1FmOQg== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 In order to allow creating dynamic connector, add the required infrastructure in vkms_connector. Co-developed-by: Jos=C3=A9 Exp=C3=B3sito Signed-off-by: Jos=C3=A9 Exp=C3=B3sito [Louis Chauvet: use drm_atomic_helper_connector_reset instead of drm_mode_config_reset because connector is not yet registered] Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/vkms_connector.c | 69 +++++++++++++++++++++++++++++++= +++- drivers/gpu/drm/vkms/vkms_connector.h | 33 +++++++++++++++++ drivers/gpu/drm/vkms/vkms_output.c | 11 +++++- 3 files changed, 111 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_connector.c b/drivers/gpu/drm/vkms/v= kms_connector.c index 339d747e729e..77a544728721 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.c +++ b/drivers/gpu/drm/vkms/vkms_connector.c @@ -1,5 +1,4 @@ // SPDX-License-Identifier: GPL-2.0+ - #include #include #include @@ -144,9 +143,77 @@ struct vkms_connector *vkms_connector_init(struct vkms= _device *vkmsdev, return connector; } =20 +static const struct drm_connector_funcs vkms_dynamic_connector_funcs =3D { + .fill_modes =3D drm_helper_probe_single_connector_modes, + .reset =3D drm_atomic_helper_connector_reset, + .atomic_duplicate_state =3D drm_atomic_helper_connector_duplicate_state, + .atomic_destroy_state =3D drm_atomic_helper_connector_destroy_state, + .destroy =3D drm_connector_cleanup, + .detect =3D vkms_connector_detect, +}; + void vkms_trigger_connector_hotplug(struct vkms_device *vkmsdev) { struct drm_device *dev =3D &vkmsdev->drm; =20 drm_kms_helper_hotplug_event(dev); } + +struct vkms_connector *vkms_connector_hot_add(struct vkms_device *vkmsdev, + struct vkms_config_connector *connector_cfg) +{ + struct vkms_config_encoder *encoder_cfg; + struct vkms_connector *connector; + int ret; + unsigned long idx =3D 0; + + connector =3D kzalloc(sizeof(*connector), GFP_KERNEL); + if (IS_ERR(connector)) + return connector; + ret =3D drm_connector_dynamic_init(&vkmsdev->drm, + &connector->base, + &vkms_dynamic_connector_funcs, + connector_cfg->type, + NULL); + if (ret) + return ERR_PTR(ret); + drm_connector_helper_add(&connector->base, &vkms_conn_helper_funcs); + + vkms_config_connector_for_each_possible_encoder(connector_cfg, idx, encod= er_cfg) { + ret =3D drm_connector_attach_encoder(&connector->base, + encoder_cfg->encoder); + if (ret) + return ERR_PTR(ret); + } + + drm_atomic_helper_connector_reset(&connector->base); + + ret =3D drm_connector_dynamic_register(&connector->base); + if (ret) + return ERR_PTR(ret); + + return connector; +} + +void vkms_connector_hot_remove(struct vkms_device *vkmsdev, + struct vkms_connector *connector) +{ + drm_connector_unregister(&connector->base); + drm_mode_config_reset(&vkmsdev->drm); + drm_connector_put(&connector->base); +} + +int vkms_connector_hot_attach_encoder(struct vkms_device *vkmsdev, + struct vkms_connector *connector, + struct drm_encoder *encoder) +{ + int ret; + + ret =3D drm_connector_attach_encoder(&connector->base, encoder); + if (ret) + return ret; + + drm_mode_config_reset(&vkmsdev->drm); + + return ret; +} diff --git a/drivers/gpu/drm/vkms/vkms_connector.h b/drivers/gpu/drm/vkms/v= kms_connector.h index a124c5403697..224950c13a93 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.h +++ b/drivers/gpu/drm/vkms/vkms_connector.h @@ -7,6 +7,7 @@ =20 #define drm_connector_to_vkms_connector(target) \ container_of(target, struct vkms_connector, base) +struct vkms_config_connector; =20 /** * struct vkms_connector - VKMS custom type wrapping around the DRM connec= tor @@ -33,4 +34,36 @@ struct vkms_connector *vkms_connector_init(struct vkms_d= evice *vkmsdev, */ void vkms_trigger_connector_hotplug(struct vkms_device *vkmsdev); =20 +/** + * vkms_connector_hot_add() - Create a connector after the device is creat= ed + * @vkmsdev: Device to hot-add the connector to + * @connector_cfg: Connector's configuration + * + * Returns: + * The connector or an error on failure. + */ +struct vkms_connector *vkms_connector_hot_add(struct vkms_device *vkmsdev, + struct vkms_config_connector *connector_cfg); + +/** + * vkms_connector_hot_remove() - Remove a connector after a device is crea= ted + * @connector: The connector to hot-remove + */ +void vkms_connector_hot_remove(struct vkms_device *vkmsdev, + struct vkms_connector *connector); + +/** + * vkms_connector_hot_attach_encoder() - Attach a connector to a encoder a= fter + * the device is created. + * @vkmsdev: Device containing the connector and the encoder + * @connector: Connector to attach to @encoder + * @encoder: Target encoder + * + * Returns: + * 0 on success or an error on failure. + */ +int vkms_connector_hot_attach_encoder(struct vkms_device *vkmsdev, + struct vkms_connector *connector, + struct drm_encoder *encoder); + #endif /* _VKMS_CONNECTOR_H_ */ diff --git a/drivers/gpu/drm/vkms/vkms_output.c b/drivers/gpu/drm/vkms/vkms= _output.c index 217f054d9598..aba2f9ab243d 100644 --- a/drivers/gpu/drm/vkms/vkms_output.c +++ b/drivers/gpu/drm/vkms/vkms_output.c @@ -92,7 +92,7 @@ int vkms_output_init(struct vkms_device *vkmsdev) } } =20 - vkms_config_for_each_connector(vkmsdev->config, connector_cfg) { + vkms_config_for_each_connector_static(vkmsdev->config, connector_cfg) { struct vkms_config_encoder *possible_encoder; unsigned long idx =3D 0; =20 @@ -116,5 +116,14 @@ int vkms_output_init(struct vkms_device *vkmsdev) =20 drm_mode_config_reset(dev); =20 + vkms_config_for_each_connector_dynamic(vkmsdev->config, connector_cfg) { + if (connector_cfg->enabled) { + connector_cfg->connector =3D vkms_connector_hot_add(vkmsdev, connector_= cfg); + + if (IS_ERR(connector_cfg->connector)) + return PTR_ERR(connector_cfg->connector); + } + } + return 0; } --=20 2.51.0 From nobody Sun Feb 8 08:48:25 2026 Received: from smtpout-04.galae.net (smtpout-04.galae.net [185.171.202.116]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C5A3D25784E for ; Sat, 18 Oct 2025 02:02:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752961; cv=none; b=oT9tHdiPLLST4CgF2IvMnyigAjqgc51TIEOJJNJExgKUoqA9FYxzY+AX5LVnP2RcnJsXGmgj35H0vvR1JlyhOamJBfhoGQs9iEtAmJYnnjN3RRDNQHrryRqg6XB5MBgUM7xgCodio0cSRPEGP9hZkNgfXDUpTW3h5i4Wr5jZXdA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760752961; c=relaxed/simple; bh=l0QqTuIRUdCVYpHuUyY5RP2VDM8HCO8Ik2svVn7zny8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=N1MK4hFZ6ohGXkz7vWCnJFavOMaXwdz6z/FRfo1S5E2XZSZ7ZxNMsP1FCQGfcv6LISc0W5cmwvReUfl6N5c6Bp79uBiJu/Zik7/tN4fD9i0NY1XgQHuD9s0DvUEAAAQ2CVBJL+bUB7kOs/yK5loWLtKKg3lz5LQSLd09Q2jnlsQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=VirI7Bc8; arc=none smtp.client-ip=185.171.202.116 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="VirI7Bc8" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 18D61C003FD; Sat, 18 Oct 2025 02:02:18 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 6E85360701; Sat, 18 Oct 2025 02:02:37 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 0E652102F2374; Sat, 18 Oct 2025 04:02:34 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1760752956; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=ikMUTSdUdPHc35mX+I2cW0QqiGa0ceHwAYivaRjc9xM=; b=VirI7Bc8AUQ7wbT1JSe0bREwo5LKfew0qVq9FT2/5vrLTG8rf/A8zkBHdCRPKDBiJI32gf tRxDD3M0/Uxs4LKvps5KycxSakLWYUvoM5R3/CV08y9bLfJv8qiCQ5757LObSdjynWXsMX hnhdCaj3Xsr3eBMmkToEoVRwo76g2Y3FTPz26tn2XeL2V0bBd0KNBcBFrpDAJ/jEnl2/2A NrrvP0Y2Yl1flKZ/MfX84OQrbotNbHKLgS4wTtwoZWL60sQkZfsWbca/9M0sH/X5h5PksE LlT6uy3tpgpahaSLSECmlXMHZ6h+LGhouaR7Un7goyBflBy67SovRS9kMFKPLg== From: Louis Chauvet Date: Sat, 18 Oct 2025 04:01:22 +0200 Subject: [PATCH 22/22] drm/vkms: Allows the creation of connector at runtime Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251018-vkms-all-config-v1-22-a7760755d92d@bootlin.com> References: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> In-Reply-To: <20251018-vkms-all-config-v1-0-a7760755d92d@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=9690; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=l0QqTuIRUdCVYpHuUyY5RP2VDM8HCO8Ik2svVn7zny8=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBo8vT/mFddf9A8YjhbEe8wcx3NUxmkZviyUae4u I95Mwj5bEqJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaPL0/wAKCRAgrS7GWxAs 4uOwEADEu1Us9VwD4VF/tUT1WC91mutz7Oot30nLy2TzNR3G6wmbdMWvurGdN4SxqFAgm5tSB9O 3hif+vWd1LOzXmJqWAwu4j24C9LqnhNEn7Db38BF1q6px1J69b4OBr6GPQCi+QxG8hbkWbKJT8W kmPaAiSW5JBB91sBF7eHQ8si5Ms36FY/fgO9FXj0h4jVaSc5cYV/BjGEg39W2qY3rYbh949yrNS TzJUmi5edM9z/hJSttblq+AnoC9cQk/MHpbIkrhBFuM3bgKSZ9OpJn/c3SjpXgu+++MZc9mNRfm Nha16RIaFZAoDo+6tV81z1KNduUiJUb7s2CMSaqjzNP4e0nzsgbNXwnwD0TzbfGPRgjT7pNSloL fKqXeScqk1DVcrfStkYV09QDR5mgBuId0O27TUKeJG526M9pLSDYvcUsccbM60TGHOWTgrxwlCk nTKx0QGkIDvGOL6jS/NAYnDvXRiTUObBK2Ee9c58Jc8NKS9CS4uZ3bQCJ7tpi57wo0/y5yY2ktK aOrZKOU3BPuWywkh/VU+hPZ6Ybz8wfBwHmyk9gjL4oE/b2XsncrastFivmc5WM+DzMQE1piBLSV WbJ0uChY+oUzAQzIu1q4H6DOcrz8Ec1hSbaaEiFhbEG1YRrEaa/F3KM4+hOs8RnQcsNfy5DaSkg YODXwDEUHfGkzuQ== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 DRM allows the connector to be created after the device. To allows emulating this, add two configfs attributes to connector to allows this. Using the dynamic attribute you can set if a connector will be dynamic or not. Using the enabled attribute, you can set at runtime if a dynamic connector is present or not. Co-developed-by: Jos=C3=A9 Exp=C3=B3sito Signed-off-by: Jos=C3=A9 Exp=C3=B3sito Signed-off-by: Louis Chauvet --- Documentation/gpu/vkms.rst | 6 +- drivers/gpu/drm/vkms/vkms_configfs.c | 146 +++++++++++++++++++++++++++++++= +--- 2 files changed, 139 insertions(+), 13 deletions(-) diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index bbd03f61e61c..8b17aaa28eeb 100644 --- a/Documentation/gpu/vkms.rst +++ b/Documentation/gpu/vkms.rst @@ -135,7 +135,7 @@ Last but not least, create one or more connectors:: =20 sudo mkdir /config/vkms/my-vkms/connectors/connector0 =20 -Connectors have 5 configurable attribute: +Connectors have 7 configurable attribute: =20 - status: Connection status: 1 connected, 2 disconnected, 3 unknown (same = values as those exposed by the "status" property of a connector) @@ -147,7 +147,9 @@ Connectors have 5 configurable attribute: - edid_enabled: Enable or not EDID for this connector. Some connectors may= not have an EDID but just a list of modes, this attribute allows to disable EDID pro= perty. - edid: Content of the EDID. Ignored if edid_enabled is not set - +- dynamic: Set to 1 while configuring the device to create a dynamic conne= ctor. A dynamic + connector can be used to emulate DP MST connectors. +- enabled: For dynamic connector, set it to 1 to create the connector, 0 t= o remove it. =20 To finish the configuration, link the different pipeline items:: =20 diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vk= ms_configfs.c index a977c0842cd6..937b749142ad 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -1115,8 +1115,12 @@ static ssize_t connector_status_store(struct config_= item *item, scoped_guard(mutex, &connector->dev->lock) { vkms_config_connector_set_status(connector->config, status); =20 - if (connector->dev->enabled) - vkms_trigger_connector_hotplug(connector->dev->config->dev); + if (connector->dev->enabled) { + if (connector->config->dynamic && connector->config->enabled) + vkms_trigger_connector_hotplug(connector->dev->config->dev); + if (!connector->config->dynamic) + vkms_trigger_connector_hotplug(connector->dev->config->dev); + } } =20 return (ssize_t)count; @@ -1176,8 +1180,12 @@ static ssize_t connector_type_store(struct config_it= em *item, } =20 scoped_guard(mutex, &connector->dev->lock) { - if (connector->dev->enabled) - return -EINVAL; + if (connector->dev->enabled) { + if (connector->config->dynamic && connector->config->enabled) + return -EBUSY; + if (!connector->config->dynamic) + return -EBUSY; + } vkms_config_connector_set_type(connector->config, val); } =20 @@ -1293,6 +1301,102 @@ static ssize_t connector_edid_store(struct config_i= tem *item, connector_status_disconnected) vkms_trigger_connector_hotplug(connector->dev->config->dev); } + return count; +} + +static ssize_t connector_enabled_show(struct config_item *item, char *page) +{ + struct vkms_configfs_connector *connector; + bool enabled; + + connector =3D connector_item_to_vkms_configfs_connector(item); + + scoped_guard(mutex, &connector->dev->lock) + enabled =3D vkms_config_connector_is_enabled(connector->config); + + return sprintf(page, "%d\n", enabled); +} + +static ssize_t connector_enabled_store(struct config_item *item, + const char *page, size_t count) +{ + struct vkms_configfs_connector *connector; + struct vkms_config_connector *connector_cfg; + bool enabled, was_enabled; + + connector =3D connector_item_to_vkms_configfs_connector(item); + connector_cfg =3D connector->config; + + if (kstrtobool(page, &enabled)) + return -EINVAL; + + if (!connector->dev->enabled) { + vkms_config_connector_set_enabled(connector_cfg, enabled); + } else { + // Only dynamic connector can be enabled/disabled at runtime + if (!connector_cfg->dynamic) + return -EBUSY; + + was_enabled =3D vkms_config_connector_is_enabled(connector_cfg); + vkms_config_connector_set_enabled(connector_cfg, enabled); + + // Resulting configuration is invalid (missing encoder for example) + // Early return to avoid drm core issue + if (!vkms_config_is_valid(connector->dev->config)) { + vkms_config_connector_set_enabled(connector_cfg, was_enabled); + return -EINVAL; + } + + if (!was_enabled && enabled) { + // Adding the connector + connector_cfg->connector =3D vkms_connector_hot_add(connector->dev->con= fig->dev, + connector_cfg); + if (IS_ERR(connector_cfg->connector)) { + vkms_config_connector_set_enabled(connector_cfg, was_enabled); + return PTR_ERR(connector_cfg->connector); + } + } else if (was_enabled && !enabled) { + vkms_connector_hot_remove(connector->dev->config->dev, + connector_cfg->connector); + } + } + return count; +} + +static ssize_t connector_dynamic_show(struct config_item *item, char *page) +{ + struct vkms_configfs_connector *connector; + bool enabled; + + connector =3D connector_item_to_vkms_configfs_connector(item); + + scoped_guard(mutex, &connector->dev->lock) { + enabled =3D vkms_config_connector_is_dynamic(connector->config); + } + + return sprintf(page, "%d\n", enabled); +} + +static ssize_t connector_dynamic_store(struct config_item *item, + const char *page, size_t count) +{ + struct vkms_configfs_connector *connector; + struct vkms_config_connector *connector_cfg; + bool dynamic; + + connector =3D connector_item_to_vkms_configfs_connector(item); + connector_cfg =3D connector->config; + + if (kstrtobool(page, &dynamic)) + return -EINVAL; + + scoped_guard(mutex, &connector->dev->lock) { + // Can't change the dynamic status when the device is activated + if (connector->dev->enabled) + return -EBUSY; + + vkms_config_connector_set_dynamic(connector_cfg, dynamic); + } =20 return count; } @@ -1302,6 +1406,8 @@ CONFIGFS_ATTR(connector_, type); CONFIGFS_ATTR(connector_, supported_colorspaces); CONFIGFS_ATTR(connector_, edid_enabled); CONFIGFS_ATTR(connector_, edid); +CONFIGFS_ATTR(connector_, dynamic); +CONFIGFS_ATTR(connector_, enabled); =20 static struct configfs_attribute *connector_item_attrs[] =3D { &connector_attr_status, @@ -1309,19 +1415,28 @@ static struct configfs_attribute *connector_item_at= trs[] =3D { &connector_attr_supported_colorspaces, &connector_attr_edid_enabled, &connector_attr_edid, + &connector_attr_dynamic, + &connector_attr_enabled, NULL, }; =20 static void connector_release(struct config_item *item) { struct vkms_configfs_connector *connector; + struct vkms_config_connector *connector_cfg; struct mutex *lock; =20 connector =3D connector_item_to_vkms_configfs_connector(item); + connector_cfg =3D connector->config; lock =3D &connector->dev->lock; =20 scoped_guard(mutex, lock) { + if (connector->dev->enabled && connector_cfg->dynamic && connector_cfg->= enabled) + vkms_connector_hot_remove(connector->dev->config->dev, + connector_cfg->connector); + vkms_config_destroy_connector(connector->config); + kfree(connector); } } @@ -1340,6 +1455,7 @@ static int connector_possible_encoders_allow_link(str= uct config_item *src, struct config_item *target) { struct vkms_configfs_connector *connector; + struct vkms_config_connector *connector_cfg; struct vkms_configfs_encoder *encoder; int ret; =20 @@ -1347,16 +1463,25 @@ static int connector_possible_encoders_allow_link(s= truct config_item *src, return -EINVAL; =20 connector =3D connector_possible_encoders_item_to_vkms_configfs_connector= (src); + connector_cfg =3D connector->config; encoder =3D encoder_item_to_vkms_configfs_encoder(target); =20 scoped_guard(mutex, &connector->dev->lock) { - if (connector->dev->enabled) - return -EBUSY; + if (connector->dev->enabled && connector_cfg->enabled) { + if (!connector_cfg->dynamic) + return -EBUSY; + ret =3D vkms_connector_hot_attach_encoder(connector->dev->config->dev, + connector->config->connector, + encoder->config->encoder); + if (ret) + return ret; + } =20 ret =3D vkms_config_connector_attach_encoder(connector->config, encoder->config); + if (ret) + return ret; } - return ret; } =20 @@ -1394,9 +1519,6 @@ static struct config_group *make_connector_group(stru= ct config_group *group, dev =3D child_group_to_vkms_configfs_device(group); =20 scoped_guard(mutex, &dev->lock) { - if (dev->enabled) - return ERR_PTR(-EBUSY); - connector =3D kzalloc(sizeof(*connector), GFP_KERNEL); if (!connector) return ERR_PTR(-ENOMEM); @@ -1409,9 +1531,11 @@ static struct config_group *make_connector_group(str= uct config_group *group, return ERR_CAST(connector->config); } =20 + vkms_config_connector_set_dynamic(connector->config, connector->dev->ena= bled); + vkms_config_connector_set_enabled(connector->config, !connector->dev->en= abled); + config_group_init_type_name(&connector->group, name, &connector_item_type); - config_group_init_type_name(&connector->possible_encoders_group, "possible_encoders", &connector_possible_encoders_group_type); --=20 2.51.0