From nobody Sun Feb 8 12:14:34 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 9DCB8289378; Wed, 29 Oct 2025 14:36:54 +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=1761748617; cv=none; b=tb7Yi9WENntsULmBgX6FKZRy+mj/Pbb7IkPvO8u23QZr/iu2hpiHoUJp1pK6r/NurTfIkXlEtdn6v+vu43YaCN2/t4gTpKlZSJTGUOO0YFnnlC8ccBuCN2YNu0R5Fl/m6eMAq28AGD/5B0wj3S54b90o0ZfquMJFm9hHJUwl6XM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761748617; c=relaxed/simple; bh=Wsj1m7hVEtg7sU79/U1qOzzdUOMLj+fgjBm3lz+0CaE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=NZ0Ex6JGU3DnODAliB2E0Sc5CRIqajupMNsjhWsq1MCB5TRW+p5U3eH6YepsHEs6xEOhtK3KMbx8kUZUv5A9EaTPmTFHHBEJaXPMWr/kRLL+Ox/iy0lUvQCv1sC5tRDKrDh2slUaPl+Apnvn8BDdcJoCEm35Me/USJtWYrIVx2I= 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=IMNlMIls; 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="IMNlMIls" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id D49811A174A; Wed, 29 Oct 2025 14:36:52 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id AB0C5606E8; Wed, 29 Oct 2025 14:36:52 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 95996117F813D; Wed, 29 Oct 2025 15:36:50 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761748612; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=ZbJg/Ukh5zMJtkFjzl+I9BgVwlaHjwOBuN87NBSPDvA=; b=IMNlMIlssFkqvlfvP4DWIjddvg2gfqj6Xbm1W9TUp9vDqG9WqhP5HjYOd1bGee8FD1/XJs LDg9CK0LRQzLYd+ClIXUXbJBYEDBHm/UCQeZv4kVcJF6/HI3X8KGxY628E/RY0Sod7Cqpi Fnt3aP6G4K3zhlBjUZLztazX2i+3dX0buVDUKsEFR/YTt/feq9GtdKE6gC6N1fyFSsWI8f 9IUYMdT2l52W8sR9zvyVSwfuGJlc6WC0cg7E2J/nlEYkYrAldxmWFnUame5Nt2EfyFTdB5 TgaRYq9JqU4WtJt+u8CTZbkw40urDSsZ+fgidz30jybd18njJZ7C31A3FjLg2A== From: Louis Chauvet Date: Wed, 29 Oct 2025 15:36:38 +0100 Subject: [PATCH RESEND v2 01/32] drm/drm_mode_config: Add helper to get plane type 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: <20251029-vkms-all-config-v2-1-a49a2d4cba26@bootlin.com> References: <20251029-vkms-all-config-v2-0-a49a2d4cba26@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-a49a2d4cba26@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=1796; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=Wsj1m7hVEtg7sU79/U1qOzzdUOMLj+fgjBm3lz+0CaE=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAiZ6GCMhQDbZXDVLtQpYyBwfKOHOtYWQFZxnW j2db4rNjnOJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQImegAKCRAgrS7GWxAs 4sAQD/9ul8waCfMvZl0bPQ0CcIsEPzX5b8SLOw25Sah3ZsE7/ObQr1sHFuOGGU5QU3AoJSA0mD9 Itdqk0ztk5+SnEvEiJTHhI/Ehj6h/eBCfxRl/NyxknIITJZ+Z6FQiBxse1azBCx8RrOEfhfMp5n /PDqfSkxBYPQh53bmgydUzH1+rOuKYkAlNmTjBgsXq0QHfjLcEdhQXdsrs15OgEPfCqgsyP1ZJq 3ySzEP9pgRh71X5A+oFsoC6cetSV7ybYKrTFcE/37w/c6nYTlxx1LYIa6+WLmlsP36mEqz+jlNO bL9Ff39KOxJmdl3gFKRImHqu98G8R7pc0OnZcsxpaSwl0PA9xuf4vh+oSLl64iwPT0dO24Y+Irm wW8RBrY+0GfoH5v4ZDhHZqu7B3UPs4FNlpRtAf9/EWnNiFP+Wl+PTTU2gWvbv1WC0YZOAj/bI1D 34OB9JvCmZMqD2lRhsFB7jhj9bSttf4XBjVej8HIgZrymAgc6d/abNBgw7rOq4XnmYt6wC+w0Gu Ob3f53VnGOaGEg9m2il5RtVtJw+urL7zgAhe0qvfM8k9s+9wCVwojeCaMjRAU8tOqX4oLWNMwCO 7ZhrUd0zyoJ79bUHhkhINc30qaIA78imXYrNVb3gkN8XcFHg0DQGsZnRDs+7H2HI2/3CGE7VTjz /4hMxH4LrzmWRKQ== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Create and export an helper to display plane type using the property string. This could be used to display debug information in VKMS. Signed-off-by: Louis Chauvet Reviewed-by: Jos=C3=A9 Exp=C3=B3sito --- drivers/gpu/drm/drm_mode_config.c | 13 +++++++++++++ include/drm/drm_mode_config.h | 3 +++ 2 files changed, 16 insertions(+) diff --git a/drivers/gpu/drm/drm_mode_config.c b/drivers/gpu/drm/drm_mode_c= onfig.c index 25f376869b3a..1a1a3f43db4d 100644 --- a/drivers/gpu/drm/drm_mode_config.c +++ b/drivers/gpu/drm/drm_mode_config.c @@ -226,6 +226,19 @@ static const struct drm_prop_enum_list drm_plane_type_= enum_list[] =3D { { DRM_PLANE_TYPE_CURSOR, "Cursor" }, }; =20 +/** + * drm_get_plane_type_name - return a string for plane name + * @type: plane type to compute name of + */ +const char *drm_get_plane_type_name(enum drm_plane_type type) +{ + if (type < ARRAY_SIZE(drm_plane_type_enum_list)) + return drm_plane_type_enum_list[type].name; + else + return "(unknown)"; +} +EXPORT_SYMBOL(drm_get_plane_type_name); + static int drm_mode_create_standard_properties(struct drm_device *dev) { struct drm_property *prop; diff --git a/include/drm/drm_mode_config.h b/include/drm/drm_mode_config.h index 2e848b816218..89f3dd46178d 100644 --- a/include/drm/drm_mode_config.h +++ b/include/drm/drm_mode_config.h @@ -30,6 +30,7 @@ #include =20 #include +#include =20 struct drm_file; struct drm_device; @@ -983,4 +984,6 @@ static inline int drm_mode_config_init(struct drm_devic= e *dev) void drm_mode_config_reset(struct drm_device *dev); void drm_mode_config_cleanup(struct drm_device *dev); =20 +const char *drm_get_plane_type_name(enum drm_plane_type type); + #endif --=20 2.51.0 From nobody Sun Feb 8 12:14:34 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 163EA189B84; Wed, 29 Oct 2025 14:36:55 +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=1761748617; cv=none; b=iXNPZxiUrUpanp/LdUwYXpsRsCH/uFrlMnN0TFXT9sRjoyDIoooXrxlyO9mrtza4+ObIn5Q5GpXrNcDAO5I/vwvj5N04B61HcjtgQ4L/g5BdA4+B0GGS24TRj92gy9XOHaLFqTlTw8l7e5Qk2EwI+TPac7V2vJls4rxVwapGjqY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761748617; c=relaxed/simple; bh=/zJLRQgbJlUfEK19hPalGGNnAJ4C2mB7Maijaaat2XM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=geskdwaQFlY2hJPNd3o/TSfxF7exLk5eqBR68yI9Uusr5kxAU+Bl+7XTOeuGJ0TsXNlrXeqFB5wLeuQ+zlQG/6wHsqLs6555/Ify3SGviSO+0l9+Thg86n2anDvOhSCwhzdJqHstxKhd985IAUub2SEL6gZtbYq16BsnzVWC7iE= 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=m2zA1bez; 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="m2zA1bez" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 4BBC54E413CB; Wed, 29 Oct 2025 14:36:54 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 225BF606E8; Wed, 29 Oct 2025 14:36:54 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 3A265117F81A9; Wed, 29 Oct 2025 15:36:52 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761748613; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=i1b8cguAuDAWMh3z6p1IfLyIILSme00GdU6qG7LpcBQ=; b=m2zA1bezwoqu3zurDoQ94Z5MtQt6uLN9OsCUsArtpwfXXiIFfNaGkLlvjsLUXcLlsDkLcH xBY5DDrNUWOTsMyGyh8HMDsyklmAkbLXLPd2AaemdMj9/e0LVeok/D/44vnyDQqZf3Je2m z+b1bnPysc9N2OOlSUjNi7/jYVgRv9NLkFvUsGRZAeQGmGME5oUTFOpr6H9M/iPD8abIB2 oFE+5mAiMeNI6BuPZkGANTybIeOSxYAPVGtRxIOVAUyrFB4pConqjD7KtXkcTd9bdfnu4I 5i7oDt7fG+kwV3lcFeX6PFk9DF9odFM6BnpStzuv2YE3r8k/dkA9hnZnRadNSg== From: Louis Chauvet Date: Wed, 29 Oct 2025 15:36:39 +0100 Subject: [PATCH RESEND v2 02/32] drm/vkms: Explicitly display plane 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: <20251029-vkms-all-config-v2-2-a49a2d4cba26@bootlin.com> References: <20251029-vkms-all-config-v2-0-a49a2d4cba26@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-a49a2d4cba26@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=897; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=/zJLRQgbJlUfEK19hPalGGNnAJ4C2mB7Maijaaat2XM=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAiZ6YJtcz0xN6TVwjzGz36c3EzPxXjnLyF11C 6Mq0zX0FmWJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQImegAKCRAgrS7GWxAs 4s46D/9Fu1frCAsfKOM7QS8UpkoROepANkt+RonasMS7MWBI8erXKXen5s+F9GS5lqbIvayZOFb JSzi1MVo6leKw4U9af2+CDZpWNZAvay6mH1Aqyd1ApolQQc50bxAmiLM1qzcDT0dGaA8tnCyKMi TRomV6xZ7pG5SQN9G+mAJek3B11bzE/AjZ2VEZaTHHC1EsvM1OMD8Q1FX+MvgDjniTlCuvd0B6H GX49YmYESYWmg/QDZvny42k/J/h0GMgV5x41l/j+voj4gWAkiGE8wEpS93m3Yi1qrQBxtErS2cI KfKb1VXbKovaig6Pw/EYiV+XfRqcVGe8FeM+wEZBYle5Nr3iPjOWzhY8D4+rb4X1PYVSZOw/qkB FOWyxyFotriE+f8SqKn9HScLxxHSYxNUS6qyMf2TvQIGpgvDjVXM874XIxFBM6DoVih1E7MaTxS scMAdkL6d9D9y8OOiVrBm+JjOQbvDKZ6hE+SktDr8Dh8fKwen0KwBmDzkVtEk/JVppJTEws/Kjd qaEdTuCOv8oaHzRViddQ0sF8w+xzb2MX1FFd8ExmNcqJokBz6wE9J7ImVl5o/r1E8tnJQCAK066 GCKorjhZo80MkgbP6LgHmSIu7o0PttIZCXO21nOWm8JyPRI28pbte075AjjDhlObSbRnMj3OICx 3lEZzCoyjaHs3fg== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Debug information are mainly read by human, so use full name instead of values. Signed-off-by: Louis Chauvet Reviewed-by: Jos=C3=A9 Exp=C3=B3sito Reviewed-by: Luca Ceresoli --- drivers/gpu/drm/vkms/vkms_config.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index f8394a063ecf..cfdd5f32f234 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -348,8 +348,8 @@ static int vkms_config_show(struct seq_file *m, void *d= ata) =20 vkms_config_for_each_plane(vkmsdev->config, plane_cfg) { seq_puts(m, "plane:\n"); - seq_printf(m, "\ttype=3D%d\n", - vkms_config_plane_get_type(plane_cfg)); + seq_printf(m, "\ttype=3D%s\n", + drm_get_plane_type_name(vkms_config_plane_get_type(plane_cfg))); } =20 vkms_config_for_each_crtc(vkmsdev->config, crtc_cfg) { --=20 2.51.0 From nobody Sun Feb 8 12:14:34 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 B43292BD001 for ; Wed, 29 Oct 2025 14:36:57 +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=1761748619; cv=none; b=dYwsw3RPBiHHawvxUxgpY3duA8krzFKIB8niITCxcvBBLqwQcWKO7wY2KNEIhmNZ0zxW3OqY7F7sdtrfga5TQx/ZuqAqa7+GnZyrqoVfHzfg79KzdFyueAaarb5Mx26tuYoQMHpr0VGjHLc45DdSoDwPQWnQ95pV/K1eQdAXf2c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761748619; c=relaxed/simple; bh=P2YQYyxAPSZpXd/i/92Ex57u+40+oZJvWkUOQRGtaCI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=pT0wf0argkwyqhIKYOifvZjx1CsF+emN5Htyj5VN3RM7wtiunk9yR/QQqGlOa33v1WAwEL39v5HrGBMHW7S+zSwuT6UiA47OeTYr+eg+Oat7tfKfQO7oyPR6HeOwxqDYpJ2BiWqfBrLzJ3Q++Hn4edzeV+UoML91ThfMProMWyc= 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=LP4xLJtC; 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="LP4xLJtC" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 1BC5D4E413CF; Wed, 29 Oct 2025 14:36:56 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id E59ED606E8; Wed, 29 Oct 2025 14:36:55 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 9BEF7102F24F9; Wed, 29 Oct 2025 15:36:53 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761748615; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=Cp6JpAtoASV5c2ZHnxjic8luGPShZOCddn0tveS2zCk=; b=LP4xLJtCpeo0/5dDEGlvCen7w4edznxJlfh4hXIodgwC983y8R+ka7JswykSJVMQfzmKhs 7lqUDNOq/iD6uuMldL5pGETpUyT20yXfyIAxuggiVpJI/IjEYzv57GpuN9AxR7NBjI8pqC v8i0/4FIP9gVRWJ0Gkgym79AZk9XMw+9ivEKalIg/U/R8m2NY748Qj1JMe3wqPJ7wND2DU zclGw7bK3OXJhnYO+4++30uGjZmhqacQKSlxgx3dZmc40KwBwf97F7wQfBxxQKK8mJKlgC q1PRAm5Uu+hNublx+XJEpK/aw/v5BNKPkmDbi8QOjZvMnCLeTgkY9rl2kO7iow== From: Louis Chauvet Date: Wed, 29 Oct 2025 15:36:40 +0100 Subject: [PATCH RESEND v2 03/32] drm/vkms: Use enabled/disabled instead of 1/0 for debug 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: <20251029-vkms-all-config-v2-3-a49a2d4cba26@bootlin.com> References: <20251029-vkms-all-config-v2-0-a49a2d4cba26@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-a49a2d4cba26@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=1094; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=P2YQYyxAPSZpXd/i/92Ex57u+40+oZJvWkUOQRGtaCI=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAiZ67gTBmoyopTr26ee+sA1L9TqFeiljDye1u t9L9WYhhSuJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQImegAKCRAgrS7GWxAs 4hISEADIvecDEqTRDOMd30EJrvFoLJdurexYYJOpbiRQw32Oo0Ll7HkT5kVmCYbk6vOUlNeabLI ukxPUg3edy1pY/s5xkiaNiN0pg01HOlEyx50gjhEG1Ex7ghFrb2bWXnJVJaW/I0Pl+nWqkgLvNl 9197W66mCD+UWEejgbsWAjbSESG3z6dpDxlwntcik+aDufgGSBgwvEW6nU4gMiK8C0/Zj13RbLq HhbC1mKkmH8rWOx90ovac8t5BTM4VrUioQBD6OxQgfpNLBWKDnk2QTIy8ljmA2K/WTkmU4sK5eU XsL2MCVmfym8zUMSiptCb9Zvx8lRkUppFfdZQLnb0bxefbL+vFDVGnJ3tgIggrvVDX6qC7rbuBL gOQHsbzmQd9k5cq7QvBqA4hUHyAWj5yG0thY5oVILmTHM8ch1tzOn7bT5Hw/PD3eomR3ttXrk1i uURqRgLALZlCoSzGZy1TL9FV8dhG6F8waG9J54ZR1xc0RsqGp40OKjfUZaNyU0RWixD+VJH06LQ XkKxZcq0erG1J8+Aep2CnS8CukaMXoToZT7T4X4DnC3XFIyXh+gXlHziZtzm1yBE2ejcRK+2DwB qJIGbwWX53TZITJWhU5W7dMUqHgkRIPSqn3kQo6GOdEASwk0JnISOsK4OYHgBWHJnzsYZrKTxV+ jkMXTqKG18EtldA== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Debug information are mainly read by human, so display human readable values. Signed-off-by: Louis Chauvet Reviewed-by: Jos=C3=A9 Exp=C3=B3sito Reviewed-by: Luca Ceresoli --- drivers/gpu/drm/vkms/vkms_config.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index cfdd5f32f234..391794d391c5 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-2.0+ =20 #include +#include =20 #include #include @@ -354,8 +355,8 @@ static int vkms_config_show(struct seq_file *m, void *d= ata) =20 vkms_config_for_each_crtc(vkmsdev->config, crtc_cfg) { seq_puts(m, "crtc:\n"); - seq_printf(m, "\twriteback=3D%d\n", - vkms_config_crtc_get_writeback(crtc_cfg)); + seq_printf(m, "\twriteback=3D%s\n", + str_enabled_disabled(vkms_config_crtc_get_writeback(crtc_cfg))); } =20 vkms_config_for_each_encoder(vkmsdev->config, encoder_cfg) --=20 2.51.0 From nobody Sun Feb 8 12:14:34 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 E361A2D0C9D; Wed, 29 Oct 2025 14:36:59 +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=1761748621; cv=none; b=Uky0F9w+td5sjlQEJAxh1N9Ro8cFbxRcLO0J5Hp/K35fgZSGFgygrh26+ikEMKaj5/c0NqnHswI/No3HLdthAIMSSR9nRrEWdBAkLIQUnARuRCGjvqJduAAbVeTLLvToXAgmEBqxuFpYbbeelAgciQ/GcyFAelmBq5kPoxw6Kvo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761748621; c=relaxed/simple; bh=voeNI9bwwu8x7aT8ETB3x5UR1BLQoLZlunp+Jro1U6w=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=aM4ScMhncdnKOh5k1rZy6v9W3xVCZ88GPHlrN677n6Vjvzf+y0Oo0xw1NA7TXWjqHBPtz6r9j5/tyQUAGD1nZm5AOKf2MGp1wGnaOz4f85UiZkks5/QFeNUdUVrT0ytUQ4EtgbZXQpWf/+n/gfNbjCSLIAvcplH4KIE2uqqG1Vc= 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=bwCMQdb1; 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="bwCMQdb1" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 1E9C54E413CB; Wed, 29 Oct 2025 14:36:58 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id E90A0606E8; Wed, 29 Oct 2025 14:36:57 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 7458D117F81AD; Wed, 29 Oct 2025 15:36:55 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761748617; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=nY1yQcqWIvwZGQdkoeG1HdLDJqiutiLInY6EQwK4N+U=; b=bwCMQdb1PJDBNvU6KB3lPhhah0a04r+JksL+KTxbo6iw7L1sE71/tKsxFcL8kO8esRCVNa +yYit8TunrSqVT9Jw9va7xIH740XtPi8PNDytfSLIbiws1lkKWrL6kFTclOp+YfwVOO58O HtXc9Ek6GY0T5YH6BghH6mNJAbU5Cf8Km8MgccMAI1c3BvsDg85c2cgYJf10S6Xe8CatEg 9y4+qm1KUT+d784NUX2K0U8UgAAlutmqN/bEi+504e7blzFQq4WX4pS8am08lNWsWAgtRW gHUloh6vjmNbn0oqmMedmJJaBSqdOJH8gtPa+ySx1Kce7qgtNYfC1pTGSEaqVw== From: Louis Chauvet Date: Wed, 29 Oct 2025 15:36:41 +0100 Subject: [PATCH RESEND v2 04/32] drm/vkms: Explicitly display connector status 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: <20251029-vkms-all-config-v2-4-a49a2d4cba26@bootlin.com> References: <20251029-vkms-all-config-v2-0-a49a2d4cba26@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-a49a2d4cba26@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=1127; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=voeNI9bwwu8x7aT8ETB3x5UR1BLQoLZlunp+Jro1U6w=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAiZ6J63Cu7MWfHrVZRUGGSsVwW63YUrMj8ac6 VykbMdMdCyJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQImegAKCRAgrS7GWxAs 4mlRD/41crYu4gMKFpLyj0lmxv7pJolD2wVQGyYxrYVFaBM/8I372AJpvveOIDGN3czKCjbpeIm 6HxyN2LG3vZshCrfYBcTWWzpfkfS+dTUj2+YoFLZwLgv+PQAiJzjIcYf4HfHV/nyE+BIWnfxrwH vF2YlUxSAGVgF2I02P3opM0ubDfm3EHbavhP6iunF/YCcnFuq5KLxHU36LOuybflYec1Vls/DUt 60pRwjs0GOELWLqVGNZOkMjoLUyah2vuERqX/2rHojZnIf6LHN6kJfa87s3pKy9uo3bMV8Z5WWq OqqP+DSXx/AFk0scAybgnWUzMapBRg5aPOk6CFexffJVzreMwHWnkjDe9cRBODr+fTxwBefiVUh BxMw9PQAm1wptJJjifwCayH2YLDYlpvR2ca2GfzdHvJCdKCl1XW6d09ZWBqFolzYuG7C1mSKVTz BUpOSN8GHA6LGIkBCK3gxqDX2zd8rgUzlchxsDa5WIjkQc/HV2pIETrJFjcOp75g5EbhY1hhK6A OHpW56BPqP1AHlYaJCku2VHDdlGlOt3QtTbZ0CVANTPwvkVgZXiMF8IcDyUzfVfWr/dfpDb3rZP DT15TKPv9kFKd8zH3ABceNNJ9WblCcQnDdLdzHbhEdO02ojHjd45navW5DH+6febqYspvS9zZZP 4zsrx1SPskMZQLQ== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Debug information are mainly read by human, so use full name instead of raw values for connector status. Signed-off-by: Louis Chauvet Reviewed-by: Jos=C3=A9 Exp=C3=B3sito Reviewed-by: Luca Ceresoli --- drivers/gpu/drm/vkms/vkms_config.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index 391794d391c5..858bec2d1312 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -3,6 +3,7 @@ #include #include =20 +#include #include #include #include @@ -364,8 +365,8 @@ static int vkms_config_show(struct seq_file *m, void *d= ata) =20 vkms_config_for_each_connector(vkmsdev->config, connector_cfg) { seq_puts(m, "connector:\n"); - seq_printf(m, "\tstatus=3D%d\n", - vkms_config_connector_get_status(connector_cfg)); + seq_printf(m, "\tstatus=3D%s\n", + drm_get_connector_status_name(vkms_config_connector_get_status(conne= ctor_cfg))); } =20 return 0; --=20 2.51.0 From nobody Sun Feb 8 12:14:34 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 4D0682D5C6C for ; Wed, 29 Oct 2025 14:37:01 +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=1761748623; cv=none; b=RAZjqQKN7EW6Vhk3dRr0alcPCfQ6uSYtdarFR9B2xuUfJLSpC977UYWjl7FIXzsYZa2ZzciZR9E9hGjOlldMtyNHHLm6tbj4KNNmHwClJ+u9AeoujkExuiBdFbRnJMW/dLVa6nDSDmATnqN2/I+bVczL43hpiBlTTS3QJvmQTH0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761748623; c=relaxed/simple; bh=JI6BJsuj4AXbzLKNzvB4FHoZVsIkkY5eZBTNuNhEyrQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=lIGaFho+VX+pEviC8Wz7qvqhVThezwGzF8s9EycZvfFstzLQ18n5ZmxQCHSjpmJnHela8/eXHtahtr58KoG+k2xfqqAiuSngxlN35USyj565CBUo+WJV2dKJKmrra3PLy+HWLmxQ+uQXasvD4HbVoQm3KVQclmhuBC51b5LMFgc= 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=wlC79MD3; 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="wlC79MD3" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id BF4DF4E413D1; Wed, 29 Oct 2025 14:36:59 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 8ED09606E8; Wed, 29 Oct 2025 14:36:59 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 6C182117F81B1; Wed, 29 Oct 2025 15:36:57 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761748618; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=6J4X9HET4WTHRHuQARwrxqHYhuRpm2UMz/V2um5iVtU=; b=wlC79MD3D3AwIKWRSLcPNc7KDGLZeXcEmYO8e2rxkunCMy6dTD5v/CTUpBF5cvCrNPG17E 83GRqGztqYjPwJHoHueYde4d2y7tBAVBIH60AMUXezhtimNZv7crUZ0L2S6MOle950L10o ViXldQCfsoyEP9zn67WQLJBFZD9pIkebnY02G8m3eE7mKKdPZLXk5lpCBXK+IQwqzv/oJl wSMM4dRmL9UdKJK+OnGHukIDmixcb+FXOT+zw1DbWHOjcou0T8y4w95HW3PWKt2oKDzxHy iXeaalidTarJlcK0hgsW8bAgt0tLMFkVJzc3sbl54E/5HsGloUqs0LwbYfvQGg== From: Louis Chauvet Date: Wed, 29 Oct 2025 15:36:42 +0100 Subject: [PATCH RESEND v2 05/32] 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: <20251029-vkms-all-config-v2-5-a49a2d4cba26@bootlin.com> References: <20251029-vkms-all-config-v2-0-a49a2d4cba26@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-a49a2d4cba26@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=6014; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=JI6BJsuj4AXbzLKNzvB4FHoZVsIkkY5eZBTNuNhEyrQ=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAiZ6C1weX5fTU9+PdO7CwUHjy6vS1s+/aI9kq brM4O2VESCJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQImegAKCRAgrS7GWxAs 4tVtD/43B0pLg3N80G3RigoAqofUn0kuJ0bHb758KSCFLBCJmlXCTFpyVvJmveMdQeKahELv6Ka kfXyTMyhvVDlzqK6RtYZvPEv0j9wt3KuInYbzplbjClMpEqN3Yn0faHULeOPnZJw2Br/wtpkGm7 XiwNPmEYiAoY1NjqNjqWsapvW4TcGKbNVGrnmDa5/pZkTyhKkGX0yrxSLewJ7aT/hEvXUdPhqGP X002QQ1eSS3zYQpY3WRKkGKJ0gr3Pia1YOPL2m6F1UxyeJVbszH+lgG+x5pvqGGz9uVXkWVw5j+ RV7mDlaAkDYxsiTqLWa6eKZW9mxJlGgbXpxtSoNI/mI9R4cBzcVeJH8cMamrFBT6uMdcU7sw3Cc Wl6UB3/HZo0D3G7P77S4DFnkJYVKUYETDCpqI3f14Pgw1eMVQG0awBPhHbMJYFyEdc9wQut5L0h UoyX3fqU4vuP3iXn/NL0e/CE2/y1FvrIYhAyMhcHMdQS0p6DxaPrKk0e688rCA8yalxDhXlFyL0 vpZ+kE9xpF4o0rMkskiRedMdq7eFqJpdz9xcmerLaoWjO87HY4f9fU6qCqCfo5tf/9dBVmXvQBw tS1zmilyr21E2+z2og031GpgnFILLRYtCHf99RfF0FErAfJ1Cg/4MC+OXj0ul9zMIJpThAO6zqL e4a29Oexuu6IZ3A== 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 858bec2d1312..bfafb5d2504d 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -352,6 +352,8 @@ static int vkms_config_show(struct seq_file *m, void *d= ata) seq_puts(m, "plane:\n"); seq_printf(m, "\ttype=3D%s\n", drm_get_plane_type_name(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) { @@ -392,6 +394,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); @@ -404,6 +407,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..57342db5795a 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(const 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..73180cbb78b1 100644 --- a/drivers/gpu/drm/vkms/vkms_plane.c +++ b/drivers/gpu/drm/vkms/vkms_plane.c @@ -9,6 +9,7 @@ #include #include =20 +#include "vkms_config.h" #include "vkms_drv.h" #include "vkms_formats.h" =20 @@ -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 12:14:34 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 B5DB52D8DC2 for ; Wed, 29 Oct 2025 14:37:02 +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=1761748624; cv=none; b=KRgbNSd/bUOUl37h4msQCreTSF58/m/PK08iMxYpAo8nftctvWOJpEAqXi7WukeEmQQaVoxPcpBJ/ao8phLDgfSlYzaK+P5g3uGQ8ADyJl6/Fn6o3CejEXrpyQ7ms5ab+gETm07JtdZOr1b/HYRAa3ISxCumVcTBvYHfIeDpAqs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761748624; c=relaxed/simple; bh=e8ElyHXcVk0AWYJ7dGjNKx8CrM9WhxXKeDzUlhTH99U=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ee8qWyjHg9dxI/waaB1ZEd+ZCkPzJ/10OCGRloo9YPfeLDaimdzpkmYp8qrT+OusIoZdeeP70vQ8//GI3PqhwzF8Goo54805WFvW21SNz6oBOIb3HB7LgWF1QGjUMA0pGX5HWt4CICVMeYXTxoFFfJ5faVL4Q/9oaP69s3EfLvo= 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=aNtObgBU; 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="aNtObgBU" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 477021A1749; Wed, 29 Oct 2025 14:37:01 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 12E31606E8; Wed, 29 Oct 2025 14:37:01 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 1E1F6117F813D; Wed, 29 Oct 2025 15:36:59 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761748620; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=fs9ni9DRQ5vnDzOwoZttmqZ202xPMAoGkKss/mz8Bp4=; b=aNtObgBUqBfEVGe3YUXERK9A4Q/G/fZjyFWpi8cy/cyv8XjtEJemC8xKrSbEed/vDL5Zlk ipb2aPm9O+6aEAw8vNPCSfK6RbceU1URxuGZX3XFLv7PfvrEsECv7+44jHMhW2hVMvKI8w QoVE7LuaenMkRuuSGRK4YwYV6LecQHggGNYBBDiN3oPto+aFL7HF1ZVzydolg9f9E0JqMQ mvhy5mKTQbBqJ4VnlUcGGCJQ9cxYk0g569mEZxpNiaufMlyIbA72Gjr8WDwjfVs0ToeEso 14S6txPyuhQKKVYxjy6P8fxEmtBTJklfi4tHCDiw4xuE4lRzwFtr7Q9wGWrvlQ== From: Louis Chauvet Date: Wed, 29 Oct 2025 15:36:43 +0100 Subject: [PATCH RESEND v2 06/32] 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: <20251029-vkms-all-config-v2-6-a49a2d4cba26@bootlin.com> References: <20251029-vkms-all-config-v2-0-a49a2d4cba26@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-a49a2d4cba26@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=2206; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=e8ElyHXcVk0AWYJ7dGjNKx8CrM9WhxXKeDzUlhTH99U=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAiZ7DeWijwgu8w0+XAYahQ0JhE7wgQrw2FSOQ z2DnIYmwaiJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQImewAKCRAgrS7GWxAs 4plnD/9rrq0m9lCn81z0Dx7fNwZFsWHbbKXEJ/5WisbKDljauUG7SL6XjblGWEIbDdyPBooqfe+ KC/qKNld+W1TUPwYj/+fGkZR43g1xr2sKTlhtkmmkJKlF7t8foW+9Vdp1gy1qkxQBXxSJyWxNxr yhPEmUypJFd2eCVrdSGSCQMZ6xKMFioScweBrrmp5Ys7Ek80gKZryZLZmp96m850rUdPfUR7q98 3mAKSL8Pjg3iAiLx0kEbxkHp5NDJdR1J5AFP4R2HBL1zHn0oOjioWPnHlqhL0gcNaKPaN72APMf t99S/ZF5T47bRpYkzUdHKv1bGGTroWDIWHMpl0XaQHRp/YvipZcU/RGy1VX01Uv36SyynMM0/ar phDDJ3YvwIJFejBkkTPGPPF1nfOu8rcmBtuRvvY9VxeMRiSZIaQwsOI5Zxg8gdUbuQ/yTb6VNf4 SuNAoHZ4YW/ZpR+rX+bxQXb1I3/9fQNtvsezjJdDuXeyKNmJvgiUn0t0lRzWILLfZoaygnBzdkQ tt8Yc6udvqM5h+hqcQS+IUFPCjt1nezZtjHrO20aug7jHIkfZYdmesNIkuobDFQwRN0n5YqRNGT oYoyflIN5DvVsp63E8wW1qBsfvL6EIVpfKGRx4M0h+laHhZDpRJHWSrK3Kle+FLXshlFB0YwcxL e4tfGtTsLhKFP9w== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Planes can have name, create a plane attribute to configure it. Currently plane name is mainly used in logs. Signed-off-by: Louis Chauvet --- Documentation/gpu/vkms.rst | 3 ++- drivers/gpu/drm/vkms/vkms_configfs.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index 3574e01b928d..1fe6e420c963 100644 --- a/Documentation/gpu/vkms.rst +++ b/Documentation/gpu/vkms.rst @@ -87,10 +87,11 @@ Start by creating one or more planes:: =20 sudo mkdir /config/vkms/my-vkms/planes/plane0 =20 -Planes have 1 configurable attribute: +Planes have 2 configurable attributes: =20 - type: Plane type: 0 overlay, 1 primary, 2 cursor (same values as those exposed by the "type" property of a plane) +- name: Name of the plane =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 07ab794e1052..be6c3ba998b9 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -322,10 +322,42 @@ static ssize_t plane_type_store(struct config_item *i= tem, const char *page, return (ssize_t)count; } =20 +static ssize_t plane_name_show(struct config_item *item, char *page) +{ + struct vkms_configfs_plane *plane; + const char *name; + + plane =3D plane_item_to_vkms_configfs_plane(item); + + scoped_guard(mutex, &plane->dev->lock) + name =3D vkms_config_plane_get_name(plane->config); + + return sprintf(page, "%s\n", name); +} + +static ssize_t plane_name_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); + + scoped_guard(mutex, &plane->dev->lock) { + if (plane->dev->enabled) + return -EBUSY; + + vkms_config_plane_set_name(plane->config, page); + } + + return (ssize_t)count; +} + CONFIGFS_ATTR(plane_, type); +CONFIGFS_ATTR(plane_, name); =20 static struct configfs_attribute *plane_item_attrs[] =3D { &plane_attr_type, + &plane_attr_name, NULL, }; =20 --=20 2.51.0 From nobody Sun Feb 8 12:14:34 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 BDD3B2DEA9B for ; Wed, 29 Oct 2025 14:37:04 +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=1761748626; cv=none; b=YXdc05PqdgYfu6pv0qrXWzFVA1Z+FtUDczaGrQz1rtsbfVjW3tvsIajIH6LYPgEhAPpshOVCCSYe7myzPNHzhmBxU6ueDgin7YXCNHw1VyrEwDKtiYwfDETd52jcVYdzSUpPVmt9+8PbIBNnitRwppeAQApEyZykqdieWWHJQaQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761748626; c=relaxed/simple; bh=Pl8/wLHil1+4yaisV9T8jn/VjcUTIXsuX+80D3wrKXM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=fAPlGeWunncf3XqxvRW8rkke3oCCC34VHzQmkRqNVMgONIhE/FSn+qG57Hu7t/woAq1rK66zkOgnCgFZodSjVWrbo87pWYGnBhuW4Bezy3d6hHkV2xr/zwHZKgrLSckKRs1cP4eHPTyhfKeou+Ctty65ltPNpKWIHj8JpQN1mH4= 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=SGBIFUvN; 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="SGBIFUvN" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 36F674E413CB; Wed, 29 Oct 2025 14:37:03 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 0BE7E606E8; Wed, 29 Oct 2025 14:37:03 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 98AE7117F81A9; Wed, 29 Oct 2025 15:37:00 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761748622; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=gZH4XqHEnkgG+WiGf4L3QVJCg6jApM4gvYwyfSScQxU=; b=SGBIFUvNgkvxzALshu7uZRgC/6m33HWE96lB+htAPa5eJmAuvZop1qi9dakIqwwcv6Ik0X JECpYAm6EB0hGWZon7ZUlqn0toStq8OoU9HoIxDPbIGip9FQgcaNAVvQVChFcDXbwRyfUJ wvGOrDCYMAG7gHiQr5PHW3IzGBbJzSt0awTJmL3rRuiQPphH+HmRS58Fjh9NDK3ayT2Ort rVv+8m+J9Ctxw+7NP0SC98VrLrrDpWPExGCxYnIkHZWx1ULuiF++XufBadpiB0GdTh7tqr GBxZHYURPIrhGRzOXsBLH/ygdoeWeWmVYnXqGWcqqLdnJxUSZq8IkIME0Vbj0w== From: Louis Chauvet Date: Wed, 29 Oct 2025 15:36:44 +0100 Subject: [PATCH RESEND v2 07/32] drm/blend: Get a rotation name from it's bitfield 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: <20251029-vkms-all-config-v2-7-a49a2d4cba26@bootlin.com> References: <20251029-vkms-all-config-v2-0-a49a2d4cba26@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-a49a2d4cba26@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=3321; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=Pl8/wLHil1+4yaisV9T8jn/VjcUTIXsuX+80D3wrKXM=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAiZ7f0FokT9zbt4H75Ux7Gi1z9UBY3E04ndK1 LaXAHSYYQmJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQImewAKCRAgrS7GWxAs 4u6tD/9v7Oce9o8e3V/RCjZhhBS6FHRp7LdcCaev5iu3YO8Sqkgn88tyalFUMSUs1JVgyNuYej4 6mX1qu+Dh0mrJvfyO7vyPnrFFQmGX6O84+2OUYkVqFhSQYQlNB3opr/cjJbhPsS65CbqT4ql4qX B/UDbjpeY3rPs1k4/jCXDe1rG+ClWGiQGz2MwC+56bT6VvmsLgnUjJaU/r6rKW3M9EXVWsgRuiy 0zEKi3VFcGGS4EIHz1j0AFt9l3a+N8hYDwvhbfFsdMzMzR4+LtTDNsir6qm3H3ob7ANEn47xiIN OLqwAPt5TbX+LQCWSPhFIDRucRxOVaj44r/wTfpjgFk4VjeFCOkEOtGnfNdEnNvTCUJyzKOKLY+ 44NcTnTyQOKFuO8kEaVnuXtrNBvt5KMKMPQFSj+Ja//qjr4a0Gmy8aI2S3/+7GrS9dLKry+/7XQ R2eEWuQCrT0ljVLou7tiFkfCMWewSSd8cZ+gsyXkjLm062ST5qVP1mFmmgYB53EsZ61lLENolvL osFx1odxRLoDjpBEQVWvKs+eUeyPFhgIlCAfCOlXoggyIfPBPMzUVJhLfr1pLww8BwR2Oaj5iNs 9uh/fp01i3JEizdhpUiJCoJFWaQmBfG6nzjr57BIk+XbOkD39/qvMo/AcaCikRFgVFiOyVkZBaa 6pjvCa0aeUeMHaQ== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Having the rotation/reflection name from its value can be useful for debugging purpose. Extract the rotation property table and implement drm_get_rotation_name. Signed-off-by: Louis Chauvet Reviewed-by: Jos=C3=A9 Exp=C3=B3sito Reviewed-by: Luca Ceresoli --- drivers/gpu/drm/drm_blend.c | 35 ++++++++++++++++++++++++++--------- include/drm/drm_blend.h | 2 ++ 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/drm/drm_blend.c b/drivers/gpu/drm/drm_blend.c index 6852d73c931c..bc7c05e20242 100644 --- a/drivers/gpu/drm/drm_blend.c +++ b/drivers/gpu/drm/drm_blend.c @@ -241,6 +241,31 @@ int drm_plane_create_alpha_property(struct drm_plane *= plane) } EXPORT_SYMBOL(drm_plane_create_alpha_property); =20 +static const struct drm_prop_enum_list rotation_props[] =3D { + { __builtin_ffs(DRM_MODE_ROTATE_0) - 1, "rotate-0" }, + { __builtin_ffs(DRM_MODE_ROTATE_90) - 1, "rotate-90" }, + { __builtin_ffs(DRM_MODE_ROTATE_180) - 1, "rotate-180" }, + { __builtin_ffs(DRM_MODE_ROTATE_270) - 1, "rotate-270" }, + { __builtin_ffs(DRM_MODE_REFLECT_X) - 1, "reflect-x" }, + { __builtin_ffs(DRM_MODE_REFLECT_Y) - 1, "reflect-y" }, +}; + +/** + * drm_get_rotation_name - Return the name of a rotation + * @rotation: The rotation mask (DRM_MODE_ROTATE_* | DRM_MODE_REFLECT_*) + * + * Returns: the name of the rotation type (unknown) if rotation is not + * a known rotation/reflection + */ +const char *drm_get_rotation_name(unsigned int rotation) +{ + if (rotation < ARRAY_SIZE(rotation_props)) + return rotation_props[rotation].name; + + return "(unknown)"; +} +EXPORT_SYMBOL(drm_get_rotation_name); + /** * drm_plane_create_rotation_property - create a new rotation property * @plane: drm plane @@ -279,14 +304,6 @@ int drm_plane_create_rotation_property(struct drm_plan= e *plane, unsigned int rotation, unsigned int supported_rotations) { - static const struct drm_prop_enum_list props[] =3D { - { __builtin_ffs(DRM_MODE_ROTATE_0) - 1, "rotate-0" }, - { __builtin_ffs(DRM_MODE_ROTATE_90) - 1, "rotate-90" }, - { __builtin_ffs(DRM_MODE_ROTATE_180) - 1, "rotate-180" }, - { __builtin_ffs(DRM_MODE_ROTATE_270) - 1, "rotate-270" }, - { __builtin_ffs(DRM_MODE_REFLECT_X) - 1, "reflect-x" }, - { __builtin_ffs(DRM_MODE_REFLECT_Y) - 1, "reflect-y" }, - }; struct drm_property *prop; =20 WARN_ON((supported_rotations & DRM_MODE_ROTATE_MASK) =3D=3D 0); @@ -294,7 +311,7 @@ int drm_plane_create_rotation_property(struct drm_plane= *plane, WARN_ON(rotation & ~supported_rotations); =20 prop =3D drm_property_create_bitmask(plane->dev, 0, "rotation", - props, ARRAY_SIZE(props), + rotation_props, ARRAY_SIZE(rotation_props), supported_rotations); if (!prop) return -ENOMEM; diff --git a/include/drm/drm_blend.h b/include/drm/drm_blend.h index 88bdfec3bd88..381d1f8d815b 100644 --- a/include/drm/drm_blend.h +++ b/include/drm/drm_blend.h @@ -42,6 +42,8 @@ static inline bool drm_rotation_90_or_270(unsigned int ro= tation) =20 #define DRM_BLEND_ALPHA_OPAQUE 0xffff =20 +const char *drm_get_rotation_name(unsigned int rotation); + int drm_plane_create_alpha_property(struct drm_plane *plane); int drm_plane_create_rotation_property(struct drm_plane *plane, unsigned int rotation, --=20 2.51.0 From nobody Sun Feb 8 12:14:34 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 996832E093C for ; Wed, 29 Oct 2025 14:37:06 +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=1761748628; cv=none; b=MqUerpNgmzvDbOZ+pUzJFc3QKl65ZB7tg+weD1tTp33Gv+fuYYgxpknPOjTIKu/Cykzj+bA8jy6uS3fFDyhUqHD8Q2WA6/HAi0KpQDwO7/cM6N1xubRqSu00KWlZ0NWtzoOPgEu25ZL5rKa/37yKziCoYfsYNthSNNH8LwTiVsE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761748628; c=relaxed/simple; bh=EWVgtj5CqLfQMmBn4PxWSe+Ra69UhyW4oe1nnFTIWxY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=WLIM70/1Tlder7la1T4ryyjGtM2RLdis5J8DS2eX135QwBJnusy5Pqw36aXIwB5qV0t0dXkTmCCm6irH5FrBfXXXeIOf12aw8KO/vwisXOh4tPNt6Jz7LkdA2zg7LisXXTmxWNs5DsY8NebtCG4/UilPAnl9gtoytNND5nkEkLk= 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=rEIvVSAF; 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="rEIvVSAF" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id CE5DE4E413CF; Wed, 29 Oct 2025 14:37:04 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id A2672606E8; Wed, 29 Oct 2025 14:37:04 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 8D850117F81B3; Wed, 29 Oct 2025 15:37:02 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761748623; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=DiQB9CvqPCMSCmfCQm+BM0yWoh/K98ULkreAzLkudAw=; b=rEIvVSAFBJVqP2kWkuvDv4tBTWrUMjT/HWF0WsW8PKtakZLthMr5N5xsYbj6cf35YL+cPA FSqKoH24AGzJRcNMORxiWMbKe4b6RAZYm8uPP9xRhGCeqpSA88enrIxmSlCydcBiHvk53l MBwbWX8YKnzkSIiAabZuPfQL6tDOeoAiQIoVnqLC+9zGP+0ZelGM9swB0CjjLnf6SPULr8 dHNKYBwppdnZINlg3V46aPYFHtXgPWfCRbqUuu674IHaX5qcYe3y4fQVHA32+K1GcsvxX6 dH8SY/Q1LQTa/TyQSrnN33rPCBklcIUb7+q/Za5rhhqhj4e8u3mQ77QtzQjUcg== From: Louis Chauvet Date: Wed, 29 Oct 2025 15:36:45 +0100 Subject: [PATCH RESEND v2 08/32] 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: <20251029-vkms-all-config-v2-8-a49a2d4cba26@bootlin.com> References: <20251029-vkms-all-config-v2-0-a49a2d4cba26@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-a49a2d4cba26@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=11951; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=EWVgtj5CqLfQMmBn4PxWSe+Ra69UhyW4oe1nnFTIWxY=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAiZ7ewS7jOCcxzhGDbAAD3UJ5s5lT+gAkyfYj aqeTDzb9g2JAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQImewAKCRAgrS7GWxAs 4sr3D/9a5A1bmt74uypnnEsBFSuTpwS9KC+OkRiCtU+bZ4ImoLQpSY54CAwSt/7OdiN7Qbnz0Gf HOTqAWDB1EGX9Dbb/ebdOHQzSvyrpTMswzoN2u+8+jCPvuqTmBMHm7rOvBU8FbWgze40EjLyjqB 1b8Krz1OdJyvPMH0FjFwyxIwv/9wJaJTb5D1rSL50fui5ofHMr8h8bizeRGB4hPEn0bGJOgF2bi 9pcHPi0ymgAiU1aG6/QWVFBO3UlRcqllm2M4L2jKwOf31ViGw76zJ17TA+AhhCg9rVwuSyeTG2c knmUdXcGYNuRFoew9tK4mna1dxd8nQytZuY0Mf+8PsijcaOVwBpCvl3f/s80+6LTCGDtLXkmj8l 6wNBjQzyfdGbeFJPvHw9odMbmHbq0ph+D5eihg5tSsksf1zazp/G4cIpcROXDJqq1FbqVBBT0Da pUfvd1q0rxaEJQmCJkPUok7MZ3QxIuMgGhAogB1vFXQ/2pR5bWICX4JpDdz8EZvu4/RIrkQP+OA PdBnHr+CUn1D4PWR3C6FssGxHgLHAs5aghJ180pnvwNne2ZWqi9bkVTReO9VAxVCwlaBszEPqOx PVdDx1b/SzO2ZskL78Yye2KHK0zmPRwJtRrCIW14xHZ22i5pqjSI1SE0zYH+VbC07XhKLjvOdnf TKjBXoXEMw5PRcg== 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 Reviewed-by: Luca Ceresoli --- drivers/gpu/drm/vkms/tests/vkms_config_test.c | 46 +++++++++++++++++++ drivers/gpu/drm/vkms/vkms_config.c | 63 +++++++++++++++++++++++= ++++ drivers/gpu/drm/vkms/vkms_config.h | 59 +++++++++++++++++++++++= ++ drivers/gpu/drm/vkms/vkms_plane.c | 6 ++- 4 files changed, 172 insertions(+), 2 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 d75a6252e4d2..8d805084ad96 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 #include =20 #include "../vkms_config.h" @@ -172,6 +173,12 @@ static void vkms_config_test_default_config(struct kun= it *test) n_possible_crtcs++; } KUNIT_EXPECT_EQ(test, n_possible_crtcs, 1); + KUNIT_EXPECT_EQ(test, + vkms_config_plane_get_supported_rotations(plane_cfg), + DRM_MODE_ROTATE_MASK | DRM_MODE_REFLECT_MASK); + KUNIT_EXPECT_EQ(test, + vkms_config_plane_get_default_rotation(plane_cfg), + DRM_MODE_ROTATE_0); } =20 /* Encoders */ @@ -468,6 +475,44 @@ static void vkms_config_test_valid_plane_type(struct k= unit *test) vkms_config_destroy(config); } =20 +static void vkms_config_test_valid_plane_rotations(struct kunit *test) +{ + struct vkms_config *config; + struct vkms_config_plane *plane_cfg; + + config =3D vkms_config_default_create(false, false, false); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); + + plane_cfg =3D get_first_plane(config); + + /* Valid, no rotation, no reflection */ + vkms_config_plane_set_supported_rotations(plane_cfg, DRM_MODE_ROTATE_0); + vkms_config_plane_set_default_rotation(plane_cfg, DRM_MODE_ROTATE_0); + KUNIT_EXPECT_TRUE(test, vkms_config_valid_plane_rotation(config, plane_cf= g)); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Invalid, default rotation is not supported */ + vkms_config_plane_set_supported_rotations(plane_cfg, DRM_MODE_ROTATE_0); + vkms_config_plane_set_default_rotation(plane_cfg, DRM_MODE_ROTATE_90); + KUNIT_EXPECT_FALSE(test, vkms_config_valid_plane_rotation(config, plane_c= fg)); + KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); + + /* Invalid, supported rotations must contains at least one rotation */ + vkms_config_plane_set_supported_rotations(plane_cfg, DRM_MODE_REFLECT_MAS= K); + vkms_config_plane_set_default_rotation(plane_cfg, DRM_MODE_REFLECT_X | DR= M_MODE_ROTATE_0); + KUNIT_EXPECT_FALSE(test, vkms_config_valid_plane_rotation(config, plane_c= fg)); + KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); + + /* Invalid, default rotation must contains at least one rotation */ + vkms_config_plane_set_supported_rotations(plane_cfg, + DRM_MODE_REFLECT_MASK | DRM_MODE_ROTATE_0); + vkms_config_plane_set_default_rotation(plane_cfg, DRM_MODE_REFLECT_X); + KUNIT_EXPECT_FALSE(test, vkms_config_valid_plane_rotation(config, plane_c= fg)); + KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); + + vkms_config_destroy(config); +} + static void vkms_config_test_valid_plane_possible_crtcs(struct kunit *test) { struct vkms_config *config; @@ -990,6 +1035,7 @@ static struct kunit_case vkms_config_test_cases[] =3D { KUNIT_CASE(vkms_config_test_get_connectors), KUNIT_CASE(vkms_config_test_invalid_plane_number), KUNIT_CASE(vkms_config_test_valid_plane_type), + KUNIT_CASE(vkms_config_test_valid_plane_rotations), KUNIT_CASE(vkms_config_test_valid_plane_possible_crtcs), KUNIT_CASE(vkms_config_test_invalid_crtc_number), KUNIT_CASE(vkms_config_test_invalid_encoder_number), diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index bfafb5d2504d..dd951db88888 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -3,7 +3,9 @@ #include #include =20 +#include #include +#include #include #include #include @@ -146,6 +148,33 @@ static bool valid_plane_number(const struct vkms_confi= g *config) return true; } =20 +VISIBLE_IF_KUNIT +bool vkms_config_valid_plane_rotation(const struct vkms_config *config, + const struct vkms_config_plane *plane_cfg) +{ + struct drm_device *dev =3D config->dev ? &config->dev->drm : NULL; + + 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 plane= \n"); + return false; + } + + if ((vkms_config_plane_get_default_rotation(plane_cfg) & DRM_MODE_ROTATE_= MASK) =3D=3D 0) { + drm_info(dev, "Configured default rotation must contains at least one po= ssible rotation\n"); + return false; + } + + if ((vkms_config_plane_get_supported_rotations(plane_cfg) & DRM_MODE_ROTA= TE_MASK) =3D=3D 0) { + drm_info(dev, "Configured supported rotations must contains at least one= possible rotation\n"); + return false; + } + + return true; +} +EXPORT_SYMBOL_IF_KUNIT(vkms_config_valid_plane_rotation); + static bool valid_planes_for_crtc(const struct vkms_config *config, struct vkms_config_crtc *crtc_cfg) { @@ -303,6 +332,12 @@ static bool valid_connector_possible_encoders(const st= ruct vkms_config *config) bool vkms_config_is_valid(const struct vkms_config *config) { struct vkms_config_crtc *crtc_cfg; + struct vkms_config_plane *plane_cfg; + + vkms_config_for_each_plane(config, plane_cfg) { + if (!vkms_config_valid_plane_rotation(config, plane_cfg)) + return false; + } =20 if (!valid_plane_number(config)) return false; @@ -334,6 +369,22 @@ bool vkms_config_is_valid(const struct vkms_config *co= nfig) } EXPORT_SYMBOL_IF_KUNIT(vkms_config_is_valid); =20 +static void show_bitfield(struct seq_file *m, uint32_t value, const char *= callback(unsigned int)) +{ + u32 offset =3D 0; + bool first =3D true; + + while (value >=3D BIT(offset) && offset < 32) { + if (value & BIT(offset)) { + if (!first) + seq_puts(m, ","); + seq_printf(m, callback(offset)); + first =3D false; + } + offset +=3D 1; + } +} + static int vkms_config_show(struct seq_file *m, void *data) { struct drm_debugfs_entry *entry =3D m->private; @@ -354,6 +405,14 @@ static int vkms_config_show(struct seq_file *m, void *= data) drm_get_plane_type_name(vkms_config_plane_get_type(plane_cfg))); seq_printf(m, "\tname=3D%s\n", vkms_config_plane_get_name(plane_cfg)); + seq_puts(m, "\tsupported rotations=3D"); + show_bitfield(m, vkms_config_plane_get_supported_rotations(plane_cfg), + drm_get_rotation_name); + seq_puts(m, "\n"); + seq_puts(m, "\tdefault rotation=3D"); + show_bitfield(m, vkms_config_plane_get_default_rotation(plane_cfg), + drm_get_rotation_name); + seq_puts(m, "\n"); } =20 vkms_config_for_each_crtc(vkmsdev->config, crtc_cfg) { @@ -395,6 +454,10 @@ struct vkms_config_plane *vkms_config_create_plane(str= uct 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 | DRM_MODE_REFLECT_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 57342db5795a..8d413e02180a 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,61 @@ 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(const struct vkms_config_plane *pla= ne_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(const 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; +} + +#if IS_ENABLED(CONFIG_KUNIT) +bool vkms_config_valid_plane_rotation(const struct vkms_config *config, + const struct vkms_config_plane *plane_cfg); +#endif + /** * 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 73180cbb78b1..d147b70692fa 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 12:14:34 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 2EE3E2D5C6C for ; Wed, 29 Oct 2025 14:37:07 +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=1761748630; cv=none; b=qifyhr/LmFxpDxF5ZSgO3yURpkMyRL9zmlGrMHl8n5t/KKiNhcSz+5ynds8gDw1R5zjTBIU2RdUyrP3MBilYCaoSVt5sMziUw9Bd37QzhZK/yFftNvs+8aF6IXXdU7Xqej4RVN3NH2gtFroGPlPUQfu7993aLmqmNe3crF8V36U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761748630; c=relaxed/simple; bh=Dv+LTI2ccj4n/EV0vGVog8BjMGvNzDlPlpeBGi9mOcY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=KQmabB/gfTazo7NwRfVpkZUUy6VFbncIXfpws6pcnunGKK1bvN63oUCZcrLqxZnCeXzabu4av8vPAu6ao8r15YwttHBywpQ3Q4MS9CYJeqesxQPmzZm3Luc7uXJ5hCawnwE5IH3XBEZFtqCAQ65k+09FboqcYYIou2q9jxpytOA= 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=BMTZjA2P; 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="BMTZjA2P" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 8CC464E413CD; Wed, 29 Oct 2025 14:37:06 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 5FD05606E8; Wed, 29 Oct 2025 14:37:06 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 2562B117F81B0; Wed, 29 Oct 2025 15:37:04 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761748625; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=iqMVLDuN4ai0MP2bHzX+4+j1XnBiI2VvRCwM5QgdY5E=; b=BMTZjA2Pvjs5jSnws+Oa7xbu+CTkBt0d1AxX95ba8GDtE0gqV5x6Q+Ruw2Aof6JmQtMqZN DNabOeN+t8SdVzTTRd472OtzE++VDPaQ2xaB5tT43SYzYjOFW/8EgG9W94E5kJxMt3Qc1w Ftt19J6lU56kdTv3Xjddb8XAop531QuRMUFqfBNkLR9JZRH/b8xPq+GzI4exlS+E4OaDSz ubasmz/lDv7pUkwIyHcKwUgAiYL8M2p7sGLrIDmLPpi4oXnnMn5gKgxUNHG4Xcbyjw3sC5 PoLbZ16ascBTypRohq1RAvVOCyCeeUjxokTB5dFQJPWxo3Nuoa7zi63j++h86A== From: Louis Chauvet Date: Wed, 29 Oct 2025 15:36:46 +0100 Subject: [PATCH RESEND v2 09/32] 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: <20251029-vkms-all-config-v2-9-a49a2d4cba26@bootlin.com> References: <20251029-vkms-all-config-v2-0-a49a2d4cba26@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-a49a2d4cba26@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=4874; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=Dv+LTI2ccj4n/EV0vGVog8BjMGvNzDlPlpeBGi9mOcY=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAiZ7YNP9XXMDrcnEpQgcHgNfI8K5oQV5Wsbk8 MSmunogl0+JAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQImewAKCRAgrS7GWxAs 4tiGEADMtOf6Q6j/mf3hw8cA7hMigthOuclQTLk3/siF5eq2tAKJXYerW5cYJ+SAwANdlNgTC6S VdgfooiYs02K3ZelEcw61ZEiyu7O1yiz01P4ktW6b3HAxxTp9Ru7LIJV2ShXOYiSoCtIWfC95Xa 6aC+EY20c18r8MjBRZO9B6AaeBKL9sM2rEoBnW6KGixbxWMsIFq+pxLnT8xXLowkQ8naF5Ol0+m 1Fiq87LAJSoIq8WKZNcpp5AYabIwL5aICbgQGz8rcUYeJUEHum9WF08njnI1TXI8avjKUe/Ggs6 RzdcwsDqX1r4meZ/FHB9ktuWVX42m/Hr7rbf0GJ6/gikYnD3jQz8VY1as2yZqyYmY43x+9Gpd0d EaXazISN8/RLVCVrQQHjSF8jZSzwbwuZapyubhdciCz9xkfWeqeZr0+YaqBKLM3e0D6bRAhgkRx gJ/H89q1gI4IZxZ1xHjCE/asZtb0VMTVCV49Abv9USlDa0d/y1l25strh6lo7qDuE+puXPCc6xD MlQKNG/9hY91ywa+5M5gfTr+TP6hvmhyPuWmShs6/qlR6M1LH17IJ+vqlI+r56Ul4GhsE/JaS+6 0PgLZskezt4m+mYdhlbntLCtd6dpa5UDw3nUFNdxjrinRoqWAvrFMDMc0HEWT34VNkqMd4bC890 OPECg4pVPw4LqTA== 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 | 91 ++++++++++++++++++++++++++++++++= ++++ 2 files changed, 97 insertions(+), 1 deletion(-) diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index 1fe6e420c963..eac1a942d6c4 100644 --- a/Documentation/gpu/vkms.rst +++ b/Documentation/gpu/vkms.rst @@ -87,11 +87,16 @@ Start by creating one or more planes:: =20 sudo mkdir /config/vkms/my-vkms/planes/plane0 =20 -Planes have 2 configurable attributes: +Planes have 4 configurable attributes: =20 - type: Plane type: 0 overlay, 1 primary, 2 cursor (same values as those exposed by the "type" property of a plane) - name: Name of the 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 be6c3ba998b9..7cc8ba315ef0 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -352,12 +352,103 @@ static ssize_t plane_name_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) + 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) + return -EINVAL; + + vkms_config_plane_set_default_rotation(plane->config, val); + } + + return count; +} + CONFIGFS_ATTR(plane_, type); CONFIGFS_ATTR(plane_, name); +CONFIGFS_ATTR(plane_, supported_rotations); +CONFIGFS_ATTR(plane_, default_rotation); =20 static struct configfs_attribute *plane_item_attrs[] =3D { &plane_attr_type, &plane_attr_name, + &plane_attr_supported_rotations, + &plane_attr_default_rotation, NULL, }; =20 --=20 2.51.0 From nobody Sun Feb 8 12:14:34 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 E95232E040D for ; Wed, 29 Oct 2025 14:37: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=1761748632; cv=none; b=qxhrAuMymxNfI1o8Dqhd8alNTI8WD7Vg9jvkgaU8+rD4B3ho3Xy1LU3AGArdAmoxueCqjfA7t/zuug9GTB9INWi82Gn1iCJpK9DUdyJQUUfLRPVpEYalZog0Q7QhY0yYiV2ChnWgv9ECnWIycSLpYRHYodHJdmIfyo9JuUL8Qa0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761748632; c=relaxed/simple; bh=9TfPsJICnyPE31+Hej6T7C008mQBIxzh3S131zfeBZs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=VqzMOO+shTodlKlCSyR19o9Xho+cg6Knwm4O4EtumIu6UVQnXxe0tl7ZJOhei1NZiJNCMwXL4nNj4s/AJK6IJTskkVWYk66OqXw+ytA7zxMFUm32uKLAssM7QomsgZpSoRu0ZpBphrOrLS1iy6PrCI1nadVcocs/f3k/kogbQ4g= 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=0tHwITeS; 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="0tHwITeS" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 1024AC0DA83; Wed, 29 Oct 2025 14:36:49 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 6790A606E8; Wed, 29 Oct 2025 14:37:09 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id E5CDB117F81B4; Wed, 29 Oct 2025 15:37:05 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761748628; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=gKwfA60Mu6/uVfL7AHgIja/er1PeHgmxn0F8i6czpgo=; b=0tHwITeSEX9IAT2Hkl/0Uuv/GhmMDL88SaubPkaF9e5H4kUNc9HUlt5sXkY9npPyp8I0Tn zP5n7PMlkz2YFydJda7wDt29qI9rRLjRy/ipA6qwaWs1l3wWz2gK/qVL8791kkbZcNspL6 WbNMgrb4BGkCLFVffutBzTq2PfXwgaPp2kCd174ndr3OFEkRBhPh59239P25iewNvI9Ee3 MAqliYxfXJpCNr0KB046ahAhuns5Xf4vJ1MPS69DUXmRUyyj9fRepWRZM9wq/szA4lsA+J LPlvmYQsj7wMYH7t6xKy1geB9trIkTseNVhLnzShPfx9J31MDy6+qvcLi9Jexg== From: Louis Chauvet Date: Wed, 29 Oct 2025 15:36:47 +0100 Subject: [PATCH RESEND v2 10/32] drm/drm_color_mgmt: Expose drm_get_color_encoding_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: <20251029-vkms-all-config-v2-10-a49a2d4cba26@bootlin.com> References: <20251029-vkms-all-config-v2-0-a49a2d4cba26@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-a49a2d4cba26@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=2102; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=9TfPsJICnyPE31+Hej6T7C008mQBIxzh3S131zfeBZs=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAiZ7YdK4D+jRwSz0I2Yym8cFs6ppWAkleolSn HCQlwv/fd+JAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQImewAKCRAgrS7GWxAs 4vWyD/91ynn74BtgRUvbYFkm0ImaDjsitRUS+6cZFBqLq5GMOqDHYGohrQhHQKlhT6XLJwzM2A2 DrC0zLlHQy2gwkNTYJbshcP/zt9gG47bl0gc5TVYPyRIOlPamT+Mj/DQmFXVB6IYUKVMmv5XqZW kHGjeHo7M68Cx2dJN6cvYrv5mHyVzwAgBuyeUchDBW8Mb7EftbCFD7fMdC0fq8ud1iJQvGswsqm Tf1kZ+USr2UAnDie0tvZnAxy3L2O5w4T82oTZVovTU+RIzlEUqFEcr0NZrx4jaJVzbmrZYicL54 1AjigRjU9ntVCmq9ii3fZrJBxvW/LPOndVRFkZswWtduu6D1btutts+YVxMNlEVRZBnheOE5eKI nrkwVjPV/UjRJ1QSgWaJCsz43EIiQ2TRzNB4H9LlOdk2Hfh2lzNprIykFGGgOlt+QCx2f5udUh5 YCSIsrQafuTZtpwSc0HwaiVjzNMa4L2YEwv4q0Yp3EVQgRiRIDrIc3g3d0WxZ+aUIjWTUbn08dF j0Wb6O6LDcVfyw5xLpkG0si2q+IsAiW0vQreTmeA+uubinlLBAfFTUV6KOSocpodnPlRc68osof dVShjf9peW3iTRbhb+naKsfQ+D6sPZF+VY4vw5UHMyxsyqEwvgX9aLqtl7UMnxchnlp0KdeaprY eUmB7VJXjWySNLw== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 drm_get_color_encoding_name can be useful to display debug information outside drm core. Export it so it could be used for VKMS Signed-off-by: Louis Chauvet Reviewed-by: Luca Ceresoli --- drivers/gpu/drm/drm_color_mgmt.c | 2 +- drivers/gpu/drm/drm_crtc_internal.h | 2 -- include/drm/drm_color_mgmt.h | 2 ++ 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/drm_color_mgmt.c b/drivers/gpu/drm/drm_color_m= gmt.c index 131c1c9ae92f..b0a3be3cc016 100644 --- a/drivers/gpu/drm/drm_color_mgmt.c +++ b/drivers/gpu/drm/drm_color_mgmt.c @@ -496,7 +496,7 @@ const char *drm_get_color_encoding_name(enum drm_color_= encoding encoding) =20 return color_encoding_name[encoding]; } -EXPORT_SYMBOL_IF_KUNIT(drm_get_color_encoding_name); +EXPORT_SYMBOL(drm_get_color_encoding_name); =20 /** * drm_get_color_range_name - return a string for color range diff --git a/drivers/gpu/drm/drm_crtc_internal.h b/drivers/gpu/drm/drm_crtc= _internal.h index 89706aa8232f..68fd5385917f 100644 --- a/drivers/gpu/drm/drm_crtc_internal.h +++ b/drivers/gpu/drm/drm_crtc_internal.h @@ -38,7 +38,6 @@ #include #include =20 -enum drm_color_encoding; enum drm_color_range; enum drm_connector_force; enum drm_mode_status; @@ -121,7 +120,6 @@ int drm_mode_destroy_dumb_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv); =20 /* drm_color_mgmt.c */ -const char *drm_get_color_encoding_name(enum drm_color_encoding encoding); const char *drm_get_color_range_name(enum drm_color_range range); =20 /* IOCTLs */ diff --git a/include/drm/drm_color_mgmt.h b/include/drm/drm_color_mgmt.h index eccb71ab335a..eb55bdd33f50 100644 --- a/include/drm/drm_color_mgmt.h +++ b/include/drm/drm_color_mgmt.h @@ -85,6 +85,8 @@ enum drm_color_range { DRM_COLOR_RANGE_MAX, }; =20 +const char *drm_get_color_encoding_name(enum drm_color_encoding encoding); + int drm_plane_create_color_properties(struct drm_plane *plane, u32 supported_encodings, u32 supported_ranges, --=20 2.51.0 From nobody Sun Feb 8 12:14:34 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 439C12EBB88 for ; Wed, 29 Oct 2025 14:37:12 +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=1761748634; cv=none; b=C080daZZmJCBcB1cavsqjtUL47v0BwgnF4AtmYUBRCH63iwVuOKA9XSxDuUiMLFpuXfhEEh+1WjC0GMRoizVIiAIFpZtnDoxoS35o/XczW5S/hNG5/db47s1uZjvt6DkuDxri6suNYg2Hwo2i3R1IwfSjYSkamNL7G3AOCb7Zw0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761748634; c=relaxed/simple; bh=fjA3uHrWGPIdRuzypNSgwDb9BsOZZE8SEPcDqjBca6M=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=OxQJZEAk41BLmZsbbbygDMzswo9+TA4PDhIGsQBG1F/B/ixYMlLgLaX60FrVvtoRPZPzraZJeJ37Q++oO1satiaKqE8H4MOl/Gn6kbsCDletgbyoNMffXokzFsNPwH05Dae69IE/JeDTNdGz5S6xpYgO/4ksLrEvdqTK9pjef10= 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=O1WGgp4i; 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="O1WGgp4i" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id B1D30C0DA84; Wed, 29 Oct 2025 14:36:50 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 155D1606E8; Wed, 29 Oct 2025 14:37:11 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id D3D5A117F81B5; Wed, 29 Oct 2025 15:37:08 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761748630; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=EiYlyg9skF8q1c98aSDi7YMXuCRISp0a8Q6aImyKbJc=; b=O1WGgp4iWC+282lp+6Ag3yaI5ibygLHhDUd4DAWBxhrbsTgQMtOgadZ5fwbd04dHPe1553 tw2KaSouienGulcBamSanE+UpzwcsqgOHeIAOKjXC5Pf86GcP0r5YEf15/t6gfUW+i5TGp XpojZ1PPqwceWlLg9l1plhFfySKXcIXatGiWB2O9CjuHZO8fXMPKEw1eaRQ0j4wIaR2VL4 6ZtKu5BGRu0LyrZXbR56zhlyO79mOnz750E5wbMUdF7r+KHkEq+MSZ5CL0mKV/AHo4pak0 Ej4Pck3edLqMH59lJms77G4yINeKPRYFps2E/m2XgN5wgq5P354FiaGm98l2qw== From: Louis Chauvet Date: Wed, 29 Oct 2025 15:36:48 +0100 Subject: [PATCH RESEND v2 11/32] 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: <20251029-vkms-all-config-v2-11-a49a2d4cba26@bootlin.com> References: <20251029-vkms-all-config-v2-0-a49a2d4cba26@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-a49a2d4cba26@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=11725; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=fjA3uHrWGPIdRuzypNSgwDb9BsOZZE8SEPcDqjBca6M=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAiZ7q1KmHgzT++39u1P0ouPt3aF+zh8cuiIty 5Vv1pNDKBqJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQImewAKCRAgrS7GWxAs 4kTkD/9E1o72yJS1QTsOvJqGaDRSJqh9o8XdeTRsTENG6p2qsBrqJDwMnkeCgl3CSaEarVF4tbu KWKKXMsoJnJ1oXpg3wL3IzQRSQqqZc6ArnOM8RFhp76NqUyv7GMkrfBBWUNiX9lFqbZy1mxawL/ I+68QFdZf/b0IzLHifN3cSLkqHHY0uC8CAeu68LbFyrGGlU0slcEZau+8QQ8Pe5nLTrzRC81IEK 2JeNY0q8sIgX3+rOZx68lG8PZ5M7xpM6eLkQ8GDNPyogwempMNCKMMXHw8jeRm/ZQQMF4/KbnK9 xyRxxGH6iJgmjUItbTuZXZ0RohGMQf63Yiz7XYf4BCt/wplCevzGf2bg3t6frA1t8Qz1AIOlAQR q1/INCJZsRosR6l4v2CtwSDBjTMrHVlyNtFf6VecRK0Phgd/6ppKjVamo6T/N/YjztcDQk9K7Mt 5PlXi3AcDK4B7hG11yiADs0PCS3nFzvmnvMKtpY+lWFRAgAC6tESzEbG1uwsJvnJ7lFy2PhtzM3 REE6GG4F1NTDSCxC3T11aommyo41t5LO33ZUUTm2Qykz8D8y1soKmBRhPqOQd/26sE9VU8KKZg/ FgX4zAnUYojVEhfvTdqYQZXTDlFwp1SYHU4E8mjOzUVwytsALuoPAunEx5geWlsRQ2B5rsErzEN Sc8lQqVGTw2tL3A== 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/tests/vkms_config_test.c | 51 +++++++++++++++++++++ drivers/gpu/drm/vkms/vkms_config.c | 32 ++++++++++++++ drivers/gpu/drm/vkms/vkms_config.h | 64 +++++++++++++++++++++++= ++++ drivers/gpu/drm/vkms/vkms_plane.c | 15 +++---- 4 files changed, 154 insertions(+), 8 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 8d805084ad96..e9bc051188f9 100644 --- a/drivers/gpu/drm/vkms/tests/vkms_config_test.c +++ b/drivers/gpu/drm/vkms/tests/vkms_config_test.c @@ -179,6 +179,14 @@ static void vkms_config_test_default_config(struct kun= it *test) KUNIT_EXPECT_EQ(test, vkms_config_plane_get_default_rotation(plane_cfg), DRM_MODE_ROTATE_0); + KUNIT_EXPECT_EQ(test, + vkms_config_plane_get_supported_color_encodings(plane_cfg), + BIT(DRM_COLOR_YCBCR_BT601) | + BIT(DRM_COLOR_YCBCR_BT709) | + BIT(DRM_COLOR_YCBCR_BT2020)); + KUNIT_EXPECT_EQ(test, + vkms_config_plane_get_default_color_encoding(plane_cfg), + DRM_COLOR_YCBCR_BT601); } =20 /* Encoders */ @@ -513,6 +521,48 @@ static void vkms_config_test_valid_plane_rotations(str= uct kunit *test) vkms_config_destroy(config); } =20 +static void vkms_config_test_valid_plane_color_encoding(struct kunit *test) +{ + struct vkms_config *config; + struct vkms_config_plane *plane_cfg; + + config =3D vkms_config_default_create(false, false, false); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); + + plane_cfg =3D get_first_plane(config); + + /* Valid, all color encoding supported */ + vkms_config_plane_set_supported_color_encodings(plane_cfg, + BIT(DRM_COLOR_YCBCR_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); + KUNIT_EXPECT_TRUE(test, vkms_config_valid_plane_color_encoding(config, pl= ane_cfg)); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Invalid, default color encoding is not supported */ + vkms_config_plane_set_supported_color_encodings(plane_cfg, + BIT(DRM_COLOR_YCBCR_BT601) | + BIT(DRM_COLOR_YCBCR_BT2020)); + vkms_config_plane_set_default_color_encoding(plane_cfg, DRM_COLOR_YCBCR_B= T709); + KUNIT_EXPECT_FALSE(test, vkms_config_valid_plane_color_encoding(config, p= lane_cfg)); + KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); + + /* Valid, no supported or color encoding */ + vkms_config_plane_set_supported_color_encodings(plane_cfg, 0); + vkms_config_plane_set_default_color_encoding(plane_cfg, 0); + KUNIT_EXPECT_TRUE(test, vkms_config_valid_plane_color_encoding(config, pl= ane_cfg)); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Valid, if no supported color encoding, default is ignored */ + vkms_config_plane_set_supported_color_encodings(plane_cfg, 0); + vkms_config_plane_set_default_color_encoding(plane_cfg, DRM_COLOR_YCBCR_B= T601); + KUNIT_EXPECT_TRUE(test, vkms_config_valid_plane_color_encoding(config, pl= ane_cfg)); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + vkms_config_destroy(config); +} + static void vkms_config_test_valid_plane_possible_crtcs(struct kunit *test) { struct vkms_config *config; @@ -1036,6 +1086,7 @@ static struct kunit_case vkms_config_test_cases[] =3D= { KUNIT_CASE(vkms_config_test_invalid_plane_number), KUNIT_CASE(vkms_config_test_valid_plane_type), KUNIT_CASE(vkms_config_test_valid_plane_rotations), + KUNIT_CASE(vkms_config_test_valid_plane_color_encoding), KUNIT_CASE(vkms_config_test_valid_plane_possible_crtcs), KUNIT_CASE(vkms_config_test_invalid_crtc_number), KUNIT_CASE(vkms_config_test_invalid_encoder_number), diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index dd951db88888..6a3d52c1141d 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -175,6 +175,25 @@ bool vkms_config_valid_plane_rotation(const struct vkm= s_config *config, } EXPORT_SYMBOL_IF_KUNIT(vkms_config_valid_plane_rotation); =20 +VISIBLE_IF_KUNIT +bool vkms_config_valid_plane_color_encoding(const struct vkms_config *conf= ig, + const struct vkms_config_plane *plane_cfg) +{ + struct drm_device *dev =3D config->dev ? &config->dev->drm : NULL; + + if (vkms_config_plane_get_supported_color_encodings(plane_cfg)) { + if ((BIT(vkms_config_plane_get_default_color_encoding(plane_cfg)) & + vkms_config_plane_get_supported_color_encodings(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; +} +EXPORT_SYMBOL_IF_KUNIT(vkms_config_valid_plane_color_encoding); + static bool valid_planes_for_crtc(const struct vkms_config *config, struct vkms_config_crtc *crtc_cfg) { @@ -337,6 +356,9 @@ bool vkms_config_is_valid(const struct vkms_config *con= fig) vkms_config_for_each_plane(config, plane_cfg) { if (!vkms_config_valid_plane_rotation(config, plane_cfg)) return false; + + if (!vkms_config_valid_plane_color_encoding(config, plane_cfg)) + return false; } =20 if (!valid_plane_number(config)) @@ -413,6 +435,12 @@ static int vkms_config_show(struct seq_file *m, void *= data) show_bitfield(m, vkms_config_plane_get_default_rotation(plane_cfg), drm_get_rotation_name); seq_puts(m, "\n"); + seq_puts(m, "\tsupported color encoding=3D"); + show_bitfield(m, vkms_config_plane_get_supported_color_encodings(plane_c= fg), + drm_get_color_encoding_name); + seq_puts(m, "\n"); + seq_printf(m, "\tdefault color encoding=3D%s\n", + drm_get_color_encoding_name(vkms_config_plane_get_default_color_enco= ding(plane_cfg))); } =20 vkms_config_for_each_crtc(vkmsdev->config, crtc_cfg) { @@ -457,6 +485,10 @@ struct vkms_config_plane *vkms_config_create_plane(str= uct vkms_config *config) vkms_config_plane_set_supported_rotations(plane_cfg, DRM_MODE_ROTATE_MASK | DRM_MODE_REFLECT_MASK); vkms_config_plane_set_default_rotation(plane_cfg, DRM_MODE_ROTATE_0); + vkms_config_plane_set_supported_color_encodings(plane_cfg, BIT(DRM_COLOR_= YCBCR_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 8d413e02180a..d740c9478256 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_encodings: 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_encodings; struct xarray possible_crtcs; =20 /* Internal usage */ @@ -349,6 +353,66 @@ bool vkms_config_valid_plane_rotation(const struct vkm= s_config *config, const struct vkms_config_plane *plane_cfg); #endif =20 +/** + * vkms_config_plane_get_default_color_encoding() - Get the default color = encoding for a plane + * @plane_cfg: Plane to get the default color encoding from + * + * Returns: + * The default color encoding for the plane + */ +static inline enum drm_color_encoding +vkms_config_plane_get_default_color_encoding(const struct vkms_config_plan= e *plane_cfg) +{ + return plane_cfg->default_color_encoding; +} + +/** + * vkms_config_plane_set_default_color_encoding() - Set the default color = encoding for a plane + * @plane_cfg: Plane to set the default color encoding to + * @default_color_encoding: New default color encoding for the plane + */ +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; +} + +/** + * vkms_config_plane_get_supported_color_encodings() - Get the supported c= olor encodings for a plane + * @plane_cfg: Plane to get the supported color encodings from + * + * Returns: + * The supported color encodings for the plane. Each set bit correspond to= a value of enum + * drm_color_encoding: BIT(DRM_COLOR_YCBCR_BT601) | BIT(DRM_COLOR_YCBCR_BT= 709) means that + * DRM_COLOR_YCBCR_BT601 and DRM_COLOR_YCBCR_BT709 are supported. + */ +static inline unsigned int +vkms_config_plane_get_supported_color_encodings(const struct vkms_config_p= lane *plane_cfg) +{ + return plane_cfg->supported_color_encodings; +} + +/** + * vkms_config_plane_set_supported_color_encodings() - Set the supported c= olor encodings for a plane + * @plane_cfg: Plane to set the supported color encodings to + * @supported_color_encodings: New supported color encodings for the plane= . Each set bit corresponds + * to a value of enum drm_color_encoding: + * BIT(DRM_COLOR_YCBCR_BT601) | BIT(DRM_COLOR_Y= CBCR_BT709) means that + * DRM_COLOR_YCBCR_BT601 and DRM_COLOR_YCBCR_BT= 709 are supported. + */ +static inline void +vkms_config_plane_set_supported_color_encodings(struct vkms_config_plane *= plane_cfg, + unsigned int supported_color_encodings) +{ + plane_cfg->supported_color_encodings =3D supported_color_encodings; +} + +#if IS_ENABLED(CONFIG_KUNIT) +bool vkms_config_valid_plane_color_encoding(const struct vkms_config *conf= ig, + const struct vkms_config_plane *plane_cfg); +#endif + /** * 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 d147b70692fa..9550831be51a 100644 --- a/drivers/gpu/drm/vkms/vkms_plane.c +++ b/drivers/gpu/drm/vkms/vkms_plane.c @@ -238,14 +238,13 @@ struct vkms_plane *vkms_plane_init(struct vkms_device= *vkmsdev, 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) | - BIT(DRM_COLOR_YCBCR_BT709) | - BIT(DRM_COLOR_YCBCR_BT2020), - BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) | - BIT(DRM_COLOR_YCBCR_FULL_RANGE), - DRM_COLOR_YCBCR_BT601, - DRM_COLOR_YCBCR_FULL_RANGE); + if (vkms_config_plane_get_supported_color_encodings(config) !=3D 0) + drm_plane_create_color_properties(&plane->base, + vkms_config_plane_get_supported_color_encodings(config), + BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) | + BIT(DRM_COLOR_YCBCR_FULL_RANGE), + 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 12:14:34 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 7B27F301482 for ; Wed, 29 Oct 2025 14:37:14 +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=1761748636; cv=none; b=Ycz4LXx+IyaTjs7JsjQy9weOy2eNNcxMunNcTlJfLltpLYJYyPHTMegWVABtlnRLFvxRMF5CseGvl6lbiKOUqbwS1qFxkRdbIaaLlla760cPvVPbLYaKOuaJ5UAnsZoL3rwU9QCV+NtKhqdCEI1Pjm4EvOj5Mr8z6SG6z4ztkaA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761748636; c=relaxed/simple; bh=kRHIbdbfnhVWw5i8K9kmqCMqIgSkq6c1b5MfkOrcekc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=iSRXr6paRqrLfkJyMJIjdinbRG3ZgFMCkst11QTs4CUtI4hwc+12RSL38uEogm57vNs9PB4Ejs4hItslmJ3pz2WmNHkCNIyVHo+2n7MoK8ePabqWmfpBhXYC8nLUBZtx9TnTt9RpFnL7gtnGpSC5F5hcI3y90fWZG57OdkaxIDY= 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=Rtc3QZQ3; 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="Rtc3QZQ3" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id D82204E413CB; Wed, 29 Oct 2025 14:37:12 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id AC71D606E8; Wed, 29 Oct 2025 14:37:12 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 85A06117F81B7; Wed, 29 Oct 2025 15:37:10 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761748631; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=lzv0r4HbW8ZPDlxxuNQc4DxHoOKfZX5QaG27pmKoI4k=; b=Rtc3QZQ3fiXUw8+6qo/NflDH5DpOVPJEm+U7pZN9v9i0EbZSXmunHZJUUcgqYnnxDEqsUn QZRsR3TSRbxX5uZSD4kt+nYg5TKVeGv4gIfXjHqzK7nJLMGwPl2bIJtgK1qCbPVvi4ii/U QAVRc6RV+Gh6NEYdSvtq+B/r8cn3Qj67MYkN3i8h7TqZpxNye1i86bvgavZmTcpyygUA7u ApwVchGshenisTrA8K17YU6/u5JQlWP0jn2Bx8koqHcJW1KO38STKOtLD88YNKs0Ma6N5v htezIF/xnsBdIDQYhFB8rkJo6CGeCxOXNMt57aZiGmTr/U9K7Y34eWUxXO9EWw== From: Louis Chauvet Date: Wed, 29 Oct 2025 15:36:49 +0100 Subject: [PATCH RESEND v2 12/32] 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: <20251029-vkms-all-config-v2-12-a49a2d4cba26@bootlin.com> References: <20251029-vkms-all-config-v2-0-a49a2d4cba26@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-a49a2d4cba26@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=5578; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=kRHIbdbfnhVWw5i8K9kmqCMqIgSkq6c1b5MfkOrcekc=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAiZ7pFOlkdVDyBDjvvg1Ip41PonTgpIVTnnEu vMcPoWD2DWJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQImewAKCRAgrS7GWxAs 4obSD/95sJJ/ShFvJ849ag/SzYZvQymScWgZHbsOfYM3cuzwl4gSiGIjbedqQf61cKp1D/ZRZc6 anOXBqUTaeQus/Ctmb6EfD+OD9cafyRZIkyUyMLDRJeoGjIQFcUJAbKvniJURK/VDLGTtcgW0qh t2/epJDrjUofLwrewDgAfpKTPCq5ujoY0VzjW1Dt8cSCtKP43MONAU0qIuv/Ym5IUFV4qsUg/qq C1Xxp7h5Ux7HmEJFZdBKSuiYuPNWaE3OTRiVwBLgk4RgMpMAOxoerY2nd9fbNE7W38EM3ZcpO6G SVDNYAN97QpYffICDigo0othj3NoJEKSMLUQHnk6hhjU3We+5F9WzJOCvyjiEmxfohXvXn4jaXS ZpiMSAaPmYsMjot3vnWHmKXXWjDEsl+IRiqE6x/1VSZOz83X7D/ywM66xRpP6qix7cHgsWwKGPZ UWzk6AxjqSH/sQ70c+QaLPIpzA//L/yQfntyLqyTqYeag3QZic1NLVYWj5KvVPkfaX8+UMtRVUE LUD8k1UZiqLnG5PeEciA37Zq8jZE/tO3BVLaNJdOfAUjuiED56TcDrcK+cAMRKM7u3m5DsYqLo+ bfIyb+ItV8AmfFQfu6iGVmkxgX8r72V88E7y5iFgiYN/pzP9OHnJap2hvD8/L0YQ4BKjKSaJtbf x8OaHNSVFZMcRhQ== 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 | 98 ++++++++++++++++++++++++++++++++= ++++ 2 files changed, 104 insertions(+), 1 deletion(-) diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index eac1a942d6c4..dab6811687a2 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 4 configurable attributes: +Planes have 6 configurable attributes: =20 - type: Plane type: 0 overlay, 1 primary, 2 cursor (same values as those exposed by the "type" property of a plane) @@ -97,6 +97,11 @@ Planes have 4 configurable attributes: (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 7cc8ba315ef0..ee2e8d141f9e 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -439,16 +439,114 @@ static ssize_t plane_default_rotation_store(struct c= onfig_item *item, return count; } =20 +static ssize_t plane_supported_color_encodings_show(struct config_item *it= em, 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= ings(plane->config); + } + + return sprintf(page, "%u", supported_color_encoding); +} + +static ssize_t plane_supported_color_encodings_store(struct config_item *i= tem, + 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) + return -EINVAL; + + vkms_config_plane_set_supported_color_encodings(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) + return -EINVAL; + + vkms_config_plane_set_default_color_encoding(plane->config, val); + } + + return count; +} + CONFIGFS_ATTR(plane_, type); CONFIGFS_ATTR(plane_, name); CONFIGFS_ATTR(plane_, supported_rotations); CONFIGFS_ATTR(plane_, default_rotation); +CONFIGFS_ATTR(plane_, supported_color_encodings); +CONFIGFS_ATTR(plane_, default_color_encoding); =20 static struct configfs_attribute *plane_item_attrs[] =3D { &plane_attr_type, &plane_attr_name, &plane_attr_supported_rotations, &plane_attr_default_rotation, + &plane_attr_supported_color_encodings, + &plane_attr_default_color_encoding, NULL, }; =20 --=20 2.51.0 From nobody Sun Feb 8 12:14:34 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 0AB213112C9 for ; Wed, 29 Oct 2025 14:37:16 +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=1761748637; cv=none; b=FMVRc2ikaxQuz8LzMUMU1ZBWzeG1kVir9v98amN1oubmf3RFDo8GyvNvtm1qERb8oGo7uRlbbdCCUVnkeuTalaG99bs0GDb7jtCwaBFj0g/9JbprvwOg2hqw7K1ifzGm5SxszvhnBzVi+7LRBgvppeJ9fJoxIyI/Toe/cJUurmI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761748637; c=relaxed/simple; bh=+Nk0u/KrijgE5zDh6uaPSGFr6ndPexSiMuF6ZPkPnok=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=AkT+vXUR4t3nYK7/y7Z6Q9QtqgsdBELLpvkRZQPB+h7gGKLaBJwizbup7BTWcyun2QzX2KHCczWJrwEYXQx30Tl2Dgy3m5ubaHLbKOLY/lieFHrgri/qOUU6xpOm3bX2YBL3g7GI1SNYZDC7f4pLeMsh+hpiEW6Kgt22f4yYR18= 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=EDWUhscX; 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="EDWUhscX" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 9CF9E4E413D1; Wed, 29 Oct 2025 14:37:14 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 71F1360709; Wed, 29 Oct 2025 14:37:14 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 1EAA4117F81B9; Wed, 29 Oct 2025 15:37:12 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761748633; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=4muwKvrTXY2eKur3coogPiXaumR8M+FqVnR4hpQELAA=; b=EDWUhscXdXDvNLLoepyby051Xj28ZKJDfWr6LLkLzUuZwA5HOPwDHulxNs1Hw01DYeujuL Nv3pX+4PcvYlwj+fLAjYNDM/gf+GZJrJlc4l47wwZKqCGTa0kJkTF/UOKezHA3VdPx3AYi tZmt/VBVOGBKM1D1pphQ+TtB0jgP2VunTLWqC1DxcFu55DuFPE1jEZU5l3SzaYRYHlF1+4 lioz9ahcGcf6SVuul916Y+iIVxC0iCY3yPCu1A5OggZ6PSYGkNClmV9ZSWk88Y17HJGsDU bOZA0T2xt6AHEV1qJMo1sx59aQUmfnrv34T2podY5hE2YCrO63clME3cqVeKDw== From: Louis Chauvet Date: Wed, 29 Oct 2025 15:36:50 +0100 Subject: [PATCH RESEND v2 13/32] drm/drm_color_mgmt: Expose drm_get_color_range_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: <20251029-vkms-all-config-v2-13-a49a2d4cba26@bootlin.com> References: <20251029-vkms-all-config-v2-0-a49a2d4cba26@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-a49a2d4cba26@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=2153; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=+Nk0u/KrijgE5zDh6uaPSGFr6ndPexSiMuF6ZPkPnok=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAiZ7uZTqk2sqraOa5CFkOLQa25qfigWrgKY1e 6wHWMUX37CJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQImewAKCRAgrS7GWxAs 4ndND/9clbGq8hMf9D5YRcm83d2Y8HP1EXP4YsCVpdmiVJfVe89loPnhO5GxCid2U32oXtkx9Oq 0sEe5bzAICdK1du4fEeU6P/FePeWJ6raAXN5SMoq8OME2d9JOEQEvzcXIwOpQRUKtr7aRwaR49T Rglp76scaZzB4OTqvWENGou//H7WWzFinNdmLPYsDSBypmLgbep6C/rKhhmwGbKbg6PDfX01tJw YYDEi1gGx9QjpvwMVv6gJaz1cfgsOb/NtZW/ESoLsTmaTdUrVP28jifHx02oPMBNv4/vCmfMLfw 8/I+WU5oplHSKhqPkRFZIlpuUEtaPXCYNpfqZrWt/vQeC+fpqvXwl36gQByETXunc25GaEEhSXO ZOTeHMKcITiPGLEaaArr0VQox0tfBPRg+DGUjjzxJ2ocXGlFdT0WwF/4iCui5WWXWe6SB1+Zbal h0z+DmNL3dMeJax93j4t2NiEMY5uQqla5B66oFaz11sai/ruOg9E19ceyLdkDBRBurrtvoD2Gcu 1cemOJAP0FlXx8kT+oCkplwu9OUi64R5s56OIRISpnejjeBSN5Sh/d5qx4hLp4vq96MEx4PEnov tmn0soAoVmwn1GDLviWUbtjzf1WVjuwDRs/KVBcy6tK6Z7ToEOQRSazrdgFQAt58tPxjY3veaoz UsSW1GbPf6+CQPA== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 drm_get_color_range_name can be useful to print debugging information. Export it so it could be used from VKMS. Signed-off-by: Louis Chauvet Reviewed-by: Luca Ceresoli --- drivers/gpu/drm/drm_color_mgmt.c | 2 +- drivers/gpu/drm/drm_crtc_internal.h | 4 ---- include/drm/drm_color_mgmt.h | 1 + 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/drm_color_mgmt.c b/drivers/gpu/drm/drm_color_m= gmt.c index b0a3be3cc016..5b24b9843531 100644 --- a/drivers/gpu/drm/drm_color_mgmt.c +++ b/drivers/gpu/drm/drm_color_mgmt.c @@ -512,7 +512,7 @@ const char *drm_get_color_range_name(enum drm_color_ran= ge range) =20 return color_range_name[range]; } -EXPORT_SYMBOL_IF_KUNIT(drm_get_color_range_name); +EXPORT_SYMBOL(drm_get_color_range_name); =20 /** * drm_plane_create_color_properties - color encoding related plane proper= ties diff --git a/drivers/gpu/drm/drm_crtc_internal.h b/drivers/gpu/drm/drm_crtc= _internal.h index 68fd5385917f..9141127a16ab 100644 --- a/drivers/gpu/drm/drm_crtc_internal.h +++ b/drivers/gpu/drm/drm_crtc_internal.h @@ -38,7 +38,6 @@ #include #include =20 -enum drm_color_range; enum drm_connector_force; enum drm_mode_status; =20 @@ -119,9 +118,6 @@ int drm_mode_mmap_dumb_ioctl(struct drm_device *dev, int drm_mode_destroy_dumb_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv); =20 -/* drm_color_mgmt.c */ -const char *drm_get_color_range_name(enum drm_color_range range); - /* IOCTLs */ int drm_mode_gamma_get_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv); diff --git a/include/drm/drm_color_mgmt.h b/include/drm/drm_color_mgmt.h index eb55bdd33f50..0d25b7d9cb29 100644 --- a/include/drm/drm_color_mgmt.h +++ b/include/drm/drm_color_mgmt.h @@ -86,6 +86,7 @@ enum drm_color_range { }; =20 const char *drm_get_color_encoding_name(enum drm_color_encoding encoding); +const char *drm_get_color_range_name(enum drm_color_range range); =20 int drm_plane_create_color_properties(struct drm_plane *plane, u32 supported_encodings, --=20 2.51.0 From nobody Sun Feb 8 12:14:34 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 C4D7D2C0F68 for ; Wed, 29 Oct 2025 14:37:17 +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=1761748639; cv=none; b=Y0p/HpQ96MXoy1I5FQ9ZleCCFnwh4NzvR+wOShq2XXjtVFS2jPMKTgDZSH3oCklaEelLgfJZJA2gLLEM7hIhzYKHtn0aTULqj1sYNqqg3PCObYU4aqUKHN2LrIyxCYrp0R5hvrEZcKpH9GjvZxo2c4mV2eGc5lEguidu9ZI+UQE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761748639; c=relaxed/simple; bh=T760Ea0lymjEwsCgtjQB1XIujALcHIbvM/hl+VMkLp8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=XzPGs10Jmz0/aWkumLvp4JG9cNN1haCwCGCddpb7aQTEqmLWlHXaEypMRLtKgENmx977R3MhBiawdll/m0q1rfY8HKvTKRG94+3yWoYTQ7xzNLLuAJweuK/+FoeYteA61dGmHHXnjgeUAAzaVOPttHd5DaR+rTKOM56B5lFc2a0= 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=kUZPjS1N; 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="kUZPjS1N" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 545E44E413CD; Wed, 29 Oct 2025 14:37:16 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 24486606E8; Wed, 29 Oct 2025 14:37:16 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id DEF39102F24F9; Wed, 29 Oct 2025 15:37:13 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761748635; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=uO84+iwcTFjRfhgWoOtSFw3ivQXohz4k3QCtmL+xJPg=; b=kUZPjS1NIFn/Kbqv/GHeudV/Q6U1M+0aEfa35J0GCwsOq98hg5CfSz/xY7B563ERDmjMN6 oj0UyNSUbWbWi9wtVVrSNZ82ptmjkp/lmQO4wOTLXVcDBh1yJ9+Nwk6bjm4Da2s1aYGnzV ieZiyESGZn6QeIvIPC4BHx92Cyc53w+cXlM9CpwNBEtxQNVuhrIY1pgpOJP9G0z6Zk0aoP SmngF9i95NPgolOEFZb2ZBeIn9cMoiy6gkzNGm88MIjMb5XgIOP4wpLeuO0XBUAOz+KFpD 1OsVdrXayTGu8mlj5hjn8Pj9QbFqZBBLExbunCcdL2hW+cEG51PR5mlz+Pfu1g== From: Louis Chauvet Date: Wed, 29 Oct 2025 15:36:51 +0100 Subject: [PATCH RESEND v2 14/32] 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: <20251029-vkms-all-config-v2-14-a49a2d4cba26@bootlin.com> References: <20251029-vkms-all-config-v2-0-a49a2d4cba26@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-a49a2d4cba26@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=10762; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=T760Ea0lymjEwsCgtjQB1XIujALcHIbvM/hl+VMkLp8=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAiZ7h87AERN393FMuc8vP5AhM55ojRPFkhOQ1 KAj6c/jrniJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQImewAKCRAgrS7GWxAs 4k0JD/9bfoccv/SFAegyNdMEioIkw0zAU2Nwb0M+r5tjr4XljaqGrXAYyomXlgsKoTiUMlYXKvC +M0eC9ETsCJtPqQz2/JsvrGOQblSI3wGUlmFjno+hTkKc51iQeuxWEYjctAtweSydlunYGnRdE0 q/7MauZTstYmwRqu48zEheRp6hP4LcCTGRzC/5lxcubWzJf54sFPLrTBqbuu245L48WwP7eTt6q GacsksnwyPAAXAuyszegICMyqQUVygrxBmaH5raVBg/YIXnt6fl/XB2OarV/0eR5Eyoqutx+pQ4 AHcVSEICFK/7Te0KPkr6qsOHKPvgmbXWkdfjWj0gnQOm5HE0ZClY9+PMA8q07F5nTKQWdnXQu/R g1MIJSez0JSN11rxseOInS9H+R0zAiItv0QN/iuKJs7zdKNElTm7Uy8TSFSkeFHUvo/9P7rDVNT b47q2J7RHt0Ebh02gzR+aM1mqMs3C8iflUaqKGTUCpBoFPe8OioZZ64+MGNyrPxXAqA2uDRck2b noTkfGLRRhCTRyBkKAkHN+X93Aoaf2GcCeiOTxNy1RcRQKcbQtiMg4HES2auchXVv8F+deqJFAe Ujvb6YPIZ6oE9Z4lVSoDyLPemZ56LW8KX+k+PrzR0WPO5h8w+eMJ7Q6Ylaz6DeaAHOCP3wuoRIf LDKLO1P0P+I3DYw== 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/tests/vkms_config_test.c | 44 +++++++++++++++++++++++= ++++ drivers/gpu/drm/vkms/vkms_config.c | 39 ++++++++++++++++++++++++ drivers/gpu/drm/vkms/vkms_config.h | 35 +++++++++++++++++++++ drivers/gpu/drm/vkms/vkms_plane.c | 8 ++--- 4 files changed, 122 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 e9bc051188f9..d962fec8d3b3 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 #include #include =20 @@ -549,6 +550,7 @@ static void vkms_config_test_valid_plane_color_encoding= (struct kunit *test) KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); =20 /* Valid, no supported or color encoding */ + vkms_config_plane_set_supported_color_ranges(plane_cfg, 0); vkms_config_plane_set_supported_color_encodings(plane_cfg, 0); vkms_config_plane_set_default_color_encoding(plane_cfg, 0); KUNIT_EXPECT_TRUE(test, vkms_config_valid_plane_color_encoding(config, pl= ane_cfg)); @@ -563,6 +565,47 @@ static void vkms_config_test_valid_plane_color_encodin= g(struct kunit *test) vkms_config_destroy(config); } =20 +static void vkms_config_test_valid_plane_color_range(struct kunit *test) +{ + struct vkms_config *config; + struct vkms_config_plane *plane_cfg; + + config =3D vkms_config_default_create(false, false, false); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); + + plane_cfg =3D get_first_plane(config); + + /* Valid, all color range supported */ + vkms_config_plane_set_supported_color_ranges(plane_cfg, + BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) | + BIT(DRM_COLOR_YCBCR_FULL_RANGE)); + vkms_config_plane_set_default_color_range(plane_cfg, DRM_COLOR_YCBCR_FULL= _RANGE); + KUNIT_EXPECT_TRUE(test, vkms_config_valid_plane_color_range(config, plane= _cfg)); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Invalid, default color range is not supported */ + vkms_config_plane_set_supported_color_ranges(plane_cfg, + BIT(DRM_COLOR_YCBCR_FULL_RANGE)); + vkms_config_plane_set_default_color_range(plane_cfg, DRM_COLOR_YCBCR_LIMI= TED_RANGE); + KUNIT_EXPECT_FALSE(test, vkms_config_valid_plane_color_range(config, plan= e_cfg)); + KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); + + /* Valid, no supported or color range */ + vkms_config_plane_set_supported_color_encodings(plane_cfg, 0); + vkms_config_plane_set_supported_color_ranges(plane_cfg, 0); + vkms_config_plane_set_default_color_range(plane_cfg, 0); + KUNIT_EXPECT_TRUE(test, vkms_config_valid_plane_color_range(config, plane= _cfg)); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Valid, if no supported color range, default is ignored */ + vkms_config_plane_set_supported_color_ranges(plane_cfg, 0); + vkms_config_plane_set_default_color_range(plane_cfg, DRM_COLOR_YCBCR_LIMI= TED_RANGE); + KUNIT_EXPECT_TRUE(test, vkms_config_valid_plane_color_range(config, plane= _cfg)); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + vkms_config_destroy(config); +} + static void vkms_config_test_valid_plane_possible_crtcs(struct kunit *test) { struct vkms_config *config; @@ -1087,6 +1130,7 @@ static struct kunit_case vkms_config_test_cases[] =3D= { KUNIT_CASE(vkms_config_test_valid_plane_type), KUNIT_CASE(vkms_config_test_valid_plane_rotations), KUNIT_CASE(vkms_config_test_valid_plane_color_encoding), + KUNIT_CASE(vkms_config_test_valid_plane_color_range), KUNIT_CASE(vkms_config_test_valid_plane_possible_crtcs), KUNIT_CASE(vkms_config_test_invalid_crtc_number), KUNIT_CASE(vkms_config_test_invalid_encoder_number), diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index 6a3d52c1141d..823039fb4145 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -194,6 +194,25 @@ bool vkms_config_valid_plane_color_encoding(const stru= ct vkms_config *config, } EXPORT_SYMBOL_IF_KUNIT(vkms_config_valid_plane_color_encoding); =20 +VISIBLE_IF_KUNIT +bool vkms_config_valid_plane_color_range(const struct vkms_config *config, + const struct vkms_config_plane *plane_cfg) +{ + struct drm_device *dev =3D config->dev ? &config->dev->drm : NULL; + + if (vkms_config_plane_get_supported_color_ranges(plane_cfg)) { + if ((BIT(vkms_config_plane_get_default_color_range(plane_cfg)) & + vkms_config_plane_get_supported_color_ranges(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; +} +EXPORT_SYMBOL_IF_KUNIT(vkms_config_valid_plane_color_range); + static bool valid_planes_for_crtc(const struct vkms_config *config, struct vkms_config_crtc *crtc_cfg) { @@ -350,6 +369,7 @@ static bool valid_connector_possible_encoders(const str= uct vkms_config *config) =20 bool vkms_config_is_valid(const struct vkms_config *config) { + struct drm_device *dev =3D config->dev ? &config->dev->drm : NULL; struct vkms_config_crtc *crtc_cfg; struct vkms_config_plane *plane_cfg; =20 @@ -359,6 +379,16 @@ bool vkms_config_is_valid(const struct vkms_config *co= nfig) =20 if (!vkms_config_valid_plane_color_encoding(config, plane_cfg)) return false; + + if (!vkms_config_valid_plane_color_range(config, plane_cfg)) + return false; + + if ((vkms_config_plane_get_supported_color_encodings(plane_cfg) =3D=3D 0= ) !=3D + (vkms_config_plane_get_supported_color_ranges(plane_cfg) =3D=3D 0)) { + drm_info(dev, + "Both supported color encoding and color range must be set, or none\n= "); + return false; + } } =20 if (!valid_plane_number(config)) @@ -441,6 +471,12 @@ static int vkms_config_show(struct seq_file *m, void *= data) seq_puts(m, "\n"); seq_printf(m, "\tdefault color encoding=3D%s\n", drm_get_color_encoding_name(vkms_config_plane_get_default_color_enco= ding(plane_cfg))); + seq_puts(m, "\tsupported color range=3D"); + show_bitfield(m, vkms_config_plane_get_supported_color_ranges(plane_cfg), + drm_get_color_range_name); + seq_puts(m, "\n"); + seq_printf(m, "\tdefault color range=3D%s\n", + drm_get_color_range_name(vkms_config_plane_get_default_color_range(p= lane_cfg))); } =20 vkms_config_for_each_crtc(vkmsdev->config, crtc_cfg) { @@ -489,6 +525,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_ranges(plane_cfg, BIT(DRM_COLOR_YCB= CR_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 d740c9478256..d8648bf844d4 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_encodings: Color encoding that this plane will support + * @default_color_range: Default color range that should be used by this p= lane + * @supported_color_ranges: 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_encodings; + enum drm_color_range default_color_range; + unsigned int supported_color_ranges; struct xarray possible_crtcs; =20 /* Internal usage */ @@ -413,6 +417,37 @@ bool vkms_config_valid_plane_color_encoding(const stru= ct vkms_config *config, const struct vkms_config_plane *plane_cfg); #endif =20 +static inline enum drm_color_range +vkms_config_plane_get_default_color_range(const 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_ranges(const struct vkms_config_plan= e *plane_cfg) +{ + return plane_cfg->supported_color_ranges; +} + +static inline void +vkms_config_plane_set_supported_color_ranges(struct vkms_config_plane *pla= ne_cfg, + unsigned int supported_color_ranges) +{ + plane_cfg->supported_color_ranges =3D supported_color_ranges; +} + +#if IS_ENABLED(CONFIG_KUNIT) +bool vkms_config_valid_plane_color_range(const struct vkms_config *config, + const struct vkms_config_plane *plane_cfg); +#endif + /** * 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 9550831be51a..5dbc7c67de1d 100644 --- a/drivers/gpu/drm/vkms/vkms_plane.c +++ b/drivers/gpu/drm/vkms/vkms_plane.c @@ -238,13 +238,13 @@ struct vkms_plane *vkms_plane_init(struct vkms_device= *vkmsdev, vkms_config_plane_get_default_rotation(config), vkms_config_plane_get_supported_rotations(config)); =20 - if (vkms_config_plane_get_supported_color_encodings(config) !=3D 0) + if (vkms_config_plane_get_supported_color_encodings(config) !=3D 0 && + vkms_config_plane_get_supported_color_ranges(config) !=3D 0) drm_plane_create_color_properties(&plane->base, vkms_config_plane_get_supported_color_encodings(config), - BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) | - BIT(DRM_COLOR_YCBCR_FULL_RANGE), + vkms_config_plane_get_supported_color_ranges(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 12:14:34 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 35D48327206 for ; Wed, 29 Oct 2025 14:37: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=1761748641; cv=none; b=UpHfi07vY+b4/EQB8awB5xpOgw7u3+QndAKwZCPY6JwhZeIVkbOV3bdv89NojODt43xrYxUDCuIe9E6BcuEC+9AAzS29dSiVPWW6+mUdF9Bx7i9pbB2aU46SFaJ/PFcIkDW2oE+TDq1Qh3gMtbxl5gVxcPOCtyeaLyVxOWBnf5I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761748641; c=relaxed/simple; bh=C/MMRwVv7tqxhyIue1VDDpDHYOcgFuMbnkd6mU2hgRk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=luJin8+o71Vof3F5gYbxgmGFkOC6cEglVZFgRSX3DsZzwfE7OgDiDw9TYMn9vcuZGGEL2zw8PNmqzS/GlPBjuKv+JkKF+bdSXf30UJM8/MOjY7qvDr5bH2bRxXqJbJbF2L+QeUfWInln3m4HwYowH/dO+6ugT3J/pcd1wGL4llE= 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=zJj11w7S; 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="zJj11w7S" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 880C3C0DA85; Wed, 29 Oct 2025 14:36:57 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id E0B31606E8; Wed, 29 Oct 2025 14:37:17 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id A5807117F813D; Wed, 29 Oct 2025 15:37:15 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761748637; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=+evWkGwW+11FOg/3gUJ1wDOagGB2wDut1Bio9XWm4W4=; b=zJj11w7SNSYwFYSv9EcCygXSsMPf7NZ0TTou9dRom3cMxkLBnP7hbY8HM3QdaDOdeWmIms F/A0UWrudYz8bOHluceZ99Cei2mthex1d3+V+NeH9dGDYvRXQXRspbJPRMsq1OGSRUD3tU YoxmafnU3Lte9t7NA4r/6pLUrJeRpX/qa+YcGcGEZSlUz2mMqvevgAXXX///drvh0eXF7u 91YHoxDFnx30OCyORGxBYtUKHzFzf15pEBPhSWdB4dNyzoF7VQwt0p2MLURx8Yi0C6YK3c Xyqr7Hw1a3HA6yqaCq1mghAELviWy178UI7WtfokF/7txqRgVmFVOSdXtTZWrg== From: Louis Chauvet Date: Wed, 29 Oct 2025 15:36:52 +0100 Subject: [PATCH RESEND v2 15/32] 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: <20251029-vkms-all-config-v2-15-a49a2d4cba26@bootlin.com> References: <20251029-vkms-all-config-v2-0-a49a2d4cba26@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-a49a2d4cba26@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=5958; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=C/MMRwVv7tqxhyIue1VDDpDHYOcgFuMbnkd6mU2hgRk=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAiZ8mCOZSmwAYSOfrN7feGUYXPMdTreMd/Zz9 isp4j9IoZaJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQImfAAKCRAgrS7GWxAs 4iYUD/sFZo9/1shihaPLulldv/eYRBnjsHHqZaF8uEiYpFDNgMCpv+VXMOjAzduR1Gp/h7CFO9X HRAE4N/1MZXzx4KEsgfhM5Mv2dK0Pi8AszgAVdL7tBr+cKS9oLRC8zsx9Ligl45yVKNYAz/vt6A NGIXnWq4gVPsjOmkUSW/pTDnX/GlngWXWDa5E/e9LIKC9X5H8xvVwi1Zf7cR4KapKf+O+TPvAm9 2PdLnrtAc7s7iQjZimrcQ4GBNfpifDlU8GZF6p3dOpRFSUUH29sxn7lU6wg7hXhlU6Bx8GMU0Lq lcg8Wq3DMrTborx4RFGcMG3RbuIRgjIdbLyNZTuBzVNcxnS9eGVeizdr2MKBIYNAh0zJEs9u6Rw clfqME5Wcla/e0SBcxFyw95aaeLPpGYeQ9j9HG5Egc4jgx6hgxbrFUx52Fc079Hl/2rk2wJhK1K z9wtBCMYJGAzJZKmhYWM1gyz3SVXqOZrzsoczTDGsOqMVagZdWiZi0uCO0r7nNtFD9l+gI6eXDQ rSLiUPJfmGWmKB3AXSBgrpcWyzVL4QQo10nZ4Gq3K13HiiPhF1Hy1LRm7XtsMeO1Me/OJZVZa65 iPwY/jvvbJECZUN3bZPUssq9o2Y+DBYa822IEda/dBzIiYyAKqJKO9PCyt9f/hku8sulBhweALg QLEpZNyitb0nMpw== 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 | 11 ++++- drivers/gpu/drm/vkms/vkms_configfs.c | 89 ++++++++++++++++++++++++++++++++= ++++ 2 files changed, 98 insertions(+), 2 deletions(-) diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index dab6811687a2..8383e1b94668 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 6 configurable attributes: +Planes have 8 configurable attributes: =20 - type: Plane type: 0 overlay, 1 primary, 2 cursor (same values as those exposed by the "type" property of a plane) @@ -99,9 +99,16 @@ Planes have 6 configurable attributes: 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) + by the COLOR_ENCODING property of a plane). If set, supported_color_range + must be set too. - 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). If set, supported= _color_encoding + must be set too. +- 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 ee2e8d141f9e..3f658dd41272 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -439,6 +439,91 @@ static ssize_t plane_default_rotation_store(struct con= fig_item *item, return count; } =20 +static ssize_t plane_supported_color_ranges_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_ranges(p= lane->config); + } + + return sprintf(page, "%u", supported_color_range); +} + +static ssize_t plane_supported_color_ranges_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) + return -EINVAL; + vkms_config_plane_set_supported_color_ranges(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) + return -EINVAL; + vkms_config_plane_set_default_color_range(plane->config, val); + } + + return count; +} + static ssize_t plane_supported_color_encodings_show(struct config_item *it= em, char *page) { struct vkms_configfs_plane *plane; @@ -537,6 +622,8 @@ CONFIGFS_ATTR(plane_, type); CONFIGFS_ATTR(plane_, name); CONFIGFS_ATTR(plane_, supported_rotations); CONFIGFS_ATTR(plane_, default_rotation); +CONFIGFS_ATTR(plane_, supported_color_ranges); +CONFIGFS_ATTR(plane_, default_color_range); CONFIGFS_ATTR(plane_, supported_color_encodings); CONFIGFS_ATTR(plane_, default_color_encoding); =20 @@ -545,6 +632,8 @@ static struct configfs_attribute *plane_item_attrs[] = =3D { &plane_attr_name, &plane_attr_supported_rotations, &plane_attr_default_rotation, + &plane_attr_supported_color_ranges, + &plane_attr_default_color_range, &plane_attr_supported_color_encodings, &plane_attr_default_color_encoding, NULL, --=20 2.51.0 From nobody Sun Feb 8 12:14:34 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 360312C11EB for ; Wed, 29 Oct 2025 14:37:21 +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=1761748643; cv=none; b=TTbERPjek2T72CiGKlkP9S4chVP/fMYRH73p+k0wJbyjD0Xgce5UJb/qJHstio7HJWT5j9/t/wy6Z/GRYORtAvqecdV7kIDDsELm5tWXUGqYEPyrPOehApIWFk+euHrmidx3sztvGGqp+XKFKeeBbr29rnCYlRs5nhWs9nAJwKw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761748643; c=relaxed/simple; bh=rcbzjgVxA4Jez3zrGuCjbePTCA++bw2wssPuLSi1PnU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=cRlNRnPQHT/VIWO1Vx8u3ea+hreMG543s9sUhkZ9NjXIu61gYrpIpje0uuhfcRH2MqEFMb5jNZjGKlPhNRZzNo+w1lTz0X2OTDimQQZ6O9flShbsmGfpa4tXvbgfetASLOXq01Oodvq3VKTo3Nnr9J4hecY4qF83dxHlGChXNTk= 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=bfh+dNc8; 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="bfh+dNc8" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id A45CE4E413CF; Wed, 29 Oct 2025 14:37:19 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 77408606E8; Wed, 29 Oct 2025 14:37:19 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 762DB117F81A9; Wed, 29 Oct 2025 15:37:17 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761748638; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=bJvliQF2se397IGqvdiAT2buACguHu4DPZiFQtOO7UQ=; b=bfh+dNc8cm8UySa+3QZyRMKtxBtRH6k6EmP4S08H2LndswWSo9DcPFwQwlPnIU7aycof4L uM3NO4+HXCDqgiiJn5+idzhCeIAxulqCLy8Ztvo7cx86yxOUOStliNoEXNsKQs8YKfXrGI xR9WgNZORQmlTcBqJyIFTz905P1FA50W7OXLM2itFGI+oC3WxDwgwmQBZesmTtZHr3UEue shPKdyjYosFRXbUpo7spL22CRkY7PB7QzKXaswr/5fxsjCORj9LqqhjVXYnVReTyGQdken +GTclJQDO6y0QxCVT26wSqYNEKeBH07PFE8Czz1heVenu5za7T4tEXmPEhhg+w== From: Louis Chauvet Date: Wed, 29 Oct 2025 15:36:53 +0100 Subject: [PATCH RESEND v2 16/32] 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: <20251029-vkms-all-config-v2-16-a49a2d4cba26@bootlin.com> References: <20251029-vkms-all-config-v2-0-a49a2d4cba26@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-a49a2d4cba26@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=9903; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=rcbzjgVxA4Jez3zrGuCjbePTCA++bw2wssPuLSi1PnU=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAiZ8MT44yWYn64FGiGv8rHYve/ewVgnOLywTf JLsv2PiN8GJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQImfAAKCRAgrS7GWxAs 4sXRD/9zHIbpRiKVZSH+jPZF2vsWeIqT3nQZx0zd0EHy+IDfwnOUZj2OZ1UUk8wvt4RIHigBFHu CrL99A7Fxq5Nx2L/ZtlwtMfUL4hbhQ6imsGNuo5KnwXMnzHqnpIn+5T6/iBDUfqX2B1jTtFYXVP 2jguOPvxBPJ5XYcg7U3GNve70djL2G38F2KC5wlT3f0+69IifV6cN59FUTxADFVkrfrLyfr7VtH HyfqZN2+Bwe2vKmDtMS8CpnYYr55jINQpFJ+CISfDyfD+zDefN6sfeGDA4o+ihE/eMXiDA9sWUW I6ZmpJmo4zD/qzHTHJlnfoZPBctQjQXHyaKi2djjPotT4wYutibX950QTI9GG33dxayWseWTWDU VaPwEQ9pBhVLyY0kiEWqNz05e8i05wBlVj8Yg3zu/AxRjEL8ORCtsLJS3iuVPmyxMkrGPTF/yqw +8OjZqlVsnq9UtbKrkwUeIUw7r+9xuA/l0eVYUVgDmbTD0AzO6+tudf+u+p94CivjkNCd6ctfNA fAUnLao7QGoQMJaKbG5kBq7qwY9Gmb0ioDj5vlqRS+6+3+kCuFLKiai9RlhojFlzbyWIpuktfiZ /RdqYuqz5iTErXaep/SCC50KuRCTq7WtwIM4ElFHIUaVZrnRk6H1+kLOBzO0AZ4qLiWp/gzu7qw W5oO/yoPxh1A5Fw== 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 | 114 +++++++++++++++++++++++++++++++++= ++++ drivers/gpu/drm/vkms/vkms_config.h | 51 +++++++++++++++++ drivers/gpu/drm/vkms/vkms_plane.c | 39 +------------ 3 files changed, 167 insertions(+), 37 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index 823039fb4145..a3fb80451b30 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -12,6 +12,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; @@ -437,6 +473,15 @@ static void show_bitfield(struct seq_file *m, uint32_t= value, const char *callba } } =20 +static void show_formats(struct seq_file *m, u32 *formats, size_t formats_= count) +{ + for (int i =3D 0; i < formats_count; i++) { + seq_printf(m, "%p4cc", &formats[i]); + if (i !=3D formats_count - 1) + seq_puts(m, ", "); + } +} + static int vkms_config_show(struct seq_file *m, void *data) { struct drm_debugfs_entry *entry =3D m->private; @@ -477,6 +522,10 @@ static int vkms_config_show(struct seq_file *m, void *= data) seq_puts(m, "\n"); seq_printf(m, "\tdefault color range=3D%s\n", drm_get_color_range_name(vkms_config_plane_get_default_color_range(p= lane_cfg))); + seq_puts(m, "\tsupported formats=3D"); + show_formats(m, vkms_config_plane_get_supported_formats(plane_cfg), + vkms_config_plane_get_supported_formats_count(plane_cfg)); + seq_puts(m, "\n"); } =20 vkms_config_for_each_crtc(vkmsdev->config, crtc_cfg) { @@ -515,6 +564,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); @@ -644,6 +698,66 @@ 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; + break; + } + } + + 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 d8648bf844d4..2d9e35b7caad 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -49,6 +49,8 @@ struct vkms_config { * @supported_color_encodings: Color encoding that this plane will support * @default_color_range: Default color range that should be used by this p= lane * @supported_color_ranges: Color range that this plane will support + * @supported_formats: List of supported formats + * @supported_formats_count: Length of @supported_formats */ struct vkms_config_plane { struct list_head link; @@ -62,6 +64,8 @@ struct vkms_config_plane { unsigned int supported_color_encodings; enum drm_color_range default_color_range; unsigned int supported_color_ranges; + u32 *supported_formats; + unsigned int supported_formats_count; struct xarray possible_crtcs; =20 /* Internal usage */ @@ -448,6 +452,53 @@ bool vkms_config_valid_plane_color_range(const struct = vkms_config *config, const struct vkms_config_plane *plane_cfg); #endif =20 +static inline u32 * +vkms_config_plane_get_supported_formats(const struct vkms_config_plane *pl= ane_cfg) +{ + 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 5dbc7c67de1d..945abbbeac99 100644 --- a/drivers/gpu/drm/vkms/vkms_plane.c +++ b/drivers/gpu/drm/vkms/vkms_plane.c @@ -14,42 +14,6 @@ #include "vkms_drv.h" #include "vkms_formats.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 12:14:34 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 A8A723358AE for ; Wed, 29 Oct 2025 14:37:22 +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=1761748644; cv=none; b=FWijf+aCyUIxUvZzSATBJeeRODR4aMcnxLkLYXKHn6bFsBC8Xhq3LufcZQf0iaJVtyGXoHEAp+x+OYIUEKkOsdZNGj+TQzLwG0+IgmjcWW0VytM4PCxVh9CM9z1mo1SSE1m+0Mg59Ap6KfActIl7N8ocBIJkiN2N8EgzzPuwtnc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761748644; c=relaxed/simple; bh=BMVGN+9+t9auyeVa0Egl37tcKEFQ9wQUAEN2uScKJxI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=AgTV562yB7/xOQMTln+xt1FLbctrjKov+5CKi8n4DTy1bG2XY/XKtFCAcajvgPhT6fcWORdfC896G1lbtQW23oMjHHRenSqKoeFm6cbbQuJPwR93Y2NGq/U1J50V8EPm+NQB/W8kfM/SaslTO2nKduIBqEzn80kVwWg0l+oNETE= 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=bQ5Az7cU; 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="bQ5Az7cU" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 45FDC4E413CB; Wed, 29 Oct 2025 14:37:21 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 1C7EA606E8; Wed, 29 Oct 2025 14:37:21 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 01F78117F81AD; Wed, 29 Oct 2025 15:37:18 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761748640; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=RDpTgbAVmwlCytnSgkakGECg7adgLDFGZNh1TIOlRlw=; b=bQ5Az7cULeeaEo8tq1YKdl9FIwVBDlzQxAyiJNR3QuQeyWaoHLZ33R78p0SyOZz3ieKACZ oa7KqElkFlHCI6oFjkRO7QnGirMJ5TfKMXbOTRInhVxzUA6NKrOkd0tWHB/H0K7ou/VM4D 9T2SiO9cBh+mdC4F9OhoBCC1X4LC4sMm/AnK2aL/GLBCiRuDo6gPnRJOfIDV+ngG577Pp0 yCF43xmyeKjlWLODB9xxxlS6OESRskYo3RCd4K97zP278cwF4GV0ML4HCmbYGDslCljqUK 5cthKxWGs7niFnegp7Gj7UX3IE3Mr4fuZ4CVRyBniXoqddKH2HXfCr2ICZKVcg== From: Louis Chauvet Date: Wed, 29 Oct 2025 15:36:54 +0100 Subject: [PATCH RESEND v2 17/32] 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: <20251029-vkms-all-config-v2-17-a49a2d4cba26@bootlin.com> References: <20251029-vkms-all-config-v2-0-a49a2d4cba26@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-a49a2d4cba26@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=10458; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=BMVGN+9+t9auyeVa0Egl37tcKEFQ9wQUAEN2uScKJxI=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAiZ84zUXw+hjsAUXMdg7ITFMXanlymzbm5dha rXUcZvCXSqJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQImfAAKCRAgrS7GWxAs 4mscEADJEQT80j5ffXeHIEdQYyHdxNCHhOQ2lZckInb84U3PonRhUcJkP8RR3b5l+uxHHS7KQyZ shHHijvvF+RgN6dIMaZRmoYmR4FJX96YYgH3HDbzL56/qiARvKd0AAjBSv//uJBuORsH3ZR2HWg vGklCfTs/ERy7HABbuFHASaTbfZLU6nesGUIjt2YjJ7xJPymtf96NL25/ZQCpA8izjUvzyJk6Dd rOJPQZzRhNoPMdVzi0w5S5ka0rWecZMPDO9KloyDDN+pzsJ7ZsRPwKAUvRXZwZhw3RAySs/s82n KE+yWQV3JsmkwipXLZEuICA5c7eLnVeyskHDahAS41RiL83dWJBPvzHuiWTswGpx0neIs4ucDjQ 6P/4Fsw/Se18U8UBGE1uc1TJhwJerTvwmelKOQdKzxl3G4/CYv/q/oyWeUHPOr403IxBcAQ60Zg 2aRHsYYrjMC2H4lqXXkm0LZk6jZkxAd7vf1jBGzRqc+JF3MFquDAmRhMa1QFgXcCtlxyfkD96z0 6cehKK84mh3vtg9ebi9zGCPIKgyDDq8BtGcu8c8bo7HS5tOVuE73194lzrxEXQSXm/c1ZqXOss3 fTvN9h6hUb/Qj6I9AQWPalPJkbP68rAlkx7jSIUiSp+bYhiNTSTUFkkkJ0SWQx01FZIsTuNi7a+ zAZbXt4Gzbc3vTw== 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/tests/Makefile | 1 + drivers/gpu/drm/vkms/tests/vkms_configfs_test.c | 102 ++++++++++++++++++++ drivers/gpu/drm/vkms/vkms_configfs.c | 119 ++++++++++++++++++++= ++++ drivers/gpu/drm/vkms/vkms_configfs.h | 6 ++ 5 files changed, 234 insertions(+), 1 deletion(-) diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index 8383e1b94668..779ae363110d 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 attributes: +Planes have 9 configurable attributes: =20 - type: Plane type: 0 overlay, 1 primary, 2 cursor (same values as those exposed by the "type" property of a plane) @@ -109,6 +109,11 @@ Planes have 8 configurable attributes: must be set too. - 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/tests/Makefile b/drivers/gpu/drm/vkms/tes= ts/Makefile index 5750f0bd9d40..a2dc4008d27e 100644 --- a/drivers/gpu/drm/vkms/tests/Makefile +++ b/drivers/gpu/drm/vkms/tests/Makefile @@ -2,6 +2,7 @@ =20 vkms-kunit-tests-y :=3D \ vkms_config_test.o \ + vkms_configfs_test.o \ vkms_format_test.o =20 obj-$(CONFIG_DRM_VKMS_KUNIT_TEST) +=3D vkms-kunit-tests.o diff --git a/drivers/gpu/drm/vkms/tests/vkms_configfs_test.c b/drivers/gpu/= drm/vkms/tests/vkms_configfs_test.c new file mode 100644 index 000000000000..0963a8e8a585 --- /dev/null +++ b/drivers/gpu/drm/vkms/tests/vkms_configfs_test.c @@ -0,0 +1,102 @@ +// SPDX-License-Identifier: GPL-2.0+ + +#include "linux/printk.h" +#include + +#include "../vkms_configfs.h" + +MODULE_IMPORT_NS("EXPORTED_FOR_KUNIT_TESTING"); + +/** + * struct vkms_configfs_parse_format_case - Store test case for format par= sing + * @data: Contains the string to parse + * @data_len: data len + * @expected_len: expected len of the matched format + * @expected_offset: expected offset in the string for the parsed format + */ +struct vkms_configfs_parse_format_case { + const char *data; + int data_len; + int expected_len; + int expected_offset; +}; + +struct vkms_configfs_parse_format_case vkms_configfs_parse_format_test_cas= es[] =3D { + { + .data =3D "+RG24", + .data_len =3D 6, + .expected_len =3D 5, + .expected_offset =3D 0, + }, { + .data =3D "-RG24", + .data_len =3D 6, + .expected_len =3D 5, + .expected_offset =3D 0 + }, { + .data =3D " -RG24", + .data_len =3D 8, + .expected_len =3D 5, + .expected_offset =3D 2 + }, { + .data =3D "+*", + .data_len =3D 3, + .expected_len =3D 2, + .expected_offset =3D 0 + }, { + .data =3D "-RG24+RG24", + .data_len =3D 11, + .expected_len =3D 5, + .expected_offset =3D 0 + }, { + .data =3D "-R1+RG24", + .data_len =3D 9, + .expected_len =3D 3, + .expected_offset =3D 0 + }, { + .data =3D "\n-R1", + .data_len =3D 5, + .expected_len =3D 3, + .expected_offset =3D 1 + }, { + .data =3D "-R1111", + .data_len =3D 3, + .expected_len =3D 3, + .expected_offset =3D 0 + } +}; + +static void vkms_configfs_test_parse_format(struct kunit *test) +{ + const struct vkms_configfs_parse_format_case *param =3D test->param_value; + char *out; + int len =3D vkms_configfs_parse_next_format(param->data, param->data + pa= ram->data_len, &out); + + KUNIT_EXPECT_EQ(test, len, param->expected_len); + KUNIT_EXPECT_PTR_EQ(test, out, param->data + param->expected_offset); +} + +static void vkms_configfs_test_parse_format_get_desc(struct vkms_configfs_= parse_format_case *t, + char *desc) +{ + snprintf(desc, KUNIT_PARAM_DESC_SIZE, "%s", t->data); +} + +KUNIT_ARRAY_PARAM(vkms_configfs_test_parse_format, vkms_configfs_parse_for= mat_test_cases, + vkms_configfs_test_parse_format_get_desc +); + +static struct kunit_case vkms_configfs_test_cases[] =3D { + KUNIT_CASE_PARAM(vkms_configfs_test_parse_format, + vkms_configfs_test_parse_format_gen_params), + {} +}; + +static struct kunit_suite vkms_configfs_test_suite =3D { + .name =3D "vkms-configfs", + .test_cases =3D vkms_configfs_test_cases, +}; + +kunit_test_suite(vkms_configfs_test_suite); + +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Kunit test for vkms configfs utility"); diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vk= ms_configfs.c index 3f658dd41272..b0a26c4dbebe 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -1,8 +1,11 @@ // SPDX-License-Identifier: GPL-2.0+ + #include #include #include #include +#include +#include =20 #include "vkms_drv.h" #include "vkms_config.h" @@ -618,6 +621,120 @@ static ssize_t plane_default_color_encoding_store(str= uct 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); +} + +/** + * parse_next_format() - Parse the next format in page, skipping all non f= ourcc-related characters + * @page: page to search into + * @page_end: last charater of the page + * @out: Output pointer, will point inside page + * + * Returns: size of the matched format, @out will point to the + or - + */ +VISIBLE_IF_KUNIT +int vkms_configfs_parse_next_format(const char *page, const char *page_end= , char **out) +{ + int count =3D page - page_end; + char *tmp_plus =3D strnchr(page, count, '+'); + char *tmp_minus =3D strnchr(page, count, '-'); + + if (!tmp_plus && !tmp_minus) + return 0; + if (!tmp_plus) + *out =3D tmp_minus; + else if (!tmp_minus) + *out =3D tmp_plus; + else + *out =3D min(tmp_plus, tmp_minus); + + char *end =3D *out + 1; + + while (end < page_end) { + if (!isalnum(*end) && *end !=3D '*') + break; + end++; + } + + return end - *out; +} +EXPORT_SYMBOL_IF_KUNIT(vkms_configfs_parse_next_format); + +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; + const char *end_page =3D page + count; + + scoped_guard(mutex, &plane->dev->lock) { + while (1) { + char *tmp; + char fmt[4] =3D {' ', ' ', ' ', ' '}; + int len =3D vkms_configfs_parse_next_format(page, end_page, &tmp); + + // No fourcc code found + if (len <=3D 1) + break; + + page =3D tmp + len; + memcpy(tmp, &fmt[1], min(len - 1, 4)); + if (tmp[0] =3D=3D '+') { + if (fmt[0] =3D=3D '*') { + ret =3D vkms_config_plane_add_all_formats(plane->config); + if (ret) + return ret; + } else { + ret =3D vkms_config_plane_add_format(plane->config, + *(int *)fmt); + if (ret) + return ret; + } + } else if (tmp[0] =3D=3D '-') { + if (fmt[0] =3D=3D '*') + vkms_config_plane_remove_all_formats(plane->config); + else + vkms_config_plane_remove_format(plane->config, *(int *)fmt); + } + } + } + + return count; +} + CONFIGFS_ATTR(plane_, type); CONFIGFS_ATTR(plane_, name); CONFIGFS_ATTR(plane_, supported_rotations); @@ -626,6 +743,7 @@ CONFIGFS_ATTR(plane_, supported_color_ranges); CONFIGFS_ATTR(plane_, default_color_range); CONFIGFS_ATTR(plane_, supported_color_encodings); CONFIGFS_ATTR(plane_, default_color_encoding); +CONFIGFS_ATTR(plane_, supported_formats); =20 static struct configfs_attribute *plane_item_attrs[] =3D { &plane_attr_type, @@ -636,6 +754,7 @@ static struct configfs_attribute *plane_item_attrs[] = =3D { &plane_attr_default_color_range, &plane_attr_supported_color_encodings, &plane_attr_default_color_encoding, + &plane_attr_supported_formats, NULL, }; =20 diff --git a/drivers/gpu/drm/vkms/vkms_configfs.h b/drivers/gpu/drm/vkms/vk= ms_configfs.h index e9020b0043db..2774655bfcc5 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.h +++ b/drivers/gpu/drm/vkms/vkms_configfs.h @@ -2,7 +2,13 @@ #ifndef _VKMS_CONFIGFS_H_ #define _VKMS_CONFIGFS_H_ =20 +#include + int vkms_configfs_register(void); void vkms_configfs_unregister(void); =20 +#if IS_ENABLED(CONFIG_KUNIT) +int vkms_configfs_parse_next_format(const char *page, const char *end_page= , char **out); +#endif + #endif /* _VKMS_CONFIGFS_H_ */ --=20 2.51.0 From nobody Sun Feb 8 12:14:34 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 852123358A6 for ; Wed, 29 Oct 2025 14:37:24 +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=1761748646; cv=none; b=c+xqKzf8JWb85o/R5bLyhXzDGTVVvYrxQEBFSkA9qOiFfJhjMVwiPB+zX/ZTdBim4qcC8xwsMkEUWff5MjPVYOKam1O3Ipor5wvSs0dD8FySJJ3wZJjb0TLjE6BV72FXOjjzaQdV0wYtivUJqCT3ab8ZDvuDvlG8JuMkAM1NMPI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761748646; c=relaxed/simple; bh=rnZm7r0xEd9LrIvetwHGtyd26t99JexCbu1jReAcAkA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ASC78Kd5Et+nYhD2PbAvjySUWic4DGtk+A91bc56OWZjGgf+Nny6e8Hr25rkEk3pXJ5eN4vR4Nbf8Lw8w/83xCm1nRElJ2NU9omGQuBaHjiDXHqj7ks5LHMnd56p/7iNKpdEybduLn13GUokwswVQ4B9Ne+31OdKD0fSURmIE0E= 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=wpwXU8Li; 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="wpwXU8Li" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id C653A4E413CD; Wed, 29 Oct 2025 14:37:22 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 9D57E606E8; Wed, 29 Oct 2025 14:37:22 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id A3F3F117F81AF; Wed, 29 Oct 2025 15:37:20 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761748641; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=wuzcvgdxKucfzXi8j9im5vi/vTJhBZGMa5n+dwDEVE8=; b=wpwXU8Li2/6wN+XcWgPzVcZOQiH+n9oqv609Yka7wVMI0+znjXOocV7UxkALOoOv7QPCBn ecoE1pH7Mytoblv7WPVkZKm7d+1RVY0N3Xw/Zz9zMA3WggSUarkEvvtBXlJaeC8eLeDUDb QsR/1BumbB0fP5nt0yroKSfouYUUMs/h1N3DagWSUZoYbeTdrm65SU5Brqbdu5Jur9rp+R Tnc3zBzeEXYZsDcqpz/tXowJzLgTtRijG5IrmKb/clgNsLSyC8Jksufd+cGkdIiXfMt4mU LYdgM9AhhFD4C6aL21Nx1TouqZpq11xutXr4/BCpPAVlqc2XCJJGO6Y53jVUEA== From: Louis Chauvet Date: Wed, 29 Oct 2025 15:36:55 +0100 Subject: [PATCH RESEND v2 18/32] 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: <20251029-vkms-all-config-v2-18-a49a2d4cba26@bootlin.com> References: <20251029-vkms-all-config-v2-0-a49a2d4cba26@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-a49a2d4cba26@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/ZANAwAKASCtLsZbECziAcsmYgBpAiZ8bCaudyWE+A46e5tkBU4wtEm5i2Rcwx3CM dtYEjx2VhuJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQImfAAKCRAgrS7GWxAs 4ouSEAC+Az4FjpAq1CI4MetBO1K/TjVnfjMYKXHpb0KXMqNzNpKz6y5kFhL4fHqIxochAVYO+EQ 4S7hBnTAoWTpuLJWxBrZnPhtB6XPcVTQat36SztGkgaAg/IlmJnGGswMKVbngD30fDGtE+GBi5x 5oHqZSOZ96f2qT7c/eme3a0PYoKDu0o8V3G+z/veqc8Z/KQhiJqVibhBQxPmCzo0TLBrFU9JL8Y FUnVKiqmwtQsjXlOKcE6gbleXbOUYKxEkhDVFlo9tbF0Gbepo7OXqhgaKev48lJf1Sx+CzM77AK Tz4YkPEeCH7ix1QUJdmYULWVazQ1ZzY35hAABwfccE4ECc3CFhGFVdFzrnV4FpoW2inX0GkYRjN XFdiHiPc5gCXVGqcqnCogpJ0s9Dy+muPMyy7Dh8dLNDlY7dXUGK25PSxC7h0/wvhsi5iuvlBk3Q PSqlSlISIUUuyYLT8LDLckxzSOpUFGMHTfujwoSsAkvcqSjrhwxVppjE1PoZgITiGQF7aLNBY35 Cx8Lq0lRlhTSVJkQr2qnJMO3DD4y7AFXkyhBeeZXjFZx0mB/tE/igHwnWdkK0yDwazM+SPcNhJ8 MmX7EOW7hX61KulOeWZ7bHaP9AJyj0zvwnLTjaaa3rHBdvg9v01stAA110Y4R9OVDfiIZyZ3wNJ DhKHLt/tUShe+oQ== 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 Reviewed-by: Luca Ceresoli --- 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 12:14:34 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 1B7602D12EB for ; Wed, 29 Oct 2025 14:37:25 +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=1761748648; cv=none; b=SEW2XyqFuuOwcZ6P76rspnESiJyRMCPRK/P58o45JxMhogr512xMk4KdKI049+5o85ksVIqaD0bnzyQra3QF5ixODshi/V8lQqeGOW6YUxsBP0+6Xqs7/wyoRce2hhD8+nHUSfr1wwhpu1khlcBI8s+5n26oHgYCmKkV5wyM7aU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761748648; c=relaxed/simple; bh=mKwvYcW2Hz25Zl72QZxI3VVT1IcCPbam0gHPfRqJ4iY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=VoK6cpEJcpNni2378r46Gfa6yn1P7ppeo9pjeWbjsSUvYukC9UF/fwqRIflBhlNWL31//KOIp/Y9EV/QV0Gv/pmE1HDx3IzkFtBpbfRrmuSPsDeoregbw8GvkDIqONiluaT2di144BQ+D+wBJr+EBeQ37AJErt5QRYLZOGlQYKQ= 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=Sdg3tShF; 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="Sdg3tShF" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 784F91A174B; Wed, 29 Oct 2025 14:37:24 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 4E754606E8; Wed, 29 Oct 2025 14:37:24 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 2EAC7117F81B1; Wed, 29 Oct 2025 15:37:22 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761748643; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=ZDoaOquusQDSLp7HQRJOshugz0KBDod0mdS1BtA/zy4=; b=Sdg3tShFUtRDpgGUgJUIzMqE6tN8dOQ7n3uKGhlHX629agac37j1taB6cA3T/Np2phMpF7 U3gsIO8RIucHBG9Cr/Y/grdkpUl7/5QCxP1ZTBAnqGyHPoYSSV+eyww7HX+Fg2NbPeaZVZ BLipYiGnlMrLiIMODxSbXx12Gttc+d9m/prr+Lm5Oh7HNIRDd8pDDttZyS8Okv1lHQMp/k TUP1Y4WusPutnvvyIrMjpPngI50s+qjS79ImOOGcZbZMRyEbPNi033kLT3201nBRssT4Vx POB+pjIQ65w1/qQatYQS68UkxXd3r7xe+8i8hTOEXW27TAKobPEdqMiq40xHmA== From: Louis Chauvet Date: Wed, 29 Oct 2025 15:36:56 +0100 Subject: [PATCH RESEND v2 19/32] 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: <20251029-vkms-all-config-v2-19-a49a2d4cba26@bootlin.com> References: <20251029-vkms-all-config-v2-0-a49a2d4cba26@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-a49a2d4cba26@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=15646; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=mKwvYcW2Hz25Zl72QZxI3VVT1IcCPbam0gHPfRqJ4iY=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAiZ8+g54u1JWgPgjDQnaIomrRkzuQAS3NxDKP z0cNIWQij6JAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQImfAAKCRAgrS7GWxAs 4nkVEACVXkTz7VusjKMBFOF90P2k43qMsgYRScr8M6vzoF+BmaEUMb732lFM7qSu6pX9GnUEb0U Phb4iLHkkSr9/SZUT4M0icFHeEJxyXplTxNkvYjKqit890y+31V7SQhucil6u5uzH9YthgREMcv dAc1nA+5nvSTJfptjSyhDiOyilOui6YtBkSl222N4saNTwfgonK0ojHcXQmVudMWpURqnZUdVt1 +0V0FppmrMCfb1/kD4jJPPo2jAdla6IfMTz3qM3mynYuadpEKAHRg3n/tQwBW3nMXe1JOKUhayH 1IRRSYZZmZNDuMGOktR7Rx26RMLzxnPHK7coqgAAHaTdMIKyAy2OiUnSAe54wqT/UYa/us0JWfT 1Qi7+STzjkgoZ/qtbRFDNms0NbeLLvJBZgrknTyzJbdG7F8FPEefwu4j5yWXwtSHynC0PR8Yl+c C4mH/F00ZN0t8qI5NpjvUPm5yXLnxuezIYgn2gSHFYftMbn3uBWBS2h7JRfnFFN3ikmkv1drQ/Y MROqy042H3i+NDfBTY64IHUQ9PX+frVL869CQV4SRLxTUZCkecLzIbGapkvkzPvkDJ3srI+m62d oyuKnhmOKZ03xhiM4ru8o18MI+mfS6endmUwfVpHmAkG1bRIuFGefnHdftG8Z7fF+mhOGnvkqj5 0i670bzAnCTTy8A== 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 | 92 ++++++++++++++++ drivers/gpu/drm/vkms/vkms_config.c | 47 ++++++++ drivers/gpu/drm/vkms/vkms_config.h | 147 ++++++++++++++++++++++= ++++ drivers/gpu/drm/vkms/vkms_plane.c | 11 ++ 4 files changed, 297 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 d962fec8d3b3..518e68c17122 100644 --- a/drivers/gpu/drm/vkms/tests/vkms_config_test.c +++ b/drivers/gpu/drm/vkms/tests/vkms_config_test.c @@ -188,6 +188,9 @@ static void vkms_config_test_default_config(struct kuni= t *test) KUNIT_EXPECT_EQ(test, vkms_config_plane_get_default_color_encoding(plane_cfg), DRM_COLOR_YCBCR_BT601); + 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 */ @@ -606,6 +609,94 @@ static void vkms_config_test_valid_plane_color_range(s= truct kunit *test) vkms_config_destroy(config); } =20 +static void vkms_config_test_valid_plane_zpos(struct kunit *test) +{ + struct vkms_config *config; + struct vkms_config_plane *plane_cfg; + + config =3D vkms_config_default_create(false, false, false); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); + + plane_cfg =3D get_first_plane(config); + + /* Valid, all color range supported */ + plane_cfg =3D get_first_plane(config); + + /* Valid, zpos disabled */ + vkms_config_plane_set_zpos_enabled(plane_cfg, false); + vkms_config_plane_set_zpos_mutable(plane_cfg, false); + vkms_config_plane_set_zpos_initial(plane_cfg, 0); + vkms_config_plane_set_zpos_min(plane_cfg, 0); + vkms_config_plane_set_zpos_max(plane_cfg, 0); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Valid, zpos disabled, min/max are ignored */ + vkms_config_plane_set_zpos_enabled(plane_cfg, false); + vkms_config_plane_set_zpos_mutable(plane_cfg, false); + vkms_config_plane_set_zpos_initial(plane_cfg, 8); + vkms_config_plane_set_zpos_min(plane_cfg, 3); + vkms_config_plane_set_zpos_max(plane_cfg, 2); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Valid, zpos enabled but initial value is out of range */ + vkms_config_plane_set_zpos_enabled(plane_cfg, true); + vkms_config_plane_set_zpos_mutable(plane_cfg, false); + vkms_config_plane_set_zpos_initial(plane_cfg, 1); + vkms_config_plane_set_zpos_min(plane_cfg, 0); + vkms_config_plane_set_zpos_max(plane_cfg, 0); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Valid, zpos enabled with valid initial value */ + vkms_config_plane_set_zpos_enabled(plane_cfg, true); + vkms_config_plane_set_zpos_mutable(plane_cfg, false); + vkms_config_plane_set_zpos_initial(plane_cfg, 0); + vkms_config_plane_set_zpos_min(plane_cfg, 0); + vkms_config_plane_set_zpos_max(plane_cfg, 0); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Invalid, zpos enabled with min > max */ + vkms_config_plane_set_zpos_enabled(plane_cfg, true); + vkms_config_plane_set_zpos_mutable(plane_cfg, true); + vkms_config_plane_set_zpos_initial(plane_cfg, 0); + vkms_config_plane_set_zpos_min(plane_cfg, 1); + vkms_config_plane_set_zpos_max(plane_cfg, 0); + KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); + + /* Valid, zpos enabled with min <=3D max */ + vkms_config_plane_set_zpos_enabled(plane_cfg, true); + vkms_config_plane_set_zpos_mutable(plane_cfg, true); + vkms_config_plane_set_zpos_initial(plane_cfg, 0); + vkms_config_plane_set_zpos_min(plane_cfg, 0); + vkms_config_plane_set_zpos_max(plane_cfg, 1); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Invalid, zpos enabled with initial < min */ + vkms_config_plane_set_zpos_enabled(plane_cfg, true); + vkms_config_plane_set_zpos_mutable(plane_cfg, true); + vkms_config_plane_set_zpos_initial(plane_cfg, 0); + vkms_config_plane_set_zpos_min(plane_cfg, 1); + vkms_config_plane_set_zpos_max(plane_cfg, 2); + KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); + + /* Invalid, zpos enabled with initial > max */ + vkms_config_plane_set_zpos_enabled(plane_cfg, true); + vkms_config_plane_set_zpos_mutable(plane_cfg, true); + vkms_config_plane_set_zpos_initial(plane_cfg, 3); + vkms_config_plane_set_zpos_min(plane_cfg, 1); + vkms_config_plane_set_zpos_max(plane_cfg, 2); + KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); + + /* Valid, zpos enabled with initial between min and max */ + vkms_config_plane_set_zpos_enabled(plane_cfg, true); + vkms_config_plane_set_zpos_mutable(plane_cfg, true); + vkms_config_plane_set_zpos_initial(plane_cfg, 1); + vkms_config_plane_set_zpos_min(plane_cfg, 0); + vkms_config_plane_set_zpos_max(plane_cfg, 2); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + vkms_config_destroy(config); +} + static void vkms_config_test_valid_plane_possible_crtcs(struct kunit *test) { struct vkms_config *config; @@ -1131,6 +1222,7 @@ static struct kunit_case vkms_config_test_cases[] =3D= { KUNIT_CASE(vkms_config_test_valid_plane_rotations), KUNIT_CASE(vkms_config_test_valid_plane_color_encoding), KUNIT_CASE(vkms_config_test_valid_plane_color_range), + KUNIT_CASE(vkms_config_test_valid_plane_zpos), KUNIT_CASE(vkms_config_test_valid_plane_possible_crtcs), KUNIT_CASE(vkms_config_test_invalid_crtc_number), KUNIT_CASE(vkms_config_test_invalid_encoder_number), diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index a3fb80451b30..801019cf04c1 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -90,6 +90,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)) @@ -107,6 +108,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; @@ -119,6 +121,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; @@ -249,6 +252,37 @@ bool vkms_config_valid_plane_color_range(const struct = vkms_config *config, } EXPORT_SYMBOL_IF_KUNIT(vkms_config_valid_plane_color_range); =20 +VISIBLE_IF_KUNIT +bool vkms_config_valid_plane_zpos(const struct vkms_config *config, + const struct vkms_config_plane *plane_cfg) +{ + struct drm_device *dev =3D config->dev ? &config->dev->drm : NULL; + + if (!vkms_config_plane_get_zpos_enabled(plane_cfg) || + !vkms_config_plane_get_zpos_mutable(plane_cfg)) + return true; + + 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; +} + static bool valid_planes_for_crtc(const struct vkms_config *config, struct vkms_config_crtc *crtc_cfg) { @@ -425,6 +459,9 @@ bool vkms_config_is_valid(const struct vkms_config *con= fig) "Both supported color encoding and color range must be set, or none\n= "); return false; } + + if (!vkms_config_valid_plane_zpos(config, plane_cfg)) + return false; } =20 if (!valid_plane_number(config)) @@ -526,6 +563,16 @@ static int vkms_config_show(struct seq_file *m, void *= data) show_formats(m, vkms_config_plane_get_supported_formats(plane_cfg), vkms_config_plane_get_supported_formats_count(plane_cfg)); seq_puts(m, "\n"); + seq_printf(m, "\tzpos_enabled=3D%s\n", + str_true_false(vkms_config_plane_get_zpos_enabled(plane_cfg))); + seq_printf(m, "\tzpos_mutable=3D%s\n", + str_true_false(vkms_config_plane_get_zpos_mutable(plane_cfg))); + seq_printf(m, "\tzpos_min=3D%d\n", + vkms_config_plane_get_zpos_min(plane_cfg)); + seq_printf(m, "\tzpos_initial=3D%d\n", + vkms_config_plane_get_zpos_initial(plane_cfg)); + seq_printf(m, "\tzpos_max=3D%d\n", + vkms_config_plane_get_zpos_max(plane_cfg)); } =20 vkms_config_for_each_crtc(vkmsdev->config, crtc_cfg) { diff --git a/drivers/gpu/drm/vkms/vkms_config.h b/drivers/gpu/drm/vkms/vkms= _config.h index 2d9e35b7caad..baed036a07cd 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -51,6 +51,11 @@ struct vkms_config { * @supported_color_ranges: Color range that this plane will support * @supported_formats: List of supported formats * @supported_formats_count: Length of @supported_formats + * @zpos_enabled: Enable or disable the zpos property + * @zpos_mutable: Make the zpos property mutable or not (ignored if @zpos_= enabled is false) + * @zpos_initial: Initial value for zpos property (ignored if @zpos_enable= d is false) + * @zpos_min: Minimal value for zpos property (ignored if @zpos_enabled is= false) + * @zpos_max: Maximal value for zpos property (ignored if @zpos_enabled is= false) */ struct vkms_config_plane { struct list_head link; @@ -67,6 +72,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; @@ -523,6 +533,143 @@ vkms_config_plane_get_name(const struct vkms_config_p= lane *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(const struct vkms_config_plane *pl= ane_cfg) +{ + 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(const struct vkms_config_plane *pl= ane_cfg) +{ + 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(const struct vkms_config_p= lane *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(const struct vkms_config_plane= *plane_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(const struct vkms_config_plane= *plane_cfg) +{ + return plane_cfg->zpos_max; +} + +#if IS_ENABLED(CONFIG_KUNIT) +bool vkms_config_valid_plane_zpos(const struct vkms_config *config, + const struct vkms_config_plane *plane_cfg); +#endif + /** * 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 945abbbeac99..11a6b7bc74a7 100644 --- a/drivers/gpu/drm/vkms/vkms_plane.c +++ b/drivers/gpu/drm/vkms/vkms_plane.c @@ -211,5 +211,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 12:14:34 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 7C53533A026 for ; Wed, 29 Oct 2025 14:37:27 +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=1761748649; cv=none; b=aP5SogccKIUs4pfpGbfr3sbMmEDHcYmEgB9iY/D5aujh3GmehcwDqUpxll6SFoupjgbQAXVt+rUc31iiAi3zS34UrQnOFEzCIgsuCujgRdCDnWdX+C0zBjI9e5yKNxjS2AABUEr3hUq/QVThxw7YC/v7JgrOjPSgatZCkeeMpXg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761748649; c=relaxed/simple; bh=P0mWYpyiiMrPDse27em7Q4FFig+ra+2u7mDuWs/kj0I=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=t6tBkZwz0rXKsrYc0MKQ+ScfgICPKeEm5OW0eoxzj/hft4afUZIovYr+YAEdgEi3Dg11oYHMbO0v2SOG8nohbSuXdjQ9eCu+cJI2abICnVxIaPv6rJ5Qz5+XuMth1xs1oPd0hdAdYvpDdCERvxaFh6et9ErIgAviFKP9sNFCEyE= 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=MtZB+f6F; 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="MtZB+f6F" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 271584E413CB; Wed, 29 Oct 2025 14:37:26 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id EF7BE606E8; Wed, 29 Oct 2025 14:37:25 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id C8A7D117F81B3; Wed, 29 Oct 2025 15:37:23 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761748645; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=zFCTYSXu8zR0H2WC/3HxAVrv/TDK9xKwNmxiQq5HQMo=; b=MtZB+f6FSuRLl6WhWgw+ezB8kMst28HkQognLdXPWXX32SUkQhtrR6dLFuGXj2MpwyiHLM TE9lbAzFH44n7yQZO/XUvOYyHsQK1u1qUJ6nPB8ZPuptJ7F4pviIITQcWto5oOBAjln+nk jKvxfITpc8Ucz2+4ni42+6pujnxxilyF9Np8e6TJ/fPvJsxIz4dvnlkGzY4kNVQCY7oGKg zhJxOKAaIiNK0P21tLQ97rwBWojbG3WfdZBttCBziJ+eoRAfrzs57LVL1OXhV1KCxLeAfY dDKMZCdBOqBN69SbREkk8Mbf1wKfDZCiAOeEsYJ+E3SrR8s6JYO0EONWLxoavA== From: Louis Chauvet Date: Wed, 29 Oct 2025 15:36:57 +0100 Subject: [PATCH RESEND v2 20/32] 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: <20251029-vkms-all-config-v2-20-a49a2d4cba26@bootlin.com> References: <20251029-vkms-all-config-v2-0-a49a2d4cba26@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-a49a2d4cba26@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=7640; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=P0mWYpyiiMrPDse27em7Q4FFig+ra+2u7mDuWs/kj0I=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAiZ8IvGV0tDNx8wFUM6wAS88DLbJbUNENpXIt /A2Jn/af5SJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQImfAAKCRAgrS7GWxAs 4p59D/oDPHMZmAgxTje/69ETTyMnUWoVs2zsNM1ckOFfzcW/RYnPSJE/UsR7LitMUk9uqxg6wc5 tSieDUk8x4oFyOE3xxVJD6IbKe7niBLeG8cq1FxoCAAJJfdsRNpV1VFXAFxO/dFI03lbyrwJqG0 OC0I+UAAZy3T0NpVwnVCBIhbkAIJi+gajQdFh+xIiePpWWFn94eBEcs6DNhbgSWz5ISARE7x5Io fysw6unT3VbKSA8qVFjWdoE1kpj/OMyLDhpDrDICaG//ZvlklGXXQMF6tKbkWr7A0NFl61B2Xfw I/Ot+OETqPx6rAdLgbRqvUu58fneMb6EijeJn3iz35y+3lgkuBicHKUQiz3vxlQGNbA0qP0lIPl k2vrp89CuO//xMIdPxQPp3KyoCDgCvBJcKvP2vd5f5OZBkIdfvuqJ06ZSVZwbAWLLjz8virYfE7 3Aofc73zLmIurpYKsWBBAxuRClJtgJ6q9ZRRYLrhZ4xlzTBKIZoxtuSlFuh6mtoND2Z3jiHx6Du GUyxdA6tGCho1Osq/PRiz4Qw0GMsf4+2FKch18KvpHjsjBcsCRCXr4V6tu2KrVIB8CIlQfC6f+d zUywppKqGxeTlc5MkFrg+KE01yUqtsngtsKaBGuIItJpFRblCkQDyq6TeaVTT1M3Vjf1y/ojozx SWlARm1JiUGpMpQ== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Modern compositor rely on zpos management 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 - Initial 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 | 180 +++++++++++++++++++++++++++++++= ++++ 2 files changed, 188 insertions(+), 1 deletion(-) diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index 779ae363110d..32858f9a3357 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 9 configurable attributes: +Planes have 14 configurable attributes: =20 - type: Plane type: 0 overlay, 1 primary, 2 cursor (same values as those exposed by the "type" property of a plane) @@ -114,6 +114,13 @@ Planes have 9 configurable attributes: 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 b0a26c4dbebe..1c0a6ecf2f29 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -735,6 +735,176 @@ 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; + + 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; + + 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; + + vkms_config_plane_set_zpos_max(plane->config, max); + } + + return (ssize_t)count; +} + CONFIGFS_ATTR(plane_, type); CONFIGFS_ATTR(plane_, name); CONFIGFS_ATTR(plane_, supported_rotations); @@ -744,6 +914,11 @@ CONFIGFS_ATTR(plane_, default_color_range); CONFIGFS_ATTR(plane_, supported_color_encodings); 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, @@ -755,6 +930,11 @@ static struct configfs_attribute *plane_item_attrs[] = =3D { &plane_attr_supported_color_encodings, &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 12:14:34 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 C302B33B6DB for ; Wed, 29 Oct 2025 14:37:28 +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=1761748650; cv=none; b=Qxr0DM0slzR7fEdN2Fu/BXxcDFRB8Lh5UKshEZeh5kU4IK+C82Tj0SNz2bkUWfPxbVdUql2K6T7MqmBdUuVfBuG/YPDvRjYKUC+w/jftrb4EPuPgvYlE+IfrV64hFFo9iJqU9wPdBnARfKCCzML2E6YAmJhPbrUeJrMrywervkY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761748650; c=relaxed/simple; bh=MW+TBo4PtU3ICsaNvIu8XELjIkOf8Ka1JhDlVk3E2vU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=STbEeGdctx8kZ+jx/JUcRD+XMYrKv5z03bstUu27kjledsrStSs8cRB/U941nSUAbcfyDmlTFAAh0Q+IwZ5uRuMqM6liH9fUrmNtCHuVI/xGGj5FCmvZOaWjkJzI5obI6ZYlOIkF9syWeXaFV0P+dHDHre/MzAwSG6hHQfnCsxM= 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=PhZLJ7SU; 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="PhZLJ7SU" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 3C3C1C0DA84; Wed, 29 Oct 2025 14:37:07 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 949B8606E8; Wed, 29 Oct 2025 14:37:27 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 876DA117F81B2; Wed, 29 Oct 2025 15:37:25 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761748646; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=k+CPr3GRQ9NHOG87KjHsgaVZ994Pa6rjX1YtzoCQq6c=; b=PhZLJ7SU2qktYWVpdfxEaQ2fyEWtTOstwhzMCGcAZReragjSbe7jqK2pSMH/6tHttHe98K /Ov15pd3L9s/UF0GZnX545ES0EaRNDhT5L6gQApOIFbq+DBZrLUI+MsaB2HCENA7iZ/ivz n7zfkrpyU6ypD7yguFGc5v0F5eb2MUmBzXqYqO/PhAR62DajHo+XRi2iHa36BNBlIhjbft 4Q+j6b0vnSqjMjehFy2ZTbrafkpWRIss7/xRSpa5Q/+w2zPxHLVYvGOGPAxxvUvqP5xfcA 98xRgwps7sJLiXccxji5tCwbMexBp5SAzOsDgL3agpCn7ISQefYJlQM8Z+xtDQ== From: Louis Chauvet Date: Wed, 29 Oct 2025 15:36:58 +0100 Subject: [PATCH RESEND v2 21/32] 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: <20251029-vkms-all-config-v2-21-a49a2d4cba26@bootlin.com> References: <20251029-vkms-all-config-v2-0-a49a2d4cba26@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-a49a2d4cba26@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=6484; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=MW+TBo4PtU3ICsaNvIu8XELjIkOf8Ka1JhDlVk3E2vU=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAiZ8cwMV4VjopJVm8JwgMOn0sASw2hKKsQVAq +Y0BNtET+yJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQImfAAKCRAgrS7GWxAs 4gYSD/9kPfdNN3m6BodhwGuP1TsDNRXjr5TieAMGbdi8wQcjSIpsL41HGgqCtqIaN67iSW4C65M HGoc+iqbtPajzeIepol7+MfNXBJxv34HCgNtMANP3jLHfOCS6aedzLaKF4X7Cjdn/bHc/Rd+uIa IrWABldC1rKoJlraIlf+c8hqiNb6JuysXxiez90Uiu0NpnJpSZSEMYTEDg57imHBwrgg+0Zsfbo P3xuzlzgTY6OQQYxSkfvL+J3bnClCszCW9v1d6Y9pEByZCCMMJVr5qQ0ljAz1KWT3JdXwkZuSXj pDN+5RJX6kVdFFvXO7JdpH12waJmBYBbvIaoKveXejIZlmwblPRo+1no56jxjhOyVB7hLrfb22N s1+JotD8v90jrggJ4oMt9Q1rSAlD2CY92hGpvwYg1AgTv3k1+dwVUptXAsbpl2fAK4vN+AjDki/ OkRhN8x8YHxfLEZfT0bnsmXePHQG9bWJy82ZkQ0UuVhIZ2dMjyhdCRMsXrsIHN5fy1zo0ooOOSz wYtH1QuaEkGlb2/bo3Qs9c3rCpYWs3j30YycQPDOEtaljpQPLv9nwxAPrFvJfutjjlooe9BJkG0 7nNg9QbVNpQAmRPB2y0CnrbNQZYZPibbKjyjB9y4/dqaahIlFhT/dCBg95V60rNxxFNiIzcG3Za R74ULwhqd6cqnhw== 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 Reviewed-by: Luca Ceresoli --- drivers/gpu/drm/vkms/tests/vkms_config_test.c | 5 +++++ drivers/gpu/drm/vkms/vkms_config.c | 3 +++ 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_output.c | 2 +- 6 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 518e68c17122..c8b885306eed 100644 --- a/drivers/gpu/drm/vkms/tests/vkms_config_test.c +++ b/drivers/gpu/drm/vkms/tests/vkms_config_test.c @@ -128,6 +128,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; @@ -198,6 +199,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 801019cf04c1..02e2f0249fb0 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -588,6 +588,8 @@ static int vkms_config_show(struct seq_file *m, void *d= ata) seq_puts(m, "connector:\n"); seq_printf(m, "\tstatus=3D%s\n", drm_get_connector_status_name(vkms_config_connector_get_status(conne= ctor_cfg))); + seq_printf(m, "\ttype=3D%s\n", + drm_get_connector_type_name(vkms_config_connector_get_type(connector= _cfg))); } =20 return 0; @@ -893,6 +895,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 baed036a07cd..6a50ec7535af 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -128,6 +128,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 @@ -140,6 +141,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 @@ -317,6 +319,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(const struct vkms_config_connector *connect= or_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_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 12:14:34 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 CA7FC33B6FF for ; Wed, 29 Oct 2025 14:37:30 +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=1761748652; cv=none; b=pm5LqdnIBESTsZZhZZ7tTA89Zt71PBBDUAvBVKx8+aR5u+EZRGwOviuLqwnHt9hcEqMfVPT/v2+EJjejn9bfj/v2wdmVj40Dszt80RB925NKUcB/L5Qbu6h3dGycjCuVaEK0r5KGA0hyLck8sK9XBcyJTR+lpkkLRGoXkQKg9CA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761748652; c=relaxed/simple; bh=LUx3WgpJ+5BY9H52t76Y/Q40Ik9Sz02o7+/xgILTIdY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=eFJ87Inu6bnFyM4C394D1EiYM5fqVLrf4+W/bSj9lhg0Fv3fv8pism5WP3DTLSFk4kyO5lTzSN5ZHioOVhFVrcgUnotBIk7EgO83GdfVediBBVxKsEBzNYCHbw4svsNF8UDRzru/POnjUakU8cIt5brfAflVmRzZWzkgups+fFM= 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=1ZT8Wp7I; 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="1ZT8Wp7I" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 5D6034E413CF; Wed, 29 Oct 2025 14:37:29 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 32F23606E8; Wed, 29 Oct 2025 14:37:29 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 24ACB117F81B6; Wed, 29 Oct 2025 15:37:27 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761748648; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=TiSP9apTRMTQa/+Qm2OMWAOpekvvQHx/ArvOL/FMv3k=; b=1ZT8Wp7IhA0jpWViW/RL1lMvau22xIyx6MpyZ4NhS+GjZj7+EerXqiBfDrX56WW5EHyLes ccHEP4/sQvbyIumX/R/qYmutb7uJ9Hru9PZy7SnAmbkgpcXla2UfuRwdOv+wUoBAGYB5xl f/HkC6TDoYP7CDXczsslPF4gP353gtam5QoJUi6cJtdTrdQynxX8OdtY5rAXGTqzjjl3Ge K4VqmcKoPMckr4vd8uJ8cE+pZU0ovTPdob8l9R6GtyR5HL7iexHhSyG6u3FjoD4pxqLUxZ gPEj3opRcwPyUnfkLm80y/XmxC7zdk+K/VeT/6NO8Q3a9GYKpRt2tTJv6FW2og== From: Louis Chauvet Date: Wed, 29 Oct 2025 15:36:59 +0100 Subject: [PATCH RESEND v2 22/32] 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: <20251029-vkms-all-config-v2-22-a49a2d4cba26@bootlin.com> References: <20251029-vkms-all-config-v2-0-a49a2d4cba26@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-a49a2d4cba26@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=LUx3WgpJ+5BY9H52t76Y/Q40Ik9Sz02o7+/xgILTIdY=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAiZ9E+Gt4xDUfca6oSRjlO9l81jkjGC5fN41Q wZPk4xKYW+JAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQImfQAKCRAgrS7GWxAs 4tiVD/95NgwtNTW58Dw5zlRj9WzngKn1GBaAFI+2AWbj0K5+yYiR4XoX6KIjCh62WRWxvIRP6ku 0DhCJ+Lt8h8WZ09G1tk+q8SyuHgxoILusiIjbVF3WI2ZVb9Dmrj+hEmFZpdqLtZIcoZNAL07Yk+ 6vGL8paQ5O6F4NyjF0/3B/YHJ0MCryiFytm9C5RPC7fBxOm5PV9IABmfjylrsZEC89ZiuBxbTmE EayYkekH8p6Ij8uGPnwH1k2gtdXYXtrHDj6ZrlhGbwvzXammcPahHrtG1bU/s8xH9WbWmS+6wjm Ch43jSMMZqdf+iMzjVrG2h73Br0/qvPIqqqqMbBOr6k+ZUOk9ZLYrTnhXX2sBXFItwKHNrSJaPF /2V3h6b2GbSelVVTRxuAYWjGoE22zEANXyIYg4pQ7o9XEIewtPugar2JgswpCtJ7YsUwA2B9A6o p2DhUYJG0UkRgv0XlvQ0oJMnJbq1OPLJzxgRvINka/sdhvpK0fiZTK/XGwXqC2Kltcw6/UKSL// oxV5Z7/e5sT0Cyo69CDUDuALkP+VPJ+j8FZ2icCCGCDRqbLviSs9Atlurf98Tt8SYabJagR9LRI lJcq3BHHwFQm9xLWGv2HauxriIeOtGekElAT7dTu/NEfeZKDSLUzDf76OthN0SiVtfyfVmraSOK KXS9xksk+54w0sQ== 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 Reviewed-by: Luca Ceresoli --- 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 32858f9a3357..99c5cf3dbd78 100644 --- a/Documentation/gpu/vkms.rst +++ b/Documentation/gpu/vkms.rst @@ -138,10 +138,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 1c0a6ecf2f29..b03e9af569b6 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -1161,10 +1161,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 12:14:34 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 8F47333F36A for ; Wed, 29 Oct 2025 14:37:32 +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=1761748654; cv=none; b=nM3YXf2qqFOTxV9VTrPSyyUidOvajJOI2u+jEUhbPmkF/qEd7tgU5KAZeh3BEVeM+fJJLoBYUCRJ33Xi/W9sVa6EtTxpDtTGR6h0dvvvov0j9MulHUiHLEAHI1JteyQP/tgrye3H84dypRNs1Me6MnK7NSUNYcR7Va5jpJ6z/9g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761748654; c=relaxed/simple; bh=to6N0s2e3g5+ds9m2twnzI2TlMbRSBVJUFTnMgjwSAk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=EBcN/5pVAiquaX+liWcyuu0yLrjOQOpWmbXXY6yqB2s6ZE61ObyEXe1QyKJZJN2WnOzfrkrdSqWWpbwWoSTiVhtyShBWJ0JBRQUWIQsSj59ee46+FXtxwGuepPUwCq5bKjJbgxkxNpmqRAcQFAcTeAwaHNwY4Vm+w7UKnJt4eKo= 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=YYs0fpiH; 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="YYs0fpiH" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 1E00E4E413CB; Wed, 29 Oct 2025 14:37:31 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id E7ABE606E8; Wed, 29 Oct 2025 14:37:30 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id AE360117F81BC; Wed, 29 Oct 2025 15:37:28 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761748650; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=qMP9RjOBCxKmLcvhFceO5QO4aOVeU1xn/DHi3LCTl8E=; b=YYs0fpiHf0fs7ydqy5kmfUNKL6SbfmHPvLpNRvE/haGYUO+zGzh8l3SBTCDNu1UdNhXvhQ yZj/dnQLXSbkeo2iq8asZO5o02RG2Mc7sKCOrCfhgcUaAQfix8DulSiVeNeAulLVZUxncR so1NDrw27qDfBBt0fJi+wICIhDvd0YWzRlUGdtV7KD6ns0bntZbzAJpdnn32aNwGEZuoIT wgACNxEcFxnIEqauvtRsiJ7aaGvPExTa0eVTE3vq5sBkfTkxp3CnvJ7vWEMYunqKWi+3Jk rBbKEyK7ETPbDkhr+jgLhwp6eGEb14QP5MOiVu5MmCanRKfypdRY+rXIKGK25g== From: Louis Chauvet Date: Wed, 29 Oct 2025 15:37:00 +0100 Subject: [PATCH RESEND v2 23/32] drm/connector: Export drm_get_colorspace_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: <20251029-vkms-all-config-v2-23-a49a2d4cba26@bootlin.com> References: <20251029-vkms-all-config-v2-0-a49a2d4cba26@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-a49a2d4cba26@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=667; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=to6N0s2e3g5+ds9m2twnzI2TlMbRSBVJUFTnMgjwSAk=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAiZ99VG0sq963pKAN/9rZyxrEpZ1HuS6Bjqq7 vTw/WkbqvWJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQImfQAKCRAgrS7GWxAs 4usDD/4lz/L5M0Z11LFKAa+ecCStJHmBTSXr3fkw+0M3wT8tajZNhzOEJxV28NDj34vjzd/XHtb BruJ08GRAj/0kONl2IqvhCtZJr55kOmEHub+2i/GMK5JQ6a0l7IlqaWF0YG4yDs0d4iPchzE/I5 uUKaWhf5nGAKs47A50Dy1tU072KMxDRkXmNnTjo24ckL73bPIwjK9szIRyw/su5moWdhrdjZ1Ho 2eWvDxpvZFEJqqVncANoM2MF3hq4ruzzKL7fWAcrySXAk0cUk11UCEltckaEUv7VFRushmHRru+ QgXrtWfbvJWT2Jrt+uYUaDzZ9x5rilyc1uKK/YYKMfeQ/oTPIL5hjXgG8/dp+preeUHDv+LyyYB 3od25wGs3m4QpNrltnzzvP2lzP+Qbov6xGQpmWvqLxvUUC3F0IKkln8m5VWv2LS/XMoDA2eR06t y7AOEWLkMWTqQdmSuZ2SFxRffcxdfisggka31b9wb8pazpx0OkoCiXnoK83y5rzrQSQcvcXx07Y IhuhO23wVdN3fW4mjxerjnzP81YObodTj7C4niqTALTU4prZIXX0HFfC8KDOXCLMedbI09Yr6Ri mIILjkfeYugaZnyj5tieM1j8BISyGbNdvQGfheROimFuUQWJSP3Aob6tuNSsMN76MwSsUu5OTtX 63pZ35zomKqZDgg== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Export drm_get_colorspace_name so it could be used by VKMS Signed-off-by: Louis Chauvet Reviewed-by: Luca Ceresoli --- drivers/gpu/drm/drm_connector.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connecto= r.c index 272d6254ea47..5b777fb75b05 100644 --- a/drivers/gpu/drm/drm_connector.c +++ b/drivers/gpu/drm/drm_connector.c @@ -1362,6 +1362,7 @@ const char *drm_get_colorspace_name(enum drm_colorspa= ce colorspace) else return "(null)"; } +EXPORT_SYMBOL(drm_get_colorspace_name); =20 static const u32 hdmi_colorspaces =3D BIT(DRM_MODE_COLORIMETRY_SMPTE_170M_YCC) | --=20 2.51.0 From nobody Sun Feb 8 12:14:34 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 4EE2633F8BC; Wed, 29 Oct 2025 14:37: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=1761748656; cv=none; b=EzqhydwckGxxwq2yLYUflOZ3upfPPCkb0kBVSP5bgGCgenP4wfcLKK5RVh0n0qs7z9B50KlUL8GB7w/RlotCU8FqTGZoVrB8iLhTmjy+gVB6vB2BL6DfnzYhkvQicfK2xhHmdY3QTyk71zE1w+/mQGs77siWAZxLV/ZI2MCgEQY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761748656; c=relaxed/simple; bh=0+98kTspyGPOT1vZSC+v8rAN3ugo7Kzz9vOSVYqHbkY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=jAQ5OI+szqQiUfoSmbYLpl+VCcsgTtOIPbv39qJpNJcfcSpijtDQtzae4VYXHDdjbwAtcOTe8PUz1q7lSnyG/J6CjQsYAC7oldUEl9GXTBVFo33XSaT8sxWzYXYVuKdGJEcmfmKdZyZ6hdRCsp63ReIxzlBTkNT4NKQAEYw3Lx8= 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=vUCxPdSz; 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="vUCxPdSz" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 0D9B21A174A; Wed, 29 Oct 2025 14:37:33 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id D7E05606E8; Wed, 29 Oct 2025 14:37:32 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 6DE28117F81BB; Wed, 29 Oct 2025 15:37:30 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761748651; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=xS/1Ec3oJHE02YD4Fccj9Q73h4DqLCBWTIm+KKVpV/4=; b=vUCxPdSzUnIzbPcKoIn5hwEtGfRls/yvSrVR3naGOjSbMHtROOzrdhl4E0EsScMd/Wpl1n oFyfJob0VcVkxxqhZnLsEtwkDgwlrV/NXHC9Q7sxxXXkG/iylfqsz+hjwTg7+Pp0X8kPzT dI20I+vJdyxSkv7zpwvYmIdyuvY4h4/trHfstNIBVrJpGWQ/dt6HCrnOUDsYnvaf3TIX/g j6CkeIWQ0Xpx8+BF1txLs8xd5fLmskrOOnVAHxXknc8VA8+W7Un3a6GWqNrqc+n8nPGzCe Z0OH4/fpW0bwnRhZxej2hphajnDy60SGly+ahxvIOyokuPeWORG59OHbiXfzfQ== From: Louis Chauvet Date: Wed, 29 Oct 2025 15:37:01 +0100 Subject: [PATCH RESEND v2 24/32] 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: <20251029-vkms-all-config-v2-24-a49a2d4cba26@bootlin.com> References: <20251029-vkms-all-config-v2-0-a49a2d4cba26@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-a49a2d4cba26@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=6028; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=0+98kTspyGPOT1vZSC+v8rAN3ugo7Kzz9vOSVYqHbkY=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAiZ9OkXw2efnaBOV717sHLWAxSpXkMmeKuusj 6M8J0UnmRWJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQImfQAKCRAgrS7GWxAs 4tbRD/9X0PceeQysXlQIjAdWfuIrVnltgJgwO7zKPg1D1dFIuiCWMpZXeJSPFMIEq6LisjY1KaI ZTlUhfo52Bn/40BkMPB4mGH8n+bbKiAymoE/7mfMPw+ZW7iyo2LaQKW/++K0YdFqlI/s68taclF 8JocTfEbAYp9o9jFcQkOhYwzy/B3yHh8kMnNH9ltj7JifGDxYjjivEDGnZSs8E95pqekx4XuW3N bP4GnBHtU67Skwn84Lj4GUirrwPtmTexW8aelu0jDRpyMTwrgT5hJUiZr7W1cV80nVST8h0HJ6p 8qeGy+Is6l6ZL5WZ0BFJ8hy7eFcz3pELzW/cnM8I98jMtdgY/3aErkgw6xZmCwf6Y5gTv5RB5Yr OhJueJRG/QChhEVlcxKdQYDHkIdUlUULaW3CsviKnazKlcxLKXPgktPa7/cP2TAEqIUssdIAn5G 6ZRQUrpW3iz9CamAaED6IsCQHodb8O0C9qxQNID/UwBk3VMUce5jyKs/gLuQdHHpPThr/DDfRM3 2LhuQdSEEdwolZCalLnNXtRy23afrLbj3tsZ0lYJpQmfHvW4j9PzkTZjAVNa2yjRQn8Y6ot/NbF 47berTb7m1GQSecWLx7U729XIvmpvnPzmf+ZK2CZNWDurrABUWFxfHuYcNDdkCKJvxD0akaWjFV PTSVF4FgDSrVjeg== 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 | 5 +++++ drivers/gpu/drm/vkms/vkms_config.h | 30 +++++++++++++++++++++++= ++++ drivers/gpu/drm/vkms/vkms_connector.c | 15 ++++++++++++++ 4 files changed, 53 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 c8b885306eed..e0ceecf2e2dd 100644 --- a/drivers/gpu/drm/vkms/tests/vkms_config_test.c +++ b/drivers/gpu/drm/vkms/tests/vkms_config_test.c @@ -202,6 +202,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 02e2f0249fb0..6f939b82c33f 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -590,6 +590,10 @@ static int vkms_config_show(struct seq_file *m, void *= data) drm_get_connector_status_name(vkms_config_connector_get_status(conne= ctor_cfg))); seq_printf(m, "\ttype=3D%s\n", drm_get_connector_type_name(vkms_config_connector_get_type(connector= _cfg))); + seq_puts(m, "\tsupported colorspaces=3D"); + show_bitfield(m, vkms_config_connector_get_supported_colorspaces(connect= or_cfg), + drm_get_colorspace_name); + seq_puts(m, "\n"); } =20 return 0; @@ -896,6 +900,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 6a50ec7535af..d68133723444 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -131,6 +131,10 @@ 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 + * @supported_colorspaces: Bitmask of all the supported colorspaces. Values + * are the sames as ones accepted by + * drm_mode_create_hdmi_colorspace_property() and + * drm_mode_create_dp_colorspace_property() * @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 @@ -143,6 +147,7 @@ struct vkms_config_connector { =20 int type; enum drm_connector_status status; + u32 supported_colorspaces; struct xarray possible_encoders; =20 /* Internal usage */ @@ -241,6 +246,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(const struct vkms_config_c= onnector *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 12:14:34 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 A5EEF3446C5 for ; Wed, 29 Oct 2025 14:37:36 +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=1761748658; cv=none; b=W9a/cG8MZ+IpfqAZAfE53ax+gWUxY4KWc72RW6h78UlEaXlSE7KiGtPeHhYjUn4N04dLSvmmYxtKJaGt20rT2+51ubOlFCKcwHvjNlgMjcI6YV/tTR4zVmN4+mmdYqlf03yPCK1sE5BMqLK/otQtgut4AxJZKCHfvUPb7By62fI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761748658; c=relaxed/simple; bh=v5g2/tFW6cJCpWfZKG7ctdaqLbdAUNKogwWbJ6drI8c=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=X+CFsvtP+vmOzf/cxvjplrItTwen4/WAG/Y0bGnlOVkL2lothvk+1T1+B2QRneb89/EatuYAzQF+QSNUIFVgMDDT8Yl/TQU5vfCpDiqzwJ8WCxhryK9ZSIAlOstGU3ky1JCHH7eEaKrGNJxvzKdRMzZQW+nrlIUC2OXbMYfMqJ4= 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=vKxLiLBT; 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="vKxLiLBT" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 1F7661A174B; Wed, 29 Oct 2025 14:37:35 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id E6AF6606E8; Wed, 29 Oct 2025 14:37:34 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 589D2117F81AD; Wed, 29 Oct 2025 15:37:32 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761748653; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=/SkxqVl9RtXMg923ohzK0NptHaF/IbRJVg/+pganUWk=; b=vKxLiLBTDpT4RKqodVQ4a78yF/qqPUewJUpslNDs4poq70V98QUpsjSAkFEtBRBHDaUy3q ewYRzHHuydKbwo+aaL+4uW6HW40oo8ZULcAlacslayabzg8JDlOX4/+p5Q2helOvEmFSkp 150E7/joSdHnQjbtSGt8AdZGS7vIIP6B7d9jzB/JqSUpCV3eTCzt741sjWNW1+N3GEh+Nx mkxyyRP2gefh6eqoy1PgxfUlpK9fh5iYfr6oVbZXPHem7ApXJLfegh1u3zzk7JE9SmGF+8 70llBzV02nMeUePF2lWIbDGkaznMkebjipLcgPmb3HyCXH4OZzDn8x4G4eoBig== From: Louis Chauvet Date: Wed, 29 Oct 2025 15:37:02 +0100 Subject: [PATCH RESEND v2 25/32] 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: <20251029-vkms-all-config-v2-25-a49a2d4cba26@bootlin.com> References: <20251029-vkms-all-config-v2-0-a49a2d4cba26@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-a49a2d4cba26@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=v5g2/tFW6cJCpWfZKG7ctdaqLbdAUNKogwWbJ6drI8c=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAiZ9llCo3cwKhbwIJTOJ7zIhQm30UYi95QYFc PrxMDS7woiJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQImfQAKCRAgrS7GWxAs 4vY7D/4ptjbqjdj8ahDVRRC+Nkadn/jegwez4uSUZiQsEiU3dRvJ95JejUXOOrHm/OTL/0sqEbS 47Ra6mFklunjoAz73I3ek+CeNu/0IVgZmYAfei19f17u2QgNnJAEkOCiln54OpsZflULJuSf2SF JZnAR8Xzav2yw7LkpwjFGkHyHe/CFSc48nQaZ2IJ1df22F49Tj1RBcmiQHeG57EZ9uFEpH0kyXw Gm5HM4BrEocYnlKczoqQjJVhLezqgtJyF28GeFNVoe0Opou7iTUkcFopQvtJlmyYZSMI4/vuFzU sOCeQ8jvrjNE+F9PcV18WhF2f2ILEnccGCtzeUBmuWz3CPR/nSrquad+tZTLdDfCwr+0PusNeB1 OiCeYPKRdY4Jid7CePxMLyTQapBcU5R+9RUP7s5t9/4vLv7UAir3QvdZU0s+anP3is1hlRBKYYD oEGa8bVl2esZE2KmOBjUDllJYp7QCmOqjp5mVw1YPBISVTYKt1n2rHOeSlKSp2LdK4/++JPE9v0 jJ7IKbSOzlMjPBrmjndVDDsnyf5h3HiCWOGhWbbzOqTsvlK3BuLZtjDCs8u/8kprjDxynVgcr80 /QR1M4yALXWEDPecJzD8agRU9d3SYwejzflJ/NIhNCV9uZc6rE+AuxNAaKagrgnSIf19v5GvJuW tk3ayAePm3HMCMA== 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 99c5cf3dbd78..c762cadac6f4 100644 --- a/Documentation/gpu/vkms.rst +++ b/Documentation/gpu/vkms.rst @@ -138,11 +138,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 b03e9af569b6..a7f4589403ce 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -1223,12 +1223,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 12:14:34 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 5E8CD345CAD for ; Wed, 29 Oct 2025 14:37:39 +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=1761748661; cv=none; b=rx0GZru6rQ2qzgz9RuLWYmf8hfOU5AtxuOII7OmSYdj25Ys+ALToA8MIBrnAHWh1FbSn0Vuu59Sf5dPoRUyYZuWnU8YLD+iplfU+jlH5aJOxRWI7hKeJ3IBmDN3WlfX697LoD46fpKxAhwJN89CQuinAQUsrVgk5EjyH+83/Og0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761748661; c=relaxed/simple; bh=fQn1DhxGfYNX8VU/HCeunjh+etuTG9Na/6C5gWSAOrE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JTFCcD2zxntQVk5yfvHf6/TxoHOIKovtzOLtGbSB1jctXV45SED+xqLUFH7heFP/2aJF1SVtU6K8dTKj2w+z6zvvH1317t5ZGb8LR0T6EINStmxUbNeYMfBT5Pq3xX+PRB28jvlXauTyJH2e5OyEOqfe1JWr3XkT9RG/v4vxUag= 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=C7P1oVIW; 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="C7P1oVIW" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 100214E413CD; Wed, 29 Oct 2025 14:37:38 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id DA000606E8; Wed, 29 Oct 2025 14:37:37 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 0CAE6102F24F9; Wed, 29 Oct 2025 15:37:33 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761748656; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=PdR/lV4Aq38fLSZTr2GyyE929TgZeBjpNA3qwiY4csA=; b=C7P1oVIWD2EqirvtwHa6PvAe+8PZF4yq6ItQLlMI+9qE61lRMMCClWJvPm/jzfDuzDs+YM IQvxnUpiwBqxYdzLJqYnhtZ5xsDTCI6/rBSiMM8VIPhOTewEZxycYaU8YP9YOA70xZ+fz+ iROta0YDG6wY7sREM6yk6Q3om5v/ABJ/oSnNBXvfWXnAjVeJBnh1iqiqz1/tr9J2nnrHtV ylXwibBv7EzODMvmR/YpBQ69B4eR+gTexnWLEFOtc3FxMJw3jSS9MsrAYesjwulYRzLYrC 864xDTnPHXy+tR3JWc3+czMRABN+SjSMpyG0VrE8TuHSPK9jwf1jt99SQUwqLw== From: Louis Chauvet Date: Wed, 29 Oct 2025 15:37:03 +0100 Subject: [PATCH RESEND v2 26/32] 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: <20251029-vkms-all-config-v2-26-a49a2d4cba26@bootlin.com> References: <20251029-vkms-all-config-v2-0-a49a2d4cba26@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-a49a2d4cba26@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=8011; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=fQn1DhxGfYNX8VU/HCeunjh+etuTG9Na/6C5gWSAOrE=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAiZ9OaO+hFxXOMW7VTFWj5vChywvDroMG4/gI unFlz+Fld6JAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQImfQAKCRAgrS7GWxAs 4l1AD/0Zb76CiV2++5JjKc5MtWrFVqRNCkq5oawlBSo2X8641GdK1TIPx7wBznAiRUEOjsa7KE4 c7NOxSUZcp0/7DXp7gjiqQHt2Sozn+aRm0A+OMmYqNIxM75slCszXbX+/Afm7nNxuoyeE6KlZmN K5GnUkNY+g9t8934Jto3RkqUpu+I880qqy5pMi/1ye7iQfvpmZEHAA8f/hdMsey0bywUoUPUC2j RBlJ7PuHrYXPp1zMOEj+jr+vD7PO5zBuYV3QLJfJDBH3QCVzYdewPZmAbE1ar+KPTRvt4q5yzrR KX3Op0SPc4k/SO+gbaPrM2w9HeEQ7jMTsF3nI178bGob/6xY0VPWpeqtQEh98U/1EJNrvn6Njey MJJVtQXjHVBhkNrG0q9XplBbxip4zbPmPxb4+MyVlBJikvpIO+mJUTdWpnC0ITw2dTeJ3i8KJ93 2hSaKrM6othazqiCB1021iAfIyy8EaDUW0aKzW9Jzkf0EIhcAAQqMANwFPvHu9Ddb6PxqZ3Qa3B 1DkB3YMbhC37hRIju7eGxgmANmazxeAEnXubhtF6NFdmiI0YkOz/yBVmnXLxiJAY218bc1FGNdP FVh86DTsO9zhhjmQo0qLiDAaxqALh8UYHJR+NqFIg10bgtG9pozw+bZBajdYz8A7p1RbXX21OKi akgzFn52OOuuhUw== 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.c | 6 +++ drivers/gpu/drm/vkms/vkms_config.h | 75 +++++++++++++++++++++++= ++++ drivers/gpu/drm/vkms/vkms_connector.c | 48 +++++++++++++++-- 4 files changed, 127 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 e0ceecf2e2dd..531c3b76b58d 100644 --- a/drivers/gpu/drm/vkms/tests/vkms_config_test.c +++ b/drivers/gpu/drm/vkms/tests/vkms_config_test.c @@ -205,6 +205,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.c b/drivers/gpu/drm/vkms/vkms= _config.c index 6f939b82c33f..02c0e944adf8 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -525,6 +525,7 @@ static int vkms_config_show(struct seq_file *m, void *d= ata) struct drm_device *dev =3D entry->dev; struct vkms_device *vkmsdev =3D drm_device_to_vkms_device(dev); const char *dev_name; + int edid_len; struct vkms_config_plane *plane_cfg; struct vkms_config_crtc *crtc_cfg; struct vkms_config_encoder *encoder_cfg; @@ -594,6 +595,11 @@ static int vkms_config_show(struct seq_file *m, void *= data) show_bitfield(m, vkms_config_connector_get_supported_colorspaces(connect= or_cfg), drm_get_colorspace_name); seq_puts(m, "\n"); + vkms_config_connector_get_edid(connector_cfg, &edid_len); + seq_printf(m, "\tEDID=3D%s (len=3D%d)\n", + str_enabled_disabled(vkms_config_connector_get_edid_enabled(connecto= r_cfg)), + edid_len + ); } =20 return 0; diff --git a/drivers/gpu/drm/vkms/vkms_config.h b/drivers/gpu/drm/vkms/vkms= _config.h index d68133723444..42f5b5edaf1d 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -135,6 +135,9 @@ struct vkms_config_encoder { * are the sames as ones accepted by * drm_mode_create_hdmi_colorspace_property() and * drm_mode_create_dp_colorspace_property() + * @edid_enabled: If true, create the EDID property + * @edid: Stores the current EDID. The value will be ignored if @edid_enab= led is false + * @edid_len: Current EDID length. The value will be ignored if @edid_enab= led is false * @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 @@ -148,6 +151,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 */ @@ -271,6 +277,75 @@ vkms_config_connector_get_supported_colorspaces(const = struct vkms_config_connect 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(const struct vkms_config_connector = *connector_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 =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 12:14:34 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 E6F5A346A11 for ; Wed, 29 Oct 2025 14:37:41 +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=1761748663; cv=none; b=GKqnd2eNjFiiIgc9woq09s+pR9iJlyFVLLFCE2BqI2dt/Jgi5igZfHNh2XF1k2nM7hj0qxR/q83HHaOfkkQ24t1D0CB3RdswGJrahy+vzZWvIiuHIkCP0cIXUyeJu0fNAq39slz26+rUTpalu3XLDqwsyhq4U/qHfZBl1LtAv78= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761748663; c=relaxed/simple; bh=cfHMITCkhuA9xDg6rR5Pf2S96MFpLvOh5N7v63PxojQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=r27dkEpqnRs6q+4b1akmrd4ruBAnRqMirBKY58RzOdy4vSAcBuioceYgYee1HNUzaC4N93A1ZKsVhJXdazAoth5UI1pEJrFKjot0roIhYUW6TzPM13BJcYJ+Ewx5wOTdXGG1sw1OkMf3qPNjChvKsuTAg08iWaQm46CXUn+TnJc= 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=zhEyh2Wc; 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="zhEyh2Wc" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 62CE04E413CF; Wed, 29 Oct 2025 14:37:40 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 33FBD606E8; Wed, 29 Oct 2025 14:37:40 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 3DB12117F81B5; Wed, 29 Oct 2025 15:37:37 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761748658; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=Zs7cFfDnZhyAxSYFH45RdpuYGVq+BUPOPTG7RxnjHZc=; b=zhEyh2Wc3M22YiW14zB+NlN4hmLGR8Csix5S4OMutycu4eMw2nxZZOVTB2H9SX0tz/Yx8c WeyXa4wrzXSNbHmFzEVO2SJ1LdtGoTgcggoe64uU/Pr6mR0i0iObGd4sriLp7lM34Ie0Ai cGpSZMrSqHHr4n53aUaL1CO0RmjFkcxtZF7Mslnim8rbdQRY22iDMQL8nNbXuy4IHLIU6C LvyHKUdr1UNfIhUxaifHIxx43ilpxM+KhONQRBE/Oqp8Kvu/++0UUmEP+9R0urWsjIDZEI dFbgQaL+Qjpa81mfyXlVfVz13xjCoHIYfy7zUWwadypXORHDZTuQCRbOUOiFag== From: Louis Chauvet Date: Wed, 29 Oct 2025 15:37:04 +0100 Subject: [PATCH RESEND v2 27/32] 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: <20251029-vkms-all-config-v2-27-a49a2d4cba26@bootlin.com> References: <20251029-vkms-all-config-v2-0-a49a2d4cba26@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-a49a2d4cba26@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=5286; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=cfHMITCkhuA9xDg6rR5Pf2S96MFpLvOh5N7v63PxojQ=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAiZ9QZXTe3vOpXepw9nuYtb3Y4yisFW2olhnp SZA+trfPaWJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQImfQAKCRAgrS7GWxAs 4hxDD/4y5QG7UGhC3l9vvaNlm2b2jriMyxoU2wTRUnnQbyKYIO/Y3SWTYJg7xu3gZUSFSbT3wRB T+kCRh9S/aTQvhtqdlr/3wVJQ2KcNHv4z1r5ZUJhCW84+KP0+P5uBh+HJ7TMKdqzeXyTUjXyYlx XItkpZTU4lW7q0yGTVGn/rUAXPy4N3b8+ACSG+uUhrICqiqXJfok4VS7tDihbSrk5U+54v7y49q rlOhFcQ5NEvesYQjThdEfA0OqPHSaEfn/Vk3WcbUOX4eThGyKDDiuZCSaUnB66RvFJh+MdDnYSf uqjeXfeXGrBMJQ/c7K7QgiS9W/Gx1eQnw1wT9wWP9psR9vnSir8Jq6HwRm5T0gARZ/dHuOvCE16 6PvAuQrLgDglYzWO/iKUKNdT6a3er5TF4BT12hyXLIsBE6EGxB63DIchi5lo7hyqRJyz3pPzvsT c1gN+VQhzThoBaNB5Ctfq+rfGTRXMIVhUsGoh9xM98GgYb2jql9qOdYGfptURunVRjfUdREpa3T u149TCN1GOdPq89nGtq7IqJorWuwIt2fKGNTZSPjbup+CUtVghOgPKjlBEcHYSwDa84pKGuOjMD BsagDPkJ2nnPykxMBjVwoh7O4BzedGvcQ37j++eSDJ2dMbc1GOom9pCE9oYkp998Lw886cBniZq RJ6WoRG2V4BLTfQ== 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 | 80 +++++++++++++++++++++++++++++++= ++++ drivers/gpu/drm/vkms/vkms_connector.c | 3 ++ 3 files changed, 87 insertions(+), 1 deletion(-) diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index c762cadac6f4..0cc7897d7b83 100644 --- a/Documentation/gpu/vkms.rst +++ b/Documentation/gpu/vkms.rst @@ -138,7 +138,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) @@ -147,6 +147,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 a7f4589403ce..1843e5d9e1e1 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -1260,14 +1260,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 diff --git a/drivers/gpu/drm/vkms/vkms_connector.c b/drivers/gpu/drm/vkms/v= kms_connector.c index 339d747e729e..699b6779a46c 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.c +++ b/drivers/gpu/drm/vkms/vkms_connector.c @@ -141,6 +141,9 @@ struct vkms_connector *vkms_connector_init(struct vkms_= device *vkmsdev, =20 drm_connector_helper_add(&connector->base, &vkms_conn_helper_funcs); =20 + if (vkms_config_connector_get_edid_enabled(connector_cfg)) + drm_connector_attach_edid_property(&connector->base); + return connector; } =20 --=20 2.51.0 From nobody Sun Feb 8 12:14:34 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 B75822D63FC; Wed, 29 Oct 2025 14:37:42 +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=1761748664; cv=none; b=it3p+RdCohVVardQG/IY23r0Dc05zFPF6JaL5zI0DTJ1TtoCSNTkc8ugu/ecb/NBwqaS236IIoqwQWuDQ6wH48ODLKRW1eGLkptqAo3zVTAcMcZ/iRor4HEz15Yzdi0k2eNXuGuTsmDcU6XYGpv2djm4z4/I8uv4jJv8c5bGVjs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761748664; c=relaxed/simple; bh=SxSapH92H7+R0YRpp8ZbmLEJQdfxderXgSB2dmTAdXE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=k1WIv+TAPgHpLthpkKMWHon4/mQ1NOihoiJ3lnMgIj/ay8v2OHe237/wDnar37lRAYnIQRUxuO71UnekrJpVIl0GhZczXpjX4lohe/Ee8MzosQPqoMjKTYAgGaT2oCmjEsIBZj4BI5OusVzmV7mNkDHpOwncR2cRXc9/eDwyQRk= 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=af/TvIDx; 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="af/TvIDx" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 33A31C0DA85; Wed, 29 Oct 2025 14:37:21 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 8BD93606E8; Wed, 29 Oct 2025 14:37:41 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 0C255117F81BA; Wed, 29 Oct 2025 15:37:38 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761748660; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=BHhX5HD+lytwOesCtdB6a6t4OMHVoG/mXwydRLC0kYA=; b=af/TvIDxpDWPVP4UP/p7j38091UYTPuy+L3Co7pxgoo8VdG3rb8V+CrzHn569B1QXJ9Vo4 mWSgc0dfWw3iAK1H2MaBvlc8UpkqV0AwMiqz+1sIhl9FtvqfkSQElRK0eJ7WmWyebyxIPN +83kBgAsGvgIj79hmIspe0lIY8qZkA+nkM+krLkO2sWihICljGQbOU5v1AibvnhDEDen2z DsPi0N5J/3DQKnL0o/bWCuJdFZYhVp4x4wWNOAzaPrJ+JBodIqVJXD0g7EuEcRXwYqf9RA qdEzE4jrbcQH6GPEb7vR6ex+XHziHNMDgui+UXFkpamLpBtP9IAN1DLdMhgURg== From: Louis Chauvet Date: Wed, 29 Oct 2025 15:37:05 +0100 Subject: [PATCH RESEND v2 28/32] 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: <20251029-vkms-all-config-v2-28-a49a2d4cba26@bootlin.com> References: <20251029-vkms-all-config-v2-0-a49a2d4cba26@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-a49a2d4cba26@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=6498; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=SxSapH92H7+R0YRpp8ZbmLEJQdfxderXgSB2dmTAdXE=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAiZ90JUv9FsfWkPTdUaPaiJ9Vg6gJLdV8H7iE Irgr4DUbNmJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQImfQAKCRAgrS7GWxAs 4vgkD/98Wk1tkoeqoG5YePb/qtNQl2IG77FoPeuuCjPCkC6q+tR5ZnFOua2721UvBNW9iP0GIXF BSobx8w1yOFTGK3hF7h4YiSSkHclV32eAuHHoIDO9th6zCHEoLbIEcWGfwc8WsTN/Tpc1Z1xl8d n4WbMg5qRqyp+rRH54eyQ/+dILoEGQYORABsG6/DjMz9b23TkdY4WaPkjwG0doRLQpi07NJLbHJ //04/s2scLRGMM+ohgfJt0RL5h2HdRcMHUw2D+YkKlcYyMF1VCT59mZfi6ioWyo7AmCiHW0qKQb ou/2VO5uLQs1CQatECdnP36NuROObNlYCDzWCbJQrq4hf6sI2zgqrtKwuG+UrKrRqqJEOp8thK2 Y4KRgd/5RnlbRSbuNOtLO4sW6z5/Oo7UJ1/z2gWrjaq/MmHLawCw2E1UsAdv6rhZovyhJZikoUc FnV06T+VMoVyLGVxbt8Lnt8xVgiskxmnUvnPI0qQk+KGTFETON8rcwM9cCb9yT8KoERBFmNHVyG U8DewgmJW2P1fd2DKlYlblmVDI9ZGekEFsGFAmUxSseFfdnbrrvAS73Km/DBHLPu/uEBfafG5Qt ebhNKXzhEC2bj05Y/pWeZhMm9YJfmPYRnC3sQpR3gc/7mjDsJoVleLqw/qD50FYj5uae0DIuE6V 3tbfd3dzXSFQzqw== 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 | 6 +++ drivers/gpu/drm/vkms/vkms_config.h | 66 +++++++++++++++++++++++= ++++ 3 files changed, 76 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 531c3b76b58d..b1d95385263f 100644 --- a/drivers/gpu/drm/vkms/tests/vkms_config_test.c +++ b/drivers/gpu/drm/vkms/tests/vkms_config_test.c @@ -207,6 +207,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 02c0e944adf8..e86173ad61a6 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -587,6 +587,8 @@ static int vkms_config_show(struct seq_file *m, void *d= ata) =20 vkms_config_for_each_connector(vkmsdev->config, connector_cfg) { seq_puts(m, "connector:\n"); + seq_printf(m, "\t%s\n", + str_enabled_disabled(vkms_config_connector_is_enabled(connector_cfg)= )); seq_printf(m, "\tstatus=3D%s\n", drm_get_connector_status_name(vkms_config_connector_get_status(conne= ctor_cfg))); seq_printf(m, "\ttype=3D%s\n", @@ -600,6 +602,8 @@ static int vkms_config_show(struct seq_file *m, void *d= ata) str_enabled_disabled(vkms_config_connector_get_edid_enabled(connecto= r_cfg)), edid_len ); + seq_printf(m, "\tdynamic=3D%s\n", + str_true_false(vkms_config_connector_is_dynamic(connector_cfg))); } =20 return 0; @@ -907,6 +911,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 42f5b5edaf1d..a4aa7ad7be71 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -130,6 +130,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 * @supported_colorspaces: Bitmask of all the supported colorspaces. Values * are the sames as ones accepted by @@ -149,6 +151,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; @@ -192,6 +196,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 @@ -445,6 +467,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(const struct vkms_config_connector *conne= ctor_cfg) +{ + 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 12:14:34 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 DCCCF347FEC; Wed, 29 Oct 2025 14:37:44 +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=1761748666; cv=none; b=tOGXHO4Xa3X5IzVjL0NgbzJfu4IhdPdYaGNLv3A3ba4/7gGakgHZw1muhgecaZQn2mqT9Q7zU1psPC0VWZW77ekCve2cUy0oE4fyUQlg/+h23lpEV6DfGVqf52EmaO/25IrOzJ5GH/05+SERmrXJ/rnWXAag4SjqmAGrGbC+jaQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761748666; c=relaxed/simple; bh=GNdCT1aWfEW/qQlyX1iY1PDslsm0v0L9+mabaSCFgjo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=XgHgrDIzlv4Pg3GFUOeMgte8Nwibn0WS9JrExxBC7cfPqE/qfj042kec/MPDpjeRi57iuwiyvvZzTyVr/ofwMhONTwdoQsfOIUKfLNiShpin8TsmzYYHunIP1LS0A+4BWKg+40fZxZRoWKxgibUEP2jDkbxorKdDc3KYBWtaERo= 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=T5YSSU1w; 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="T5YSSU1w" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 13C9FC0DA83; Wed, 29 Oct 2025 14:37:23 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 6B995606E8; Wed, 29 Oct 2025 14:37:43 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id F0FDB117F81B1; Wed, 29 Oct 2025 15:37:40 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761748662; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=1ieovVEGpwnQqb90fB7Ngr7zVzD1mSM9AkeaTdc+irk=; b=T5YSSU1wvQNqcc6rNh/2C4BRhuc+nYxcgwcnsynSEyO2CozaB/we6zQGJOTiPJ0KWPRiW9 cYCTm64iAwoPiFWqZTprfc267INgck5jHMdPgVOBmPBFnK5vrsCVTla5qSr4ko13uUs7gP qGIT2cn1+xm7Xsa445PTsGnt+4q5z7bCbFkyl02u5g6y0q2lg1bdBdg55m/RRMsuv2/dYG RiME2wqahwCyVv4KdFmcfZS+O+uemK133VjOf6xU0RzEcwsFOx5mZEOYiOqCXlgc6gSC2A LibunI+puZbf2oo/xrSUWNJQ/7CkZe6lNQKs/OdA5m37So5RZAzqD4lDh4IArg== From: Louis Chauvet Date: Wed, 29 Oct 2025 15:37:06 +0100 Subject: [PATCH RESEND v2 29/32] drm/vkms: Rename vkms_connector_init to vkms_connector_init_static 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: <20251029-vkms-all-config-v2-29-a49a2d4cba26@bootlin.com> References: <20251029-vkms-all-config-v2-0-a49a2d4cba26@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-a49a2d4cba26@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=3042; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=GNdCT1aWfEW/qQlyX1iY1PDslsm0v0L9+mabaSCFgjo=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAiZ+usbluoyz+CVfmPQXVAXXfGDxuzYNqVvoa 2ohYNQaJQyJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQImfgAKCRAgrS7GWxAs 4nJGD/4oPPsr2RLiMOtmF96vYPcdYsC+1EeKdAwcEv8q7E27qGzoniikcQujb5YvgFR+73BNINc I9MgDxWVRO10GJPYJAfPmJ2UVLHY7qezORxrfYLSHmOCN0Tgs5lfaAt+cjXkzhS4bVZ32AGj9vW 1qbH2lgsREbgSTYYjX9n9PhIX7QWgo81jQpPXpt3SHLzPziN8k4iydWCWJ6XU93K2UzC1AF+SfU WeBKog6NZAEsrDOqiqWcvrFPl2lOy/jo02HWgoOsNRxhHlWVaukYi36cRvhRST3j7eb0nPRQ+Bi 9IsY4diLOc10z9xDjVo+zWsE5R2Brj9iowHGDCa5kRLiY42Fhm2PKcLf1Vqz9Vr1AdCqUdLuffw gI4PGckVPYr4bOTY25LHxD1NI846c7IpenZ7DTLgCR93N4+ni6lb8Sl13D5fxAaPsG/Qw1x6npj mby3ml+AeCJjJzT/cwQUrOV7lqjXF1a8Irk2bXiyKEaNnpl13xIimTHXAeICfAGMIZmoCfq1XMr nOTqHcVlV7d7U0hILu8SRn4w2XOX3EggAklZKPWQq0Y1RNHABNyYjl45ekPErsgFX3CKj9MeWEv OAiuYqG/vkhHJ4adKUmEzhtO6Qu6txdESMFCZN8i29UqJ+VQXV5kFGF9+KTi+mLMhlgAR56dRSZ 2/IBUzcnUtdgsug== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 With the introduction of dynamic connectors we will have two way of initializing a VKMS connector. Rename the current function to clarify the case. Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/vkms_connector.c | 4 ++-- drivers/gpu/drm/vkms/vkms_connector.h | 7 ++++--- drivers/gpu/drm/vkms/vkms_output.c | 4 ++-- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_connector.c b/drivers/gpu/drm/vkms/v= kms_connector.c index 699b6779a46c..1b7ccca2abc0 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.c +++ b/drivers/gpu/drm/vkms/vkms_connector.c @@ -108,8 +108,8 @@ static const struct drm_connector_helper_funcs vkms_con= n_helper_funcs =3D { .best_encoder =3D vkms_conn_best_encoder, }; =20 -struct vkms_connector *vkms_connector_init(struct vkms_device *vkmsdev, - struct vkms_config_connector *connector_cfg) +struct vkms_connector *vkms_connector_init_static(struct vkms_device *vkms= dev, + struct vkms_config_connector *connector_cfg) { struct drm_device *dev =3D &vkmsdev->drm; struct vkms_connector *connector; diff --git a/drivers/gpu/drm/vkms/vkms_connector.h b/drivers/gpu/drm/vkms/v= kms_connector.h index a124c5403697..85f9082c710e 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.h +++ b/drivers/gpu/drm/vkms/vkms_connector.h @@ -4,6 +4,7 @@ #define _VKMS_CONNECTOR_H_ =20 #include "vkms_drv.h" +#include "vkms_config.h" =20 #define drm_connector_to_vkms_connector(target) \ container_of(target, struct vkms_connector, base) @@ -18,14 +19,14 @@ struct vkms_connector { }; =20 /** - * vkms_connector_init() - Initialize a connector + * vkms_connector_init_static() - Initialize a connector * @vkmsdev: VKMS device containing the connector * * Returns: * The connector or an error on failure. */ -struct vkms_connector *vkms_connector_init(struct vkms_device *vkmsdev, - struct vkms_config_connector *connector_cfg); +struct vkms_connector *vkms_connector_init_static(struct vkms_device *vkms= dev, + 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_output.c b/drivers/gpu/drm/vkms/vkms= _output.c index 217f054d9598..44f8f53c9194 100644 --- a/drivers/gpu/drm/vkms/vkms_output.c +++ b/drivers/gpu/drm/vkms/vkms_output.c @@ -92,11 +92,11 @@ 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 - connector_cfg->connector =3D vkms_connector_init(vkmsdev, connector_cfg); + connector_cfg->connector =3D vkms_connector_init_static(vkmsdev, connect= or_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 12:14:34 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 8F38B3491FB for ; Wed, 29 Oct 2025 14:37:46 +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=1761748668; cv=none; b=IC8lWkA3JkY1Li09TEBKzX5/mRzV6p6eZgo5fvSQ1IqyrgsE3DomujmQTl0FqIybjnju2GbVzDHGqjvDjgtdKeeaQ5g+MgUjui7MFEqUPP1KBrw6tgvE5q3WZtlenyYxMyAp4w2rP+7mDaTNvszitleb5+/6FKkKoWX403tY/gg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761748668; c=relaxed/simple; bh=vHE+KXN44+uY83YhKjAEjkHqNWJmb39F47iujVDrYRg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=oP02jETr/QwyP6JKB7L51ZctChf5HWWnc++EQpmBvba0NzMDElSa7fFc6u4LCSx4bIIO9uxF6XlCivkbv33/M1OmIUWBDhwNPYEIpT/n+/x1hZAsWOpJ1Nyz9FdWFEVu/EVPWdmHn4MF54RTYPeTkH1In9G78VDpPpluGWXxEvY= 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=oKYdSMPi; 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="oKYdSMPi" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 2AFAB4E413CF; Wed, 29 Oct 2025 14:37:45 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 001E9606E8; Wed, 29 Oct 2025 14:37:45 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id CDB87117F81B6; Wed, 29 Oct 2025 15:37:42 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761748664; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=g6EoLHIVrvJ3bH8/8VH0gkiHKWy94ZpuwGW0qU4+WeE=; b=oKYdSMPiZSk2DOm8uPrfg94cfMUHhxMRy+YQGf+qNgZRgKufiWztXSNfvKonx9zh44Gw1V xXt8kME+XRRx6UXXQSaMUaPBI3K+jsOE5aCxLh4vKEsTl8Ov+GJwSNWKAxvDWXTn6UtgwD 7Judm/z/eJdUkasM2wrc9N7c8EyFoDNAEYBo08KksxkBSq9A1oI8SJnDb78qloYgyHAuik xW2cudl6Hv2X0cdOmIJfjCq1DBqXKbHGHprkcD9wp3NhX1TYJ3qn0yhlHHuAP8ZMmevNzJ qr9cFjqIS2DpMSGzG3B0OH9rjroYjaHGSDfh9iQqk8b3Vw2Qz896ecsDduTwUA== From: Louis Chauvet Date: Wed, 29 Oct 2025 15:37:07 +0100 Subject: [PATCH RESEND v2 30/32] drm/vkms: Extract common code for connector initialization 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: <20251029-vkms-all-config-v2-30-a49a2d4cba26@bootlin.com> References: <20251029-vkms-all-config-v2-0-a49a2d4cba26@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-a49a2d4cba26@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=2773; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=vHE+KXN44+uY83YhKjAEjkHqNWJmb39F47iujVDrYRg=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAiZ+aT+Hp1j2FV+wXkQMqRjY099iOPC0rTWV+ 10CqY7fnE+JAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQImfgAKCRAgrS7GWxAs 4hsOD/495loX/gzxt0xaWy06ZIi5nyYDBl5hYpWgYAnL3rBeay1pjCoANE1bg3gSwSrRDAYnopb 17DPTzIBBWwlM5zchMWsLLkgbDmiUY2Q9TZ3ccN+Qapp3yZ687mBTUhLLlOoipvdsANBux4MLb7 K1URkc6YCbzf7zUJhg6VP3tQ5rr8iCzm5KV4LFu3cnWjhKXKYzir+Tm9rJEvlVj7Lx+eh3Anig0 thzIRj44BVF4AcxoEXTgCNEaR+3YkKC9VF9fcm8jhoTpOzVEuuTg93iKAsdgGNZU+S74bRyZwZV 6Xer2pZ/sP9RAc1LpxAJmWsldcmQBf3FN4+D6rf3wl8Ujf+Vso0cDY4WiEvSasWSPruhufKD8PY Xnbme4bgrzbi4WnruqD/goVrmGLN1b6r6CCTWTeByLoYwarx/QCxlKWbDnCZiz+1B1HNy+jVYI7 KAprzh1cNFEB9reEOJpeoSbsFZrTZAvYjudDNzfgnTEALJlnhzlH6n+KlfR7a0yPi7OV06QSB7N l23jc2m692Cm6nEhdGk3KG9xd3Kog0RZzInKd5A8FaIUJYMPGoTuaz4oBXeuDoluYM8ZXU9hpa+ kQaymMAT2YCeGYt/9UJY6BQpdeuDw9DWXfM2a0ibud39FPFOK/QkNpYM3AtxrD8ePK70ZIsfkSe NgA6RoZJIJMOhdQ== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 With the introduction of dynamic connector, some code will be shared between dynamic and static connectors. Extract this part to avoid code duplication Signed-off-by: Louis Chauvet Reviewed-by: Luca Ceresoli --- drivers/gpu/drm/vkms/vkms_connector.c | 44 +++++++++++++++++++++++--------= ---- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_connector.c b/drivers/gpu/drm/vkms/v= kms_connector.c index 1b7ccca2abc0..2c5f04af8784 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.c +++ b/drivers/gpu/drm/vkms/vkms_connector.c @@ -108,22 +108,17 @@ static const struct drm_connector_helper_funcs vkms_c= onn_helper_funcs =3D { .best_encoder =3D vkms_conn_best_encoder, }; =20 -struct vkms_connector *vkms_connector_init_static(struct vkms_device *vkms= dev, - struct vkms_config_connector *connector_cfg) +/** + * vkms_connector_init() - Common initialization of vkms connector + * @vkmsdev: VKMS device containing the device + * @connector: VKMS connector to init. @connector->base must be + * already initialized by DRM core. + * @connector_cfg: Connector configuration to apply + */ +static void vkms_connector_init(struct vkms_device *vkmsdev, + struct vkms_connector *connector, + const struct vkms_config_connector *connector_cfg) { - struct drm_device *dev =3D &vkmsdev->drm; - struct vkms_connector *connector; - int ret; - - connector =3D drmm_kzalloc(dev, sizeof(*connector), GFP_KERNEL); - if (!connector) - return ERR_PTR(-ENOMEM); - - ret =3D drmm_connector_init(dev, &connector->base, &vkms_connector_funcs, - vkms_config_connector_get_type(connector_cfg), NULL); - if (ret) - return ERR_PTR(ret); - 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, @@ -143,6 +138,25 @@ struct vkms_connector *vkms_connector_init_static(stru= ct vkms_device *vkmsdev, =20 if (vkms_config_connector_get_edid_enabled(connector_cfg)) drm_connector_attach_edid_property(&connector->base); +} + +struct vkms_connector *vkms_connector_init_static(struct vkms_device *vkms= dev, + struct vkms_config_connector *connector_cfg) +{ + struct drm_device *dev =3D &vkmsdev->drm; + struct vkms_connector *connector; + int ret; + + connector =3D drmm_kzalloc(dev, sizeof(*connector), GFP_KERNEL); + if (!connector) + return ERR_PTR(-ENOMEM); + + ret =3D drmm_connector_init(dev, &connector->base, &vkms_connector_funcs, + vkms_config_connector_get_type(connector_cfg), NULL); + if (ret) + return ERR_PTR(ret); + + vkms_connector_init(vkmsdev, connector, connector_cfg); =20 return connector; } --=20 2.51.0 From nobody Sun Feb 8 12:14:34 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 DA5D134AB06; Wed, 29 Oct 2025 14:37:47 +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=1761748669; cv=none; b=LsF1jUxxHkeYwdTvTASrolHxCKEkE2QdTDWkmJM4o0lhBp/Ft456nyJpj4pFBgF3JsO7vQX15JaQhxRXpcCY/H+vbOPyybWx5qPEL//Ud4dsUiDxRY1LoXDozQAvN5hn1+FwA/1bemJiFTOizdLhWm6b/9oQIVui4yhfT0+XuzI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761748669; c=relaxed/simple; bh=xrzdaraOFExxLukUGdDstkMZ2KqagA/b+HcZMmpJXPU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=jezf4K8iHDi+IkuCrMnL7uCq+w9ceo6C9jBTkQzonyYX0NTZ1WyWe/Hl+AYJgT9CkcxRUq+xOdryQKnM97vgTqBX7LeKawO9TtR30i706PB25d7SoIynOFH7wFx1eA7QG4AGtL8dTxF1wyKjRHf5Z1kpkHJIZ0b3Zcm9qavLpDU= 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=lzyL6J/r; 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="lzyL6J/r" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 53462C0DA86; Wed, 29 Oct 2025 14:37:26 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id AB19B606E8; Wed, 29 Oct 2025 14:37:46 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 81C54117F813D; Wed, 29 Oct 2025 15:37:44 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761748665; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=z9Dd9IU6DX4wrDs84ZKPS92OQlwhgVAYGOu5dRcVDJU=; b=lzyL6J/rpydJo98TsRXgfxoYR3Core4zBppBXy5dQGgCtpAFLdNX2bMZIeytP9LxjFtcpq 6YZSi0ZesEQ2CqSwHX44MzYRO6sywsAkhyBuFoAzL+NsOGuupn9Oacl8aMmn7VH1sHivCa HVJoHlyQ67om0Ysl/VbwtLN7AxHVM8Ek+foeJkun8HwZ5WvPmJbgH3vmgdWBpqpQkmeLn+ BIfzrdEi8RwOSFpsI5FCn/PBcjQp5ozgKYqyK8rXdGC0T6U6zBzNBhgGoU2wJpHsANfGA4 gwlFN21CwGCnoHn05oGF2tL9oAELHB4Umd825KHYf1LMcrNVRSwL15VzTd9GrA== From: Louis Chauvet Date: Wed, 29 Oct 2025 15:37:08 +0100 Subject: [PATCH RESEND v2 31/32] 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: <20251029-vkms-all-config-v2-31-a49a2d4cba26@bootlin.com> References: <20251029-vkms-all-config-v2-0-a49a2d4cba26@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-a49a2d4cba26@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=5808; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=xrzdaraOFExxLukUGdDstkMZ2KqagA/b+HcZMmpJXPU=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAiZ+QghrFilKMCZFYcpyamJr0m3kZTyYOOqm3 1Bi8wtvk5SJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQImfgAKCRAgrS7GWxAs 4rwcEADX8ko2qVQYN222//f88abW8+XGCX9zshE0H6hcocPra9HuorrVImCWM8cxentS8x0Ur8X RAAWJYgZZxxWqE8gaimxVIRND/IZIP8jD4nf5BjZPSZfWmXByoW1hFtzWDT03ROH8c2aR602rcn nF3BXWANtLLIck3zzyZjCWQVZUdtNCXNFHNtHE8zL14FWanByKMPol63laQzS26d94umOV9Dt/q 4HKEgQaiTs+gpv3+32SRsbr7ujk+gHrAQpoOd9uoKKj/Dz4T7AFdQMPrjfdBltZIqyJVrEasXGo mT4nd2SqY5f6mDt6kcqnDiLpFOkW5JZEmdTVTLr6QwLvTxC1QsdqxhTCbEPeEJD4DvDIHpiaDSF EBwHxqtfTazIlmvFZ0smpXwWRa1Gk6ywt/T70q5Zk24qeuceVa0BJdXcJL5NYAgP8ZXk5gD2hoy BBeVLo9BPnNmOLQWyB5nVQ8X/nyyp+dsuKpmgNmdeb49yrK0shQVTWx01Ec4isVArELC2DZxqa6 AUnzhxQ59ID4BEzAKxIM3jsJnjpgUvDX8s3XKUvU/0n6uA+55LYybkRF1UsaQzZTLXHubntgFlc Gv2HK61aNBCgvMqjhQvmZf3wlKAHYn/yIn+EZzy5hYaezrqYE/D88M1oWbDdP82ed5Cx1uwe1VB iqxsZGBwdzAduUw== 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 | 81 +++++++++++++++++++++++++++++++= ++++ drivers/gpu/drm/vkms/vkms_connector.h | 32 ++++++++++++++ drivers/gpu/drm/vkms/vkms_output.c | 9 ++++ 3 files changed, 122 insertions(+) diff --git a/drivers/gpu/drm/vkms/vkms_connector.c b/drivers/gpu/drm/vkms/v= kms_connector.c index 2c5f04af8784..bd0e368d5598 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.c +++ b/drivers/gpu/drm/vkms/vkms_connector.c @@ -161,9 +161,90 @@ struct vkms_connector *vkms_connector_init_static(stru= ct vkms_device *vkmsdev, return connector; } =20 +static void vkms_connector_dynamic_destroy(struct drm_connector *connector) +{ + struct drm_device *dev =3D connector->dev; + struct vkms_connector *vkms_connector; + + drm_connector_cleanup(connector); + + vkms_connector =3D drm_connector_to_vkms_connector(connector); + drmm_kfree(dev, vkms_connector); +} + +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 vkms_connector_dynamic_destroy, + .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 drmm_kzalloc(&vkmsdev->drm, 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); + + vkms_connector_init(vkmsdev, connector, connector_cfg); + + 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 85f9082c710e..f53e3f85c684 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.h +++ b/drivers/gpu/drm/vkms/vkms_connector.h @@ -34,4 +34,36 @@ struct vkms_connector *vkms_connector_init_static(struct= vkms_device *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 44f8f53c9194..56c9c0b56151 100644 --- a/drivers/gpu/drm/vkms/vkms_output.c +++ b/drivers/gpu/drm/vkms/vkms_output.c @@ -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 12:14:34 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 DDDCB34C9B5 for ; Wed, 29 Oct 2025 14:37:49 +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=1761748672; cv=none; b=VR+XUvtSxMNBHQCn63CtwDt7N6f3z++Lae7GNfU4tafKiKgU6IOIhNgG++n0orgrtB+9NnSKGvQmSgp3ciaEUo5ktWZjLbH4j6nSqqiVV93fD8s9uciCmE3/xuqkh7ELtO5TwxRH5U1BisWGMxAWZVd739ZZRaI8AHuNHO0EchE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761748672; c=relaxed/simple; bh=0c54fSmOm2l+K0LbPt9pg/s8Cgsdy0XFWVvsXyQZpVs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ui40kJ9xH9pTkB04LYYiAh9IZRccVnW3kEHLYcSMl+ZWcTUoKK2XEZqXrb0j2kIr48AffT9ann217I35xagH1Y7asyQayTySGglegdY6sU0BnBML1M5d8i7E17EJOoTw9n2AXMvfFOlwS/fx37zNgV18whwL8fAfuM1kMVCp5Wc= 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=xDFoakFg; 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="xDFoakFg" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 745C84E413CD; Wed, 29 Oct 2025 14:37:48 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 49861606E8; Wed, 29 Oct 2025 14:37:48 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 25A8B117F81B9; Wed, 29 Oct 2025 15:37:46 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761748667; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=SpkB+O9TsCu/AbXZ5AMtN1pcUFMsRO/D92Oon6XNGNc=; b=xDFoakFgMjXupBjBvM+Gj5BckQhNYGUgz1innM7hTnbwJWUUnazPq0pPkIsagfLx+EUnxB EtgFrnebLMMuEDmkcGRBTTG1zI8EKUXG04w8BA2jE/smNK+G9xWDmQAkGRSboKhex3zx4v 9tDcAW7WacckHu1y3Rl2VAzMgYHHhLIm97Y62Goh7p07wU6snaNpYjuMOYeH9rA3MzerCO ysZ+Lv4P8xjrZakBqEhaK2IT0jJViNdqdwnfA5L74eb6A7q1saaVZtiRKd1HTn8upN9IiD BU8yBSoop4xirtZCmVW2+ar7cWD05fV+hl2Ady9MrpiqzGRbHKxlXmenCeg7pQ== From: Louis Chauvet Date: Wed, 29 Oct 2025 15:37:09 +0100 Subject: [PATCH RESEND v2 32/32] drm/vkms: Introduce configfs for dynamic connector creation 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: <20251029-vkms-all-config-v2-32-a49a2d4cba26@bootlin.com> References: <20251029-vkms-all-config-v2-0-a49a2d4cba26@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-a49a2d4cba26@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=10022; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=0c54fSmOm2l+K0LbPt9pg/s8Cgsdy0XFWVvsXyQZpVs=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAiZ+L80/ASVtOKvQ0n7uTXAP0uWajlNrFXD97 MBpD/48eHyJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQImfgAKCRAgrS7GWxAs 4rjNEAC3Tewhm9I9O6xyTAKBKs+x5urd4lBFI762XjQglX8KPHFqn42L8wV5TB3NW10ROXcHFmB dDoS1M5l/k9bcLSEziGyPHs1stZpPD8m3oBvsPYmsTtZO4emLQQ7Wdc1BIUKZSv8qOt1B8DwoNV 3IxpnlIhVuLNQ0/iumRCPSTIbtxbcPvj+hwHW+bjSuL+W0/lW3oaCEWOmrE5XA7hlM+Aizf5UsP rJuDomy032u3rNgfNb2P3WjzUS7nWLmjjnNZ0B9FLRqzT7JAPRJnYnyGyH46PwErK9VBU1M66Et itz3cGepXEPji0EZk/od9VVOl6hSqRQqxWFnP7nHcuCmMw/yEhEsL/SGQHPDes1YciMxxfSFYJ5 73cKdhXDKCi3KgpRA3nqVnq1nw/q6GaGbLZIKP9SdL+RhRCb7BG0tRrE66exsMLRchBG0PKqr/g 9NX7ko+oAGzuPheJ75Dic/HhV1UjcAlKOCUAcxcqcfRelRvMLI82WLVsU3RDmaIJ8T+yrpPlcNh 4ke7unvlg5PXXuH2/VC4j5hEsL9z4LIaQb+NZueHw0oOQDHtUDCCD6aAUcqdhZh4UMGZ5efGiNH 490QxoMVjnaPYYW3JAlJWAju63dX/4arQ1RUWy/T4Oc2nduvCO0sfl8NW6sVn/oS105OlRoOUxQ lzoB5k76fWrHi9w== 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 | 153 +++++++++++++++++++++++++++++++= +--- 2 files changed, 146 insertions(+), 13 deletions(-) diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index 0cc7897d7b83..afed12132ae7 100644 --- a/Documentation/gpu/vkms.rst +++ b/Documentation/gpu/vkms.rst @@ -138,7 +138,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) @@ -150,7 +150,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 1843e5d9e1e1..b4315c6cb25c 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -1135,6 +1135,12 @@ static ssize_t connector_status_show(struct config_i= tem *item, char *page) return sprintf(page, "%u", status); } =20 +static bool connector_is_enabled(struct vkms_config_connector *connector_c= fg) +{ + return !connector_cfg->dynamic || + (connector_cfg->dynamic && connector_cfg->enabled); +} + static ssize_t connector_status_store(struct config_item *item, const char *page, size_t count) { @@ -1154,8 +1160,10 @@ 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_is_enabled(connector->config)) + vkms_trigger_connector_hotplug(connector->dev->config->dev); + } } =20 return (ssize_t)count; @@ -1215,8 +1223,10 @@ 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_is_enabled(connector->config)) + return -EBUSY; + } vkms_config_connector_set_type(connector->config, val); } =20 @@ -1332,6 +1342,107 @@ 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; + scoped_guard(mutex, &connector->dev->lock) { + 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)) { + count =3D -EINVAL; + goto rollback; + } + + if (!was_enabled && enabled) { + // Adding the connector + connector_cfg->connector =3D vkms_connector_hot_add(connector->dev->co= nfig->dev, + connector_cfg); + if (IS_ERR(connector_cfg->connector)) { + count =3D PTR_ERR(connector_cfg->connector); + goto rollback; + } + } else if (was_enabled && !enabled) { + vkms_connector_hot_remove(connector->dev->config->dev, + connector_cfg->connector); + } + } + } + return count; + +rollback: + vkms_config_connector_set_enabled(connector_cfg, was_enabled); + 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; } @@ -1341,6 +1452,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, @@ -1348,19 +1461,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); } } @@ -1379,6 +1501,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 @@ -1386,16 +1509,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 @@ -1433,9 +1565,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); @@ -1448,9 +1577,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