From nobody Sun Feb 8 07:22:20 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 707B2311940 for ; Mon, 22 Dec 2025 10:11:16 +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=1766398278; cv=none; b=g7cZPvk8isoqojsFUY3HUZTS7vXgNnAh7VWA57QJBxTW0Ip2ZWA3P6/hEHBHQcShjOPV+hXaMLlfwkbVYjMaeinok69OB3fU7aCYTfqZfuyeiYKQTD3qw/l1H+S3X1Z0hhye4moFU0Rl4UATaRZj7OQbNMJi7S0kOPntJ48KCGc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766398278; c=relaxed/simple; bh=fKVcqX3gt9HWv3UrYSPLutXF0KAtxtD01MuzRGvxfOk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JDUIDvDEu9H/dTFi5FSB/eYQ7vM63bQO/FhWjS6kVBeJynx8awX0vuwc6NqcGy2F+vOSrNURwYstsqaBSaYxvb+hcaHyrKH6K5nz7KMsC/cl/VCKAeLyAYXIzafQi3mfMMRZjgoULvYgTmzV5WLqm+0bcJrX61tCystb6Q4wleg= 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=DijC7KBl; 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="DijC7KBl" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 91CF9C1AE05; Mon, 22 Dec 2025 10:10:49 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 8DCF3606C1; Mon, 22 Dec 2025 10:11:14 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 8ADD010AB0194; Mon, 22 Dec 2025 11:11:11 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1766398273; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=HmDVzyqEe/Jq+20MUVsc6IeQHVqNx5QgQOxY/IMi8X0=; b=DijC7KBlG8Cjl7hcxJRC4Qbk979zAa8sTGu5kuLIo/Jy3e61JzKFv2xhdngNR6d7ir6FqO UvOPYOMAl8IUfLpKrCt35fIr96UbFfEXSJ9zjy6QeL/yUiWilcONAWmXKt+ix76Pk5GNfS j32U9I1SEW9QzhrMFrx9aCTzbEXVVUpirEa7DuWJ6RJh0Zx5lpWdkbDPq18xjfb17gbWCA 4Y+ffpIAac041rRLhOuDoHLXcPqsz2gPn+3m1oxw427iXVd2nhfpHMfBS8guPIAr5+2wdL s52MKT6F9FRq/Zpyx3bRS9eV5WX6LnkP7lNiLd2p/KrjXE7nzEqeHMu9ehBEFg== From: Louis Chauvet Date: Mon, 22 Dec 2025 11:11:03 +0100 Subject: [PATCH v3 01/33] Documentation: ABI: vkms: Add current VKMS ABI documentation 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: <20251222-vkms-all-config-v3-1-ba42dc3fb9ff@bootlin.com> References: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@bootlin.com> In-Reply-To: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@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=4636; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=fKVcqX3gt9HWv3UrYSPLutXF0KAtxtD01MuzRGvxfOk=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBpSRk/7dPZjWG8ymYs690lI5XNikF3uUZ9I3XpZ qhES8XSgYiJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaUkZPxsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDIACgkQIK0uxlsQLOKqgA/8DAfnpGDTv51JM8eswwjhrhZTuAm6cED KerAGakI4Wp6DHJ4j8HcJ5ma6ZURfbf5q4Y6bbCxem4YjGkHIYHH86Zm92uUzJ3puqgXQSPbS1O BDHg6FzSx3ggDEbNSkPqo7XHXrcJ4ktpBZ+k/5DT6h2+gro97QqQYdP7Lj9KVH6vQqqloKqfMlJ c2aRedJsNk02zWkhoM2LlJtfz9ayG46lUZJ8ZJ1XPgkYBF38fhgYHqqPJ7AYqgjm2mzZF+cqHdh /HHuSdQOfAeuXZ+MhjQVQMCVg5hEq9glgsv/7hVDW5dVnqhzafeZ9CPSmBw/z73cvgxFjVvsJl/ 7HUnkP6WzjjM4OoKiha8FINJ3c+nbZaM5ho6g2FYMyoiglHGuUNs+wgoXESzZiA5Q1rrpQRxdNo VS0JJNMw4pmOTm0/A5VxEYLLZSuxvkPugd/KRvCxmKYnt48H8hTP6daQU2IRSFnel/rjN0OVXwm 1dvw29Ao9aq8IPlVB9Ii7/uOR6l8XTivjfsXKVqq06GBwPVyOpzos0GQVnoQjeHAHBTC3KZGupl ENYsfgle7G3EWkFTZi9XpnNhDlacuaq8+ot1+aVyn1AGtuYl6ngXNgC3lc1pDNAjyz2mDPbOi/g i5ZUFACTQhKWeBeSwmI5OMLrSGwco7BJWAYDiyvMJpKEX1Fk8fLw= X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 VKMS recently introduced a ConfigFS API to configure new devices. Add proper ABI documentation. Signed-off-by: Louis Chauvet --- Documentation/ABI/testing/configfs-vkms | 118 ++++++++++++++++++++++++++++= ++++ 1 file changed, 118 insertions(+) diff --git a/Documentation/ABI/testing/configfs-vkms b/Documentation/ABI/te= sting/configfs-vkms new file mode 100644 index 000000000000..0beaa25f30ba --- /dev/null +++ b/Documentation/ABI/testing/configfs-vkms @@ -0,0 +1,118 @@ +What: /sys/kernel/config/vkms/ +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + This group contains sub-groups corresponding to created + VKMS devices. + +What: /sys/kernel/config/vkms/ +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + This group contains sub-groups corresponding to the VKMS + device . + +What: /sys/kernel/config/vkms//connectors +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + This group contains sub-groups corresponding to the + connectors of the VKMS device . + +What: /sys/kernel/config/vkms//connectors/ +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + This group contains attributes corresponding to the + connector of the VKMS device . + +What: /sys/kernel/config/vkms//connectors//status +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Connection status of the connector. Possible values: + 1 - connected, 2 - disconnected, 3 - unknown. + +What: /sys/kernel/config/vkms//connectors//possible_en= coders +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + This group contains symbolic links to possible encoders + for this connector. + +What: /sys/kernel/config/vkms//crtcs +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + This group contains sub-groups corresponding to the + CRTCs of the VKMS device . + +What: /sys/kernel/config/vkms//crtcs/ +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + This group contains attributes corresponding to the + CRTC of the VKMS device . + +What: /sys/kernel/config/vkms//crtcs//writeback +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Enable or disable writeback connector support for this + CRTC. Value: 1 - enabled, 0 - disabled. + +What: /sys/kernel/config/vkms//encoders +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + This group contains sub-groups corresponding to the + encoders of the VKMS device . + +What: /sys/kernel/config/vkms//encoders/ +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + This group contains attributes corresponding to the + encoder of the VKMS device . + +What: /sys/kernel/config/vkms//encoders//possible_crtcs +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + This group contains symbolic links to possible CRTCs + for this encoder. + +What: /sys/kernel/config/vkms//planes +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + This group contains sub-groups corresponding to the + planes of the VKMS device . + +What: /sys/kernel/config/vkms//planes/ +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + This group contains attributes corresponding to the + plane of the VKMS device . + +What: /sys/kernel/config/vkms//planes//type +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Plane type. Possible values: 0 - overlay, 1 - primary, + 2 - cursor. + +What: /sys/kernel/config/vkms//planes//possible_crtcs +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + This group contains symbolic links to possible CRTCs + for this plane. + +What: /sys/kernel/config/vkms//enabled +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Enable or disable the VKMS device. Value: 1 - enabled, + 0 - disabled. --=20 2.51.2 From nobody Sun Feb 8 07:22:20 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 59B213128D9; Mon, 22 Dec 2025 10:11:18 +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=1766398280; cv=none; b=DK+pcbjj01isej23pFGxHWtQxi7/qoH0MfM89F1Slhp9DozQlzR8rl3RlIJXixikA1Y6fNslXfpXgRuJ2ayjK0O45ODoEjYaQqFMeq1WVpeXni1gURq+ZK/yuznBiY5Zg483rnPiku2t+yncoGHsix7XgNxR5jrgCO++PyrNysQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766398280; c=relaxed/simple; bh=67GX81QjAKaNiRN7eRAMsUYloq514Vv/5gM6Eubw9LY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=tZtjh12X7VWAYp2l6sApm3M6qXNnq87SFzTdG8WisVKN3zgbE/5jOC0VGt7qdotNxzRFTGwMQCXPnC2uLc2kwCmfLozfXEgXuU8RifHoO2Qz3ZoDQG0hQ+SPLH8w7QAFeGLX2Y3kjBgB4o4qq0nMMDj/Exy5xPB0txO+qzzB6D0= 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=yrQ13n9f; 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="yrQ13n9f" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id D245FC1AE06; Mon, 22 Dec 2025 10:10:51 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id CE325606C1; Mon, 22 Dec 2025 10:11:16 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id DB34910AB019F; Mon, 22 Dec 2025 11:11:13 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1766398275; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=gJ1Zow46kC2t8niE60P0MnSu70oxI/H0jOwJmcAOuLU=; b=yrQ13n9fGAL0bsXnhjsJr113U3eeQOg7JmH3uaT6mCfBDk/A1UkY6O1GyQ7ys1IgWpIo5e TTPf0NiSn0njeiYEby6ZqpppVsMEtCtbVKcW2QnsXfD4/s/uImGVPeXNj6aAwWKls8xkmP EL8EnWM8LMJm+7weWBhNJl/8MxsSDV+qGLfrGDxJ4Jk412KloCJ+gBLDxg3pm6FOXzKOtx RqMrNfa+1Zum9Qip8D1BJ+CnQdjY5UBJKwMWVH+4ocUwhx7S+WzAhmEgfxuNicE6Nz7h7D vocgBeJMgk6Dsff82hCs8qLK0M1IzGxB7LW6Ek5xtZzoTwlpZD/6jbHKe0UAyA== From: Louis Chauvet Date: Mon, 22 Dec 2025 11:11:04 +0100 Subject: [PATCH v3 02/33] 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: <20251222-vkms-all-config-v3-2-ba42dc3fb9ff@bootlin.com> References: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@bootlin.com> In-Reply-To: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@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 , =?utf-8?q?Jos=C3=A9_Exp=C3=B3sito?= X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1969; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=67GX81QjAKaNiRN7eRAMsUYloq514Vv/5gM6Eubw9LY=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBpSRk/lkUL9Esjf7fYdWIIYfgsyKwbbiEcPzHQV emrMFA9AZWJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaUkZPxsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDIACgkQIK0uxlsQLOK+eQ//V4FWeLzgRsoB4/0mhVGkZMMs8Ox2kDm OL/W/1jDKntANvDaHcD4TKu395pAA8RZomn2CugiEXX4FtrLF2LE6dyk7e1AK4+I6oeUU8C3E2T g29ML1D2PjObucd3XoZQvxPyo1RRXpc1nK6fPTgBYg0yfdYaTsKlXAEjatM7vUjF5HkMHk5Urk9 pME34tvApNhr4YVrrPEDgvtsQsaSz9pNMHC+DJTP1SuGuPUY6hNfFYofBlVOvfB1G4wb6J/Ij5Y NVXMhR6nq7N6HzySUCCZpY14aqGDOAALDZVovn1boEysn6uA8KMpBqzBVf06RHacJ1mvwVsDtzS ixBTVMvK0HUWpxSfAPWKM8LIgBSrGdeVcSQKXLIBozx3aluCj/iItW6SVdeKQgUhDHGoa/VtpCx AJEOF0U6mrhfsLHG4xI1qKS4AE5KOLB0KDnaRU6HU8eMu9K7XH7fEWF5Kx2DGRVuknSBT+C16uK yAybnMsUDh2BHcJToC+2t4gN/XbCqbBOTU8C+rBraxn5SyFszDxFho5ylkfbBrAAqWbFX1riow7 QTl+snbIoYwCNfvFhfnhuwI4R+yRUphVhDyxuVntae4+UM13KFlcYxN7apRXKG5fIPDcgKx+oOQ 5e946kLrLcvp8HKFep7gTvMrdOLZx/LYspLdpRzyT8O8z9xyzLcY= 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. Reviewed-by: Jos=C3=A9 Exp=C3=B3sito Signed-off-by: Louis Chauvet --- drivers/gpu/drm/drm_mode_config.c | 16 ++++++++++++++++ include/drm/drm_mode_config.h | 3 +++ 2 files changed, 19 insertions(+) diff --git a/drivers/gpu/drm/drm_mode_config.c b/drivers/gpu/drm/drm_mode_c= onfig.c index d12db9b0bab8..c940a67e255b 100644 --- a/drivers/gpu/drm/drm_mode_config.c +++ b/drivers/gpu/drm/drm_mode_config.c @@ -231,6 +231,22 @@ 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 + * + * Returns: The name of the plane type. "(unknown)" if type is not a known + * plane type. + */ +const char *drm_get_plane_type_name(enum drm_plane_type type) +{ + if (type > 0 && 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 895fb820dba0..f4c580fa2a52 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; @@ -1001,4 +1002,6 @@ static inline int drm_mode_config_init(struct drm_dev= ice *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.2 From nobody Sun Feb 8 07:22:20 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 F39C0313555 for ; Mon, 22 Dec 2025 10:11:20 +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=1766398284; cv=none; b=S3H0+bNSmwOE85DWy9Ucn0a7UxmdTyBRmQWsI+n4n3798kYVs054Pdwa+P+Gph1wdNNJgSm34Pr+cioX3OX0uf4+U1Dm5LRfok/7B9jhFpNJ9fVx9VosbvRSKwkS/pnFs8nnU1tH7EXyTljmQqXqpCsv4w2zoR1TJ6Gy7JRdRZQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766398284; c=relaxed/simple; bh=g1vbeumKRvYydQoIx12RB5g9ouajWh+dHntqU6W9eGc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ZFpK6yqAOYcPW8gkDXBOgtcOsG2fjHPVOtpVHnV2piiC173Mbnsbc8fJsTsVSAzHKBT3V7evB24u0Xfn4e8jigyjqJQ55AmF9npcmtKQb3cRStD339UhwCS7A3uCX7SN0Ww5YceHbeP/Qvf7nSr1LVkerINFEfacameBAuO1A0I= 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=RI2qcdOr; 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="RI2qcdOr" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 5124DC1AE04; Mon, 22 Dec 2025 10:10:54 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 4C62B606C1; Mon, 22 Dec 2025 10:11:19 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 36A9710AB0199; Mon, 22 Dec 2025 11:11:16 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1766398277; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=70aS4LgI4fXlyEns96sw8SPFGUG5N1Qg9z4OxGLWrGA=; b=RI2qcdOrMk7R7cOBt/d1ItB2eVcgsRleFIjNrJRQjbFMOEcnY32Bo3IlAPXb3z/vy3VOSq RcWatsbAQnKaIiENHbdcwK42YfHROw3ftmO4iWlZ/R1UjO6LUGitclD9bokcJjYvvUZB6j BqKcvGXcw+ZQW+a2JlbSC7Sf/mSfp3c49SA4dFVt8ofVbt9yegXdLeCzRsn1IKeO2NiWc3 kfhYYKwH0ldfYMV4jw+NiJoE1WqtmopJmiUebcR0Z8O6EyCjjT2Yyyy2emlnYFhh2TT2IQ DJJeuMBlxBB0Qb4mHGTw6469YwqLS9YB6lbFLNhmJkhfetiEE2dLXCQi+4EFPA== From: Louis Chauvet Date: Mon, 22 Dec 2025 11:11:05 +0100 Subject: [PATCH v3 03/33] 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: <20251222-vkms-all-config-v3-3-ba42dc3fb9ff@bootlin.com> References: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@bootlin.com> In-Reply-To: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@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 , =?utf-8?q?Jos=C3=A9_Exp=C3=B3sito?= , Luca Ceresoli X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1010; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=g1vbeumKRvYydQoIx12RB5g9ouajWh+dHntqU6W9eGc=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBpSRk/twntv97Gc2/zyiPUtWL4X09t7H2W7kHFD /ZhlW1HhdqJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaUkZPxsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDIACgkQIK0uxlsQLOJNhw//ePEOQU3RKMhD342ewl5rDYAb2Pn3TLo jqfWNFcyN1Br10R0E/SBUiKx5rxz3Zle6Tr4hkaoxF0ZMysWXEoOjmoOB9OBD2KBU5KpT4+TP+/ YmsJGdc1bmq15RfJ3/r90xII0nNg7qEzGHbO5dK/UJp578tVnWV16URObD/sI65MJ5K59EbrEoT tLRKaBQdjLQdcec6MtTK1ifFGDHvJJOJuWtYUuN/ZWbXVmvLjMJBPX9ljkMH/4pK1o8S0RKNr8P u9AEjpCFrPZ3kuuRhiEvbKL0pglNZERdWiqu0MiUz0Agt8pO+okmsmVIjbEiKFrKJXPVUwmLRjB vqNY2N2tRPlg1r/xdFViO8nCOTP1LrhfXVl7xDRXWCGGzf0X3dj5EOur+CWAGHxzjYGOursOcfw xe0pbI/3ykwvncozX+4W2tt0oUDmGRHGh8VtMKNulqxpWhmcJhpZHmWTmszn/vNzcCTsZtTClj9 kVusGO7bggVA2z2YGBXn45rLSTr9TmZGAfL5y0x7EM+LmCw5by/A2ppXyUmZbRKmMSfyTuAznLc tE8ebEJhhNv7Ks6W4X0CGXZJUGvZuclUPmq6D/q6rhZvV1UL/t6YThtCaACzW2RG3Nlg7OPJof0 5F0a2inCksb6T4l5iKUBOSFwIy6bUXannuTOWHuueCEwzPOEHIYo= 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. Reviewed-by: Jos=C3=A9 Exp=C3=B3sito Reviewed-by: Luca Ceresoli Signed-off-by: Louis Chauvet --- 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 8788df9edb7c..ec0001adc4d1 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -352,8 +352,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.2 From nobody Sun Feb 8 07:22:20 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 8E2043148A5 for ; Mon, 22 Dec 2025 10:11:23 +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=1766398286; cv=none; b=cUmOFAJ5URfxdNb4Or03p+cYwOHvJLa226gtlXxzIzAW+QTdKMRzKapXJuKWu6L26ySaiz76JuaPvu3jwslWGJGWWRjhFLbfPna9kR74XsKF9YH+rrcbISkSMayskMsoZnxYUEDyzi/ciU0J2hQsAbYt8NVgkoy27qkPVmwwYMQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766398286; c=relaxed/simple; bh=K38wOBTG/91e6Yb1mIir+Yt1rsf04yjLLgb90rfe0BA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=I/Q10BY1AodDqZW38dmlfZwk/UcHDGo7uK+G1En1756BO4EZg5/Sw5JDXaG2iBeprWaULtJdnrhx/ReJs4MEAqGNpiPBMACYL76xxAzQpEaAe80fw3MSvPFRlzspz4n7rxCeuarfcfleFMkwXJf1lObKQ2JQm0Dm0W4pe51nqNo= 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=MAvTand2; 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="MAvTand2" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 61F881A2372; Mon, 22 Dec 2025 10:11:21 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 36D5D606C1; Mon, 22 Dec 2025 10:11:21 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 7C4AC10AB019D; Mon, 22 Dec 2025 11:11:18 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1766398280; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=WhU6P3hf6ihdOZrrfK4WQvf2PxNpGmlUzFEm+JAPP1I=; b=MAvTand2XwqPG2hVIIB0F6FOHEgJi/+nrlAx0l6G8YTdLizSU7UieFaxnNHVUcHG58zGNE YNhnNvqIMnWNDBlVzRW8uys7YxWuOpeCllrGucT+QpFXxVkcvULbWsKqSF7aBuMQKQACeZ lhuR120ytYtMe0DYXLO+OrP2fM/mMxG/8CA4iwsqfeRRyafX16Cxy42IKwg8IRe7HNDOUA EcTXWQ3xGoWWDpo/uKVpGzrdDA48lkuN0+Wuj5Bu6w+tUNxsdI5/zkwsPuI5oSg6Wsxo9G myHtnt4MZYG1b3rVFAAkMk/y1ss4HMb3e5o6uiygsHw9J14GOZsqt2FkxYGDvg== From: Louis Chauvet Date: Mon, 22 Dec 2025 11:11:06 +0100 Subject: [PATCH v3 04/33] 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: <20251222-vkms-all-config-v3-4-ba42dc3fb9ff@bootlin.com> References: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@bootlin.com> In-Reply-To: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@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 , =?utf-8?q?Jos=C3=A9_Exp=C3=B3sito?= , Luca Ceresoli X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1207; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=K38wOBTG/91e6Yb1mIir+Yt1rsf04yjLLgb90rfe0BA=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBpSRlAvLUGPQZwHMBR/TUb5LaWTeklGbtDXi+2R 0/Q9cnANDqJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaUkZQBsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDIACgkQIK0uxlsQLOKsxRAAm+vzQ5iHLsHMl01wgOLVvQhLSWd7HKo b/IGpsinU3Nj43ZEUMdIW7oORzWyMUmVHofdC6XL4zm37pPNsu2/9pIhykmSCOzLQsHqmkE2/iw kust0y9ek265rWVbn+iQgkAhTdpYAauUEiejr3BgmMBue8JBTTbD4jsTrIBWKGwR0KoIDfi+nQP hcj3ZlZxJLRMhq+bETXkVkHk0C9yyDqlOGH7SLhM/bWeUtoUkTE6j/mI3zE0tm7mkP7ZYF4xJEQ NqnRoHFb02U3Z6W70bCa9rFzOySCal3zyJhiW8kvljqdEKgGiKTkip79V9OQJWK9qMv8dXSvK3n DOxDzxgsnhGTkQDIVvk82FBR4iutD8sEpCoxnFQAnDEXNPbnqF8NvwvrrtIljM+0Jn03ZgelAJp 8G8BysnXGcynGk5zR9i2fO10Xfq0BCPkXXOb5AE73/2DR7tb5LpSwW8FFKP4oUI3o7A4fiUQKIY jHPROp4M75Y+tDJHeLSz1pzKY774pwK+GVkRLKae7ZEDFX7buVHHYkICl0sBgx3Qn/dV6Kcm7sE r8Ca9T0nfeGd0DHXRr+RLp95lFZ/BNgZC0gh+uIkou5EvlvBK3v8aQtp2k5EdkPw7NH7G0fG6Bv k5DhLvQYiuU+a6tTGEW9LNrDSfxwRi3nkOUCcUGH0SnjOffpMm8Y= 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. Reviewed-by: Jos=C3=A9 Exp=C3=B3sito Reviewed-by: Luca Ceresoli Signed-off-by: Louis Chauvet --- 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 ec0001adc4d1..233e7ad4d45b 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 @@ -358,8 +359,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.2 From nobody Sun Feb 8 07:22:20 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 1E9F73148C7; Mon, 22 Dec 2025 10:11:24 +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=1766398287; cv=none; b=VG/7HSiC2GuM/m96seMcWdlRsCx3IVK35gHl5DjrQSMgEPyrLYFBmz+bYvVsGSqjBnDy8/kjtJxL6g9VLVtDLYi6O1D7N5BEW1p7K3MzbZYf8cGdHzaOXsltu8QccD0s6gQ3swp3lG7GBvhSHPl8lZIqbbw2azyeHW156f5TgdY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766398287; c=relaxed/simple; bh=NJ3vqBeS2HoSwulpqyKvzV1dxHx6uodXMXnq6MM3zjQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=TfmzvzUIkKjgByxeRiTVvgZvN7TgMFVrPFDGEVT/Txgv8kCe2pK26RdkBtROxslDDXeM9aBq4CDVIoJl2VuTF3sg+zRDgU6Xc9migMiDGeeiA7Ce9xFFr45iyHo4/tcIsDXViyZ6qxBTXN8mERxpnE8340oOF9K+PRwGhbrvYsE= 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=vEFw39J2; 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="vEFw39J2" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 5E1781A236D; Mon, 22 Dec 2025 10:11:23 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 34D5D606C1; Mon, 22 Dec 2025 10:11:23 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 5B8F810AB019E; Mon, 22 Dec 2025 11:11:20 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1766398282; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=enYFEjapjoDSW7/LWjwZVYA1UOdx6e9CfcbRDewBj7Y=; b=vEFw39J2HRgnbVVfGs9Vi9L34RijsX+s+UUg4uB9Dpjf0dx7xm7USDKFcTuS4cm49uuyd4 CXtCI/3FDPKsgmdMUyXzK54uNnPOYRIhyzEFe5e8EJnZl28dG52Q7scSgOq2hFm3I4Uwfz Noih+zu6dP1E57dJ9+bP2TaiZssALcLmtc4u/Tm1hNDvhmcgHqDk3+xjRF3nhz8bKHW10K I9IjQ0Sslw/WVKmUWRVkyYNTOwgBLXWdhYhbySguVQMFiCRXLmUg9jE1nBKGuVe/ZAcpov CdnDBkDR730WoOk4JOGsOD6J7cTiXQznkyxfQRr7t/stivadM9t294fQXsA96A== From: Louis Chauvet Date: Mon, 22 Dec 2025 11:11:07 +0100 Subject: [PATCH v3 05/33] 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: <20251222-vkms-all-config-v3-5-ba42dc3fb9ff@bootlin.com> References: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@bootlin.com> In-Reply-To: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@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 , =?utf-8?q?Jos=C3=A9_Exp=C3=B3sito?= , Luca Ceresoli X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1240; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=NJ3vqBeS2HoSwulpqyKvzV1dxHx6uodXMXnq6MM3zjQ=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBpSRlASXz/vnOxb/7V3x/h6R/M900nX3Ms5V81F b/QHLDshq6JAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaUkZQBsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDIACgkQIK0uxlsQLOLMuRAAqerJ5B0gN2dLF7TIL4nx67rMfna1c5p ieDYVtieOS73oVW37sdGkd/wPbbhhg03fiUKVNPKhZZsGwFJ6GalLO/1+DcASqmDfafVJEfbuZL 5UXFYVv5DJnF/1A/ZsZxJ61LRXcTzO2u40MlGwhxpBkj3A3ML/fizB4ETfsdPMgX5hnVuv5seXH HsoTqYSXUaOEX4Wk+dNfF4JqK+SGZkgzD8oq3hfnjyA9jykH6hTVpLdT7hIXo5NvvlW8uztCofo Oluh6s4acGtUWFIfgHfzQISkE6gXdUJLo0V2mK2tM9udgfBbxdk8mXHo+eWs7jfoQeno7mbrSxe fpo7BKnBw10qLfdHr66d82ihgFp/OtLQjuhsV09C+nvn/jnqxTbulFIB7v6JH5tYQQJeIreFQ3Q Q+88k9MC34AHt6cvEmgLhzvurxP8ZzX+ZrZ/d37AS9ZnrZfPgL1RMW4UKpgRCNwbEO0IcnmHISr mvkDhmQ0pnHbieMXW5HuG3iwKKL4HXRF2Z/XrqKJ+w+/AR92qW6c/PI/vdxBkJlQw/X8ALiPZP1 uC+LNd7jeqpcT/ZeENevN/U54RQm2iUW6h8DQNUcm03qMzuSfHBPd2XCV2kjsjWnUwWwUUlQJGQ 0xqk4pnPztQFGaQxkJfAc04J40jGamjaG4rdEUnTLgDBzOeCKX+A= 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. Reviewed-by: Jos=C3=A9 Exp=C3=B3sito Reviewed-by: Luca Ceresoli Signed-off-by: Louis Chauvet --- 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 233e7ad4d45b..ed1cd8d153c5 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 @@ -368,8 +369,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.2 From nobody Sun Feb 8 07:22:20 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 DBCBF313527 for ; Mon, 22 Dec 2025 10:11: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=1766398290; cv=none; b=WfYXfYT7MmPKhNUTXStzBYDorKYOaQaCFzyB5rr72LI0xmk7rK2CaaAXFN0kHJaRrt5BymIuxDgREey1QtrbsoVA+U3bRHsCtGyptyzB+JYW3sIBoxrVTHA6mTqiUz/FFCW99xAnjQrvlbzXzt5DzrDE2W4bWXBk26uLuJ32D2c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766398290; c=relaxed/simple; bh=BQDNwIoSJTYr0DnulbPemjrhDtzIGyub7yXHojx5ghc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Ye1Hm57ibVOQtZiACR01dorDe38kU+fHiJpXHqDTW8q0tWNYowxYkJKR6hi+nTvYh/AgmWLTV0iczk00tRwNx3yqCmuJ95qu+8TCQ5Xz4oZd7ycKUdwzBVYzKAmCUQ++vdK52yU5WjbVSeAmHIUTmd0fs9PrKD9XE/SAaRcy6aE= 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=GeQ0JkCI; 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="GeQ0JkCI" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 123534E41D36; Mon, 22 Dec 2025 10:11:26 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id D9FF6606C1; Mon, 22 Dec 2025 10:11:25 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 6ACDE10AB01A2; Mon, 22 Dec 2025 11:11:22 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1766398284; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=PwMByhJR+4NsqCHWSPeb2QraHeBUsFjjwUcbiSOuQ34=; b=GeQ0JkCIG48szOfosmjKDwaE6NSAd9KfO929f1qQ1MFH0clMrBf856dbiPvtSh+nTji5Yx V5MVIVGqD0BCDORktpCrN5kqMO4XeFAC3KYkoKdr9PPnZH8E/O2nE2sT2bOjXTPF2hAZ8H DOMtW9p9mzjE+bWjn8IyH6kPa7DUEiivWD3dLV1CfE/HK13SDGC4U2z9T+JTMqb7p8jkau zreuhr7k+Hvo7HGACG51yrDmkqkr6Yec/aKZMxmlof65U8u72X19g8U5kCYArPpQGGnAO9 dqKhYXauxIs1gZNH0Gzg19lN6EsC3z5uRWPG7wbukBy0W6QvIgH7Llc+QdpPZw== From: Louis Chauvet Date: Mon, 22 Dec 2025 11:11:08 +0100 Subject: [PATCH v3 06/33] 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: <20251222-vkms-all-config-v3-6-ba42dc3fb9ff@bootlin.com> References: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@bootlin.com> In-Reply-To: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@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=4113; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=BQDNwIoSJTYr0DnulbPemjrhDtzIGyub7yXHojx5ghc=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBpSRlAasTheGGS778y05KfgykCAqv166BOYP5KD VQ5guQEawSJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaUkZQBsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDIACgkQIK0uxlsQLOKYUw/+ODmVy8lBc46ozhglXutN1owtxoVFOFw /TKbv8KJpNZVxD85qWP++OjxHPgg5+OctkyGIodO+2iH6ugLOHYw9bgwps3Vkhy68DqwznYwXJB oVPQ93BvlLbuMSysVMXrswO1EPpJd4xodtr3XHthE2Di94lxj1O/rS28MDBSlsMyRksqbHVGaUW Es61bEnvALIIDwKEBFPSz1dwstrjIl+o1uRG5DBqQhUP5Ya0FlTFnldAaZyFFSpK8ZX2CwqdejD qFsIYEdpCIQfk9cltIXzpamyIgWJF5GD5jKoJkDQSnFJYWA8R+fmgKKa7lDg86UTN1a1JfotRvg 9SXmYnXsGO824wqJajdOSGoUqMqeaJdpe/q5bgQ2FfoS+nBSDY0rYt7tZyzY/ahbmD0FLCtrD6U +BxnPgwrVcRG0xOKp6sIkQ/6xeSnlQcN+iG8LL6PKXhg57obqZbz9Vd7/NkOgUTBKMpMNREOUF+ ptHwaq20zZuICH9DIJZk95EYiZd+nOHZzTI1uA/Y5YTdQYlw/aawMGJv197zTOapf8ZRuOrH2KL nSocmKqZqzZXue1wjld/04Xx38B4UWM3M6UWXgpqH7ROP4UFlCxos7p0SkQfOs4cyp1XsyjLU8B s++StK+xWEFnbZPCIR+O1Kr/PEZRakIbj7/KeddfSjWYm1dmLXmI= 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 | 5 +++++ drivers/gpu/drm/vkms/vkms_config.h | 26 ++++++++++++++++++++++++++ drivers/gpu/drm/vkms/vkms_plane.c | 3 ++- 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index ed1cd8d153c5..f31a1eb8f811 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -356,6 +356,9 @@ 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) ? + vkms_config_plane_get_name(plane_cfg) : "(null)"); } =20 vkms_config_for_each_crtc(vkmsdev->config, crtc_cfg) { @@ -397,6 +400,7 @@ struct vkms_config_plane *vkms_config_create_plane(stru= ct vkms_config *config) plane_cfg->config =3D config; plane_cfg->default_pipeline =3D false; 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); @@ -409,6 +413,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 8f7f286a4bdd..b9a41a22c011 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; bool default_pipeline; @@ -314,6 +316,30 @@ vkms_config_plane_set_default_pipeline(struct vkms_con= fig_plane *plane_cfg, plane_cfg->default_pipeline =3D default_pipeline; } =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_plane.c b/drivers/gpu/drm/vkms/vkms_= plane.c index 19fe6acad306..d8612e28ac3f 100644 --- a/drivers/gpu/drm/vkms/vkms_plane.c +++ b/drivers/gpu/drm/vkms/vkms_plane.c @@ -11,6 +11,7 @@ #include #include =20 +#include "vkms_config.h" #include "vkms_drv.h" #include "vkms_formats.h" =20 @@ -228,7 +229,7 @@ struct vkms_plane *vkms_plane_init(struct vkms_device *= vkmsdev, &vkms_plane_funcs, vkms_formats, ARRAY_SIZE(vkms_formats), NULL, vkms_config_plane_get_type(plane_cfg), - NULL); + vkms_config_plane_get_name(plane_cfg)); if (IS_ERR(plane)) return plane; =20 --=20 2.51.2 From nobody Sun Feb 8 07:22:20 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 CD3BA313550 for ; Mon, 22 Dec 2025 10:11:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766398293; cv=none; b=oLO8a52sBoSXN1fsIr3OyK6KafX21RQ/OtyiFnM18blLLYuM0Yw2JubJCW8X5Fp+pzVExHX3AsaPhM7JUZhcNOp+PZyzvRVgVLwCsJ8bvcdCk8x52r1k7+IRBwFrGFqrc7g5zz3hnpTnc/6dl9hfHpk/NtwxO+NonpURuP1WfSE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766398293; c=relaxed/simple; bh=u0WV/Itb+bzS/drY6Q8gQzG4ZgoFZcPdwt/RXarf84A=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=D31PN3MDQjbo0ljKuh7arLR4yhgfXMlWAAphGeAgdxNNwFV8vSfCXf84ywdTTjxVL6mJLGbctjNMqwR2YNwyHdueKWhcxG8704eWfj17ol6GicR9PkDKv4ea0PX7paE/kCGwR7OJIvoz50+qDyyOAWiPczVV9YvcGkarx6fOc7E= 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=qI+G6e26; 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="qI+G6e26" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id AE99CC1AE07 for ; Mon, 22 Dec 2025 10:11:02 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id AB0B4606C1; Mon, 22 Dec 2025 10:11:27 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 401F410AB01A4; Mon, 22 Dec 2025 11:11:25 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1766398286; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=TUspDMV4sV8T5ai7L9SrDaEiPOHe9taUzFXuPZLSI7g=; b=qI+G6e26K+/+hErHo91wmpdUAQgmWysXCEaFlII0l91qT0zZr/0R0YsoW7uEn5g0XRyD9r 2croLSLYdrxyWkPHexaxOnfcOIiUcbjvpyk5Z7OfqhJNEkqZoiG+ZHy8CMJcg/09PmbuBA n/r1SjG4YCoNhiebrCls7Y+YEgq9s8wEeNgC1b4jYa7dX7gRDLIFhie3unbYjM2nTyxNn+ sFZg8q/jIFITDcKh+OoxnCo8udR1mnuqgcI6SPLXJMB5V5CYYEhbTsoEWyvRpoiRDL4bFt XXWm/7d22ajjAl8Mgva3bVm3sbj63LvxkAQHlCip9RMmbwtsl84ObVdTE6Ki0A== From: Louis Chauvet Date: Mon, 22 Dec 2025 11:11:09 +0100 Subject: [PATCH v3 07/33] 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: <20251222-vkms-all-config-v3-7-ba42dc3fb9ff@bootlin.com> References: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@bootlin.com> In-Reply-To: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@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=3319; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=u0WV/Itb+bzS/drY6Q8gQzG4ZgoFZcPdwt/RXarf84A=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBpSRlAs61L/0GKf17EWT910wgFNdvYV02ahN+PL x5x5F0AA6OJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaUkZQBsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDIACgkQIK0uxlsQLOLA/RAAr+BlasurCyHPZhhUEGUE5I8uXxx22yg RojGL3z27M6oT+7bYhLgkvFxw6CHXsClK0YtCsVb0/i6GHxFH9vJnUH7rRAdXE++3dJUjG0cufE sWMno6uKM0fFn/7VVdem2tVGlqIfECk6fqY2+jq6Jt47DkwoopK/ric8Lf1LB1wZxI1+7eecmGX xvPrphWaYyfz5UxrFz578UCZk28QUKN1VWF0OLt3zmkyFEf5RtKvfhIB6ZJ/IdcxwJrC/Lq3jEb W4Hld80mfzlIsqi7jVZPzpXht6mBJt4u3998Xv30OiIDOUn25o5QlL+TKk6FPQleoFDsDEdEByz wK61zqcNG4R8RdxpHfsZzcTzqgpj/sYPnBPpdcIH18k2Kl/zHOnhzbtOx8SO5ATtCFpnXz6wFM3 FFsl6BWnVzz3DMTU/FraCxn7UMYO7Q6UdIBQV7dN8tWrExAeKRRr3fWX1el2agjUG9FjZGemmxv OGzfHy/umQ7wnorcRAiyseD2U08ALUCwfBxU6sEXwayGrU6vZqv3pmb1MxA+iIbhRraZ05xyoA3 wccbxto6udx0QwsqG5a/UKnDqAjPXDbyawZvuRPHQdiGCUYkTJ06l6nS8QPvk7CBc15WwlXI79P IcizpwTUSMOL1eXPuwQ5pVNI98uZGF7CnELVT4C4VmaDOxEgE8SY= 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/ABI/testing/configfs-vkms | 6 +++++ Documentation/gpu/vkms.rst | 3 ++- drivers/gpu/drm/vkms/vkms_configfs.c | 43 +++++++++++++++++++++++++++++= ++++ 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/Documentation/ABI/testing/configfs-vkms b/Documentation/ABI/te= sting/configfs-vkms index 0beaa25f30ba..6fe375d1636f 100644 --- a/Documentation/ABI/testing/configfs-vkms +++ b/Documentation/ABI/testing/configfs-vkms @@ -103,6 +103,12 @@ Description: Plane type. Possible values: 0 - overlay, 1 - primary, 2 - cursor. =20 +What: /sys/kernel/config/vkms//planes//name +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Name of the plane. + What: /sys/kernel/config/vkms//planes//possible_crtcs Date: Nov 2025 Contact: dri-devel@lists.freedesktop.org diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index 1e79e62a6bc4..79f1185d8645 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. Allowed characters are [A-Za-z1-9_-] =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 506666e21c91..989788042191 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -324,10 +324,53 @@ 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); + + if (name) + return sprintf(page, "%s\n", name); + return sprintf(page, "\n"); +} + +static ssize_t plane_name_store(struct config_item *item, const char *page, + size_t count) +{ + struct vkms_configfs_plane *plane; + size_t str_len; + + plane =3D plane_item_to_vkms_configfs_plane(item); + + // strspn is not lenght-protected, ensure that page is a null-terminated = string. + str_len =3D strnlen(page, count); + if (str_len >=3D count) + return -EINVAL; + + if (strspn(page, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012= 3456789_-") !=3D count - 1) + return -EINVAL; + + 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.2 From nobody Sun Feb 8 07:22:20 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 A08F0315D2A for ; Mon, 22 Dec 2025 10:11:32 +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=1766398295; cv=none; b=gBwrQ0NQzCYwjYV5wc+21LsFS6bE6qQaH0bj1NvuXtsdQcrBQibmcjPaYWMJnbHhrl/FZCBfLdeVqDKy4iSdAGA5PWEcq2larQHfnsgxrmBVjIX+hDSOOzwYt8eozigIAXkMlLYYaeL8iuN3Ued7XYDFUfJoDmAdl5pD2cvRaBk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766398295; c=relaxed/simple; bh=b/WSaiyC5M1nv2FVQTXQnRbE5ZUHonT0PNSVbPOuKYw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=rpeX2eHg+jy5tZXB350nvOdxbQRATsp88ycOsxEt2tzRFydqCJqET2kcf874dC7fzHQ9yP77Ev2hoW9Pv279enEGiqRIxt/yZCcSMaisOZHuDUP4hU72ZC/NMX7tfut4Xqz2tdPjJuMmFhNW4r4p46Zqz+zkYw6AlY/uib6hVVQ= 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=Qpmh/jZj; 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="Qpmh/jZj" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 2D74F1A236D; Mon, 22 Dec 2025 10:11:31 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 0121B606C1; Mon, 22 Dec 2025 10:11:31 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id E48C010AB01A5; Mon, 22 Dec 2025 11:11:26 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1766398288; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=tmD2ZK3TTOzrJAbHs3rVTloVkAyIeJqATZIFpjpNGC0=; b=Qpmh/jZjt9PRaaKuRXj7A+puvmhQe/2+bMubsUsbwoiW6A5XkB3lgk4AAqn5hbfgLweutb ljGGziC1JMpVjJcA2OEnvMOy7ZJkoJROv3owV/JzBCM6MRJt6zRc3lkMKMIX31tVu0FJ9U oeb5n6ZZOW5RZhKI3mXfrla62ILw4NNW0WV+XlrOqsgHuTTPbWffu12gBAKCObFwp+mhYv 7LfXBmj7MYFofw6J3jnslyU2SzrugmnnFvTruCm1yEq+RBUY9OqHbI1CaadYMQY937mINh 8nSlmuUXZzI2GHKCrjtoIZ3M6DP/OF7wUYbgo3ixRfJEJmSWTVyJUUq9D75KXQ== From: Louis Chauvet Date: Mon, 22 Dec 2025 11:11:10 +0100 Subject: [PATCH v3 08/33] 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: <20251222-vkms-all-config-v3-8-ba42dc3fb9ff@bootlin.com> References: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@bootlin.com> In-Reply-To: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@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 , =?utf-8?q?Jos=C3=A9_Exp=C3=B3sito?= , Luca Ceresoli X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=3434; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=b/WSaiyC5M1nv2FVQTXQnRbE5ZUHonT0PNSVbPOuKYw=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBpSRlACkUbpgJoinxdbKIY99jeiumPBLXh+4paK cCl2RFD4qqJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaUkZQBsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDIACgkQIK0uxlsQLOIhPw//VytUCsaFC2Myty+Cospz2XZse7NOtM9 qxWS3W/IKnjm+y6neqUuVBoZtbsnPjCCE0tUHlH3275WfXXr+cphY+LSdc/0RiMBueXSayS3Hbf ySAe2P+4KgJkTfjZCdCpIc8V4Dg8wNPQiM69Oi7Ky3UmTulCINW32gnn7berRvvnZwmnKOsZLpK Bh6rySKAgOd+7qKOS+4bVI99+W/ySHkrUSVE1AtfQOnaxITTSVh7D8EfQBX5CwuFfDRADn9No5l hilvJASjXVlpx3Ux2vHyesSokoQIbqB2QP829wfcPoiQygxXbqyWrSpsOrvLaxD6+h5nrEwRrTp ewUOE538MtVPIehNmP7iVMaFR7E/kxdoXzPXerF5ImvGYQV786ViMxFQIxUMcSaGWrn1vluzSMy aGDkozvM2LG/hFXanPOX2i5Pey3EGp76bRBnzBgvlukUgHuSkWiMPGEdIEQzaiHWDZGWf+8kgNA 4znlGrF26LuLEWQ7jEOFTZtZDCJAFyG5qQ5bEwkHNusPZqBqJEu7o7R+smH+FYFnd0AyqceXevA HOyxK3LAod56KzixFAyoA61+pIxUkd8oTpJh4ZKETKgjefeRxImcfHPXlrP8hEb2q5WFfUvnqMO 4PLRzifpIankMyfHJNDFU0wswllqofQh/6lmd88UQxsObz2vZFvI= 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. Reviewed-by: Jos=C3=A9 Exp=C3=B3sito Reviewed-by: Luca Ceresoli Signed-off-by: Louis Chauvet --- 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.2 From nobody Sun Feb 8 07:22:20 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 1DE0D313550 for ; Mon, 22 Dec 2025 10:11:37 +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=1766398300; cv=none; b=b0giTEVczWIq6j4qEvn195Noi5mV99QfDg/0CBsfQYYdGisHf1SUDPWwqPvpi8NzDnv2JM9ghwrON60iecM2L0FMWcxEs+qNLhch6mhQ/U/7LQxUd/0wQVxJhGjXl757jf+50jjtoh+rwz+UwtkjwQvyOultv+ua1SP26+qoNsk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766398300; c=relaxed/simple; bh=99rsMtDLMeM5AsaULN4Q0GIOz3k7cELphzqUHT3Nj+I=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=fr4NgZG5GfFS1NzFl2pNUysqvJ+ZTyEsG+HVOPXcZxnOjxeaQ9XnMcxnmFPchXSRqS/bleLevB0YqbEqONEqQl+4duQIhX21yu2x7qsVzQaplFgWrp+kYX644M7MbNtcMt66At3Ca5tjusyXAosI8Fzolgamgok2IDQB8W51wjQ= 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=rVLZuJCo; 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="rVLZuJCo" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 5CA18C1AE05; Mon, 22 Dec 2025 10:11:11 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 5A024606C1; Mon, 22 Dec 2025 10:11:36 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 65EAB10AB01A1; Mon, 22 Dec 2025 11:11:30 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1766398292; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=guGdjBCKWPwgWY7mRq2vpD5KExhd5nJM2mcKSd+dU3A=; b=rVLZuJCoGatIHt4lTQsQftKxa/2as1dYNdQKQqI4NI3T2QblE+T/K6MLiRomjbTs+TKrNM 35qerpjnSe2sJOgdgcPXx9P6A15WCuFDXbRJHyMCq32WH2uOmq+SNTWin+fzbbI/7hlW6n t1lI2HM+MWEdpsSGDFhSmaOE6yWVCwgOemo5sCOYl0omffwtzTpTjjGUSOKal476EKbnMd 8qs8ID0Qj++IWx/0n5pjqJDUOdMxDvqrmTqHDX2OeO/62mumVi5HrGnZOHUKRd1Pg+Nnui eNDk7u17knMXOx5eoipK3DjzsJWFy/dBFU6sQrhbKscx1HNEgrVC0t9nwt1Ruw== From: Louis Chauvet Date: Mon, 22 Dec 2025 11:11:11 +0100 Subject: [PATCH v3 09/33] 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: <20251222-vkms-all-config-v3-9-ba42dc3fb9ff@bootlin.com> References: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@bootlin.com> In-Reply-To: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@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 , Luca Ceresoli X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=11904; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=99rsMtDLMeM5AsaULN4Q0GIOz3k7cELphzqUHT3Nj+I=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBpSRlAJaknsif0ML+akdyUo/PscyGm7ZClLlBq/ OIEMKFEnvqJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaUkZQBsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDIACgkQIK0uxlsQLOKl6BAAxQ8ZsolNTG6elU6E46mW4p72Jb2rAP8 E/MGbUa59rd+J+C6JVdOttMw7Yd0pX5DCL4ofv5YDSa8no7RVWaeTGPiJbJZMJyOlM7CRrBUbgz yquB+rXXFSDdkrujCd6qZkM8gLy1CQdFPUTPOCJjOorRYxTqfiMB/tvnjp+jvOATYGLZxy21Hrk 9vXQUZbCjxm6RffRy1vxMLN0qbPY/66iX9nGWJ75ux4jPn2hrzDWixOYVCMH/Rknam8R2x/bQ/6 ARxMTHrr3T4bBrxIfnr63ngUL1ZaI/hzAsZjIIEjAUmHTnJrzO8x01dHqXGeUCN6bG+sutjlgoN RS+EjavsgqWlCq/eAcko2VaCU1TkfwuGVIAZNWmvk940uYmICEVMebecgm5RDwCeCrYO4XNQ1SO GaMWV5YyC6dYVD05KKYH01rcgGEqF7XDpOQz3J4H0C85cw5vhYDnTTHz5lCWTJXtx12vMXYLa++ nHkKPQu/zrnFnggPQ0Hf4PtOU46bzRsLTfuXIeO1SfufDwawMMcJ+e5h8Om+pa1Vj7VqEodpko7 hSkTkDE8LAueBkpFRlFoSwhfSI/wcL+xiww42Pq0WbROXoovPT9/fE0LvvffXK6goZa0U7cZ6mp pEQMFwunNcadaQLLZIhCtWK8+UmY2O4zf0WfD4GpmMAq+b9oobXM= 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. Reviewed-by: Luca Ceresoli Signed-off-by: Louis Chauvet --- 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 | 5 ++- 4 files changed, 171 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 1e4ea1863420..c33fe737678f 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" @@ -185,6 +186,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 */ @@ -481,6 +488,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, 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; @@ -1003,6 +1048,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 f31a1eb8f811..7aa087602807 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 @@ -150,6 +152,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) { @@ -307,6 +336,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; @@ -338,6 +373,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; @@ -359,6 +410,14 @@ static int vkms_config_show(struct seq_file *m, void *= data) seq_printf(m, "\tname=3D%s\n", vkms_config_plane_get_name(plane_cfg) ? vkms_config_plane_get_name(plane_cfg) : "(null)"); + 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) { @@ -401,6 +460,10 @@ struct vkms_config_plane *vkms_config_create_plane(str= uct vkms_config *config) plane_cfg->default_pipeline =3D false; 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 b9a41a22c011..cf29976ec1a9 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; bool default_pipeline; =20 @@ -316,6 +320,61 @@ vkms_config_plane_set_default_pipeline(struct vkms_con= fig_plane *plane_cfg, plane_cfg->default_pipeline =3D default_pipeline; } =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 d8612e28ac3f..7c604cfd6a09 100644 --- a/drivers/gpu/drm/vkms/vkms_plane.c +++ b/drivers/gpu/drm/vkms/vkms_plane.c @@ -235,8 +235,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(plane_cfg), + vkms_config_plane_get_supported_rotations(plane_cfg)); =20 drm_plane_create_color_properties(&plane->base, BIT(DRM_COLOR_YCBCR_BT601) | --=20 2.51.2 From nobody Sun Feb 8 07:22:20 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 7D27E314A7E for ; Mon, 22 Dec 2025 10:11:43 +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=1766398305; cv=none; b=Pw/UIRD2sDxKBPKR9J0F4TEKLbrKw5duPSvr1Aw41RatnHGNfV2K3XHY+OT5/OhhOr9Gq6PRT9mBZoh9rg274BQZlUb5WrUioHd004pa+CEsBaneeFZnT+hO9b6bIfnhUxqpRH/hghvz8Fi8wSZ18DI9x5InbPFjTT4K+NvNK50= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766398305; c=relaxed/simple; bh=clPxtmEMbNIK+Z0tE5WO5KEo2WR06dFkUJbJl2Yf2Ww=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=evwAhpBvnc+z/DWYtv3cjldK7L069MgRQr+nYHdD5N48o1Fio7H78LPvprPYcdpx+pNYLUe31dCZ5FvZ3wfbl5zAHaZc6DPj+g1j/2HlGSVPs8neT8XkkJw/EpeOd5TtGOttQTpsMzfJ/ddYlwidFghmWLZpDk94wmqpuPabaUY= 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=cATUu8ez; 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="cATUu8ez" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 374831A2373; Mon, 22 Dec 2025 10:11:42 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 0C1DF606C1; Mon, 22 Dec 2025 10:11:42 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id A660010AB0199; Mon, 22 Dec 2025 11:11:35 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1766398297; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=mh17FwdIwDJQmgWmaf9u9me3jrBUTLLPhPQ/n8f+ag8=; b=cATUu8ez9NTSRBrCqOwNIbVLAnOTgHNm6VXEVsMb72VO1poGznZ36hamwlx6bFG+Hl/3u1 8vvO2F7+V3bv67WJ+/fINRfmN83Y6bOoYd1UqZS0+l+Ws9Twnc3lhEmVWse0qMk1d22T9H YG6HUpyw+DJ9umt6ywnaDtl4wH/h2IGIFE4RkXwCAD5CKYjabwFdV6nW670oMCTFGRCFYB 1ezDMx/FVbCnnL46vCk4RmhDAftEBNxkEMSulSD8iSuoLlvZeCtAO4a+zA+6aSf/XBVKUH hB5YOIDN7D2bMJaVHprYrNzcBnMBgJmYIBnwxB4VJ3he6s+962trE3dE7Oii7w== From: Louis Chauvet Date: Mon, 22 Dec 2025 11:11:12 +0100 Subject: [PATCH v3 10/33] 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: <20251222-vkms-all-config-v3-10-ba42dc3fb9ff@bootlin.com> References: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@bootlin.com> In-Reply-To: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@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=6203; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=clPxtmEMbNIK+Z0tE5WO5KEo2WR06dFkUJbJl2Yf2Ww=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBpSRlAXUWxlvJWLQOT7OldLv1ZBk5r+7NDiPoQs vNv0kO/8MWJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaUkZQBsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDIACgkQIK0uxlsQLOIUcA/+NVaZ/QIYC7NumR3ZiBdZ4MlufBjFcB0 gOBbeAudDHdv1MboxXkAi1cPpzhy62Dm7NH/p5OWoKIT2fKgniEQWsyOdSvNiObtY8NOrVokxFn aRO2RAtcMFJcovamaH8sSxVG8LVa7u9E5BHuv/nN4cRuRzpfNiZx6WlUl4ZN30Z1CooFawfBPv8 YciLEvj+brheH09Lq/0A0w1eMWTZB0te6LzNPViyGxqSQMFv11TQ3EsnPpbBR5ftesEt2Pq/+XN g82UUt+yWK3C1HlbvoU6Ek261aMSSi3imiiGVB48RLlUY+6ro070Mo+Pa3NNGt6Fgl221EROl2r piY/1xtCvS2PX2aCusKwWsMYzaYYCpqzGTSyPRtkzgLsdXgqZZqF5t5wpg8DZ9JOYhvQ9s8lCT5 ee4dGsKD++8rB5pSCxM/LiEb2SusTpLipzXGydr9kzjq4nSD7yQ2prMYQGydFG9xrtbd670k4JE T/g69A+q+GsthxEuTFZmcpFfjbboSGOS68dsi1tCkYGzZkwpk/1L7KgZ4q1c+lPVnvrC8SibMUE vDbtKqdUt1xy4GYmyRQ4lV/C3UFROEyiYS1oSx0LXsiu6w9PkBbVHPKxmrKNA9v3VyN1JUDvNTf z+0u6DXkdweCfBI9cLQBt7wq3pPMgQu26IZtKx5GUsp1GICPxAu0= 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 configurations, 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/ABI/testing/configfs-vkms | 15 ++++++ Documentation/gpu/vkms.rst | 7 ++- drivers/gpu/drm/vkms/vkms_configfs.c | 93 +++++++++++++++++++++++++++++= +--- 3 files changed, 108 insertions(+), 7 deletions(-) diff --git a/Documentation/ABI/testing/configfs-vkms b/Documentation/ABI/te= sting/configfs-vkms index 6fe375d1636f..9b74375bbf35 100644 --- a/Documentation/ABI/testing/configfs-vkms +++ b/Documentation/ABI/testing/configfs-vkms @@ -109,6 +109,21 @@ Contact: dri-devel@lists.freedesktop.org Description: Name of the plane. =20 +What: /sys/kernel/config/vkms//planes//possible_rotations +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Available rotations for the plane, as a bitmask: + 0x01 - no rotation, 0x02 - rotate 90=C2=B0, 0x04 - rotate 180=C2= =B0, + 0x08 - rotate 270=C2=B0, 0x10 - reflect x, 0x20 - reflect y. + +What: /sys/kernel/config/vkms//planes//default_rotation +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Default rotation presented to userspace, same values as + possible_rotations. + What: /sys/kernel/config/vkms//planes//possible_crtcs Date: Nov 2025 Contact: dri-devel@lists.freedesktop.org diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index 79f1185d8645..7fd746dd6ee2 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. Allowed characters are [A-Za-z1-9_-] +- 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 989788042191..bcc3e222e6b3 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -365,24 +365,105 @@ 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) { + if (plane->dev->enabled) + return -EBUSY; + + 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 =3D plane_item_to_vkms_configfs_plane(i= tem); + unsigned int plane_default_rotation; + + 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 contain exactly one rotation */ + if (!is_power_of_2(val & DRM_MODE_ROTATE_MASK)) + return -EINVAL; + + scoped_guard(mutex, &plane->dev->lock) { + if (plane->dev->enabled) + return -EBUSY; + + 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 static void plane_release(struct config_item *item) { - struct vkms_configfs_plane *plane; - struct mutex *lock; - - plane =3D plane_item_to_vkms_configfs_plane(item); - lock =3D &plane->dev->lock; + struct vkms_configfs_plane *plane =3D plane_item_to_vkms_configfs_plane(i= tem); =20 - scoped_guard(mutex, lock) { + scoped_guard(mutex, &plane->dev->lock) { vkms_config_destroy_plane(plane->config); kfree(plane); } --=20 2.51.2 From nobody Sun Feb 8 07:22:20 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 471B2316199; Mon, 22 Dec 2025 10:11:50 +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=1766398312; cv=none; b=t62D7GIJMziTI4Dcpva7PbNZZP440JjKt4wRrdZmmkfADM6ougA0Ruyq/SvYI+jxIPVfncuzlFVTo4NObWpBuv8ZPdRq4DRryrb+ragIB53pdUrpVAlaOd785vwbNsR4+j8KdvwkuvW0MfbNkMmaGCT3E4qgt4tM6/u/8tEDAO0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766398312; c=relaxed/simple; bh=OugjWrUvcZogEswAfggVPyTpTTPf0Dkr6yW/zV275yc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=AcO9ocgYYN6I1oH6J151aHmXoSmzoq8Bdq1d0kaaa6vGdUGGv2bUobh/uoq58fl4yf4T8oQonFQXMT7kimYRXj+I9fg7dkM5IZyH2+eDpZyzqSch8v7fULApfuyuUI66gcANddE/Ae8nZXyM0yYYc7gm0RprrR+LAJXqvHIoUD8= 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=fR9uB0X0; 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="fR9uB0X0" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id D45971A2373; Mon, 22 Dec 2025 10:11:48 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id AB1BA606C1; Mon, 22 Dec 2025 10:11:48 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id A246910AB0194; Mon, 22 Dec 2025 11:11:41 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1766398303; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=fQe086Z7/WxnmGwFVKgVFgBoU8PQB9Lf8nUfzyMi1WQ=; b=fR9uB0X0D+txfJcIlRf2BQ6rg7Vre4QQFHd0C3PuEVAT3jvXBeEhSf46UONl2kKDr4ri10 YE/zPMckOMgiVWZUroXUGUrVLURjI7aV7Pn6dMQr8sM5MBE7c9xv+rtzG4YilOM9WNXod5 Qh8kJtYOryF6OnptUP9uYdm+iaiMMgCc4/KIeKptJ32/cLMFjbqrCb6+Zg3ySZWeUiew3K /IRiO+vXcc5y2pGgIMUQfX+ZZMeiiECzcdR/2hJWNq92wI+3XvsegR7b2Dmr2ETaxrLi+J ZanVeMjKO2yL71G6A15GvbhDCz/1cHLbkphZLlcXTBl9M4T5HfQRYAw2xVUoAQ== From: Louis Chauvet Date: Mon, 22 Dec 2025 11:11:13 +0100 Subject: [PATCH v3 11/33] 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: <20251222-vkms-all-config-v3-11-ba42dc3fb9ff@bootlin.com> References: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@bootlin.com> In-Reply-To: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@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 , Luca Ceresoli X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=2160; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=OugjWrUvcZogEswAfggVPyTpTTPf0Dkr6yW/zV275yc=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBpSRlBtQuL/9YhMx0gfTbscxESh+zBObPykBxmQ hsvCswuVEiJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaUkZQRsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDIACgkQIK0uxlsQLOIeuw//QsclYzU08o1tuQAPN9wIvVJAu0PCJPo Nh1SR3pPxOk3vl/EWpcfdIY6bXJ5mWFR5aRjBhYh1QUJCcdcisF1n5AFb8vvv7MwGy4K1cpmG0L UNIp6Ool45FXAv/anl5SvBiy1vnnqusiUTPr1R5PC/ECliLskE38lbH56pRF1EcYOHLMG/1Qdcr rbzMMk1iJjrcawsuwiiCb2AwKRZcE46qtds6utxGhpW+9szOjTCLa/GIORL3bnh+U8A1HGsx+pJ J2uK8uIOnPTQuP7UmlNeA5L9Ol5wl6XB+Lb3IEB6X2o851HoRPe5voVVJ+fD7/Y44RX95tSbg7L jEmRIWCXZFTDaQsi8bVPZgkkBunj9c4cRheVPgaNC3yaYbx52zw9Wx6wm+RYwTqijRvy4Z/Bmjm M03Lv70ybVsDpKPS/qi2ljTMBAP/zAzdqqFZKkghZCxSSX/bJTRPc7Y8u9alIwLrKam8v1X9238 o3jvXYoNJunAn0rBXwsr/ca9IQtgYb6drG9nOWFgB/s5upUAfhTqJ0k2hwmK1LJ1pzlGuXAChlN UP1ZJaegkoJuq4y9Rii26bIAUXrOg6MG3A9x2WTbHe7jAlDn5mqYkR4zGflu/HXgpkLirjRbRme IRBhBOW0JVwfvlXFShoN4apF3pH3uEbeWsoZhJ/cfs6w4ERZnsh8= 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 Reviewed-by: Luca Ceresoli Signed-off-by: Louis Chauvet --- 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 c598b99673fc..56fd8e0620dd 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 c09409229644..2f22b1a16dfa 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 5140691f476a..133ca77d91c7 100644 --- a/include/drm/drm_color_mgmt.h +++ b/include/drm/drm_color_mgmt.h @@ -113,6 +113,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.2 From nobody Sun Feb 8 07:22:20 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 C5653314D06 for ; Mon, 22 Dec 2025 10:11:52 +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=1766398315; cv=none; b=apBXkG4T/Uyw+iemYy+CkjEnSVrB5D+P23lvZm8FDYCCmuGPOuxOKVnTCoZYYO9IeA0GhfMXJpeASIjURjod5d+OpJ/4vKV/xmqBbuo9w9DkK+xmCjtbdqzXbIkvuJEfCYSfaBNhUkAu3lAI3hD3DJE7UqcTG4EP8sEdI0Gei0w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766398315; c=relaxed/simple; bh=R+q9Yv1wpwXmEh+eX0ifPICZ7Fh50jJbSAPBGpaA6Do=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ZxCzRk5bqhIJdVZXwR5npi5eO26PmtCAnGoMJn+oZ/Xj5Nr0LT6peYclsWanIUl5koa4FYm1Q/oo5csh8/xM22KgiqYMGlGLMWnxHXGTp4jd/tsW5iMd7WNJ1w+Sc6q3IJYa1V8aLmSUGhDP9iwHeznAp4XZpNM0jGD56Qz2M7I= 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=Mi3SDu/F; 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="Mi3SDu/F" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 687894E41D33; Mon, 22 Dec 2025 10:11:51 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 3BD70606C1; Mon, 22 Dec 2025 10:11:51 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 26AB710AB01A3; Mon, 22 Dec 2025 11:11:48 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1766398309; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=cISZtk7rynv/rd40OAwJYsREJ4saaHgI1a7U8LX01gE=; b=Mi3SDu/FJrkR37zgvKpr03QRkEOyUwELSUEPMQI0hY69HINMX0qcS+y7mYyAFMxgji4Qdt bRBY7SO4eP7SokNX7fbkcm23HstTIWQ8NaIGlsJ+4me+mHZ9Uhtl537cyxWfioMA3vHMSP 5ISGAUIO01wRIEQbHsJhO9jmU0u7vn16zxDXqOY8rA9dv77zqX1z1BEv6UrGgW9ZBlho8h b3LAL/LpSU4j3UAvZO/rfYSQC2RikOSq8JI1vZfyCnfysLscD4EBeu7X6j8xmIsSPgvHP1 o7tJCenG4Y6pNOdel6/SUA0B3F5+kFrySjUJycMbpzoJTQEfiaiJu6EskFn0nA== From: Louis Chauvet Date: Mon, 22 Dec 2025 11:11:14 +0100 Subject: [PATCH v3 12/33] 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: <20251222-vkms-all-config-v3-12-ba42dc3fb9ff@bootlin.com> References: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@bootlin.com> In-Reply-To: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@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 , Luca Ceresoli X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=11887; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=R+q9Yv1wpwXmEh+eX0ifPICZ7Fh50jJbSAPBGpaA6Do=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBpSRlB1fYmy8dysR0rIkZMA5B9Zwiqe3MCHGItk SDj3nDrylmJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaUkZQRsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDIACgkQIK0uxlsQLOL9jQ//Y0xAAIVOkW1oN8s5Wts687bcfSMF8Pa kO2Old2M/m8/WL9eaqwfg0eiM4jx9jDw8Fo2kofmohecxVNZ17fm0vXAAhJiLfAz0IIO0gH9Am7 eg+Ff5Hg8lAGXV+neu9PXUZYUe+K8UPTdjbaHDiRyck/egSWzr/sTcL7ZuDwc4pE/j9+M2WjU5K k7wWF9jil1DWz/RjlXrLNlFZkpbvFQXc/NModu0hRIs356kSCStlUzcc/+4LD09GdiMajbHZB/S qBvitiirDA1RfsKR4dkl6G2E4/JhpWbaem5EfRAkFercQU0TAp15OR3hOflZMrCuuVu1mncI3ev mJdXO94X59Y7mLSsMP0zbKXKaGuG3ibFb9RCqBHued8HvgPla+zAksZuOb3/pG0zUBGjTmeWeIG A96igB29RxSaNt19NT2umlK8HswmUIKIyuG4ij23yVb2W/nubWevs7RE+6hmrJGpDQodRVkyyu1 Y01GVt3hFtjmVPprp5YUb/RZqyJE3C4P1BZuatgDJR+r6lRMZMsYMMP86KufZiPFkuWXWRpTMTz khwFtMu0etRJ8EjMhM9ATxILjcAQVDI7WgKa7vZwQ9P9LR4heFl0zZKwn+4fEnj4TmTQ9Z4xsto dwa/UEm1eY9XjXw0pWfWEMRzimXtEmOxsAU4Y4zQpCxRVhMXK/lY= 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. Reviewed-by: Luca Ceresoli 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 c33fe737678f..a2a3f1a106a3 100644 --- a/drivers/gpu/drm/vkms/tests/vkms_config_test.c +++ b/drivers/gpu/drm/vkms/tests/vkms_config_test.c @@ -192,6 +192,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 */ @@ -526,6 +534,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, 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; @@ -1049,6 +1099,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 7aa087602807..486cdd1f54a4 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -179,6 +179,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) { @@ -341,6 +360,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)) @@ -418,6 +440,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) { @@ -463,6 +491,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 cf29976ec1a9..cae7c3b3da07 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 encodings 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; bool default_pipeline; =20 @@ -375,6 +379,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 7c604cfd6a09..49544839f7dd 100644 --- a/drivers/gpu/drm/vkms/vkms_plane.c +++ b/drivers/gpu/drm/vkms/vkms_plane.c @@ -239,14 +239,13 @@ struct vkms_plane *vkms_plane_init(struct vkms_device= *vkmsdev, vkms_config_plane_get_default_rotation(plane_cfg), vkms_config_plane_get_supported_rotations(plane_cfg)); =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(plane_cfg) !=3D 0) + drm_plane_create_color_properties(&plane->base, + vkms_config_plane_get_supported_color_encodings(plane_cfg), + BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) | + BIT(DRM_COLOR_YCBCR_FULL_RANGE), + vkms_config_plane_get_default_color_encoding(plane_cfg), + DRM_COLOR_YCBCR_FULL_RANGE); =20 if (vkms_config_plane_get_default_pipeline(plane_cfg)) vkms_initialize_colorops(&plane->base); --=20 2.51.2 From nobody Sun Feb 8 07:22:20 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 723D93161A3 for ; Mon, 22 Dec 2025 10:11:54 +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=1766398316; cv=none; b=pJPDSEqvmmE7f/TocPmgH4oK9speVPAByeqjiZVf8tblzT/c5BoztoUFQxFWppFMZgar/Sj+y2SmLG2aGox5HQ+A93m7VNXkBgTJ2OJCD+wAqXWrUWTE9mTPv5J2aXxdnMpzmGSETcLSV+B9Qn6woX6QZ1i+tib2SH3wPWCWL2w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766398316; c=relaxed/simple; bh=KrbZiegF6pw+Vnpcarfhl+XKg7MwzTvyPUzkLZmmKLU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=MXdNIzSp8qRSRtRXipw3VVJy5q13iZIHY0DAu94jKWD8subQ3FDfhmQZZCqeDZxAwQ3E4duALDTX3CH4ldd6r9H1eRRM9+wOhnye5iiXYtNHmX5yesdZvrH6R/4HSoFrlLD2Kw5YJa9b5zgT69YtXbIuNgB9ilROzgrcAJwirsc= 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=Dci9uPPq; 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="Dci9uPPq" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 1F73CC1AE05; Mon, 22 Dec 2025 10:11:28 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 17AFD606C1; Mon, 22 Dec 2025 10:11:53 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 87D2610AB01AB; Mon, 22 Dec 2025 11:11:50 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1766398312; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=naVKzE5jKov3A6hauaUpolq/4+6MGPF41QUoRj+IiPw=; b=Dci9uPPqNuTXrGcYhGTxiH2MAYqM4wrRhaDeXRDDCvMZkGlWzrm/sagZfJgjR48GtWHj7r d6FsoyCV8sdQazEsnpCFAHfzwTHwrSzWN4f1+rRVgRYZ32k//ozu+UzV9abqJgEHqZ0y+h gfC83FgiTG2mVRJow0q62RaTs88/PuyJBoQwTXl2UC5hC+y4XQWIQrztU9TNG1RC1EUvKX wX3q4LnBHmPqIj87FA3o2zvCeaqGYy2Ps9Q8IPDzOKQqvzWfgcMMwQvqJQeAqmdFhx7bsS lnopMmDJODQt9VqWIuenz/Ehm1NO2Jc/mx6ATIxu9qPX5NuiC2f3XMPydw+HcQ== From: Louis Chauvet Date: Mon, 22 Dec 2025 11:11:15 +0100 Subject: [PATCH v3 13/33] 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: <20251222-vkms-all-config-v3-13-ba42dc3fb9ff@bootlin.com> References: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@bootlin.com> In-Reply-To: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=6834; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=KrbZiegF6pw+Vnpcarfhl+XKg7MwzTvyPUzkLZmmKLU=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBpSRlBBHucMxyz9B1Nn5jFC51nGjuwtJ9e7GWLC lRa8oeoRfWJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaUkZQRsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDIACgkQIK0uxlsQLOIb5A/+OsORggP4LYB/5rR+ArrFPjDeihGhT3n 8fVvekAlwgCa6Mrc9lwVv9Q0Mar/WW4UzqXPnqLb7p2wksZyY5RgtmGHxC1MMlpKWEwJ4s7XxkZ r0wpEJrItHjOKC7L0qVfCA+hx5x9RrGibn3jq9sBCJk7dwVDeBAHnSMqtc5WSJGu6XBi8SSIQBI Uv7xeDBqJW1koTnR+a+fbQ0BR7Axy1H0mAST3/1yCn/QZaMchtbHnAmD5PS+Z8toLCoZBP2Mn3b H3K+iHcMbb58s3CGf4mkbyTpmGZzENBjpWnBj3/oH5WetwtqejsG3UHUQ80mXAidhuOjSRf8Qka cEfM+O5F++WR+4nzWZiEH0pm4TzX0PavoGfQ+t6brz0ERRLkYYpxKQHcFWp7rcSd6Boy6HCf2Gk aIhpKKI3wFGw2s/ZigMhbajzBMPX7pz/CNVAhpRIN50Tu5dTu8Rf1Uc8QkWCs5r8QRL9L8EYhE5 hXrZXykc0nPzA7tbFDxc84MKXrWSKa19U//rZvrDlrTeaEsnXHeKBl+mv+o9UTwFe9XiDNGbNMj iD6tYgc4zVpd6FRt7ieRM3A2ovHKh5THRpMwvoDn6wZDHryQXyOVR2Yw2pnL6QyoNvcB2RgRQ8Y hlU69DmHP24MUqgzX8Yd2izgAsoJZJolaGk+46vy0iYk7gdOY21U= 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/ABI/testing/configfs-vkms | 14 +++++ Documentation/gpu/vkms.rst | 8 ++- drivers/gpu/drm/vkms/vkms_configfs.c | 97 +++++++++++++++++++++++++++++= ++++ 3 files changed, 118 insertions(+), 1 deletion(-) diff --git a/Documentation/ABI/testing/configfs-vkms b/Documentation/ABI/te= sting/configfs-vkms index 9b74375bbf35..242aae91289c 100644 --- a/Documentation/ABI/testing/configfs-vkms +++ b/Documentation/ABI/testing/configfs-vkms @@ -124,6 +124,20 @@ Description: Default rotation presented to userspace, same values as possible_rotations. =20 +What: /sys/kernel/config/vkms//planes//supported_color_enc= oding +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Available color encodings for the plane, as a bitmask: + 0x01 - YCBCR_BT601, 0x02 - YCBCR_BT709, 0x04 - YCBCR_BT2020. + +What: /sys/kernel/config/vkms//planes//default_color_encod= ing +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Default color encoding presented to userspace, same + values as supported_color_encoding. + What: /sys/kernel/config/vkms//planes//possible_crtcs Date: Nov 2025 Contact: dri-devel@lists.freedesktop.org diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index 7fd746dd6ee2..0d4dae3ba8e5 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,12 @@ 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_encodings: Available encodings for a plane, as a bitmask: + 0x01 YCBCR_BT601, 0x02 YCBCR_BT709, 0x04 YCBCR_BT2020 (same values as th= ose exposed + 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_encodings =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 bcc3e222e6b3..755978b17c95 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -9,6 +9,14 @@ #include "vkms_configfs.h" #include "vkms_connector.h" =20 +/** + * VKMS_SUPPORTED_COLOR_ENCODINGS - Bitmask of all supported color encodin= gs in VKMS + */ +#define VKMS_SUPPORTED_COLOR_ENCODINGS ( \ + BIT(DRM_COLOR_YCBCR_BT601) | \ + BIT(DRM_COLOR_YCBCR_BT709) | \ + BIT(DRM_COLOR_YCBCR_BT2020)) + /* To avoid registering configfs more than once or unregistering on error = */ static bool is_configfs_registered; =20 @@ -446,16 +454,105 @@ 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 =3D plane_item_to_vkms_configfs_plane(i= tem); + unsigned int supported_color_encodings; + + scoped_guard(mutex, &plane->dev->lock) + supported_color_encodings =3D vkms_config_plane_get_supported_color_enco= dings(plane->config); + + return sprintf(page, "%u", supported_color_encodings); +} + +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 & ~(VKMS_SUPPORTED_COLOR_ENCODINGS)) + return -EINVAL; + /* Should at least provide one color range */ + if ((val & (VKMS_SUPPORTED_COLOR_ENCODINGS)) =3D=3D 0) + return -EINVAL; + + scoped_guard(mutex, &plane->dev->lock) { + if (plane->dev->enabled) + return -EBUSY; + + vkms_config_plane_set_supported_color_encodings(plane->config, val); + } + + return count; +} + +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 BIT(vkms_config_plane_get_default_color_encod= ing(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 & ~VKMS_SUPPORTED_COLOR_ENCODINGS) + return -EINVAL; + /* Should at least provide one color range */ + if ((val & VKMS_SUPPORTED_COLOR_ENCODINGS) =3D=3D 0) + return -EINVAL; + + /* Ensure val is a single bit set */ + if (!is_power_of_2(val)) + return -EINVAL; + + /* Convert bit position to the proper enum value */ + val =3D __ffs(val) + DRM_COLOR_YCBCR_BT601; + + scoped_guard(mutex, &plane->dev->lock) { + if (plane->dev->enabled) + return -EBUSY; + + 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.2 From nobody Sun Feb 8 07:22:20 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 AD536314D04; Mon, 22 Dec 2025 10:11: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=1766398319; cv=none; b=niRzwV+ezRm3DCq9f5yeKePH/IWeza8c00tTz114TrLlMswpS3n7zDPBDfXikU1CaF3Opsz/sDGrysHQjbuJiua9AGV5Vj92VvPDb8Uuk++3YJlpMFttB63snPJyyZ/Y3jjoRXTiR7Lgs2sMPPF49xkcRpODeCF71FqmOo7dPJs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766398319; c=relaxed/simple; bh=tUpMSF03u5oCySjWBJEfrxWBM9Xo0Mlwcy8LL9ObI0M=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=hvMO9fvkVytodKV09LYliOQSQ8zuvmI4GFjjCAXGXtmJYc15qMs05p1yfrWWwITg0MBYxf0rVZOXlxoK1WBkZcdMNqyIBNC8iHuWG5khwyqdXY+JDYt2MU3j4HS+YRHIR6E3gG0IwgmW+Yv0zwfaMxBof8U8VnVfzPzw5+WY93Y= 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=iLTRlW3i; 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="iLTRlW3i" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 113744E41D33; Mon, 22 Dec 2025 10:11:56 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id DAEAB606C1; Mon, 22 Dec 2025 10:11:55 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 80ACC10AB019E; Mon, 22 Dec 2025 11:11:52 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1766398314; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=0WkyIctWllsokt9s1/yIkBw2IMbVHkBoQ1ZiBvPE/Qc=; b=iLTRlW3iYOr1yGebesGDom1V661+n5Qa7UV8poYesmBJEiZHoUe05ZzZbQnh+S2iV7iVJe QV4Z5UwZoV1uHZxPxj9nPJprZs3DcSRmtrJfY2hrVOPwy50Rjq+Z5f7RvpDfgdgAgxnfCI iQr7uAR4vl1VsujMQy0IhiGCpfBSa26AR5PtXdrvDtkgs2tZ33wn/t3hmvp+kEyJoUrjK5 uaBY/BgYG8ctTvVSCdJAK847CgM+bJTKzi2rs3CT+YuIRMBXBeF2cMSNkpm36w1nrK2ag9 GYMUldB+B2JSN4D+RF2I2Zx1NV9xQuQAZY/AWFHuG/CRgjto0spwJv1+JNmRTQ== From: Louis Chauvet Date: Mon, 22 Dec 2025 11:11:16 +0100 Subject: [PATCH v3 14/33] 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: <20251222-vkms-all-config-v3-14-ba42dc3fb9ff@bootlin.com> References: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@bootlin.com> In-Reply-To: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@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 , Luca Ceresoli X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=2211; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=tUpMSF03u5oCySjWBJEfrxWBM9Xo0Mlwcy8LL9ObI0M=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBpSRlBzly2zMBPOZ4cBIPKVXLuauYNR4f1oicRC 7bFE9iHcxCJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaUkZQRsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDIACgkQIK0uxlsQLOIGpA//Qy6yCwUoigN6/0ta1gw1KtO+naZ/YZA ubzf+sHw257x0NB0UDmzTmqcfwC0wI9dAlVFL0BXL5db/RQa/a4BlpYE0kXuJsAtSHjkWI9aYoM jpFYbhh4DCUdZjYXBVwHuOVeLpJ6H16qNF+rVzWjYrzmTjAHJU4ajrVo0smVdBdmrwsoLFct+fm QjOKptmJ4fYSPOBCz7jx8OYDuYsVpV9nbN5GNTsqWmjm556NPsjhOCUk2IwNziXjA6N2Z+FzpGp tUXASozbssNf/I+W3OdDqMjwoPdneFUIrVtoWTAQGf8NYyhYEigyAJQzwPmjZ6TWmRRSuBL0T7X t4FkXOw9lMBREnfMoYcL/4lSohIJTlsMw3OfZuAJnwEwDHuR4s0/p4kko0BVEpmwgJnvrncLcqm z9A2mhpSxPaT16GgX2Yo1z2ZLViYh6MWjNZSUeCm6ed5/aBdmS4IF9BtSxq2RCi2PVe+8b+jDgA zOi1WDvpaSrbBQ1CHgB5gTb21b8e/6FY8m6EfRTJHRDVWP779UFl75icD7nWl9FQQ1m/ZO7HFiu Svx5LvkzaXR1SkRAMK33Sa34i5yLqzaImORr4ebjzXtT24QFWjy/FSWGnZ7T+Mu/qluc3T2dmp7 +wpqsL51rQKD40E1E1SxgEP5EZ0K2W/GN/Im5XiapaK3GFMI46r4= 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. Reviewed-by: Luca Ceresoli Signed-off-by: Louis Chauvet --- 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 56fd8e0620dd..beced449ecf1 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 2f22b1a16dfa..54bd491fbfba 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 133ca77d91c7..e91f494e5a63 100644 --- a/include/drm/drm_color_mgmt.h +++ b/include/drm/drm_color_mgmt.h @@ -114,6 +114,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.2 From nobody Sun Feb 8 07:22:20 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 8233E3168EB; Mon, 22 Dec 2025 10:11:59 +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=1766398321; cv=none; b=A9pcrqiooCQPFMjN/KRYX/pi5ngb/45JJ+bpt7h9G10c40j7jx0Ujzl1SnG4gGbVW/IwMqJdy5rlw1CdDXCXs6ebxhUYeBJ5zE6O8UzLkcbF/zsK3mwnf9Bt7tXzt8nHZfrztXXRrz9Zx6ZVEUgCARKsw8ygULNLytuYw4QVn0c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766398321; c=relaxed/simple; bh=YsXBxTtZ2dfU4I3O7VtTUuslG1wNR+/6hNxx1wqF1IM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=DFOGsYKuDQsNPdMy46qPtB7xZyu8JSLRji9YDBcXJceiWYfqb9DT72zqOiN/pxLBH/kLGtc+9UzR3yk2VnIQqXLFLExNPVXGp2rnbFguFPktPwCKPECBhAuBUQloQ5ncr5hjMuAXbO3GjEP9GorfA02+rUpnUYuaRZHyFyZL5Z8= 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=nu6IiE8v; 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="nu6IiE8v" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 2D1F31A2373; Mon, 22 Dec 2025 10:11:58 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 04160606C1; Mon, 22 Dec 2025 10:11:58 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 3416E10AB0194; Mon, 22 Dec 2025 11:11:54 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1766398316; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=sl8Le4obEhXGwn4WHUvMuISFrlY/VG+RoyMboE2Djac=; b=nu6IiE8vadVnag0rhvBR2/mG4P3I+i4gP1Ns/G9RY99Xa4ZYMFC3kG+Tjf+pwJwcOSv5rk Cl48giFtY2zY3s4IbcMHuOuWZMhXqbua210Nw3WaSviUmxwgs0sTWcGzhA1UJCv4O+87lq tEVszuZZDRln1/yhreHGeXUJXRuSBzoxhNEFX4JGlP+1BDxorCeV5aT6vvkUBXB5mBnf8g GXPdDuXhoF3gyDIPXZfaI61V/OTp+assXwK2DjCfzXITLSeps3GtKF9v77bpKPisEAWutP 83/stESSIsWYmQiDaknD5Kll/MYdpA2HwfLWypIovmzGKLjq2IUtEkDU9RSVhg== From: Louis Chauvet Date: Mon, 22 Dec 2025 11:11:17 +0100 Subject: [PATCH v3 15/33] 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: <20251222-vkms-all-config-v3-15-ba42dc3fb9ff@bootlin.com> References: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@bootlin.com> In-Reply-To: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@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 , Luca Ceresoli X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=10940; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=YsXBxTtZ2dfU4I3O7VtTUuslG1wNR+/6hNxx1wqF1IM=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBpSRlB39/nUq+Fu3ban5KWaGpUyua+JCgW+fz/S IK/gQoMPm2JAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaUkZQRsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDIACgkQIK0uxlsQLOKVVA/8CMK0EPQGVNgGsuDUeRIRK4S2WscNlfh CZhHEMBH1/yE77ExdDYBGbN9i+bRfTcLDwOfCvrmiL5mrbi0OAIs2kFxs0HpGpm7QLTyoGUZSCz yXJ45JxLWJBXPNuJtZZSKRrG2mk567b9+PtwJ6d3p8xyY2G46Kt6XLZxuj2EyohN6ZaSX9Kh5OG 6gfT+VJLcqRSoJZm3/KcdMEYDAQC5XducZcrIOBnF5Uajll62DD7nFd2gQzI53uz1i73L0npEiu Wx0iVFFC3ZdGGRwMWJbMLLRDoL/qQ0/uJcs8WzFggPH1qdZOKPPrjhIfUMSD6JJsvt7H715xew/ 7Ln4DhRFF/Bezwd5DIzDGk7z5pS0UMAPwzswvYG7BEEv90KW8F+m/88ocbk0Td1D0dmV4kJmKYc A6jcgWJQ5dYcFtisBcUQvHwIRapRTbpaW+pcoTVdg0tBOjHuLk2WCsFLnqJturYyD7Bx19urvAY lzerhKjfjbmgWFzt6Wq2ew8xQCpLTfM2slo+Rr5dETbBSfaGXWzVS4P82CAIDU+Alt8oZvrB/vd snc55XJmvfQmdgUlpdMtUqidOnnf+HdUvzvxSVRoQSS0fHL9fWRdIMIlNT5YQ+vpcCtb5yXKUKu ZN9QltNLl50hqOGUeDKlZF63YQojfKVzuA/EeQ0ujWeXEwG1Tlyw= 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. Reviewed-by: Luca Ceresoli 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 a2a3f1a106a3..a88d8b4a969e 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 @@ -562,6 +563,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)); @@ -576,6 +578,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, 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; @@ -1100,6 +1143,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 486cdd1f54a4..5591e0baf1a1 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -198,6 +198,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) { @@ -354,6 +373,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 @@ -363,6 +383,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 encodings and color ranges must be set, or none= \n"); + return false; + } } =20 if (!valid_plane_number(config)) @@ -446,6 +476,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 ranges=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) { @@ -495,6 +531,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 cae7c3b3da07..bb2721a18d61 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 encodings that this plane will support + * @default_color_range: Default color range that should be used by this p= lane + * @supported_color_ranges: Color ranges 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; bool default_pipeline; =20 @@ -439,6 +443,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 49544839f7dd..6461cf025a27 100644 --- a/drivers/gpu/drm/vkms/vkms_plane.c +++ b/drivers/gpu/drm/vkms/vkms_plane.c @@ -239,13 +239,13 @@ struct vkms_plane *vkms_plane_init(struct vkms_device= *vkmsdev, vkms_config_plane_get_default_rotation(plane_cfg), vkms_config_plane_get_supported_rotations(plane_cfg)); =20 - if (vkms_config_plane_get_supported_color_encodings(plane_cfg) !=3D 0) + if (vkms_config_plane_get_supported_color_encodings(plane_cfg) !=3D 0 && + vkms_config_plane_get_supported_color_ranges(plane_cfg) !=3D 0) drm_plane_create_color_properties(&plane->base, vkms_config_plane_get_supported_color_encodings(plane_cfg), - BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) | - BIT(DRM_COLOR_YCBCR_FULL_RANGE), + vkms_config_plane_get_supported_color_ranges(plane_cfg), vkms_config_plane_get_default_color_encoding(plane_cfg), - DRM_COLOR_YCBCR_FULL_RANGE); + vkms_config_plane_get_default_color_range(plane_cfg)); =20 if (vkms_config_plane_get_default_pipeline(plane_cfg)) vkms_initialize_colorops(&plane->base); --=20 2.51.2 From nobody Sun Feb 8 07:22:20 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 CDB2A31771B for ; Mon, 22 Dec 2025 10:12:01 +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=1766398324; cv=none; b=MK7W6orug0heVZ6JRbnfR1FrAeNvieUYNtetUktioiXslRjRwdj5GV/RmPXoW16y71hiEp+ARsglwVrgjJNQsSYikZ7yASDEOUPSqhi4Dx6GgVewaMG8GiB3PkcPrjswfzT36jWHwiwqut0TxbQErjHksHY/idqQctiQXXTTV2A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766398324; c=relaxed/simple; bh=GvzL7GhhrNe9khGOkjshp+QmQ+GxzH5YD39LavoAsgU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=qREx/yF0/2+iDCYoSuGO95ZPb2eY/uTE5G4dXu4V826akfxBdBPAvdKuwHPey/fVKgmn2UiVw3TKBZkxzbc5B1bmd3E49XotjeZZjUfVgl8uQ1VEV8kxHAaq5DQErpfOTc3pbwfwl0Dy+NQNQ+cafdyknr1IxDKXgIFijYKnmlA= 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=I7uyW0f9; 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="I7uyW0f9" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 69E7BC1AE07; Mon, 22 Dec 2025 10:11:35 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 65DA2606C1; Mon, 22 Dec 2025 10:12:00 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 7067910AB019D; Mon, 22 Dec 2025 11:11:57 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1766398318; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=Z19aSMue5EyUWxQJrAm0oWhEPWe5muY+5GKKRbfkPYI=; b=I7uyW0f9JH7dW67DM9UM3Em+MSIgSDP3JYZJfdIIsUdBb/6jCJwnv1EclS8zPf9IKnZD15 Qn5rhefF0Bm2MYIlS++19cbHLBOi8cy+FAS4gGhyrxg8gDH1GDbQJOgzGNLfM+Nkena6EU ctnc8Is+W+494zttkco7f6/pZ0SJN+OLC1DFvA1nTZ6AV0Tho6zThzQvAvJCRstPq81VXj Pqh/t/do9AYxFNeOYSGx0yF0wynlHD1LqfW4IxIHNF3LEJ6dJVMokTqAb7Jv9kFsNEIEBB wvw8NQXdvzZs40lnX1DARNG5sZIHFALwzpPo7bW6UZasOu9rRS0QwWKpT/nobA== From: Louis Chauvet Date: Mon, 22 Dec 2025 11:11:18 +0100 Subject: [PATCH v3 16/33] 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: <20251222-vkms-all-config-v3-16-ba42dc3fb9ff@bootlin.com> References: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@bootlin.com> In-Reply-To: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@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=7379; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=GvzL7GhhrNe9khGOkjshp+QmQ+GxzH5YD39LavoAsgU=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBpSRlBGbQRGEaRq8WOntxQttW+rN+XXuVj9Sd3w cycRFVRX0uJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaUkZQRsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDIACgkQIK0uxlsQLOIMfg/+M+HvH+zPiPzcuVqPoup/xfYi287XA4I OjEIgMdhObpEczDLRQvpkpO5M6WNwXA70ZOuiu0c7VOQJZTVeuSVwHg+hnbGbewssGt0TK9O7qF SOEMMvpSUwgG8K2CCD/0b1/JhW96NzwJMfa10gYi1kt8QaNa5D6j56SxYEi+t35HdKK9YPjFvMN 4AkqRDufUYEsJ/2B8qMKGT6zmAAMkqFEyT32pEX3BabsR1XV340XKjllQTe5o0PkCn/++de4iiF GNrT6BT/Z5dqLRProQ2Q3YKAtqVg/HgvvOwM5q481EGWWBU6B1ddxzE5adc8eugYWwPoaZ9YrCH hzH4u8SbDahZ597Cc5hyXFPvk+MRU/Nm8UPqUhz2dLM4ie2BB0zKnMjpb7x8g3luXnjx3KGDN2l XyBagH+CmVlPSvBodZBK6rP+pD8HSmxZuY+JnW3rPu8Asvv0j5uBY6fItFAAhAIGpU7vGeUgfaQ 9hiEbW6QeHruy6h6E4xl2kU/yJKNEe9HDXQxBgviT8YboWoRkBbE07JHMl/kztsK4Nh5izxRpT/ xmJCDnuBluAGKFG0nCOLSlze07RiH1X2wzEkBiiWau0yiti5MZ6FMUHZilrkz22JFEYtYAARHzC G/JFh/0SotbxFducu6lSotrvW8jycF1dnkzI83UnVsWcC2pZj5Iw= 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/ABI/testing/configfs-vkms | 15 ++++++ Documentation/gpu/vkms.rst | 10 +++- drivers/gpu/drm/vkms/vkms_configfs.c | 93 +++++++++++++++++++++++++++++= ++++ 3 files changed, 116 insertions(+), 2 deletions(-) diff --git a/Documentation/ABI/testing/configfs-vkms b/Documentation/ABI/te= sting/configfs-vkms index 242aae91289c..2ace79ce848a 100644 --- a/Documentation/ABI/testing/configfs-vkms +++ b/Documentation/ABI/testing/configfs-vkms @@ -138,6 +138,21 @@ Description: Default color encoding presented to userspace, same values as supported_color_encoding. =20 +What: /sys/kernel/config/vkms//planes//supported_color_ran= ges +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Available color ranges for the plane, as a bitmask: + 0x1 - DRM_COLOR_YCBCR_LIMITED_RANGE, + 0x2 - DRM_COLOR_YCBCR_FULL_RANGE. + +What: /sys/kernel/config/vkms//planes//default_color_range +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Default color range presented to userspace, same + values as supported_color_ranges. + What: /sys/kernel/config/vkms//planes//possible_crtcs Date: Nov 2025 Contact: dri-devel@lists.freedesktop.org diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index 0d4dae3ba8e5..ab0eb2f97fc2 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,10 +99,16 @@ Planes have 6 configurable attributes: possible_rotations. - supported_color_encodings: Available encodings for a plane, as a bitmask: 0x01 YCBCR_BT601, 0x02 YCBCR_BT709, 0x04 YCBCR_BT2020 (same values as th= ose exposed - by the COLOR_ENCODING property of a plane). If set, supported_color_range + by the COLOR_ENCODING property of a plane). If set, supported_color_rang= es must be set too. - default_color_encoding: Default color encoding presented to the userspac= e, same values as supported_color_encodings +- supported_color_ranges: 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_ranges =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 755978b17c95..7be6d10b2b68 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -17,6 +17,13 @@ BIT(DRM_COLOR_YCBCR_BT709) | \ BIT(DRM_COLOR_YCBCR_BT2020)) =20 +/** + * VKMS_SUPPORTED_COLOR_RANGES - Bitmask of all supported color ranges in = VKMS + */ +#define VKMS_SUPPORTED_COLOR_RANGES ( \ + BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) | \ + BIT(DRM_COLOR_YCBCR_FULL_RANGE)) + /* To avoid registering configfs more than once or unregistering on error = */ static bool is_configfs_registered; =20 @@ -454,6 +461,88 @@ 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 =3D plane_item_to_vkms_configfs_plane(i= tem); + unsigned int supported_color_ranges; + + scoped_guard(mutex, &plane->dev->lock) + supported_color_ranges =3D vkms_config_plane_get_supported_color_ranges(= plane->config); + + return sprintf(page, "%u", supported_color_ranges); +} + +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 & ~VKMS_SUPPORTED_COLOR_RANGES) + return -EINVAL; + /* Should at least provide one color range */ + if ((val & VKMS_SUPPORTED_COLOR_RANGES) =3D=3D 0) + return -EINVAL; + + scoped_guard(mutex, &plane->dev->lock) { + if (plane->dev->enabled) + return -EBUSY; + + 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 =3D plane_item_to_vkms_configfs_plane(i= tem);; + unsigned int default_color_range; + + 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 & ~VKMS_SUPPORTED_COLOR_RANGES) + return -EINVAL; + /* Should at least provide one color range */ + if ((val & VKMS_SUPPORTED_COLOR_RANGES) =3D=3D 0) + return -EINVAL; + + if (!is_power_of_2(val)) + return -EINVAL; + + /* Convert bit position to the proper enum value */ + val =3D __ffs(val) + DRM_COLOR_YCBCR_LIMITED_RANGE; + + scoped_guard(mutex, &plane->dev->lock) { + if (plane->dev->enabled) + return -EBUSY; + + 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 =3D plane_item_to_vkms_configfs_plane(i= tem); @@ -543,6 +632,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 @@ -551,6 +642,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.2 From nobody Sun Feb 8 07:22:20 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 E14D0317708 for ; Mon, 22 Dec 2025 10:12:03 +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=1766398326; cv=none; b=PXOQb2qeofg22XjPTDxVI8DpbcKAteGY1vT6HydTna3lpVHm4ohFmB+gnBzD53AVeqi6pfHQTgWHtyc6JMrzKf8HADAQDxg7QoiXGl04INhPgI+x0WfGm4PkAeuQacXtn795yuHHo81GlVImcbiOQT/GAKdg9dE8sRwYnGj/dfc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766398326; c=relaxed/simple; bh=mzUB8fKisYn73ttObORXp2w0FKABe2mtx8ZlGqSAmIc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Kk1JIPWMJbow4E7KrqlCGA6f9szUUVwaPYw2SDNuN2AntQ58no06qplHXpoJtIH27MzWGWfJOKFToD8k3v1xYyY/p8GqOaIzZcG9ONF9oT3raci7WP7SD3KrzC83u6jQI/eFJ2qg/GBjuICboFa72bpEc8PUKOOfKq54VD8/nTY= 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=zTU6NdGd; 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="zTU6NdGd" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 65D584E41D35; Mon, 22 Dec 2025 10:12:02 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 3BCC1606C1; Mon, 22 Dec 2025 10:12:02 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id B75F010AB019E; Mon, 22 Dec 2025 11:11:59 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1766398321; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=I7zawk6++0Z/TjkX63W4pHhrEWl4IUqVLHzb2AqGjD0=; b=zTU6NdGdptHNDoya2VDmHlkOB3optAuB9fT1UUCQm6Dh8L9/dLB7BjszGery/mDpZ1yVFU V1vuk9m1TQqaMIVhgL1Lf54Uxd6WkJ/wzWOaCCZA1UDNdbnG9JqOcmVgvzXGjDJaOPU2rC oT68P/3+TELexOZ60ihAM2Q8uW8y7OnkzqxUpLeTwgvAWTroEdCfo66/rOkQPhIuC1YVaE jSPtAc5n3nlxhqq0CTRbg7lJBKQ+x/LAjH58FDDkAfeWbN0HKv4q0NI5Rce+ajpdIIIZWN o8+UPqFX4k9yVtnVNULtdhweodU6PnscygJqoz5bApTCc8jRlj/71jX23CSUtg== From: Louis Chauvet Date: Mon, 22 Dec 2025 11:11:19 +0100 Subject: [PATCH v3 17/33] 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: <20251222-vkms-all-config-v3-17-ba42dc3fb9ff@bootlin.com> References: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@bootlin.com> In-Reply-To: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@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=10172; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=mzUB8fKisYn73ttObORXp2w0FKABe2mtx8ZlGqSAmIc=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBpSRlBipYlLv4Qb8tN3YPNPOVvntcZJD0YX7Ug9 00Fx57mSXuJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaUkZQRsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDIACgkQIK0uxlsQLOLCkQ/+OSIpRaEK8I7Kz4yBNha02xImzu1HjIP AWbaUzhtvc+74lqwXI24OVMX3zK1G2L5uN9KTJ49Tvw4Hb4Ltjb1Cce+Msf4t3THSLTcX1+Qioh vMxlhv8bzPH1gGQHZiJQBLvsGNgPrBa/RlrAW5jDxtcwTTxOHLHotkdl65aHLv4dawPS8Xk8zb0 68VRYlrIM+hjVG/s3llMezOYpCxjM9XUIfvJyr6IUsSNREE+XqR4vH1W4zHRxrKXl4y87Im7uiF ss/dhISUttiRynMffA2Q4tZ1OqCd7foce2/QcIGiRt5tE6JcUQfFMrk0SxQXN3jEicipGn8xVeZ +miGkhtjHO6sd1xFA3rXlh0dvxaJ6juDgIu+HqpHx+lz//e/yxTLs7YGieUsIMXffJYvANJ5cGs DrvuB80pp0lnxUqpRV6YAQJ5QO/dgQZNAsW39TCW8Odl9WIdH918E2mVtAJ+Bccq3VqvN6HlEX8 NFFCmrn7b27Dl6xmTBxJSEGAWOdpjEeSZE94mF8acfeJplSeCIjHvCWGLNqyaP1RjMqqT5+tWKf ADfNOm9zNFmFGkelFp8vMZtg+WnnFpDvH97UBN3VmMW1oeOadSX1SLdXUgD93gn5mmxvnhPFEo8 zPoN98dYz24luWO2H++ARB5YNpaP5Fw4ibg4tXwsvJI6Od+mz6ow= 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 | 124 +++++++++++++++++++++++++++++++++= ++++ drivers/gpu/drm/vkms/vkms_config.h | 51 +++++++++++++++ drivers/gpu/drm/vkms/vkms_plane.c | 39 +----------- 3 files changed, 177 insertions(+), 37 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index 5591e0baf1a1..1c97f952bf9e 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; @@ -441,6 +477,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; @@ -482,6 +527,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) { @@ -520,6 +569,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; plane_cfg->default_pipeline =3D false; vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_OVERLAY); @@ -650,6 +704,76 @@ 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; +} + +static bool is_supported_format(u32 drm_format) +{ + for (int i =3D 0; i < ARRAY_SIZE(vkms_supported_plane_formats); i++) { + if (vkms_supported_plane_formats[i] =3D=3D drm_format) + return true; + } + + return false; +} + +static bool vkms_config_plane_has_format(struct vkms_config_plane *plane_c= fg, 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) + return true; + } + return false; +} + +int __must_check vkms_config_plane_add_format(struct vkms_config_plane *pl= ane_cfg, u32 drm_format) +{ + if (!is_supported_format(drm_format)) + return -EINVAL; + + if (vkms_config_plane_has_format(plane_cfg, 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 bb2721a18d61..f268c3172217 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 encodings that this plane will support * @default_color_range: Default color range that should be used by this p= lane * @supported_color_ranges: Color ranges 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; bool default_pipeline; =20 @@ -474,6 +478,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 formats 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 6461cf025a27..c2854b2117d1 100644 --- a/drivers/gpu/drm/vkms/vkms_plane.c +++ b/drivers/gpu/drm/vkms/vkms_plane.c @@ -15,42 +15,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) { @@ -227,7 +191,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(plane_cfg), + vkms_config_plane_get_supported_formats_count(plane_cfg), NULL, vkms_config_plane_get_type(plane_cfg), vkms_config_plane_get_name(plane_cfg)); if (IS_ERR(plane)) --=20 2.51.2 From nobody Sun Feb 8 07:22:20 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 8E7613191D4; Mon, 22 Dec 2025 10:12:06 +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=1766398330; cv=none; b=skG4NTLcpEnoupKDcuAELkaBpPGcTgnWEzaiv0odhTPOoojxqYGiKSXXU9v6RROH6XFzRhHapQsroEGbdM1T6Ubr5+/zZF1Jf6sxxtEA23xoZ5gqDMeQiSygjbvJRgVt3FvGs3FLj26tp5g+VqCDkugMjPQh+zI21ij4PjfIxcs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766398330; c=relaxed/simple; bh=FXCbayNS2qadBlqhzx5IYbuv60BF7i9aXDaAtMTLApo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=WDzGQliPUc8EsT9RIbj9QZbonZE6JH0KfwWMRbqmyuls/CM73IB4SQwM0HiJ8cELjpUvpesXeaOJwZrtLvA3mxYLeY48ISohmE0Rpycm4JO8areqgqpWTIVVyw737+8Gry9xqqksekmfZZ0HfjPVUZvPp6dx1gHzGyILoPLv6WA= 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=cd+LMa7F; 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="cd+LMa7F" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id B3BA9C1AE05; Mon, 22 Dec 2025 10:11:39 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id AE5AA606C1; Mon, 22 Dec 2025 10:12:04 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 9ADFA10AB0194; Mon, 22 Dec 2025 11:12:01 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1766398323; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=+CdmJEkRK0OQbbG51djQaYXH07gnk1RrPWLwZqVPF30=; b=cd+LMa7FVFV6/72FhhiBDzgvpiL8tOjmb8xQA2JiOTDIMSHUGIbyH1gWQpm+5sZVshV4Ai eHPOtxN5020tIReuy/CX0j687CXRHUwFWaNG9QyUBOdfFqanv8E4quUvdc7raxFh4ZdYjM v66AHxKxuSWlxYRm+18BR9kmrs+81uesm4ZVTtw3qvECub7vvcT4ADQ7cjFZnu5bGAaQtl osSiNqkyEnLDLdsoGsQKe9rvBPX+2qSKoLceKSR6tAjU4KOjWpmmTu2x7cUZ1iQ3TTTZHh otJZZl1QUXIFAfKUwS9/DiryyRxr6+4JNaywm82toBAGcuQSeaC6ayRh+FJQ+g== From: Louis Chauvet Date: Mon, 22 Dec 2025 11:11:20 +0100 Subject: [PATCH v3 18/33] 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: <20251222-vkms-all-config-v3-18-ba42dc3fb9ff@bootlin.com> References: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@bootlin.com> In-Reply-To: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@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=11354; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=FXCbayNS2qadBlqhzx5IYbuv60BF7i9aXDaAtMTLApo=; b=owEBiAJ3/ZANAwAIASCtLsZbECziAcsmYgBpSRlC5GqbOkZVOhvK//jJGpjG+aXt6dWT9C5HX lX12YFU56qJAk4EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaUkZQhsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDIACgkQIK0uxlsQLOIU7w/1F1Gg7DgXCq/4s0xpTId6QxgjAwIVeC1 OTzqQUg6jeDQYMqBs09X88rvz5N+nD0IzG3ISNq9Nt2O1QG+iI5Bre2lZdCbPcLC2O9jx2joTbT u7amU119mzlMLYQlTALEx19/B05Ay3ofSSJvK/WVnUpYrbMR60GgMlmv5afLyFUKQyF8xNvQkw0 FkG/FHjTs6dw+EbylpALX6/tGmbgx7ZmCTKMAtIUYTZbUYcpPBE9vsWwZujSthbOR0OXSOh1bdT DJe5mwxMhjxfkLkrtxwEygd8u3GaYm6YlskwB49UuRtC2b6SwR8kmYYFV/FFsdOpasN0szW9yS+ G7PTAAll5CI2T4BPgVjaAhoa1yxYPwvpkvUH/xGNzw8bqf3ThrGc0iRYV7TZSgeQ/mng1H/dUbo ENupKN5IRH0Y5AYqJosFDriythvQ+0nXh0aYlVEmWu68ft9g9UmaJ7Mzqiui9TAo97UKglC+var Tfi2ucRgQxHley5tBnIDWZfbrlOgL6GWmRh8wgVg1T/h2qO7cMaQu3mld2OrefjMmW9MHhrrTDz gIW+R/dA5wIUZ/+ImSKowHqzY9GwQFfdTcoDt6HWIPf4uid1CvQ8LejrKmGgSruthEjxII/9xjJ q6MCo4c/9BugNDnlgi7CocoeAAziFPbOtc/Tmuz/BXtEYtX6/qw== 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/ABI/testing/configfs-vkms | 9 ++ Documentation/gpu/vkms.rst | 7 +- drivers/gpu/drm/vkms/tests/Makefile | 3 +- drivers/gpu/drm/vkms/tests/vkms_configfs_test.c | 102 ++++++++++++++++++++ drivers/gpu/drm/vkms/vkms_configfs.c | 118 ++++++++++++++++++++= ++++ drivers/gpu/drm/vkms/vkms_configfs.h | 6 ++ 6 files changed, 243 insertions(+), 2 deletions(-) diff --git a/Documentation/ABI/testing/configfs-vkms b/Documentation/ABI/te= sting/configfs-vkms index 2ace79ce848a..48f92538c602 100644 --- a/Documentation/ABI/testing/configfs-vkms +++ b/Documentation/ABI/testing/configfs-vkms @@ -153,6 +153,15 @@ Description: Default color range presented to userspace, same values as supported_color_ranges. =20 +What: /sys/kernel/config/vkms//planes//supported_formats +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + List of supported formats for this plane. To add a new + item, write its fourcc code prefixed with '+'. To remove, + use '-' prefix. Use '+*' to add all formats, '-*' to + remove all. + What: /sys/kernel/config/vkms//planes//possible_crtcs Date: Nov 2025 Contact: dri-devel@lists.freedesktop.org diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index ab0eb2f97fc2..15d62ad963c9 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_ranges +- supported_formats: List of supported formats for this plane. To add a ne= w item in the + list, write it using a plus and 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 d4d9ba8d4c54..92cfa7262ba4 100644 --- a/drivers/gpu/drm/vkms/tests/Makefile +++ b/drivers/gpu/drm/vkms/tests/Makefile @@ -3,6 +3,7 @@ vkms-kunit-tests-y :=3D \ vkms_config_test.o \ vkms_format_test.o \ - vkms_color_test.o + vkms_color_test.o \ + vkms_configfs_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..8d02c2c459d9 --- /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 + * @str: Contains the string to parse + * @str_len: str 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 *str; + int str_len; + int expected_len; + int expected_offset; +}; + +struct vkms_configfs_parse_format_case vkms_configfs_parse_format_test_cas= es[] =3D { + { + .str =3D "+RG24", + .str_len =3D 6, + .expected_len =3D 5, + .expected_offset =3D 0, + }, { + .str =3D "-RG24", + .str_len =3D 6, + .expected_len =3D 5, + .expected_offset =3D 0 + }, { + .str =3D " -RG24", + .str_len =3D 8, + .expected_len =3D 5, + .expected_offset =3D 2 + }, { + .str =3D "+*", + .str_len =3D 3, + .expected_len =3D 2, + .expected_offset =3D 0 + }, { + .str =3D "-RG24+RG24", + .str_len =3D 11, + .expected_len =3D 5, + .expected_offset =3D 0 + }, { + .str =3D "-R1+RG24", + .str_len =3D 9, + .expected_len =3D 3, + .expected_offset =3D 0 + }, { + .str =3D "\n-R1", + .str_len =3D 5, + .expected_len =3D 3, + .expected_offset =3D 1 + }, { + .str =3D "-R1111", + .str_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->str, param->str + para= m->str_len, &out); + + KUNIT_EXPECT_EQ(test, len, param->expected_len); + KUNIT_EXPECT_PTR_EQ(test, out, param->str + 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->str); +} + +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 7be6d10b2b68..a451d1122acf 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -3,6 +3,8 @@ #include #include #include +#include +#include =20 #include "vkms_drv.h" #include "vkms_config.h" @@ -628,6 +630,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 character 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 || len > 5) + break; + + page =3D tmp + len; + memcpy(fmt, &tmp[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); @@ -636,6 +752,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, @@ -646,6 +763,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.2 From nobody Sun Feb 8 07:22:20 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 4B3BA3191CE for ; Mon, 22 Dec 2025 10:12:09 +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=1766398331; cv=none; b=I6/rB8s+PQZQ1a1tWCRxBW0hOyhz7ly7iaLnLqsBPIvCoiFSDrlkLaU6kevUmlBRUqalBllnRiHOfjJh2CwbPkQBOGgUJIDVgbMQF1jSe/YYsjrgaAnLfR2/erGmSQoLFjWdNmjp+zGeKCAxE1WsCVlfrSqd8JB1s3xFW2vJMwo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766398331; c=relaxed/simple; bh=gGNgp7xNX8I1tSnKb8b5F8sjM7kP31NFBOBuYHhf1YA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ErHnzACVcgJc+J5bOERHtsimOXUU1N96REuYga+Go4UL+u2O64TV2FhR9Lz6a89zrMSsDf49kgbu96QJsthms+ufBQ35rtl/ZbmoSFDv+Fx3Rri1QtQaLt5oCtH0UrFVf0F02fSkK5ak3+ybtpO4aEtpqf73KqK5IxTWw6/ehP0= 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=NNrDIomQ; 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="NNrDIomQ" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 18CC2C1AE07; Mon, 22 Dec 2025 10:11:42 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 0EF2C606C1; Mon, 22 Dec 2025 10:12:07 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 4905D10AB019D; Mon, 22 Dec 2025 11:12:04 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1766398325; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=/i5I/GI6hYApVeEPXn4xiDPsvzwpR3K9s7zhvtoZ2/E=; b=NNrDIomQNnQN8m/ayvSVubfl+KL04Pd4b4hYbKy5dd4qcJyPLf/oeFsjoDDp6/U3E/AiKv bvf0qqpBameqoJlyFXkvVC9+F96VHZXcytCePQZe3PjS1wUuU19BgKOd+fkMPMOUUde2go pawB2xANqc9WSI8gdkenZ3uJP3E5veyAciP57Cszb6QIQBR6YiC7JnVKrJg2SVu/QQ9rV9 fbguv5/L1AxFN0i+oyfXTnjUmp9tOejLZwXYIQB88L0KDZMo/kYj6tLYhHLSDsNqtNfHQP MxT4in9b0Et9jejs/aRnNUR0bTFNIlQIuwnm++HGHhogHnLdrk5XNQnFy0jNSg== From: Louis Chauvet Date: Mon, 22 Dec 2025 11:11:21 +0100 Subject: [PATCH v3 19/33] 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: <20251222-vkms-all-config-v3-19-ba42dc3fb9ff@bootlin.com> References: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@bootlin.com> In-Reply-To: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@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 , Luca Ceresoli X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1576; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=gGNgp7xNX8I1tSnKb8b5F8sjM7kP31NFBOBuYHhf1YA=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBpSRlCtM+wm77OJKgVGtdAO9TEI5kIfVaA9oWuH 3+V2PKYzGiJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaUkZQhsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDIACgkQIK0uxlsQLOK0/BAAkB5ogctUFbmXg5hz0hjuDKK2LrWlr8T PzRdTsJu81Wu7z/jn+bk57wISBuiH/QSkYoyPOr5nQPPy09m9vNTRA7j2L3niTtdhw/AxZJ5L4T NcE6maSgSaBNCh4q5qhwk+c6RvpBqxv3TU9+bVA88P9txVUg+pdyuvFLQJvQmt3MpT7Cb6XT6uV LRmXVYcMlstwXoV//Q5lKeP/6GHx3z1vnUZGOELF+uO+16kGpsM7mFOUM5xhdPU3upeqVbCZWUh 3Ng1KejNH08U3wAAzV3POasGov7DzQGJRrNvNrOd2u2gAXuwRpJt+4BXNVYVuusoI9pvxFiP7Gk /Ljj37stjF+nfhT33yIkRA30amEr0l+k0DqnIbv7VYxHScdLEkoQYlf63n3EeAI3qeq/Zbulm/a ImpVy2t0ZyUxsBmQu81uAEmaNCbC9qTTSVuDF8Ke9MFKIkS38TBEgzGMeDXLSsST98CB2wrr7lw cO4JtU8x+xYTDE39bdg693jAJ51yp2rAUCU3G1OqaIihM2eoCztHMaiTDigBxLnM7ZuplaX6VG8 8p9GPbuzNKFOqdIt3p5HmCAZtstAJVdXI43Rt1+J0yal2L0Y9CmZ9MNhMvn6cl6Bnw/ExA01rNm qxfYhXHcBYTbqbhErv1lBrRoO93FqYh4UQywa6pnYtvxHIYPibQQ= 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. Reviewed-by: Luca Ceresoli Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/vkms_crtc.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c b/drivers/gpu/drm/vkms/vkms_c= rtc.c index 9a7db1d51022..ae0d3356dceb 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 @@ -142,14 +143,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.2 From nobody Sun Feb 8 07:22:20 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 670C93191C2 for ; Mon, 22 Dec 2025 10:12: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=1766398334; cv=none; b=lcEDT7Zne1KBtU7VyscEdfJCfNYbpn5ENlruM6Vs7TadrBjFZpl/8A1FbiqeCyo/lQiMFc72Pvpa8YJBTb7DMtB6oAPxqhyJVc3RKxxbtWCho5SNMpsk798FqUpCrdYbUMbL9rpO9ZH6NsL/CSS6aGeCynU5OPPN0MCmVT1nRMU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766398334; c=relaxed/simple; bh=G4Tpf8q7Y24uD2l0YnODPcYkZE27G4rAVPhDfLWtGNw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=sDOoBTQ+ipJ7VzIllNz3WERdIxg/KVaSzTsg01JzZf+6aFRQCkOiGFbf9TIip1pDZ97xlrHo04O/FGRJMYhmhC1KaonGqTScvx80dSQ5vRwavhUYsi1tePvJ4a3JI3Bk8efuxvDvBvLjFcmc39KlAAOd0DGhkgTvpvpUEe7Wz00= 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=GlGdEGhZ; 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="GlGdEGhZ" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 8E62AC1AE08; Mon, 22 Dec 2025 10:11:43 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 8BEAC606C1; Mon, 22 Dec 2025 10:12:08 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 3617910AB01A1; Mon, 22 Dec 2025 11:12:06 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1766398327; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=xvLQd0JOeSSpMev+Jo1w7ypMxeZlz/1ij+dcg9scFG8=; b=GlGdEGhZrYgluEDXC+SyJld2JlkgCYP1rTDb0sUcrG3sXxqPM3ivL7B3KYDKCnqxgoc2z1 N8AofIhz6wwKkSPQKuCKdsWErya6OL87GmM+CAgxoxEqN8ziKpcnkD5F/+ydMCZysABK3h qnzysOCfEqQ0jO45ztqbDJnSmy0DL/dh7vx2S7DUQOzc5sUv3vhzOkzGsOTX5U3sBjF87c pMHtq+wYwpNc99rw/gaMWs7iQEA24+ypu1arWjpR0BiA58sc3uagB5Cl7Mpcsl0KcNO6xu D7fEAr36xYDjBl6aN+Wl/m9xLXTNpHhg8oAC7fqSIcBxwlbZRylplJKYQjxNTQ== From: Louis Chauvet Date: Mon, 22 Dec 2025 11:11:22 +0100 Subject: [PATCH v3 20/33] 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: <20251222-vkms-all-config-v3-20-ba42dc3fb9ff@bootlin.com> References: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@bootlin.com> In-Reply-To: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@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=15427; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=G4Tpf8q7Y24uD2l0YnODPcYkZE27G4rAVPhDfLWtGNw=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBpSRlCMFkvSCJQOpZpU3UYBPwYAjAvZ63674Drk +uOr1FB8YWJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaUkZQhsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDIACgkQIK0uxlsQLOJpIhAAxloxb1c4H9ydjXG3aPwqOkBNJX8tfzA 2zf1Tz0Liz4rt9hgdKFZP5uNzH+O3BzBE1Y8NYA0gGO8p5HdWG3vcaF6kqmU8R0XDfeSwtKhxFt qdXfQD0/OPdek9rUj9E0jo2KolD38ZEzM0YmsCg98hw93XbMZ4fsBiq/qmszIvvkHeiVp0WZctZ UJfB3YaeZF7WYwkaSrc5ngB1cZOCs13qBhKd/BzoOqGhGnyO8Hm7/h8YfgNaejMwSwLI87GBTEf OldHMkp8iL6IhkJNCJMTw5h0cQBNhoVD4VrIBdLQimxoULe4kBIkxk+6hUBhB4Z4EJKQY/26loI 0OT1VI/mUpWzlowhtpo7rkgdJZ92shoJAjKCXxk3in2xZwowh1kasgWMM9+yjX6nHi9cjoE1Uyz ehY6cSC1KrAVz/LCFu60bw/CW65tIrbdJ02yZ2crfrnU0oxHwGikdnTDC2N1oOHNI1vt6kXh/4A 3j6cpFuET2pjdTE2Oe74C8du2l+qKYUX16aqvNWe0GlDzXIQGQh3PE449Ay2L5Y70yqwb/afFlV kMsA6tUvh428hn3+QAFLFguqKoOaGj2O5CeNgo9JjE/dnwDsKpoPtnz6nPyCw1G9z8xELmVJepD kG3e5m38usB4nVkTAwktDku5VtQfx3ZsdEUzLC47dwABmO2i5Do8= 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 | 89 ++++++++++++++++ drivers/gpu/drm/vkms/vkms_config.c | 43 ++++++++ drivers/gpu/drm/vkms/vkms_config.h | 143 ++++++++++++++++++++++= ++++ drivers/gpu/drm/vkms/vkms_plane.c | 10 ++ 4 files changed, 285 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 a88d8b4a969e..4a5899b8ccfd 100644 --- a/drivers/gpu/drm/vkms/tests/vkms_config_test.c +++ b/drivers/gpu/drm/vkms/tests/vkms_config_test.c @@ -201,6 +201,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 */ @@ -619,6 +622,91 @@ 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, false); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); + + 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 mutable disabled */ + 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 but mutable disabled */ + 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; @@ -1144,6 +1232,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 1c97f952bf9e..415556952b6f 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -91,6 +91,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)) @@ -110,6 +111,7 @@ struct vkms_config *vkms_config_default_create(bool ena= ble_cursor, vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_OVERLAY); vkms_config_plane_set_default_pipeline(plane_cfg, enable_plane_pipeline= ); + vkms_config_plane_set_zpos_enabled(plane_cfg, false); =20 if (vkms_config_plane_attach_crtc(plane_cfg, crtc_cfg)) goto err_alloc; @@ -123,6 +125,7 @@ struct vkms_config *vkms_config_default_create(bool ena= ble_cursor, =20 vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_CURSOR); vkms_config_plane_set_default_pipeline(plane_cfg, enable_plane_pipeline); + vkms_config_plane_set_zpos_enabled(plane_cfg, false); =20 if (vkms_config_plane_attach_crtc(plane_cfg, crtc_cfg)) goto err_alloc; @@ -253,6 +256,33 @@ 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) || + vkms_config_plane_get_zpos_initial(plane_cfg) < + vkms_config_plane_get_zpos_min(plane_cfg)) { + drm_info(dev, "Configured zpos value outside (zpos min; zpos max)\n"); + return false; + } + + return true; +} + static bool valid_planes_for_crtc(const struct vkms_config *config, struct vkms_config_crtc *crtc_cfg) { @@ -429,6 +459,9 @@ bool vkms_config_is_valid(const struct vkms_config *con= fig) "Both supported color encodings and color ranges 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)) @@ -531,6 +564,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 f268c3172217..9217097c0296 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 ranges 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; @@ -68,6 +73,11 @@ struct vkms_config_plane { unsigned int supported_formats_count; struct xarray possible_crtcs; bool default_pipeline; + 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; @@ -549,6 +559,139 @@ 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 + */ +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. + */ +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 c2854b2117d1..809ca07e5f69 100644 --- a/drivers/gpu/drm/vkms/vkms_plane.c +++ b/drivers/gpu/drm/vkms/vkms_plane.c @@ -214,6 +214,16 @@ struct vkms_plane *vkms_plane_init(struct vkms_device = *vkmsdev, =20 if (vkms_config_plane_get_default_pipeline(plane_cfg)) vkms_initialize_colorops(&plane->base); + if (vkms_config_plane_get_zpos_enabled(plane_cfg)) { + if (vkms_config_plane_get_zpos_mutable(plane_cfg)) + drm_plane_create_zpos_property(&plane->base, + vkms_config_plane_get_zpos_initial(plane_cfg), + vkms_config_plane_get_zpos_min(plane_cfg), + vkms_config_plane_get_zpos_max(plane_cfg)); + else + drm_plane_create_zpos_immutable_property(&plane->base, + vkms_config_plane_get_zpos_initial(plane_cfg)); + } =20 return plane; } --=20 2.51.2 From nobody Sun Feb 8 07:22:20 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 0A70531771B; Mon, 22 Dec 2025 10:12:15 +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=1766398340; cv=none; b=Azr10IM0wac1NMxQFxfDoKWJhXTYTT+TiUiUjIrjJHeBHaqibWE8DaKgJAmLAd/759o0ocvNclG+QTj73Ctr6thxE3effMuQgegkhKJnd7roVAgqiKekvdI7Px5bjEkTGz0ld8RjEDwj/h4pvZCVwCXWR8KxTjAC4qHPP19lD4E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766398340; c=relaxed/simple; bh=zg66emRQ9vJX8Db5mLafvXO4tBtRi+ohu+fCJI2oHoc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=kNIhExSj76edU8Oha8M1LC0Bmby1QeEfbv8M2qzhztAGtDtg5Q6VZhFYmGo67Td+JJ06oy6HBZlFjKcjraTFCfjxE1Mk2pN88zI+GWiojnXHK4OTkIQcLA9pTo6ztwJjKrsFQdPN6i+ruAGw3QszsRk0Z5zMj6mAGHR1mHRS7uw= 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=TGWKVPvY; 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="TGWKVPvY" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 8C8394E41D33; Mon, 22 Dec 2025 10:12:13 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 5FFD9606C1; Mon, 22 Dec 2025 10:12:13 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 0CFB110AB0194; Mon, 22 Dec 2025 11:12:07 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1766398329; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=LvPL07YQ2+ZbO1wTrUyzmuhR4CILGij69D3/1xLFg/k=; b=TGWKVPvYWzONttYZ2+Ug5ROaosxRRFDpyn9dyuewhy1fbWN98Ps/30yNwnHRjI+3hHKPne e0h9lN/EXYnhXQzpsoSkfLQMkrYD2ydt2kTcjc30AJ6971Yn7vghYpT2BWoFjK2y//IAGy wPFYApps4Uca+kjwFzJyCr8mvPiQl94vcObB0Eb0LzK2cPDL2dAu5G7SttM/Jhn6reqtu6 Z8gBszOE2S8y/8IoOYqv2uZ0rT2ntSU5Q/N45V62cxf1YTqbMG+kvp1b3LqjIgBXawWt5t 0iRYpwRGwBp7LJyQ28VRCtPsDj84An62v/q+hBk6eqECBdXLU7Y7XuK3tfqSLA== From: Louis Chauvet Date: Mon, 22 Dec 2025 11:11:23 +0100 Subject: [PATCH v3 21/33] 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: <20251222-vkms-all-config-v3-21-ba42dc3fb9ff@bootlin.com> References: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@bootlin.com> In-Reply-To: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@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 , Luca Ceresoli X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=9470; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=zg66emRQ9vJX8Db5mLafvXO4tBtRi+ohu+fCJI2oHoc=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBpSRlCeKdoP342N0jwBjUgZFHFtsi6hPJoMlwic craHDOaMoeJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaUkZQhsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDIACgkQIK0uxlsQLOIKWxAAs6zEXjqhz4ezTDqXyuaII/VQN7C85sR Bl6m8hEVI4Scp4gA/OSij8SBmk7yD7yfjC0YQN6/dHJHKrFkpSQNu3kTmh79wDcSdr4ShDIQKJY rVRFa/o7dfgDb1W11S+mTr1zP9QfHMzh3DaATTvidIKewFhW5E5e/ebR8qw9Ka/1vINsMgtt5Xj Ad6bMhYnA9AzEhoZ4V07HCzjFlYtfMUmKcIR9Rf9FuvGBBhgzd8MQnHppNvd68xvSZ7Cp1aCUSp hgEeMyFn0lSLS6avpZ9k3gKY/L4itpGd4BGF4wAhcq6o33fMHV8wL3Ciq5tjdITq60d1N5WnLHh TrfwZ2vweQMPrJAglILUuOEtC/8uXBaTtgnxgSqm4H5UTXkri8sRG/nLJd07bchq8n5AsbXof2U +rV326aZ1fFfHEe4BQ8mHYntnXIzfvJWfccfzagcqnR7+hrEhtt9e0Pl7BhXxYY9QBTL1yhmXIl bs2v/Kba74bZP1CfvXDyPWjLgqtkB5dhiY+o0bCe3lxb0b92z21u2wyU+u2E9cJ5lKc5S75lOKg eBtYPmZRIk6xIuJGrVS0BxGgooVNw1XsZf8EzFzishSNuVXEJ8H4MAsq1jpM+Tq6yq5b0U5mQR9 mXDEA0CLnb2tDgWnmkc+4dOVwVmjwedgkLfCdMBIr3qeCh5Z2cQQ= 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 - Minimum zpos value for this plane. Must be <=3D zpos_max - zpos_max - Maximum zpos value for this plane. Must be >=3D zpos_min Reviewed-by: Luca Ceresoli Signed-off-by: Louis Chauvet --- Documentation/ABI/testing/configfs-vkms | 36 +++++++ Documentation/gpu/vkms.rst | 9 +- drivers/gpu/drm/vkms/vkms_configfs.c | 180 ++++++++++++++++++++++++++++= ++++ 3 files changed, 224 insertions(+), 1 deletion(-) diff --git a/Documentation/ABI/testing/configfs-vkms b/Documentation/ABI/te= sting/configfs-vkms index 48f92538c602..34cb6aeec411 100644 --- a/Documentation/ABI/testing/configfs-vkms +++ b/Documentation/ABI/testing/configfs-vkms @@ -162,6 +162,42 @@ Description: use '-' prefix. Use '+*' to add all formats, '-*' to remove all. =20 +What: /sys/kernel/config/vkms//planes//zpos_enabled +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Enable or disable the zpos property. Value: 1 - enabled, + 0 - disabled. + +What: /sys/kernel/config/vkms//planes//zpos_mutable +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Create the zpos property as mutable or immutable. + Value: 1 - mutable, 0 - immutable. No effect if + zpos_enabled is not set. + +What: /sys/kernel/config/vkms//planes//zpos_initial +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Set the initial zpos value. Must be between zpos_min + and zpos_max. No effect if zpos_enabled is not set. + +What: /sys/kernel/config/vkms//planes//zpos_min +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Set the minimal zpos value. No effect if zpos_enabled + is not set. + +What: /sys/kernel/config/vkms//planes//zpos_max +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Set the maximal zpos value. No effect if zpos_enabled + is not set. + What: /sys/kernel/config/vkms//planes//possible_crtcs Date: Nov 2025 Contact: dri-devel@lists.freedesktop.org diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index 15d62ad963c9..791c4f33a90a 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 immutable. 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 minimum zpos value. No effect if zpos_enabled is not s= et. +- zpos_max: Set the maximum 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 a451d1122acf..e7f3ab54b5a1 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -744,6 +744,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); @@ -753,6 +923,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, @@ -764,6 +939,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.2 From nobody Sun Feb 8 07:22:20 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 EA0FE31987D for ; Mon, 22 Dec 2025 10:12:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766398345; cv=none; b=bmXfOR7OpHAe4cD1rzHHHQthLDrF12JizyXvVrtWiPDb808UHQV6QD/SW7ebrIzPyeHYR1EMxMhuq1OkLqPFb6XE/oDdSwHeg39e1jCkM9IQpCmeg5nhT8KNvoqPeiXCpurVgtyZjV2dEEx24vvX1Zdc+ec59Af7jAvUK4SRXSo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766398345; c=relaxed/simple; bh=EOBH4iD1ljiTsBNfMWOz/Ca2Fgpv0a45jibbXua09dU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=DmHZnfYenuK9oEz7bW1l1vC/F/ye+jvRQ7aI/vbkkQWf7aF7oB10n99mSpzfB1NDYLDLgQoGIhwtK94ZPPjX2rS4d1gFISzFx7hxkzZarYN+64z7iijPBtC0kDnq3HdJYYLwxeZ+iLAwaJpqgZ325eTowacJ0DJTP0vDKg3rUYs= 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=ih/ozC0H; 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="ih/ozC0H" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 752C6C1AE05; Mon, 22 Dec 2025 10:11:54 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 7181F606C1; Mon, 22 Dec 2025 10:12:19 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id D4C1910AB01A3; Mon, 22 Dec 2025 11:12:12 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1766398334; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=Kk3DFisA2S1uhDJWNKTPqbuCuU55HoSJ+RHftyHOqPw=; b=ih/ozC0HjamslOYxzGQgSFQg0oKZqLCosGsGHEAIvNXAQ6zW8auhCZKSTOlm6hSPHDJ64P oWwrLu23y0kgJPTOxVQIHHMZNrYZWiCh5r5+diTRETIL5+DQSK0hXJnPcRUkSNMTZfyTyo ET3bakxJe8pIOfetiNnXKQkid2vrhctkrw0bRN9gWNViJPMu7WdQjtnrtR0TsqiTI0A9l6 Pmn531btJbgKXLj8+nGWVB8XJLkf4XlseCrayz/eXgDMVlI/WAXGHc2UTHYSTtp+cqd1bV 4pdOWbqTV16VKYwUwiuNSd0tk0dpYl1vJHAQKLSRIDrJ/ZZxDRd3JdhQNj8uBg== From: Louis Chauvet Date: Mon, 22 Dec 2025 11:11:24 +0100 Subject: [PATCH v3 22/33] 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: <20251222-vkms-all-config-v3-22-ba42dc3fb9ff@bootlin.com> References: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@bootlin.com> In-Reply-To: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@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 , Luca Ceresoli X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=6761; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=EOBH4iD1ljiTsBNfMWOz/Ca2Fgpv0a45jibbXua09dU=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBpSRlCfvOyJFGBsvAiWCrcdMcu+ZgmEQgUFnRke qx/Q6KD86yJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaUkZQhsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDIACgkQIK0uxlsQLOIUlQ//ZcrG/XN/6vwbUN7GpeykDsvVCr8z9RM F3io9/QwAXbKCDd6Aq3ThBlWgrncNXAmXi5ml+6XL6qQi12G1qNf1D3kD7KXffvromwyhzatUhD Gy+FkVIv7G1wxmW1Cdonvbbmy8f6PLtXa5YmAqHFb3QLCJ22bMl7ezXmg82eBWBalY9ecghdQwZ 5zS204OT/ou5TsUtMokUH+fzbSAFQSuJbi6S2MLSaqlj8JFZzWXCp4p7S1oyFDXxX6x9AiF26kh iitrwoZEiKwaa266vl9itysLhqqX+SDDaxrr+mLVmUH9yHfD73O1nfLUc5DWG8+uQqEY4DGzgBp KVMZ1Lme8D3F2yaqC+H2wX+T6+oly0GSNUYHHKxSL9BrnRLx/5YvddDK5VrmKehqqDwo1vb0Nts Ze03HNIeTPoS5J2wjXISdsfP0odabaCdfXXuHfzL+jlUwW5jwLEmbKNOyQnO2Eu0BYP+KV/EPq7 PtM6oSKzirbZcmCpwGxqa4MzDyLnUmzzLV29IYHISCmRqa4V7AjlD9gVxi92cwuUs3RkMSfc0qq Cf+R0tqKf2IAVzX9MfWvXkgUsB8nONFvqPbMzSLySRq/RPgw0o3I8Fs3HE875XJwcq4lVUXq0N7 egxmM/JmdZ7xaCWwTVGSKNOtkbkp/gjWNxistO6xNlKGgSgyf+eE= 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. Reviewed-by: Luca Ceresoli Signed-off-by: Louis Chauvet --- 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 | 4 +++- drivers/gpu/drm/vkms/vkms_output.c | 2 +- 6 files changed, 39 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 4a5899b8ccfd..1900cc79db2b 100644 --- a/drivers/gpu/drm/vkms/tests/vkms_config_test.c +++ b/drivers/gpu/drm/vkms/tests/vkms_config_test.c @@ -137,6 +137,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; @@ -211,6 +212,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 415556952b6f..59ce55efb167 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -589,6 +589,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; @@ -905,6 +907,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 9217097c0296..4a4058b407e7 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -129,6 +129,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 @@ -141,6 +142,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 @@ -343,6 +345,28 @@ vkms_config_plane_set_default_pipeline(struct vkms_con= fig_plane *plane_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..33253d29b1cc 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) @@ -24,7 +25,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 86ce07a617f5..1288c8551bc8 100644 --- a/drivers/gpu/drm/vkms/vkms_output.c +++ b/drivers/gpu/drm/vkms/vkms_output.c @@ -97,7 +97,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.2 From nobody Sun Feb 8 07:22:20 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 8894631AA82 for ; Mon, 22 Dec 2025 10:12:26 +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=1766398348; cv=none; b=ImSrE0cI3/v30dvbT1qX32oUkDAmQQxxqpsrM94U/ew7o7Srs0jkvHX5IP/mLH61EUDp0EB7A91u/QkN441JzVu/Czluscof7ACPUvtJYPdKkl9I/PsveHZwRcYXZOfyN5hrDCPenT5VkMUye89P7OtYhM6mp1vVDjLKSdvuIaM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766398348; c=relaxed/simple; bh=YfhHPCBRadtLDnNh6hkyyciYwfxoCIh5V5YD+cL4HxU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=UPCZyLfWHAXPgJdubo1fuwql0TE5nLmWnURvcVY79vD63nVgbshiVN/b+iasRGK0s1IxgoSyfoTviMgyfer32Tw+Dv5uvavv+0EmY0KZqg0yweL+tjB9SCYUaoULSPi+vjnqppzMTLno7Q062d4OM+sYuwT4q4yclbNLO7apad0= 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=AT9a7Bjs; 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="AT9a7Bjs" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 28579C1AE07; Mon, 22 Dec 2025 10:12:00 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 235B8606C1; Mon, 22 Dec 2025 10:12:25 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id C51D210AB019E; Mon, 22 Dec 2025 11:12:18 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1766398340; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=2cObqjoFfW7734SjxgtP+ltDMD9c+ams0J07Fvg4daU=; b=AT9a7BjsTitNatmwcQ80DMAxftQfySER1x1nOaLHFQL5qjKDdf7ojyhVQ6YQDLIKQaUCPA Q6rLLjTDg4ZVC5ERIML1k/TnxfwJfPne5UDqwW567hm2dVmo4Yov/B2zYbdhQ37LWEbKU+ B3ZLlq9JQ3BetZbvyu79C/bY+uOWjOkvZLUgOpbQJT6fM9Gbh7TOlXEOOBudMhsTNyo9yR 23US1wLy48AVDuwhXVuUU+jyp1HFJNlCzeLRLxw988hZef2dUdm31/m/mhkazddt/ST/JR 3ntbAyHqQG93SFEvwXxtwR6BONF/bCUkVZOS+XlAAdk3emVufebva0D1m8XACQ== From: Louis Chauvet Date: Mon, 22 Dec 2025 11:11:25 +0100 Subject: [PATCH v3 23/33] 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: <20251222-vkms-all-config-v3-23-ba42dc3fb9ff@bootlin.com> References: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@bootlin.com> In-Reply-To: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@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 , Luca Ceresoli X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=4190; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=YfhHPCBRadtLDnNh6hkyyciYwfxoCIh5V5YD+cL4HxU=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBpSRlCEvo5eXQjVmXy2NXcs3egEbysfYRulNVMO qNmF6LeJpeJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaUkZQhsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDIACgkQIK0uxlsQLOJqkxAAiGQIfm2wq87Dav2MEYQlo+0UY+6XM0f cNhHcMwZU72X2iMslQop9CH2vCJtctx2clOo4dPU6rWJTdSwGCtfnJoZ2pK9yuOxeyNrP6Trnxh ZEFHfTn4qEsYZOBuaB7iUR+y7Vg+zM1F1pr4kShNT7kD8Wk96ry8qIjetA24Bh6PD5ci0ryWwD3 Lv4owvJayUAwGdFBvsBul7XCLDW0pz22c/2x5pRHwuZHQvBM+LpVxv8jQNC6LikmAB+rO1x6qVP ChJC7yYZBzJAaztOHMdq90GuCEc4pa6IH0Y9saK2A1EckxQfH/hDxgD21GN2MGKoxIhtA+CliI3 vherv2xNMWl+2bBi1JWr0BjKUMdWyUCYD1U3wSeupMm1PIwpzOgVyFHrw7WaRqi1SWxJt1giALY XK8Q2WsUmutN8bX5oF18slzua8Q7S+/an74J0vuivyMlnbg6hoMjkSyFolw9QZpSuhCqhwQ4CwA hDtWP9XuT3nSNznwlg0PFA0NmNQUrcFyDllvPU2ykUIES//oy6KkEBAPyNJ/J6IcVqj+0Rm5bPx oROKMM0HNafas4Vhx5zBhTukJsO2ELgdOL5MNRChXojxrI1nv5tT9U28PbeV7RJb/54jy3XAZ9k FsFTbXUGg4hFyLUsqzhtmCPhBIko9zbMEm7iVeiKnXR/aU6YP2fg= 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. Reviewed-by: Luca Ceresoli Signed-off-by: Louis Chauvet --- Documentation/ABI/testing/configfs-vkms | 7 ++++ Documentation/gpu/vkms.rst | 3 +- drivers/gpu/drm/vkms/vkms_configfs.c | 65 +++++++++++++++++++++++++++++= ++++ 3 files changed, 74 insertions(+), 1 deletion(-) diff --git a/Documentation/ABI/testing/configfs-vkms b/Documentation/ABI/te= sting/configfs-vkms index 34cb6aeec411..5452140cc508 100644 --- a/Documentation/ABI/testing/configfs-vkms +++ b/Documentation/ABI/testing/configfs-vkms @@ -33,6 +33,13 @@ Description: Connection status of the connector. Possible values: 1 - connected, 2 - disconnected, 3 - unknown. =20 +What: /sys/kernel/config/vkms//connectors//type +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Type of the connector. Possible values match those + exposed by the "type" field in drm_connector. + What: /sys/kernel/config/vkms//connectors//possible_en= coders Date: Nov 2025 Contact: dri-devel@lists.freedesktop.org diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index 791c4f33a90a..41c6f4733663 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 e7f3ab54b5a1..d6a85d6c466f 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -1170,10 +1170,75 @@ 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 -EBUSY; + + 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.2 From nobody Sun Feb 8 07:22:20 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 80F1931B123 for ; Mon, 22 Dec 2025 10:12:33 +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=1766398355; cv=none; b=DEZylVkQIQAadDcy0kHljZGHsrdO5QL5/Jl+ZkwPXlsV7q9+eLQFKktlcgvXuZJaNG4hLWnvQLFbzoB2PEjt23YbozxKpgYOw3/q1P0yij/3NfmjIAKKZK8QBhg4vVjF/gd1OAp2DV2loAkSoQ5tKl1IlZ9JU6UE0OXuxzaeR1Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766398355; c=relaxed/simple; bh=KnGxFis/5j2zHTEy3YIbGEDRffhNaf3bRQz4h6vtkb0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=jt5ziNSNjO1sriukJl0XI/IkbOwwbP0HBklMwagw+Ll/Oxt0KxEkxufVLEjfLzzdgttKh7U9eXpvQkvC6IRi9yBh5OIfJT2xeLePWmcsDrK9fohh9P/wr27Z1Kd4NuQklG3kbDUyoXZmXbNIT812yMo27iwdzQgozWcwotiOows= 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=Nk4eLxdT; 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="Nk4eLxdT" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 1A32A4E41D33; Mon, 22 Dec 2025 10:12:32 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id DFE8E606C1; Mon, 22 Dec 2025 10:12:31 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 9924B10AB0199; Mon, 22 Dec 2025 11:12:24 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1766398346; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=eL8Crh30dL9IlFxIAQwRgzxl5mvrGNMvjII/yDEj1rY=; b=Nk4eLxdT99+QMbI57xFNy+cINopA8trUBDYj2lJAHdoGMMwAKCsE4NYKFPpjdolwvwuIFb roP9TL9pS/CO/r86p+P5dj4jqz/E+aJrOMhnHUntTxoHTBwwIT/7LDZ6DOF9+sj4bVxGx5 vqdgKyEbDYLonLeCCrHGNijQUG8nefr2HbKEJgZJZlPYan3Go9mHl97yMhYwH+Noz+Sk2j 2WLMmvi6ChwekfdrGp4oV/r8WnnwHR0wtJT6q8n9jFi3XORvv9JVIif7hzm4AzKCStOZSJ EtyfWq6NGJJPm1gTWI8ZHY2wV+FuvDx7k4em/wxLi1Zg23++n0e9/PRa/R/KQg== From: Louis Chauvet Date: Mon, 22 Dec 2025 11:11:26 +0100 Subject: [PATCH v3 24/33] 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: <20251222-vkms-all-config-v3-24-ba42dc3fb9ff@bootlin.com> References: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@bootlin.com> In-Reply-To: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@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 , Luca Ceresoli X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=723; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=KnGxFis/5j2zHTEy3YIbGEDRffhNaf3bRQz4h6vtkb0=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBpSRlCYv/2NRWZPHdZgmTWGcYb5Pn/WYdMRpHdo iKyp80tFh2JAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaUkZQhsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDIACgkQIK0uxlsQLOIEPw/9HqbUC85b5C6fdry/ocb+5EoGqJzOF6w rV1sShl+DPjDUcEt5wi1SPxnsV2GS8WdnfqhQbeJ8j4jCiCBWSSsoTo5PVJRwRXAJoVSXR6XJDk NPVToqHnNX0sjurwlNsTqcdoFI9ayz6ijw2bTiiwVO3aLKjNuupoWaRChkQW9dORZQhtHzD1YyT iNswO+sRTS86dtGEwX90XUpqxikF6q/KR5RydRHMTGkMaHWQTC8MyIuDY3yNIVnjseVd+n52y9R mqoTutifW4rzoLDbIzxuKMB4oV3gskytGggvnHMLk1OtqGAJtXWUP8W1qdRfGpPGsMycENxbvZx J0ZvUEY3ItC0/D3oDHt4vGfRFo1vY+mJ4DNnUlHlg4H+5BKFkePv/Y0f/H2u9kQSxXkSzEnt7SI lSQRf5pWa/mRDFnUILNZSKXIBSdqPR9pfWWj1uvwU4F2l/UuQDOzMfC3+oBBa4Ie3cU73dVyzoy urVohNTmMOK4up6XbLg2vvrxxjBKlGgepVLAc08XYCCRxUBjAZq5C2NGQVwhdQ/tToOTnVHMazw KReEHGhqtTSoo3xBUMu6Bm3SQWId+TZzyzTsIO8gEpGX4Uukoc0Quwkm+LVUUrt09s18f2P/RcC eoKAYzakxZxfcMugbxhGDrAzQP0v6JgH6PoFzs0AD+/DyWSrdWCY= 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 Reviewed-by: Luca Ceresoli Signed-off-by: Louis Chauvet --- 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 4d6dc9ebfdb5..77c2fcd4f222 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.2 From nobody Sun Feb 8 07:22:20 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 7B57431B130 for ; Mon, 22 Dec 2025 10:12:35 +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=1766398357; cv=none; b=Ey6d01T8d3q3nmdsu7T3uLTFPpZ32iOYxUTCGD2wssGhr/Mw6BULIR8/0nudpMiu0hKrBxdxmyzA0vE+fMP94Fs7t18KR9OVVt+l9xi0in7zHr/qRHmR6lu87dKgnrR5xkHmvNJFpgT+uUYZDg6C7e+RrnLZbuqqKGUGAdADLJA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766398357; c=relaxed/simple; bh=Yhwzf6/7jZni4mNzAuhgG5kLyTe1klV7qjEZI8Tn6Zw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=bmM7qSyn0ZbhaaJpDqmAOaLiP8VrNLQE0UIAHntKArXbdySaaF6G2ewYv4FB6k54PGBWPcoBCHd2FDI9BLoaq4JprNUxSPXIrq8OBmypkc4Y68ml/lV7g8NK9ZKGo6QT8YgXMFwR6W3l3bITNw8DVUR/GvjlZ3XcxvVRyAL4n54= 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=UiZnQI3O; 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="UiZnQI3O" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 2450A1A2374; Mon, 22 Dec 2025 10:12:34 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id EC88C606C1; Mon, 22 Dec 2025 10:12:33 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 6AC5210AB019E; Mon, 22 Dec 2025 11:12:31 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1766398353; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=yTTRbpqypHIqE7M/6uF9YUabZ9LYuBJ9m2GDLJy6KX8=; b=UiZnQI3ORk2lEkFtOTr7Nm80+TZoFLFmPXtLBs1Qr2IOzxSLvI5K9kASBN583wwyLzfMTm +EYcqqj11iMJXXE2yDeuILusGEjgXKpwyecCEoseJXujsM+G25LSdQWNHQKXtKPohD+1rw oYRdDSTJar40A++kzNmnabr2k7a6s11xqdXghrxuoLf8d3usuKP8vWPSQ42yirFVPfYsDH OLdujj920oXwjnk2PANyv2W+xTH/GkiCJM6vpYI5kVrZloNfuTa2eRTdQKZvuwiHaR6MEz TURoN1MsJ6FyVOSgwLnCLXlIIpYk5SbsjXM1SHuLCBAakYkR7RrpTfaIG46WLw== From: Louis Chauvet Date: Mon, 22 Dec 2025 11:11:27 +0100 Subject: [PATCH v3 25/33] 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: <20251222-vkms-all-config-v3-25-ba42dc3fb9ff@bootlin.com> References: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@bootlin.com> In-Reply-To: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@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 , Luca Ceresoli X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=6094; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=Yhwzf6/7jZni4mNzAuhgG5kLyTe1klV7qjEZI8Tn6Zw=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBpSRlDBpM2tIi3K/VJMaBMK2Qe4Z1N9ZDziA4st sj93DQf2qyJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaUkZQxsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDIACgkQIK0uxlsQLOKx8RAAzLmc9z/1KSW54y9zSfIxxsNN/mJUG7O iTLirycCQhSEjLMRoSd2xzotmRg5nqx3qyTipHBrNioMBOMhKa4wbjV0N6tuECzJINvod7J0Inw sHw8xJvDTrdhrEb97f46fp7UwNxPXhVCO4/JI6fVkcTCfhpJFQPjYaqN5jAsLwobgmemJ18W/gu iq725svhUJshtCkvz9vkYrn5wftaAcLG12SWzlt8MK8nb29zOjNbPsrk1GtRasgQ5TGfzI0zJ8d DSa4XaJeUhwEhVRYVT+gb9/4ix17PVnJrKVAM4mBZd5Ewd3wfm7XWWhlc0a/twtk7qZZsIN0YHF xf8vH2gGXCaDni3hgtEkSIQ9udLF9Nvu7QukovTmjzGQbvrQfQoFuLLH65QZoCuP0upZspJuZPJ u30U5kgF4Uc199nlwF9rmMH33mDPxuHPJkBj8sTslb2ZW1XnCJZKLd3pOceTVnalA+sqUIpqXXf 6SbQkCUWXu/ZF85tOtmxXpum7gcHwfSDrzOqzGV1wYUZrMUZXvKOqWzL9ivs+ZcmTi3VgXh0gr7 Dx9rfMGGAkzodIRWdsNaWsBqZ6bERwk5z30mz85mVBnLCzEQbVyAtVw3NWbbZjPTWfzMo9ShacA Hic+I2erHUiN9nNGcQWFcUmOZsFNbvqbKvLlsNURzJ7kVAnVYTXQ= 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. Reviewed-by: Luca Ceresoli 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 1900cc79db2b..a31fd230c1d4 100644 --- a/drivers/gpu/drm/vkms/tests/vkms_config_test.c +++ b/drivers/gpu/drm/vkms/tests/vkms_config_test.c @@ -215,6 +215,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 59ce55efb167..de661c85c11f 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -591,6 +591,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; @@ -908,6 +912,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 4a4058b407e7..c9d777589cb6 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -132,6 +132,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 @@ -144,6 +148,7 @@ struct vkms_config_connector { =20 int type; enum drm_connector_status status; + u32 supported_colorspaces; struct xarray possible_encoders; =20 /* Internal usage */ @@ -243,6 +248,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_MODE_COLO= RIMETRY_*) + */ +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_MODE_COLORIMETRY_*) + */ +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.2 From nobody Sun Feb 8 07:22:20 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 1481A31B823 for ; Mon, 22 Dec 2025 10:12:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.85.4 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766398358; cv=none; b=UrRhw701ljGOALXK8m663/WlNgNy8XRcGYcYaghNT8iO5/j1SNZbGvTj4qcr5z/q5OjqNMhbGh0QjsGCo6eZom0+AeSZTi1EOaVQsIANctC69hfs8uQrdrG6WIVlwWKV2PqHZxQ5tH8vT+8TeSvehrjuNI33Zp7Rn34yjQQcsOM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766398358; c=relaxed/simple; bh=zNfRFxKJmGCWDW0RYX4Fz/88QHBhgC3Pcntft5M0I1E=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=o7fQnpDZxadhC73L9q8DuwthQIlCWsJ6fJRpMT03YMjQy10wsNw3IAvaKbk2dZLoAqNMc7+UdV5QRn375fH9V8R/b8PZpAJP8ZR7HEuF5GlFy5WdEqIQSmXto+C7DhszUO2fAEAfNA73r8HuxknoU/PLnO6Akg4W9Ste0w0daHw= 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=H3/gjMiy; 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="H3/gjMiy" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id DDDC64E41D33; Mon, 22 Dec 2025 10:12:35 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id AB2C1606C1; Mon, 22 Dec 2025 10:12:35 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 688CC10AB019D; Mon, 22 Dec 2025 11:12:33 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1766398354; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=3rDioDZW96sB584fik+FAOG3Tfu7GIllXvDUIad2QaU=; b=H3/gjMiy1Ah/0o28KH6F8ewKmPS92fchHI6LlHR6bEjCsvnaybUE2vRe5oD7A6Fk1ztL8j LSDWLJiU6CQZTS3Qsi992tS714usPg4k+dgs7nhyyeJC6EITK7fI/9dl78W8TlBOfGekWz oBxsSfLArza5C70r1SYf1+FMbE6UCwVeAKBfxryZCHZ9cUYNjZRMkq19p9dqWOk8MAkAOU WO17rFaoGYJlr1T+KyBsVt+PJMR6tnFUdOiNTlr+kvkcfXZWa0Jfn3nCtW7tDdPvimmiPX 8qaGTuFE7IQTP9FU38+wUprGwx6fcr1fChcsbcKAfPQEAZH+pWlMLW+QN90FMA== From: Louis Chauvet Date: Mon, 22 Dec 2025 11:11:28 +0100 Subject: [PATCH v3 26/33] 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: <20251222-vkms-all-config-v3-26-ba42dc3fb9ff@bootlin.com> References: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@bootlin.com> In-Reply-To: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@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 , Luca Ceresoli X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=4154; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=zNfRFxKJmGCWDW0RYX4Fz/88QHBhgC3Pcntft5M0I1E=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBpSRlDMqFdQIhDtPFad62IvTs5XqevUfd4TbXm2 ozE3UzmGp2JAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaUkZQxsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDIACgkQIK0uxlsQLOJRPxAArNKk6uHmRocRHNqJy5a+Iy7cMLJm6TW OKehyBJ2bvrrbW+8i33Ef3ehLPyn71gbdqkN2qO3bNvUoSzDTdIP3+EV4ceaLsefNRt+uRLmALw 02DRivgqFxLbbqkLEREtPXhbMF7ipDleODNk2C4tviZvKhnhz3R9Q6O15A8XJ4TitrDTP2TAhDM yG9A9buLOxeiezxgKcBtH0Yza/+TARi1r1L2Y0UGVWW77/wQ14ZEcr714AD1E5m9KE2BeupoH0D fHQOuF4mLZkWUSSZAfeTstaS+gOgOeNrHpxDMETXlnmM7U3OWSIsm3EAaLcwXeidwuRLeu5q8Na lxuccMqYNTd6obEGFK0NUJTIVTSu8ic4u6fSApKfUk0kEIJ/0MXmZsRT2NKovWc+Qi9KNhCsncj fRwVkdUP4jtP2CVvlW8VJyAtYFnnx8/i9eNCye8U51CV3SvFfYk3sL75OyPn5pr0oqLh4moevqb JdrcIiVUnu2UNJcZ/FrtXCWez2pswo5rc4XAlendWMwcrogtZw+bL5Bk5BEYSyJh51gA+vQ2LaB IEp7RzUL/66iGY1A5DaWlGtEAhJoMEjWe7mOmU4vEX0PPq6PH+geZHZt0pHgLCMMFWLQwJyhTnq TFYP/8BOtMtZbTmWanfxpkstPhioR6AmNamqiD+m7QGirTlaWgOg= 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. Reviewed-by: Luca Ceresoli Signed-off-by: Louis Chauvet --- Documentation/ABI/testing/configfs-vkms | 8 +++++++ Documentation/gpu/vkms.rst | 7 +++++- drivers/gpu/drm/vkms/vkms_configfs.c | 40 +++++++++++++++++++++++++++++= ++++ 3 files changed, 54 insertions(+), 1 deletion(-) diff --git a/Documentation/ABI/testing/configfs-vkms b/Documentation/ABI/te= sting/configfs-vkms index 5452140cc508..f750e616be54 100644 --- a/Documentation/ABI/testing/configfs-vkms +++ b/Documentation/ABI/testing/configfs-vkms @@ -40,6 +40,14 @@ Description: Type of the connector. Possible values match those exposed by the "type" field in drm_connector. =20 +What: /sys/kernel/config/vkms//connectors//supported_c= olorspaces +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Supported colorspaces for HDMI, DP, and eDP connectors. + Value is a bitfield, where 0x1 =3D NO_DATA, 0x2 =3D SMPTE_170M_YCC, + etc. See enum drm_colorspace for full list. + What: /sys/kernel/config/vkms//connectors//possible_en= coders Date: Nov 2025 Contact: dri-devel@lists.freedesktop.org diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index 41c6f4733663..1c4a8023374c 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 d6a85d6c466f..90bf6e6995ae 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -1233,12 +1233,52 @@ 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 colorspaces; + + connector =3D connector_item_to_vkms_configfs_connector(item); + + scoped_guard(mutex, &connector->dev->lock) + colorspaces =3D vkms_config_connector_get_supported_colorspaces(connector= ->config); + + return sprintf(page, "%u", colorspaces); +} + +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.2 From nobody Sun Feb 8 07:22:20 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 AE03331B839 for ; Mon, 22 Dec 2025 10:12:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766398360; cv=none; b=Wkc+dgM1wsbN3NhDWomAepOGOe2BD6G6ocWSjqhZyimjpyB353AEFNkwxJTvxr5G2aeiUwoS6Ghdzxb8MwdrNs7nor7pnb9J18RA7RUIUumhKPidzzL04zPPKFECpIPNuz6dm/kZFOa0sPn2UUqwpbIhbSa01mDDLvsekc5Ym7Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766398360; c=relaxed/simple; bh=BfLteTu4ChSbOOTr2xOxDhpRJ3PHmliineAJdLfTk7c=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=lbYzWGpAHTlcO3OVJ+lS/qLk5qLnGq+w9MzG0RXbkuTLuLpf/IjmKNnwugra7taYLFDvIV//4u74v0cDqDulrLd5Moek5RR/+Arkf7r+rRGFAxkPOo+sBJ168BErrS263kquwoyf7FBIlVfbsGWcBBFDkFz87W7vEvoWPnFhMbA= 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=OfvnbxXR; 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="OfvnbxXR" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 81E6BC1AE07; Mon, 22 Dec 2025 10:12:12 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 7F2C8606C1; Mon, 22 Dec 2025 10:12:37 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 2794D10AB0194; Mon, 22 Dec 2025 11:12:35 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1766398356; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=3cDzwNfFz6fNJ5eho/y4cU3G2RQLRw/Hz5ZRCsyS2xQ=; b=OfvnbxXRR730sMIwok7EE7AWBMXLjvnLuDkBHcUC7ftPQx8SOUuBwzz1rSMUYvW51SnabE qJrLGfpC/7bfhcufo7z1ZF5JeY+i/PCHnGQmexXK2+1DL5sS/VOMxnZ5+AWhu+KadfhxUy SuEBN/N0RZmbEE66IXtgs+rBvH98LWnUq3Qs3FJdVW+GlduvS3PErlPtklaSJmQZ+/zXJJ ggw+AFQ9i0TynnKYSjpQPQukE8JasW7yaGzk3xpBxZRxfiQcdD6laX4YsDw0I4TcARGPpK amrvUvAeuRtx5V6+RfdarEJ0EYSKfTzPeP4OvB/gXZ7GDndZz1vHa3HzlSMV+Q== From: Louis Chauvet Date: Mon, 22 Dec 2025 11:11:29 +0100 Subject: [PATCH v3 27/33] 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: <20251222-vkms-all-config-v3-27-ba42dc3fb9ff@bootlin.com> References: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@bootlin.com> In-Reply-To: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@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 , Luca Ceresoli X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=8106; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=BfLteTu4ChSbOOTr2xOxDhpRJ3PHmliineAJdLfTk7c=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBpSRlDsp37MH1mpiFTxeXalTsopL7xWJ6YsRytI 71LSJt/VeyJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaUkZQxsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDIACgkQIK0uxlsQLOJgbhAAtAK1o49wTVgmw1hX80Hkcn+hNJBxIDU 7t1neuyObIeJaXHWrCoEddLbdyk04MHIfZIVuDEigqvfWu1nQSFgmD7stljezF2Hs4iT862a0db TkOhhMgyb9f2ihFmZwBWh5feTVMYj5jcWzu8faXG1t3ECRCWvXK2apqjVLQ152OmSzYmSq8kAhx Qmj/ikPA4nyFt6Kcztf1zpBcOIgInFab+A2AJgCtKYUuSsfLGWtYTsZEIbXEzhWeAu4azSfmufm cxbrlFqevhL8pyB/Eg4hLVvwQeu744auL/7RB53UZfqoFikswn7kI9gfzA19pzkvUuAGQUaZ+Dh xwc/emX1feaaxIUBdrT+RBHmnrGctupPpNBt1e5OcJLOsevpFh195SIHANBou3uGBsCcHefqjzS 8q4ab3suW0kRe56bH58ml/OUr4xJ0XupzrUCy+NYm3GA8Z0hG9WOOzE/j6J+i3kKXiXddV7bKcp NDTyDP8aEX1TEXc8NUgEbc58sV026JCvvWWzh+U4e8T5PqW6u5G87LBf7BTTvxwIh2EPzgIEO0E GN0iXmZqeonLQ9AfUYVi6YoDYPeIbU+h881BdAIVszIYTKUz8jg0poxRRhop2S97eMejjDUTCmX DbvEtdtx1OvefVoSGasGQvvW5KOId+ZGY9k9K1UHzm4GGWM9C7sg= 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. Reviewed-by: Luca Ceresoli 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 | 50 ++++++++++++++++-- 4 files changed, 129 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 a31fd230c1d4..2b49745ee026 100644 --- a/drivers/gpu/drm/vkms/tests/vkms_config_test.c +++ b/drivers/gpu/drm/vkms/tests/vkms_config_test.c @@ -218,6 +218,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 de661c85c11f..adb1a384c122 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; @@ -595,6 +596,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 c9d777589cb6..7cca1cc130b0 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -136,6 +136,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 @@ -149,6 +152,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 */ @@ -273,6 +279,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 and @edid ignored. 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..c85d19013720 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.c +++ b/drivers/gpu/drm/vkms/vkms_connector.c @@ -42,13 +42,55 @@ 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; + break; + } + } + 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.2 From nobody Sun Feb 8 07:22:20 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 4189A322B9E for ; Mon, 22 Dec 2025 10:12:41 +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=1766398363; cv=none; b=kNv0U0rc0H5fpgQfyXakHMgXqtpd6+Vc23gsCrxYnwDAyuuM0OYnJLHzH7/qqbsJdi12xh/R6cR5QYE7RqZpggIUG+QNuZlZmN1VkCjEnCpe1OYm1cWqReJzOSO7vJcl3GGFZ3WgyeIVN0PMlq19tRXzYPVz+y6kKbLlxFSGEDY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766398363; c=relaxed/simple; bh=cl8tG4qtFzsCp8zzIFZIkraQNRqrm8LmoP3yMF+oXaE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=W4BWLq1A9OxaqH1shlFTpde3+g/KyNABDBkgpnYCj8zfIJZF34x/5WF3c1UVo3jZUoiaZtc+MXhNmc3IZrU0sQ/1ws8+WKAqKXweb377RB5z9zLwfxyw0nVT+ePYEIaSvNseNNSJ6gh0aBsxUcIxHUeKH9YqqRniiDBeHs1/xqM= 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=CR1sNsc5; 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="CR1sNsc5" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id E0CE81A2373; Mon, 22 Dec 2025 10:12:39 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id B6CEC606C1; Mon, 22 Dec 2025 10:12:39 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id F1C7110AB01A1; Mon, 22 Dec 2025 11:12:36 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1766398358; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=leEQUM/D0frCB8WsJTkJzyoJM1iUZ4sosJdWRFn8k1k=; b=CR1sNsc5mMDY9dCd7wq38cTs4u/4aOSD/55b2u0UzUWKOJgyURLICLoeROQP3daKVDnTrU 5v9311XQnFx1KE0SWIPJzUjxRJa48mFSVLOTglWHwt+oRQ8bBwy+jWRRmrcbt09Gnk3WOQ 6gFGxKArNZcvMdWg+IjlHXAHdbtpvh1/XQh0yhdhBmEOPLcqC0NdAk3TaOXAVigs94EVPa fmaNWlyjKPBZrBM+QlIWKF71EGONSgGk2ufAFsj8c5Cpb5oIFvrzckUbnax6LgYuJFix2Z 2vpCdPdmg6xCX3Df+obnhYJ1cXXPFKZfEFiHhf0oZMUtrQYeX5oxHjGcpNrz6w== From: Louis Chauvet Date: Mon, 22 Dec 2025 11:11:30 +0100 Subject: [PATCH v3 28/33] 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: <20251222-vkms-all-config-v3-28-ba42dc3fb9ff@bootlin.com> References: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@bootlin.com> In-Reply-To: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@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 , Luca Ceresoli X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=6440; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=cl8tG4qtFzsCp8zzIFZIkraQNRqrm8LmoP3yMF+oXaE=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBpSRlDdxpCFERYmAaf45qESPVSBWxU5pI4HM+J7 noGn52eLz+JAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaUkZQxsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDIACgkQIK0uxlsQLOJXTA//YBk7ddaHabqwQrBzB3gRtpI5qlbv29j b2QO8/CQe6Bvm7ZRvbj0nxDTMKmPiooUrqXoc1IMOqBNRP01pyPnmh4jRQR5R8HcD8AZ/rNf7tX nrS2H4TdJNwRlxCUnuLQHMfuJo8EOi4zY7/3RD7+6XaGG2OJqSVg+g+3Wa//nNiz97b8xXDIPO1 xalTjDN9sTAIwhgTFNpmzvR+zyXV3cGXWOuW6lmbFgbXdYu3HgUPHhCFFUXWzCE/XLmY/HRhYOr VtsNVYdlCnVumiNutJgqqtZSPmMmukXK95Pj8Lb3LGSDTk4HW2YZUon1dqaaCM2pMlDCKWmiTu1 T7rQgsLzYFoJue+HiR/HIyMFHcSrs98jQmFolg4GNv0g+bPxCCl0ETr0G6FwydjUNZkwNBUvW+5 ya2UTIpoJVmEay36dgYmtqN4Q2g/4//6dIJriE8Sf5ATNvmxOMaqWKZhdyL//TkyO41CNJt7zCH QCQ4A8gThXJVlEAb1AdcZyxX/oVsP9bV6+Ls5SftZhckWMXHEjN9X9qh4mBWxcY/+QQVAtAIDz8 Ly5wIaZP1CdLvod7FSAEwuWiSVkEWPQYSynmaAWTV80rGnlZzH/tSd3t7x2dxILjbFvlC5Ov0BK 2f7uLkTcin26ChnSimDnOkKI1+fotO+1iQhsFQT791e2tbV7yNlQ= 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 EDID 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. Reviewed-by: Luca Ceresoli Signed-off-by: Louis Chauvet --- Documentation/ABI/testing/configfs-vkms | 14 ++++++ Documentation/gpu/vkms.rst | 5 ++- drivers/gpu/drm/vkms/vkms_configfs.c | 80 +++++++++++++++++++++++++++++= ++++ drivers/gpu/drm/vkms/vkms_connector.c | 3 ++ 4 files changed, 101 insertions(+), 1 deletion(-) diff --git a/Documentation/ABI/testing/configfs-vkms b/Documentation/ABI/te= sting/configfs-vkms index f750e616be54..4061ada5d88b 100644 --- a/Documentation/ABI/testing/configfs-vkms +++ b/Documentation/ABI/testing/configfs-vkms @@ -48,6 +48,20 @@ Description: Value is a bitfield, where 0x1 =3D NO_DATA, 0x2 =3D SMPTE_170M_YCC, etc. See enum drm_colorspace for full list. =20 +What: /sys/kernel/config/vkms//connectors//edid_enabled +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Enable or disable EDID for this connector. Value: + 1 - enabled, 0 - disabled. + +What: /sys/kernel/config/vkms//connectors//edid +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Content of the EDID for this connector. Ignored if + edid_enabled is not set. + What: /sys/kernel/config/vkms//connectors//possible_en= coders Date: Nov 2025 Contact: dri-devel@lists.freedesktop.org diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index 1c4a8023374c..60367fd1bd65 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 90bf6e6995ae..20f5150e8b24 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -1271,14 +1271,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 c85d19013720..311858727175 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.c +++ b/drivers/gpu/drm/vkms/vkms_connector.c @@ -143,6 +143,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.2 From nobody Sun Feb 8 07:22:20 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 C7236320CCE; Mon, 22 Dec 2025 10:12:45 +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=1766398367; cv=none; b=MkjpiD49NFCtY4V3IuBJLFBswPtOE54T2ha4vcx5Qgx4nRLnbXK0gXq/PP1hV7out8piskFAUQJ+V1K1OJW4I0HUm3ILyzajM280hYiksOXD1+jSLZWXWRlaqjNarYKg0r51Gw6nJ2j74CA5I/f1p2LN7bFlh5Q6YiB61Qufo/Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766398367; c=relaxed/simple; bh=1hrPKI43Pz64zwGLv9pkMTEkwrfJC8vNHY1BYpuVT7Q=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=V1bX1BxtLZZ8RRdqoxJp4mxBWCyp32mvxJdJJFjfm9GkcWh5KOYAcJIw3n2OfTuTUNqM1PSPndznzzYO0CpKhIZh9RAOxR9s8inw68VwHGFqiScTXGro7IXStHx46zmtMB6+/YAkzfPNgifhJMXx9DLd6tYfksCfqjR2uD6W72E= 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=tMfSr/Ot; 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="tMfSr/Ot" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 4992A1A2373; Mon, 22 Dec 2025 10:12:44 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 1E8EF606C1; Mon, 22 Dec 2025 10:12:44 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 36F0B10AB019E; Mon, 22 Dec 2025 11:12:39 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1766398362; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=3NUf0Nhrlt0ddoQz1HjmdPJ6+hVyvDbUTv3nR22W1zY=; b=tMfSr/Ot0LXnedVqyU5JNM+n5Ep2VIdYokPa/O6T3wwCCg+Rrjav1qHdugrW2V/Zk0ZevC yZTgRqHrQDwzZYry5ngAnx0Z/fQ5THxgsBpUd4eQrQ02/gt2bbJbTOyB48uX1R5z/SnO9m eE8U434UTeS0d+R0QONSXl+JrNXtDLbEfgiRTROe1cM0/S/qtfgU9Bdz94vySuCrbWKnsY /Hu2Fyo8XTlhHFCS3gfSP0GDQ3OWOR7+3ypqQ53rG+BwptW+Tw04VFdsMPJ5PRW3gWE69q HkH3Tzmr6TLMd1bUKnwzJvy24SUCLTS6Vy8VUBQ7RS1oWVHvgZPWC1sr826szA== From: Louis Chauvet Date: Mon, 22 Dec 2025 11:11:31 +0100 Subject: [PATCH v3 29/33] 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: <20251222-vkms-all-config-v3-29-ba42dc3fb9ff@bootlin.com> References: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@bootlin.com> In-Reply-To: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@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 , Luca Ceresoli X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=6556; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=1hrPKI43Pz64zwGLv9pkMTEkwrfJC8vNHY1BYpuVT7Q=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBpSRlDXSe5RIDSOy715xc6x1+AA9qlhduZUnRfr hWeSQkulTCJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaUkZQxsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDIACgkQIK0uxlsQLOJfThAAoscpiaJSLMKE7tYT6o2VK5yzjGzyfwU L+2NpDU134pf7WKD5pdPHzbt+MCPTyiD0mGj+neydVPSzRI1TsLbmmJDkk680BrTKdrvzkOH6Uv cksLzcpDkK0sR5UXlJgngxYvxexMrroBHcg53RCdMBxHkXRxbs3QX2avDazz2uYdKK918EOBWNQ hFgh9cHc8GnXL7OO/OV8lBDjCCU9t/fpqbRFYf7yv7no54Q6XOHvVCnQPV2DWjDU/ZJiFOQt9iG KIijyTaVt52pAPrXKIYyxecs3+4L7ZdtMVV+wLLpN6ftQNXKIKCHR6Wuuxke4F8Xk8w4h7KIpF8 Vuad7jBJAVFMmrlDBg51wRqwXBAv/dgnSrm5xQTj6BU1hbq7JfMTEo0MMN0sbvaH8MTSpv4jfU9 MDzhz8WV1lkmaPM2182IXwLDZJxeHDAu2Fzi+ppUL4J4mRB5FeC+/pPa3wIN5glAZKSkliKVz0O M5NKlhlXWlghz25b0q69idL52ghazGgTXeN22hPyhi45thP5VR2WIDcMqho97HxPtcwusitG9HU 8lqV/gjCQ5qWIJ/LOTlVM4OskOOyOl+ZM59Rlczmw0Qbh8DKIwjlJZCDWVYbLaKt8nERCo7RwJO Oz7MwtffALu5JgoYhdeaJVHgrzdB9BgQO6COm6xfrdtnjjURJtlE= 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 Reviewed-by: Luca Ceresoli 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 2b49745ee026..fda23f05a0a5 100644 --- a/drivers/gpu/drm/vkms/tests/vkms_config_test.c +++ b/drivers/gpu/drm/vkms/tests/vkms_config_test.c @@ -220,6 +220,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 adb1a384c122..8abf9efc12e6 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) =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", @@ -601,6 +603,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; @@ -919,6 +923,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 7cca1cc130b0..281434628e0e 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -131,6 +131,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 connector is currently regis= tered 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 @@ -150,6 +152,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; @@ -193,6 +197,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 @@ -471,6 +493,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.2 From nobody Sun Feb 8 07:22:20 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 4B3953148C7 for ; Mon, 22 Dec 2025 10:12:48 +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=1766398370; cv=none; b=dx/hZ6ZCl+qYQDLeRV0YX0zP7Dcpr+HekvflXjNGMCK9Nsy6FLVT2AESdS04vJ71JXICbdqXz3nv0/g0AXuXOT3yatR+npM3usi9VLWzTm4TFM0Y4RIjHEWxcE98wn51HsLLy7Mr0QUBYWQLutuBBiCmxZLd9PcQelYzjJFmdbo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766398370; c=relaxed/simple; bh=V/+e1zKI4sX8lqdyAbtlaxr1nfQRLxcCFIcUk2OVYxQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=KFWUnAoQ8WIS6QsxsRZDXFIR4Vt4QgcDlbCSI15n/VikoDDdHFnHOsff5jS1TqHPOl05lw+NLh5McnU5IjUnwxfmLtqmfO+dX+3axc3aZcWrdAIh+ZkFpL4fmNq79U9abMqYTZEmTGqNp6GaIQ2DBzHbQJDJurUgWTIroBKpDws= 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=1AfHk5l2; 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="1AfHk5l2" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 03338C1AE05; Mon, 22 Dec 2025 10:12:22 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id F25BB606C1; Mon, 22 Dec 2025 10:12:46 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 8A05810AB01A3; Mon, 22 Dec 2025 11:12:43 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1766398365; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=gvdZH6gGBykKk6CN6i1s7cZc+6EPuOT+mmajVf0RNVY=; b=1AfHk5l2SsMt70cFXOCdBJC2HMNvKiFSKcRbWOCAtoQBv7ZTYmWnjU205fX5WGvyQ105Gj EFF2Sbbv663amS7PeCBL/7RuDTfL6EE9zUTowjlx3fEJ7YuSryuYwcefpSWiZZTQ0sK4Ed FTcmMrGe9mDfCslEajVmY55QvZgXR/34GYjgd6ZJty+B6ILXzMdFkMp2oWGS3GpA08GMYR +mbkmhnJtLT7kx9jrHMa29fc37S49nFq3K+qkpp6DlqmnFArE9YhGXImP8g8Q+WjKEXJb3 sUko6VZ7z0b53rOM0RXbjNEOm6rqpO8kizuA5Jt7AfFmQwj/vCR8htuARbIxzA== From: Louis Chauvet Date: Mon, 22 Dec 2025 11:11:32 +0100 Subject: [PATCH v3 30/33] 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: <20251222-vkms-all-config-v3-30-ba42dc3fb9ff@bootlin.com> References: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@bootlin.com> In-Reply-To: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@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 , Luca Ceresoli X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=2889; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=V/+e1zKI4sX8lqdyAbtlaxr1nfQRLxcCFIcUk2OVYxQ=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBpSRlDphUscokf1eiCZ2vgNVfSNct+s7RRZqc7h x4aYelzmFaJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaUkZQxsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDIACgkQIK0uxlsQLOLpbhAAha+Iuj9NzBYBF/mC20878EOQye8EFCV dn1BDFJuIsIZmuxcQcO/2vyDvbxrAdbKQDnh9RU7c38J3xt2OhMRFSVpYU9GVT/xEdObIF9Dc29 jsKtGoATWPblExsS/rmtr7BD176w026qOtiI4q4krM6AcRWkF2CHHu8RiOUrVYl4HBi3bmNhCMx lAi6S6lse1VsrD0dwkhJXp7uoBXqphnbSL8EHKDwru3LtCkoKRFcCNFtPy/anf/HBN5XAFOPFJt JJ7GugKrUrf4UyfCmOj3OiAk24xl7ilWzjwnV90WY4kvFGChuZJXFeoLcbpiy1NMl+BQ244vSVn GAT0+/8WeW/bYFz5SSLQuoKlG2QhDiA6WHk71taz/UgzPqn2IgUAGg70X2dX3mpwnrexSqjAFeS i0qhJEBqfCncmky81n+QRzpdyQDAnmf4PMyek0i/bNuW6YC/NYWWHcI30PDCyMGISzGgfAmG0+V RiDXv+eC716vRjSojGiU5nWOhhJn+UdNlHuY092ox3CFsIzbZFo4KCi29vYcwNgDlt+R/TIWbJ7 1eGQcCSLH7oEfKfO+H6TczcfvBU4qA4ZSF/f5AfJlK4Cz1Ix9bMGGPnuYYdcxr7J7Xr0KyEbKzw Gw6vThpOfZIkixBTMt1Xml1E8djqOwx8EMxePJji6YuSF4Fi21eA= 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. Reviewed-by: Luca Ceresoli Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/vkms_connector.c | 4 ++-- drivers/gpu/drm/vkms/vkms_connector.h | 6 +++--- drivers/gpu/drm/vkms/vkms_output.c | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_connector.c b/drivers/gpu/drm/vkms/v= kms_connector.c index 311858727175..211f11c8473d 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.c +++ b/drivers/gpu/drm/vkms/vkms_connector.c @@ -110,8 +110,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 33253d29b1cc..85f9082c710e 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.h +++ b/drivers/gpu/drm/vkms/vkms_connector.h @@ -19,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 1288c8551bc8..13c4ca5fd39d 100644 --- a/drivers/gpu/drm/vkms/vkms_output.c +++ b/drivers/gpu/drm/vkms/vkms_output.c @@ -93,11 +93,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.2 From nobody Sun Feb 8 07:22:20 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 5A2A7326951 for ; Mon, 22 Dec 2025 10:12:51 +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=1766398374; cv=none; b=ez3bQzKQsxeZTwkYD4fOii4ekRjPaQsJj5+cFQ/uwzI0nKWjuCHtkcLaMr1mX4UvAE81lsfFcy5mEZxuKKOONUQY1T6/4Aa33LFF80CrIOTV9qi+YH2wxfKpiH5XMa35/nKljwKGeCA1ECh/0t1uAZnCDev1q7LLf/Ix5oy/0ZQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766398374; c=relaxed/simple; bh=yoSv2zmqsM08XpGUmJQS+2SLpyZ6XFDF5YGQcog13kY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=TPxlkpb7pCHyqj31d4iF4GJrOUBArIAxU0tTTSjdsnd8UcdTZgTtMdnn4H7UCesLGCeERHPwIqwnmF6qSpCZZ1ABnEAVv6H3i1GxR+jiimaD4icLf8wwq0jQJOOW3zhew6QGFlAX3TZB1m8VK2fLdjFanI0A1VT7ThD2zrffyz8= 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=bsl812Fd; 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="bsl812Fd" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 8CA3E1A2373; Mon, 22 Dec 2025 10:12:49 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 62C16606C1; Mon, 22 Dec 2025 10:12:49 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 6169C10AB01A2; Mon, 22 Dec 2025 11:12:46 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1766398368; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=J5RVBRf87Z75m13rh/8P2VEYGRdPDGtnY1g07bc3IJY=; b=bsl812FdCqEO+N+0WJtuN6pshbab9NIO37B5AcT34pIR5ccw6dx67sUxawso2fHS7g9YE3 F8R9CTWPyUvbfRT5zEGitaCHVlrn+6f/+JEXbvlcwacnEDvg++b96z/VYjN9p8e/08nNC6 1XZqddx21C7rwD2Wu4fHONEtB3WLr06zM/PkWxeqKH/+2brT6e+GQ+k/hcCIP8XEU0rOAn jMOs0dI89iVMufkY5l7XSJc+NbrP0M7sFN9dhGWZUR/SOKFoR1CXE3g3APQnUTrz+fSmNq Iypse/EuXXwtQFvB8MuHM7vsJsvalz1pLvDTplt9ldTuXSsGgiBlMDC5qrdDhQ== From: Louis Chauvet Date: Mon, 22 Dec 2025 11:11:33 +0100 Subject: [PATCH v3 31/33] 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: <20251222-vkms-all-config-v3-31-ba42dc3fb9ff@bootlin.com> References: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@bootlin.com> In-Reply-To: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@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 , Luca Ceresoli X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=2829; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=yoSv2zmqsM08XpGUmJQS+2SLpyZ6XFDF5YGQcog13kY=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBpSRlEJCgtE5ARQGGmxPsWE4yqYjRrHcDbYsD3m 2RJNzKvn+GJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaUkZRBsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDIACgkQIK0uxlsQLOJnhg//bbmrzzKtS7SA6vQs1AyEkPLg3GEepj6 gSsOyymWjglj1v5udl/3z/bALIQASIcW6vH69RPGEEIzWlt482OZENL2GkcdbslE2jg1f9iES31 sOHe8PJyq2Rcrfe9s3a9IPPWUr2+4HWBzAjANtitFRF9thuUF5P7x61ZVtaTj6LDazMfWX46z51 GAZgVvKk1JCgeKJFeZyKLvVaAmIzp7FMvRAUL69sLWKPrnUc7GWx7JcpH18IL7CX+PDWiweuLff A0BRWWU0wgxVQv5s/SZ5PRPBvqT4KVIoOxZU6XBRdkKIPL5tryvmkBTdF8tUI8nVUYytmxDMfbW oz8wn8EnjiU7SiREn4mxFWyp7G4oiy2cpUl70zdWij/6OovZevC9Lqht7G2/NUZCUqzTfRZJfdx MgV1aSV50lqPoQEWyELJa+u+idKM8RCzzUDYMW8Ez+1u104XTS1X3lEd8Ke0SbrzMZMDVrQsflP hgsA7on7FyNbs7De6mE+1i0OHJaSL+VLtAbH5VmU1S8wG7ZDRCGVha+JTzxTfZ3b3I6vYr+hojj ZU3w2K+V9g6FjwT7YKgTQVR6TxzvdsjBMJCarDZRUmnul3zs8Yctim4xKPeq/l3K+1Ff6bpzMjm SL6Z29kGAaUPNiOy1+j4VStn5MExTC94kBgatHyVWHfza/nfgzeU= 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 Reviewed-by: Luca Ceresoli Signed-off-by: Louis Chauvet --- 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 211f11c8473d..3ad614642355 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.c +++ b/drivers/gpu/drm/vkms/vkms_connector.c @@ -110,22 +110,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, @@ -145,6 +140,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.2 From nobody Sun Feb 8 07:22:20 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 D095D328257 for ; Mon, 22 Dec 2025 10:12:53 +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=1766398376; cv=none; b=aI6NeTDDCUhbyI2chjz/pFuR+R7mkYcUmu4ZH3gQDTSwAzt4hGxpPWjEEVXZcjSOLhEQaVQ+FD7VvrXq4mlv7eo3AcNlLSQxIIdXg//vqzSxbcvhD9d4CqQxziLfjEM9Z0byvM8RW1uKEyopz1QljlJBBKDQaqoedhlwOoDwaNA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766398376; c=relaxed/simple; bh=2WE6lrzqgr2rCNqCgI40uchmGUNbk9xLaNdA11sdE7M=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=IyDBTdBob1JpA//bsm9Nwh50L0RCmaiWTF81+VAkXcow4f4l2T+C9EqhsfOuR9fIv+ibsusNch1cAESvTNEzR7SSc/xMxWrGuHzCxP1KE8KzEY6Qaf42fxY9HaQwwsI6LcNMfvGC0fMn4NQGgIeNJtmMDqUpCeu+p09WGTK7X7s= 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=aAqRDjWq; 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="aAqRDjWq" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id CAB7B1A2374; Mon, 22 Dec 2025 10:12:51 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 9F686606C1; Mon, 22 Dec 2025 10:12:51 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id DAF5610AB0199; Mon, 22 Dec 2025 11:12:48 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1766398370; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=zTVxelzVCNuhZPYTj04Vug2YyxvhIBL9J1QfsUumizQ=; b=aAqRDjWqYeALPuzRJcK/RLliPmBxKcaziOCzerWMCgTrLZG8+iWn4j5zRQ9NJ+hJId287T uMXC/rooO+zZxF6DUNWBDd7T8cnMOrT+rxY7zfclsGv5X0I9a0ETwUBwnuWcEytRxvIvnq 1uZhcEywuE5pDFIvVKBg5v1UMO3Tc+R2O3QOZTwnvdxT1j2vkVcoITDRewvuEB3+BcmgaC 4i71cvqBu2Lb8/VHzalIS3qDVjV6fUyDZcEnINaESFb/2oDKr1wjEdyqatSMsNAGMiq1YJ LSHA1hrzFDhlvjjl2+mRTyBLhfB5s968g/aLfHXYUmqTn7RhvLWG8HCEgSGcYg== From: Louis Chauvet Date: Mon, 22 Dec 2025 11:11:34 +0100 Subject: [PATCH v3 32/33] 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: <20251222-vkms-all-config-v3-32-ba42dc3fb9ff@bootlin.com> References: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@bootlin.com> In-Reply-To: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@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 , Luca Ceresoli 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=2WE6lrzqgr2rCNqCgI40uchmGUNbk9xLaNdA11sdE7M=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBpSRlEnESIUlIlcMfuzqof2lJt/w0YhAI10Mhn9 rU0dEGCAGCJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaUkZRBsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDIACgkQIK0uxlsQLOJkMxAA1HfTAuanWpUbRLyXmZF9ZUIjJOnPFR7 xaIablR9LKhCGRjsza3pPIen4VIF4K+dqpsKFWvqDG9zcpojf6dp7oHaqSyG1I1o6NXe+LVVcLP yvQXUnpSxE5nX8Opm9FmbHKG9VS4KjHvXJJIIgt4/+rIzzheNoTpRRfayS4X1oPV5wEcQbZn0ks iwKqvdXuvIZZrZgZIDT8xkgNdcF1DB4Libl1E5SRgCzJIdYJnU5wmK7rg/m6kAgb3xRXdqJVhXf uBFcSlBhyYqJuzqQGKkJS3Vng9iCqF65RK55h/VeikTTBScGMbMdx1zqrn8zfMxAJ0O7zq+bcY6 9azsOsGmlaHSu/baWDNVCsbu1y2lqeoU1X5ugyaeRhqecMLqVfrtuAFvaoPW4Uu0pO7I3pC/wFb N9qgzrFarLbLVwh23pZ3axDMxqZ3QYjdjVzw2GU5nvBYAtW3SHclORSpib8x5AcoKybketNu2Pt ZPgyyPEEOGxuuspIpnx4MkkrZN0vWJR6mPQ9b9bgKm6bXR83ym5jM50OFIN/FV0mLm0Cse52G4K tsHbZQ/zT9KLr1RTR+OX7N5RDjSpyYPfxgFB3KIbHyC72/X2/qAInmx6/gq8aKS6FONxDBsUpig FPiuphFDrEObTYPkRBnNxz1AVddYnjuvJulxaqe4GtoqgoWEzPak= 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. [Louis Chauvet: use drm_atomic_helper_connector_reset instead of drm_mode_config_reset because connector is not yet registered] Co-developed-by: Jos=C3=A9 Exp=C3=B3sito Signed-off-by: Jos=C3=A9 Exp=C3=B3sito Reviewed-by: Luca Ceresoli Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/vkms_connector.c | 81 +++++++++++++++++++++++++++++++= ++++ drivers/gpu/drm/vkms/vkms_connector.h | 33 ++++++++++++++ drivers/gpu/drm/vkms/vkms_output.c | 9 ++++ 3 files changed, 123 insertions(+) diff --git a/drivers/gpu/drm/vkms/vkms_connector.c b/drivers/gpu/drm/vkms/v= kms_connector.c index 3ad614642355..616036494937 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.c +++ b/drivers/gpu/drm/vkms/vkms_connector.c @@ -163,9 +163,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..a235a518d5a0 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.h +++ b/drivers/gpu/drm/vkms/vkms_connector.h @@ -34,4 +34,37 @@ 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: + * A pointer to the newly created connector or a PTR_ERR 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 + * @vkmsdev: Device to containing the connector to be removed + * @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 13c4ca5fd39d..50f7d88dee8b 100644 --- a/drivers/gpu/drm/vkms/vkms_output.c +++ b/drivers/gpu/drm/vkms/vkms_output.c @@ -117,5 +117,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.2 From nobody Sun Feb 8 07:22:20 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 75D8A320CCE; Mon, 22 Dec 2025 10:12:55 +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=1766398377; cv=none; b=qgZNCxOQa9KEWiIYqQ3v6s52hRnIs60iaaR10ejMx15PCB7+sdsJqZ9ceAy6DdmxhM4kOTLRHq2aPBS18cEq5VLqTfg4VRMxPHqZ2trObS6mbo9BEoXCoiwothLGTXae/wqkqPkOjmSU0uIm8Yp6NXgVhnY+QmhB99FKTvdQJKA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766398377; c=relaxed/simple; bh=CQ0/S/9cst10jdT1raGe+Cbx3RfiJmqTSkt4++S4h+c=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=PYodNnh1TQJwobJ8ig8gzuqFzSRjgsGEyZBSTDTNlx37f65vIa5AJ6kBpC8WkpRJ8iu39CCNZnaQ2z5XenhK+Oxw0TeTv38A9/HjflQg/8EP0RJxKTaP4V2uFkEaUn3bp14POP7OwCRBBEuSZqJp8EhnjrsBzfcsTAtp6r9do6A= 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=01U2YD76; 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="01U2YD76" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 9043F1A2375; Mon, 22 Dec 2025 10:12:53 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 66AAE606C1; Mon, 22 Dec 2025 10:12:53 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 05F5B10AB0194; Mon, 22 Dec 2025 11:12:50 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1766398372; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=q2BZJOx9U840k1P5Q6/3KlepJkyEYaoPhkPZJmzsmow=; b=01U2YD76sGykg2VkPzEGsjuemDKyUX/nOij7eFZ21tH0L1TzDOi/ZztllnW904/iDICeDd nO6Q4fYAIxhQYCZlQyZAiSJlUrfI0gByiRVeU/WMCqUNk02WWJPM9xw5heFCgX8kUmjiwy tbdRcF/6Be/AUuXWC0t9fXeIiOwN5zrZ7sqQku0uzx5856ha2e5/+fU2QOvmAC92zBgVOC 9p7P+/A8mIVF7uX6art4XZGNZJD2THccnqLz1MtlLoVPUTlH0XVlJjO9ClI8rSA3ASHkQk f5CIq9O19U+hQELqt+qYeR4JNkq/h1YI9gEtyiYsPW995Z0ONJphyV+4PCCnLQ== From: Louis Chauvet Date: Mon, 22 Dec 2025 11:11:35 +0100 Subject: [PATCH v3 33/33] 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: <20251222-vkms-all-config-v3-33-ba42dc3fb9ff@bootlin.com> References: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@bootlin.com> In-Reply-To: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@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=10962; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=CQ0/S/9cst10jdT1raGe+Cbx3RfiJmqTSkt4++S4h+c=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBpSRlEw/pra8T5+J3MllZF8PGGe07wusZVgV3rr A8zyNI3r4eJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaUkZRBsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDIACgkQIK0uxlsQLOKdLRAAv21o8SPMt0Z47ubtncuoajRboLFBK6V t9KY8+WUbkd5wf6ipRnLbrilFFR5kKj5RrIUnqwxabgYrpKQZ6Be2opJeVhzW95mzFz2dqm4+TT GQxMMrG6qHl9qyw34cjJZu2d1PFuN6wpM4bCcEVhqfd2/wJTvgM48XOO5GUgJoK6ZeZ0KRetxnl STIh3WAo7GKDgWxkrC3540ecsXBHaPBTcUm358RCh0eLJJkXhq4nY9jMxz8LG6r3d1Q34kUc90+ ejA+Lijs3FBC8Fueb59UzHnFxvi7b1GvePRSY/ozw+Al0PeiLZcx7JRwqZ6/eY4QYSETYRtSgLp AMAqymzT9bVNNcDIpe+Xul7Bd15GPTsd1eR0igqnIzqgStwXvY9m8AYOuZtT5ik9vW/5Gd50+VR Dz/DJJcC13MwXEd9Xj+6UcMcRKDEFGAg0neM1msfHoDeBJS8qcJNHdSjlQgnq2FmErd/XghlS1O AzghHX5CbH+xnnqoQOM4W6Pihm9o5h90fJe0WS+/XWFE/RyU5mgUFvjqRZelvZmPBMrez75s4P5 18CqMh/ikmY14o9zOykQUz7MqqWTlDPn+jvqsSwAzcVNNOB0HuqRd0T5VIYadIQp6TU0B9W++v5 p5EB/wSROBo/LCZAJ1JxoB/omMxIjR1gbNM1NjRjygeqvtaeGMSg= 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/ABI/testing/configfs-vkms | 14 +++ Documentation/gpu/vkms.rst | 6 +- drivers/gpu/drm/vkms/vkms_configfs.c | 146 ++++++++++++++++++++++++++++= ++-- 3 files changed, 155 insertions(+), 11 deletions(-) diff --git a/Documentation/ABI/testing/configfs-vkms b/Documentation/ABI/te= sting/configfs-vkms index 4061ada5d88b..a7fce35fcf91 100644 --- a/Documentation/ABI/testing/configfs-vkms +++ b/Documentation/ABI/testing/configfs-vkms @@ -62,6 +62,20 @@ Description: Content of the EDID for this connector. Ignored if edid_enabled is not set. =20 +What: /sys/kernel/config/vkms//connectors//dynamic +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Set to 1 to create a dynamic connector (emulates DP MST). + Value: 1 - dynamic, 0 - static. + +What: /sys/kernel/config/vkms//connectors//enabled +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + For dynamic connectors, set to 1 to create the connector, + 0 to remove it. Value: 1 - enabled, 0 - disabled. + What: /sys/kernel/config/vkms//connectors//possible_en= coders Date: Nov 2025 Contact: dri-devel@lists.freedesktop.org diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index 60367fd1bd65..fce229fbfc7c 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 20f5150e8b24..657381a8a4c2 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -1144,6 +1144,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) { @@ -1163,7 +1169,7 @@ static ssize_t connector_status_store(struct config_i= tem *item, scoped_guard(mutex, &connector->dev->lock) { vkms_config_connector_set_status(connector->config, status); =20 - if (connector->dev->enabled) + if (connector->dev->enabled && connector_is_enabled(connector->config)) vkms_trigger_connector_hotplug(connector->dev->config->dev); } =20 @@ -1224,7 +1230,7 @@ static ssize_t connector_type_store(struct config_ite= m *item, } =20 scoped_guard(mutex, &connector->dev->lock) { - if (connector->dev->enabled) + if (connector->dev->enabled && connector_is_enabled(connector->config)) return -EBUSY; =20 vkms_config_connector_set_type(connector->config, val); @@ -1343,6 +1349,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; } @@ -1352,6 +1459,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, @@ -1359,19 +1468,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); } } @@ -1390,6 +1508,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 @@ -1397,16 +1516,26 @@ 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 @@ -1445,9 +1574,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); @@ -1461,9 +1587,11 @@ static struct config_group *make_connector_group(str= uct config_group *group, return ERR_PTR(ret); } =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.2