From nobody Sun Feb 8 19:55:55 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 037192747B for ; Wed, 29 Oct 2025 13:30:28 +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=1761744631; cv=none; b=rqC5oLrPEOqejUPhZ/vOtHajNNpeHQz6Pa8jbwB3teV5eO4ssgsMgveEcJDJOySM0TQ5irDVtgJ2nZIfVUXinOMm/7C5ucbpk8PVPfLicig+2Ug700RqFvjcVFe5sQZTzSpYu5ftVAmKbW29xzpeKFjUX+Mlpx4pavnuvH/uhIM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761744631; c=relaxed/simple; bh=Wsj1m7hVEtg7sU79/U1qOzzdUOMLj+fgjBm3lz+0CaE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=dZfRZf/zESadxFIND2WHyntOOSbywbGXosIEbDOay04sxfCS07u5lDfdg8gbF5wNNcyeEZlaHK5mBRLMCaqTElJOM5w72R7LlmrBf4jhrCQfgTQcmJxXsxpKQ8nLIwDJUnZFKKtYj8RSXJi5n27w7xn2FpM9SX9ouKAN1WHpx5c= 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=ZG0ZDUEg; 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="ZG0ZDUEg" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 457141A1744; Wed, 29 Oct 2025 13:30:27 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 19A2B606E8; Wed, 29 Oct 2025 13:30:27 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 2575F117F8047; Wed, 29 Oct 2025 14:30:25 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761744626; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=ZbJg/Ukh5zMJtkFjzl+I9BgVwlaHjwOBuN87NBSPDvA=; b=ZG0ZDUEgr2O8ICslHQvKj8Ix3OEKIsdFTpEz6SH2K9XocAGnscuv558BOAvbLrjpXOK3YX f+5oUnzL3w9M3cBPgxOVXLUKLiA2++zjdn7nkoOejqDAgbOb8O/xPhoo01bBbpivIrVJ0P n1tnHVtMzXQq6YaVoy3chbvE24DGYKDvk4uflItbXibLuApj4g3VknOoT+QGgABHw4IBK7 DaEQ1Lwav3wILUtLSDByoFg+aw5VWmBAOCeb114uLNkOkvzKzBJlcgBbpLz5iOlL3ddOVK NkaaZVqaoqvHAk7rn08c0Q1TFlZlpQuvmseYZPMFQeW9ldAcMHwQUSiVGA/9bQ== From: Louis Chauvet Date: Wed, 29 Oct 2025 14:30:11 +0100 Subject: [PATCH v2 01/32] drm/drm_mode_config: Add helper to get plane type name Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251029-vkms-all-config-v2-1-be20b9bf146e@bootlin.com> References: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1796; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=Wsj1m7hVEtg7sU79/U1qOzzdUOMLj+fgjBm3lz+0CaE=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAhbp3Mc7H5kFQMRLxwe1wNXkyaS10zALrsFIR MqDLsJwgeWJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQIW6QAKCRAgrS7GWxAs 4tGQD/9zUGwEKbAaXVececP+MM8sKKz+3nqPN7s6HFWjyquKqx4lIPoMKgIZIwOuSvsD5ciNi9/ 4F9HIMjcTeumK+HVX1YPj62K0QGx0GDe08XCgqtxQiHzKRJfv1elZg4cFSdT1M7Vs4/ptneyTE8 FZ9nf1hh5bOTj8dYfazs0n5GlJUJ0pq3TjAg24SZqQbPGQ9hbFDBmKCyRezTZKqcQCEuFApPsqh Sh6S8yLmQS5szhdCKRBnodPfLkBNqxt41HPfxoZgxbCq1n7wUeufg2yx1LQifhYc66FyJ8feST+ LJ5jRs4FeKX4Et8reEEQcXBK4b9dbpZdxWghwVBgTKBR+vWfB81lerNbIegncoZNdJuXxjEh3Av E0cxUnG/R9pormg1Ku0HvRYuk4e0hmwR6+BSt3ApUlGULGGcvBaav7UjZ+NXlW/BD17AVJHQ62G 1IGZ4NgkDtzv7jC8ATL6yDZ6wj9QmafkGywwFzMlHfNkt8jSZXfUNPny8U+sZ6ueyPRB5lonnKv ZxcoStkeOqRR/ASdm2PCXXPVvELDg1kuZ196gwDY6FcoQUbTB+JiNnOWLl0nQhZ8ujpnXEl5sLo o2Z5qYyDy/cfI0AnRuka0OeRw3M2PpcOVFYUpT4nL0mqB0ESgzp8tOSN9z7Hi6BFtHLCVlNHdfG ogRMj3WwaKuiMyg== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Create and export an helper to display plane type using the property string. This could be used to display debug information in VKMS. Signed-off-by: Louis Chauvet --- drivers/gpu/drm/drm_mode_config.c | 13 +++++++++++++ include/drm/drm_mode_config.h | 3 +++ 2 files changed, 16 insertions(+) diff --git a/drivers/gpu/drm/drm_mode_config.c b/drivers/gpu/drm/drm_mode_c= onfig.c index 25f376869b3a..1a1a3f43db4d 100644 --- a/drivers/gpu/drm/drm_mode_config.c +++ b/drivers/gpu/drm/drm_mode_config.c @@ -226,6 +226,19 @@ static const struct drm_prop_enum_list drm_plane_type_= enum_list[] =3D { { DRM_PLANE_TYPE_CURSOR, "Cursor" }, }; =20 +/** + * drm_get_plane_type_name - return a string for plane name + * @type: plane type to compute name of + */ +const char *drm_get_plane_type_name(enum drm_plane_type type) +{ + if (type < ARRAY_SIZE(drm_plane_type_enum_list)) + return drm_plane_type_enum_list[type].name; + else + return "(unknown)"; +} +EXPORT_SYMBOL(drm_get_plane_type_name); + static int drm_mode_create_standard_properties(struct drm_device *dev) { struct drm_property *prop; diff --git a/include/drm/drm_mode_config.h b/include/drm/drm_mode_config.h index 2e848b816218..89f3dd46178d 100644 --- a/include/drm/drm_mode_config.h +++ b/include/drm/drm_mode_config.h @@ -30,6 +30,7 @@ #include =20 #include +#include =20 struct drm_file; struct drm_device; @@ -983,4 +984,6 @@ static inline int drm_mode_config_init(struct drm_devic= e *dev) void drm_mode_config_reset(struct drm_device *dev); void drm_mode_config_cleanup(struct drm_device *dev); =20 +const char *drm_get_plane_type_name(enum drm_plane_type type); + #endif --=20 2.51.0 From nobody Sun Feb 8 19:55:55 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 86900215055; Wed, 29 Oct 2025 13:30:30 +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=1761744632; cv=none; b=Iqc1j7vvNxDhA0RN8oIDDZEt08Dqen1vcr72Q4mtYANv8zJd3YDaqnfHnblF56eMbf73AyCc0cI7E5xHWKY5kYg9wMZHWketQriifSB3gk/3NLD+ayerG8vUeQgxkgwYxyR3UlxDYpwXf+2tYlm+d3w1fxpjBgU4B/knRR5sIxY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761744632; c=relaxed/simple; bh=/zJLRQgbJlUfEK19hPalGGNnAJ4C2mB7Maijaaat2XM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=jE1Skh9r1+VT+/p7NGwpppFQXeLq8O0jYUbJ2FNVT21mkY8y/E2XafSXkgn+ZJnvD4kCKsAi3JiD+8TXp5nE6Fl7o7QZz40WQPM96eeQSiVWqQNAxOEQtJyIxvVUAr2z3MPU30b239ePM1IEMEZCwCp5DhkL4jhd3NDMFqQl/yk= 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=we1KXrQZ; 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="we1KXrQZ" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 51FC3C0B8A9; Wed, 29 Oct 2025 13:30:08 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id A935E606E8; Wed, 29 Oct 2025 13:30:28 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 9FA8D117F809A; Wed, 29 Oct 2025 14:30:26 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761744627; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=i1b8cguAuDAWMh3z6p1IfLyIILSme00GdU6qG7LpcBQ=; b=we1KXrQZtKjmfYA5wrrelBrpkIY6ZRFlzmx4h9unxMxzcpguiDWgkZ20hEbAvqGTvePR9p iiQQ2ZABwdCGtD9supqyfI7w33+26Yn1wmRLxmz2Tx92W4fd6FInNbOru3C4MT///fEbx3 1tPhId9Bj7gDEysX9vaNikvlrLl6pf5w9FOmTK0+bLQ98xAoNCkSWR47+e0Nuq5wX863JX ltkNcnsLGO6ZH3a06Q8k+wRZvftx7uViUNTaLhBKW7ex6luecoNLwVPsgt9wzaCO27+vXA D/Y2ARzoHl4p4vMFw0Qc/knqwR1xFaajktpSKjxTzR1oIIVQyq84r0kt2Qm2RA== From: Louis Chauvet Date: Wed, 29 Oct 2025 14:30:12 +0100 Subject: [PATCH v2 02/32] drm/vkms: Explicitly display plane type Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251029-vkms-all-config-v2-2-be20b9bf146e@bootlin.com> References: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=897; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=/zJLRQgbJlUfEK19hPalGGNnAJ4C2mB7Maijaaat2XM=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAhbpcuw9XP8+CJTv+nUqGh434KVxgb37ykh/V mAeDqmADI+JAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQIW6QAKCRAgrS7GWxAs 4hhsD/46VAjW/37FVjnaOnjRRxA1lcEINpW/Wrnm5WtSZHwyEtcSaLwGiLOaAwowztd02ClVK2t OAxSoUm0UDiG1IKUVoMDVFlFnneQfKSmwIqbHEU6TifVBKcvthElWaX2dZrPjf0hDaEJpj52DpI 277WwWWWSmhE8FFjI7Zag0lYHamTS9x+pyaQYKHa54+cPkczlLOUZRDUWKu69/w9oEKvUBqI2fk PnluykuKHYNqnKvagDbQuEunH7meLLH5ijqsDAaEDVsh1aqlpX5++ChvkBTnePqeLhWnx8+3BOh pv9BaVVp1Ljd79XYc1aZwTjJ7Nc5BiVscsTfgLbVi3xSqAdDf+oBK7sHbfUgrCw4ub9hoXYvXfN QjByjk00V+4C0P9+6fLSY5GTs4Sy+NTxfpFXvEmQjF1jnPRbE7z+eLYtdMgBUAisdKuGS3bXIUp 422Rx0qfWdlshi8tRDs7SXOQ6jGcTf+EFdXElCUTSBDX4uCp1eGqDnh9pqPQqCgsRC4khMlIJcB SzLHd1/J+RY0l43E9t53A2jH+g+QfUXzx2GqlrQG08KtyfY3+gLEavN8OEIUuVVdwzxnJ06QytF j6UiAlFgTL/0RADn4QhVGmB/9IZktNgbH4sxS61CYLEzaJ5q+dJXf1xYenuS65ZGrjzOjUN3jOP jE1+L0WT7oF2vdQ== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Debug information are mainly read by human, so use full name instead of values. Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/vkms_config.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index f8394a063ecf..cfdd5f32f234 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -348,8 +348,8 @@ static int vkms_config_show(struct seq_file *m, void *d= ata) =20 vkms_config_for_each_plane(vkmsdev->config, plane_cfg) { seq_puts(m, "plane:\n"); - seq_printf(m, "\ttype=3D%d\n", - vkms_config_plane_get_type(plane_cfg)); + seq_printf(m, "\ttype=3D%s\n", + drm_get_plane_type_name(vkms_config_plane_get_type(plane_cfg))); } =20 vkms_config_for_each_crtc(vkmsdev->config, crtc_cfg) { --=20 2.51.0 From nobody Sun Feb 8 19:55:55 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 80686325715 for ; Wed, 29 Oct 2025 13:30: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=1761744635; cv=none; b=h9lvojeB2+oPenCSuVxHU7fesDqPID7TCOM3HrK783aN8R21xHdM6wGncbXEbjxnPOCIxkrTvyhlKNK25hEgPb6aZiolBWwXB5DIS87aladUVxmot5q4NjiH3Goqr+haZ87yCnWjhVLvb1YMTKsWX59T0kMZGO0dxE9nQIwhbBQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761744635; c=relaxed/simple; bh=P2YQYyxAPSZpXd/i/92Ex57u+40+oZJvWkUOQRGtaCI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=nxuAUDGzTMiXqbvzvmp7UMMxwYJ+VVygcZMx8YZQf4a1Bq4ksRoooc0/IunJ3HHq/QgHo8tk0/WhubnUeo/uluA9CeKxO24rMIcyx5EcZiC7c5IxCRyZClawkp5pfmX2ng1aMqBuOocvoORYKuspe/yYNm7cayXi/lFwJfpxVrw= 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=boqy2HyY; 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="boqy2HyY" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id A32491A1748; Wed, 29 Oct 2025 13:30:30 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 764D5606E8; Wed, 29 Oct 2025 13:30:30 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 32E3B117F8098; Wed, 29 Oct 2025 14:30:28 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761744629; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=Cp6JpAtoASV5c2ZHnxjic8luGPShZOCddn0tveS2zCk=; b=boqy2HyYA56JznCdDuiNlNOggeOQsF3Frvq3i3KhWrQ+s7spIpcfkI5wJK+XYXCSL81odJ yHwM6eCo5h6A7KGHbdH5ClVos9BXij50usTPRfE/XYczeeqCs117KzRQvO71kwt83ivJXl QqFwbjLbgaOWT0fYCFsgMX4d5AeVv+yMhpFR0JTr+qORWKk+X+P+jjQIA1j8ZqX6Ak9py1 TByBohiitkS9WENPUWI7ByWqnniro28UHPhzoPj7yEyE6WDcftaQNNjGjMvMBTUw333rkF rEeHnYcpxIMCBcHWp8qKBsEb0v4NxvvAfwQ/TsHU5qIpgYM3iLsRCgckdzOJ0g== From: Louis Chauvet Date: Wed, 29 Oct 2025 14:30:13 +0100 Subject: [PATCH v2 03/32] drm/vkms: Use enabled/disabled instead of 1/0 for debug Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251029-vkms-all-config-v2-3-be20b9bf146e@bootlin.com> References: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1094; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=P2YQYyxAPSZpXd/i/92Ex57u+40+oZJvWkUOQRGtaCI=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAhbpKKqwnk9Jg/KzpwQPyvh4Dy+jCFteQFLgk WobJKey5xKJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQIW6QAKCRAgrS7GWxAs 4pqID/9mS6B6/OF0Gp1LuPZCqXuO++XQs9DYgZauNZX7GaVMhatv1Vb03Zgb+MsYkMaKlgUL2Yi hGq6y34EOiPO51oAPafQwA8fOwe+CMwqgxquc0d/1SoDFaYdEO5Gn4Pamr8vm7DMviR9BIrgHrd G5+3ZaX6KqtJ9eSdHD7kJ5Az6G4+ynhzC9UgBJkfbv7WUFMJkug3CBtGuGAcGRREoENDwhD7EEu nhMcFZrxWg6SeW7tpGY3rbxpsupLzI6ijUiZvCMNvsQ+ElJHqgsD9cs25d92QYdiLiCgVyt/XSU 4Vq3xV9WwjnXfkilWJFCneL9GqPaCH/k3u8T9VQp7LBr/aFdSCTmqZLZ5X6d7whwqruDNOI/8WG +qGVm09+MfAipSGotIInLRNnFzzEaUdVlobvSNedt+YCEQjtm5XcZmv9NR2raahga2LgKN3I2YI PLEwqP6utb//9Lvt6IBY8fq5sgG916HDgbF68BnyrUmUR8EqXIrIxffM9V+I68OU/JYYH/rI/0L H+ALhVzRDWmjapKiLFrU8arp8jgP08x/hjTHcAkIiKupYLDFF4IEfq0dSFNOZbVavwxcY7YS0r0 kLCQ81/4f7Upl4Az9M+wxQwoSjzvgG0j6blpS9ZdGZSFK7f0JOrlWhJUlBEkXiTnCijn/y41/AZ IoxACUMjL9B9exA== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Debug information are mainly read by human, so display human readable values. Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/vkms_config.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index cfdd5f32f234..391794d391c5 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-2.0+ =20 #include +#include =20 #include #include @@ -354,8 +355,8 @@ static int vkms_config_show(struct seq_file *m, void *d= ata) =20 vkms_config_for_each_crtc(vkmsdev->config, crtc_cfg) { seq_puts(m, "crtc:\n"); - seq_printf(m, "\twriteback=3D%d\n", - vkms_config_crtc_get_writeback(crtc_cfg)); + seq_printf(m, "\twriteback=3D%s\n", + str_enabled_disabled(vkms_config_crtc_get_writeback(crtc_cfg))); } =20 vkms_config_for_each_encoder(vkmsdev->config, encoder_cfg) --=20 2.51.0 From nobody Sun Feb 8 19:55:55 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 C27B13358AF for ; Wed, 29 Oct 2025 13:30:33 +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=1761744635; cv=none; b=WCbCnwlRRSWql/j3q/ejdB8Ldk4XqV13EIt521dtaAlS7Pl1SA3CxjvlMI3usBIMr/JlNQNu491qbAdAFu2DcM3WRmkNHa2EK2tk7iNek0/C9mCXR/HI2Ud0FKg3v8CWbpd9YIJRBSaHs+f++FyfVAOwyBnfe3/93SvLLN9hy84= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761744635; c=relaxed/simple; bh=voeNI9bwwu8x7aT8ETB3x5UR1BLQoLZlunp+Jro1U6w=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=UXhU3wQH/4IP1Ry7blSqMi7Xv7AEMUHjAM7yRTIS5BWCiIbwBpRTfRU8+z7UaF+f5/rzMT8uFG/PbM60+BY4nYVz4+9R0VD4tNRojrYw+jd6JBFIwHGZr+hkjEm0axO0yckqTp7ChPxNYTm31qP0E63lpUGYAhOpz+GgbZX0hK0= 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=LIGa91yB; 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="LIGa91yB" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id BD0C3C0DB01; Wed, 29 Oct 2025 13:30:11 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 2078E606E8; Wed, 29 Oct 2025 13:30:32 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id DAB77117F809B; Wed, 29 Oct 2025 14:30:29 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761744631; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=nY1yQcqWIvwZGQdkoeG1HdLDJqiutiLInY6EQwK4N+U=; b=LIGa91yBr+KhOkUvdcIx2Q6TCaHuzTcbAUmElO+IyN7HnJ8d5plr5TV/8C/osS/mk2JGiA MvmoW5QpmpERhE2fJml1uzG/Ifwe+AzoBx9mq1W+MgpoXc6LD1h30T0RzWwXyGt44PQIJ3 E3pwvfRl2egZsvdx45x9bjsDEHfliaT/tj5zZpLsyy41SMnhusbYYTRBqFP/ae25VtC2FT SJaLpmX51nVaS/rdBe8xbNrkiClcSzwV4igPb2J6KWfNE/ioRXDa8PbBdlnLfEMeyVBuU3 cpTWYzMsj8XxngCwdPHjw5htCNOUZcYtdWJDXF8g+ecB716EjZ/Vlr4IjWVIfA== From: Louis Chauvet Date: Wed, 29 Oct 2025 14:30:14 +0100 Subject: [PATCH v2 04/32] drm/vkms: Explicitly display connector status Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251029-vkms-all-config-v2-4-be20b9bf146e@bootlin.com> References: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1127; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=voeNI9bwwu8x7aT8ETB3x5UR1BLQoLZlunp+Jro1U6w=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAhbpW6i8+LjrYGhDuj+fvvq7Ra+BELTtewFnC bCweK8if1eJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQIW6QAKCRAgrS7GWxAs 4uxiD/92GvT0QOReIPABd3VzJuhaPaxzELC1NpWg0k2hmEpdu4KDj1VpIMpJO6QKZtviBvO2qc0 L9rkCKVUx4GM4Tk1sdYwVCQIyYTg512KB4ETMqfeMVwcQGGrELZp8duQ/eRye0rrVsVvXBCyF0Y B1t1c2DmRXYOihKhnhxZJy7ivCTCFxEKLJ+FDSsXjvup4qrTkW7GjDo/ACvXC85IomXJbd93Ayb JP/880nin5TqiNGFQwQxuz6XT+qRjQc/+SRGQH1dJDnsiHXqwotpx2H1U8doDIr2xra6/Z/Vw3Q rgDcjlxPwxjCIXnrZ/H0gqgLPlaD85K9iQzEG7u37fVNyqhvvvCe2CNpfIJu7taWVlt7Yiu8wej yVSaN4Py8dUt9/D+3oD6Bdeiw7KuHTq4uyjY2DoZ/abCshZNUryktKVAszXu/yz17b4F4nUAJ8c BVJ6WgtX3VDtn3c570R/07EjRCtXoJvTcU6wBVErnfSaXzBu5yNvfFatMGOTnVR79I8INxytBjx JiK+9/m2xDn7hqh7RTWPAua9GQSwz/bP1SKzMgR8ErT8hzVPLZQerDZFvarOORkgLOFmSWniWXA mB0IvK9hXKEgNsCmv4erKd3aKHSUDOtT33zHWYXfnsJIEPiVAgMDhisjgD/qcvADc+yIuaw5ePf W4l/YIImRmqnCCg== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Debug information are mainly read by human, so use full name instead of raw values for connector status. Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/vkms_config.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index 391794d391c5..858bec2d1312 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -3,6 +3,7 @@ #include #include =20 +#include #include #include #include @@ -364,8 +365,8 @@ static int vkms_config_show(struct seq_file *m, void *d= ata) =20 vkms_config_for_each_connector(vkmsdev->config, connector_cfg) { seq_puts(m, "connector:\n"); - seq_printf(m, "\tstatus=3D%d\n", - vkms_config_connector_get_status(connector_cfg)); + seq_printf(m, "\tstatus=3D%s\n", + drm_get_connector_status_name(vkms_config_connector_get_status(conne= ctor_cfg))); } =20 return 0; --=20 2.51.0 From nobody Sun Feb 8 19:55:55 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 6125F3358DA for ; Wed, 29 Oct 2025 13:30:35 +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=1761744637; cv=none; b=JJQIz+GE8OmdWtMp2VSfL7WaXnGKia1FPzhzRLveeKUH+/JHIfatuRD5SPQN8TwslGmYtPuxEdUx0x15iC1FhhNx/u84FiZEKjVYRmqZxoZjFAKyiIocpygZ4LI3wyavMGU7iouNUqbEDEN1oodmfqq4YNefSA3MWkiGtAhqat8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761744637; c=relaxed/simple; bh=JI6BJsuj4AXbzLKNzvB4FHoZVsIkkY5eZBTNuNhEyrQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=G/Ojfc2FOBltUssIWAFDGPme90o8c9/QkNpb+GWiLOVSLCfzKllAMxWpZU3286Sx21ra2AF/YCnbIK5dxkJ1Vejl73iiGO5nawqqKPSJBeVa29+5LTzbxtrUPT+DXsnm95UhXOWZqXNzsvZsQdRh54xslbAMEvyqzc9v8cZLlPs= 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=npWlK3Gd; 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="npWlK3Gd" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 9DC05C0DB02; Wed, 29 Oct 2025 13:30:13 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 01372606E8; Wed, 29 Oct 2025 13:30:34 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 9EF55117F8047; Wed, 29 Oct 2025 14:30:31 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761744632; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=6J4X9HET4WTHRHuQARwrxqHYhuRpm2UMz/V2um5iVtU=; b=npWlK3GdPJ98KRGhs+vCVDdXUyug0OQ1X1OKn70J7oL6faCZkBefBEI3fKqGR59/PdW+mE +M70fFaHyN1/4FlIuvrM0OLXTz0+c1zGY5LeTd32ia3Ddjfgh1OIgyJjCR/YDhXLZfDDiN E4zIDbxmVNsIBNDQdP5H3uih/hhvbvsJzc/rVHvFNoQtR1uskN+7Ax2ZNgaXJvnzQVOsXM kHjWPYRdFzwTE17EHl3uZLCm8aW6yYxkEAMKoFDWXDG0ykyWYaUaYyjAc2iv7DirgOjPZo 2k5DscZJiy/V780OYWINSoZU4j7PseXZ+uU7GILvut6vfcC3T9KnTJYBly1GOw== From: Louis Chauvet Date: Wed, 29 Oct 2025 14:30:15 +0100 Subject: [PATCH v2 05/32] drm/vkms: Introduce config for plane name Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251029-vkms-all-config-v2-5-be20b9bf146e@bootlin.com> References: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=6014; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=JI6BJsuj4AXbzLKNzvB4FHoZVsIkkY5eZBTNuNhEyrQ=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAhbpdedlxZb3+bTUdvY0rVCdEYW0Wxbynd2GB rcsiw8ODV6JAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQIW6QAKCRAgrS7GWxAs 4tIIEADHoXtLa/cwWR6rmUlzLUNSGwTqwTqLiSkSQ7NUAMqRc3F+SRkOldtxVB49OeP/VzTrkCp XrTZWE0Yk2gzZf1dhaxJcRkHQ9IFdeL+ha+e4GlgKchFPTVU9fMwEI9KCR6ffFjMDWvoWCLhWT7 d6pIqOJMlcVC3aSjnEN8CL3XuBLAw1noI9Q68IK+YZSYNAqPc44UkV2WVLrjWx4tCqSGoOgm677 T7YEG6wDt2mf7+K5Bo3klTEf9jpASW1/UHFBGWe6WnfxU+icilzD1DlsrUp1LzU4A1pY0LvAP9J cT5YKkl1p4GXhnzxpW3wIrqy6nP4ZovQF4pyks4jY70mETr4vU/Az6DQ++79d7avvyP2w/bpscN 3if+Fc1K5ncM5V5nzuAotCb+7334D6XyzYKIk7QGQz781hldBdawy+bbKI97Qc+2OObGIv3kqun 2NhyvbIkoQTvGODnDpmUJXxue/kLjFjMvADxfLLNePb1+41u6Yccst3DBJvJ62h1Y6X+J7wPvMH NqC5rY4iDY1dKwoqLqkBXQsfhEw+skYyw02unlZJaH6Ym9NzzBdOsV55vi6xFXg48lnJucNOvNr f0RXZ8VpCm7mDe9xNy0iPbjgc20nHzyHcPvK5R6B8li9FG0ikjTWpFtRy1s67PpyXDogzWlBoxg Ts0Nq1zpz8ht59g== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 As planes can have a name in DRM, prepare VKMS to configure it using ConfigFS. Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/vkms_config.c | 4 ++++ drivers/gpu/drm/vkms/vkms_config.h | 26 ++++++++++++++++++++++++++ drivers/gpu/drm/vkms/vkms_drv.h | 5 +++-- drivers/gpu/drm/vkms/vkms_output.c | 6 +----- drivers/gpu/drm/vkms/vkms_plane.c | 6 ++++-- 5 files changed, 38 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index 858bec2d1312..bfafb5d2504d 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -352,6 +352,8 @@ static int vkms_config_show(struct seq_file *m, void *d= ata) seq_puts(m, "plane:\n"); seq_printf(m, "\ttype=3D%s\n", drm_get_plane_type_name(vkms_config_plane_get_type(plane_cfg))); + seq_printf(m, "\tname=3D%s\n", + vkms_config_plane_get_name(plane_cfg)); } =20 vkms_config_for_each_crtc(vkmsdev->config, crtc_cfg) { @@ -392,6 +394,7 @@ struct vkms_config_plane *vkms_config_create_plane(stru= ct vkms_config *config) =20 plane_cfg->config =3D config; vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_OVERLAY); + vkms_config_plane_set_name(plane_cfg, NULL); xa_init_flags(&plane_cfg->possible_crtcs, XA_FLAGS_ALLOC); =20 list_add_tail(&plane_cfg->link, &config->planes); @@ -404,6 +407,7 @@ void vkms_config_destroy_plane(struct vkms_config_plane= *plane_cfg) { xa_destroy(&plane_cfg->possible_crtcs); list_del(&plane_cfg->link); + kfree_const(plane_cfg->name); kfree(plane_cfg); } EXPORT_SYMBOL_IF_KUNIT(vkms_config_destroy_plane); diff --git a/drivers/gpu/drm/vkms/vkms_config.h b/drivers/gpu/drm/vkms/vkms= _config.h index 4c8d668e7ef8..57342db5795a 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -35,6 +35,7 @@ struct vkms_config { * * @link: Link to the others planes in vkms_config * @config: The vkms_config this plane belongs to + * @name: Name of the plane * @type: Type of the plane. The creator of configuration needs to ensures= that * at least one primary plane is present. * @possible_crtcs: Array of CRTCs that can be used with this plane @@ -47,6 +48,7 @@ struct vkms_config_plane { struct list_head link; struct vkms_config *config; =20 + const char *name; enum drm_plane_type type; struct xarray possible_crtcs; =20 @@ -288,6 +290,30 @@ vkms_config_plane_set_type(struct vkms_config_plane *p= lane_cfg, plane_cfg->type =3D type; } =20 +/** + * vkms_config_plane_set_name() - Set the plane name + * @plane_cfg: Plane to set the name to + * @name: New plane name. The name is copied. + */ +static inline void +vkms_config_plane_set_name(struct vkms_config_plane *plane_cfg, + const char *name) +{ + if (plane_cfg->name) + kfree_const(plane_cfg->name); + plane_cfg->name =3D kstrdup_const(name, GFP_KERNEL); +} + +/** + * vkms_config_plane_get_name - Get the plane name + * @plane_cfg: Plane to get the name from + */ +static inline const char * +vkms_config_plane_get_name(const struct vkms_config_plane *plane_cfg) +{ + return plane_cfg->name; +} + /** * vkms_config_plane_attach_crtc - Attach a plane to a CRTC * @plane_cfg: Plane to attach diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_dr= v.h index db260df1d4f6..9ad286f043b5 100644 --- a/drivers/gpu/drm/vkms/vkms_drv.h +++ b/drivers/gpu/drm/vkms/vkms_drv.h @@ -225,6 +225,7 @@ struct vkms_output { }; =20 struct vkms_config; +struct vkms_config_plane; =20 /** * struct vkms_device - Description of a VKMS device @@ -298,10 +299,10 @@ int vkms_output_init(struct vkms_device *vkmsdev); * vkms_plane_init() - Initialize a plane * * @vkmsdev: VKMS device containing the plane - * @type: type of plane to initialize + * @config: plane configuration */ struct vkms_plane *vkms_plane_init(struct vkms_device *vkmsdev, - enum drm_plane_type type); + struct vkms_config_plane *config); =20 /* CRC Support */ const char *const *vkms_get_crc_sources(struct drm_crtc *crtc, diff --git a/drivers/gpu/drm/vkms/vkms_output.c b/drivers/gpu/drm/vkms/vkms= _output.c index 2ee3749e2b28..22208d02afa4 100644 --- a/drivers/gpu/drm/vkms/vkms_output.c +++ b/drivers/gpu/drm/vkms/vkms_output.c @@ -19,11 +19,7 @@ int vkms_output_init(struct vkms_device *vkmsdev) return -EINVAL; =20 vkms_config_for_each_plane(vkmsdev->config, plane_cfg) { - enum drm_plane_type type; - - type =3D vkms_config_plane_get_type(plane_cfg); - - plane_cfg->plane =3D vkms_plane_init(vkmsdev, type); + plane_cfg->plane =3D vkms_plane_init(vkmsdev, plane_cfg); if (IS_ERR(plane_cfg->plane)) { DRM_DEV_ERROR(dev->dev, "Failed to init vkms plane\n"); return PTR_ERR(plane_cfg->plane); diff --git a/drivers/gpu/drm/vkms/vkms_plane.c b/drivers/gpu/drm/vkms/vkms_= plane.c index e592e47a5736..73180cbb78b1 100644 --- a/drivers/gpu/drm/vkms/vkms_plane.c +++ b/drivers/gpu/drm/vkms/vkms_plane.c @@ -9,6 +9,7 @@ #include #include =20 +#include "vkms_config.h" #include "vkms_drv.h" #include "vkms_formats.h" =20 @@ -217,7 +218,7 @@ static const struct drm_plane_helper_funcs vkms_plane_h= elper_funcs =3D { }; =20 struct vkms_plane *vkms_plane_init(struct vkms_device *vkmsdev, - enum drm_plane_type type) + struct vkms_config_plane *config) { struct drm_device *dev =3D &vkmsdev->drm; struct vkms_plane *plane; @@ -225,7 +226,8 @@ struct vkms_plane *vkms_plane_init(struct vkms_device *= vkmsdev, plane =3D drmm_universal_plane_alloc(dev, struct vkms_plane, base, 0, &vkms_plane_funcs, vkms_formats, ARRAY_SIZE(vkms_formats), - NULL, type, NULL); + NULL, vkms_config_plane_get_type(config), + vkms_config_plane_get_name(config)); if (IS_ERR(plane)) return plane; =20 --=20 2.51.0 From nobody Sun Feb 8 19:55:55 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 32B5D26980B for ; Wed, 29 Oct 2025 13:30:36 +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=1761744640; cv=none; b=sA3x0fgLYk9m6Zd1Tlaz5Niv3Q7xNf8jFClO7gQLgTm9wHH78l9LKvrJb4Yck48HkWUvf8jV0Doc+MidlxQJHZo9/H9/Mi29Q0u64O1Zc9a06uTO1xE0/Z+OKWB5O3QJM9/f7GMK2whCX/IgbSjihoICDvmkMM/+wLFNQ+NKmhU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761744640; c=relaxed/simple; bh=e8ElyHXcVk0AWYJ7dGjNKx8CrM9WhxXKeDzUlhTH99U=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=cFiw4pB8uCX/JJS2G3iJBMD5u3LVCQdK5WXokyPywpgS4L0kF03tG0vGRcO1H6tw3BBm9psN6syz3V8u0NSbaSLm39mgf1aFnUC1h8XmCJMcTkI6Uj4kghFDAu8bdw8jw6/MkuWpChBWRe6rX3UIGDzLX+KuqYfOH3An603cSbY= 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=YeOgGv7u; 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="YeOgGv7u" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 4A73BC0DB00; Wed, 29 Oct 2025 13:30:15 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id A165E606E8; Wed, 29 Oct 2025 13:30:35 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 4E305117F809A; Wed, 29 Oct 2025 14:30:33 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761744634; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=fs9ni9DRQ5vnDzOwoZttmqZ202xPMAoGkKss/mz8Bp4=; b=YeOgGv7u62i6IHv75jQrEqeZOcaQ2KAGt5yEvKhhYAGSAM/PlZjA1SjfIjZ9uatkBZBkHQ KKU3AM6SnnAkkQywvUHj7qF6UstBipPgRHNPFKkWh55v4PDM/NuUIm4pcpUe6Iu4s5MNZO zxPQ8WIaHSPfynw8y6Jhpe45gc5FarKyg/Pc1GTYvh9XSlyZuxgw/FJsb+j717KQR/WJLF gc2lhmGECh/xxHgTWRdvTookjyLo5aNMes7rcLAWDb9+sYXcguJo2S/5hHkzJFCB6ERj/z A6ZLIqkRUMaL5eReGraJHCbHmhPLgbMkGsZOMSJWX5P6608WmHk3vusBDjUyXA== From: Louis Chauvet Date: Wed, 29 Oct 2025 14:30:16 +0100 Subject: [PATCH v2 06/32] drm/vkms: Introduce configfs for plane name Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251029-vkms-all-config-v2-6-be20b9bf146e@bootlin.com> References: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=2206; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=e8ElyHXcVk0AWYJ7dGjNKx8CrM9WhxXKeDzUlhTH99U=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAhbq15OoDz92mgX8JMHTEsCZmO0xWYXS2X01h jGzxdK2qPuJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQIW6gAKCRAgrS7GWxAs 4hk9D/4/xFfTKKNu+LjBdoFMtoqtHavnG3bt5jownuu/g8cgVPIxlTrsOBL3jfly8Hnv3R2EMow 05cgJTajRO7VE4BU1JYOFme1MNgtes66tNHq4qjGepFC87IPsHEFCMeSM5KmHfB213Nsb46W+m4 Q66kW697gxKHw3AqyONY/rXiJbeRVujPevjbryEsieoyiJqfdI4I2lZknbcE59foOjwYGJGqe8V 833ZkvskOf/zlxfqZYsMWLoXLunMbdyWCHuxYmkpQrArza0nh3cKkd3pOdvyKr1S+hIaImXGk8Q nO4QRRETXZKmK9MixUK5PH9cDvDICb3MKOuJ2M/Kba0RQJK4uBOBWC0GE9sAAH62p6qGXimJjeC ocujXz/FlVYGI1I8o+LA5DgsDWC5DeBZV0Vw3rX4jk94+NzMK11cYy4+MHw7k6ROXEx9iTt6oVB u1kFHRENCU8elYRg7nXNOkK925iHiSsTRZSwccjqqizlr/V5GYJONV3kL/RKkyYHqKcJROK5qLU Mh3PdBbxQvUDWRff1vmaNuSYieZfacNBZAvkfCkRSp6XONH/OFKpx1DBxpm6nl0E9DvruYYhT0I GpXqf27qND0Il6eHXpY51tjXrbmqWYztIEJO23JN19f/ixMOTt22oeXwFwQ8rOWLJ3bRCe7q7jW rpP2UbhDKuF0R2Q== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Planes can have name, create a plane attribute to configure it. Currently plane name is mainly used in logs. Signed-off-by: Louis Chauvet --- Documentation/gpu/vkms.rst | 3 ++- drivers/gpu/drm/vkms/vkms_configfs.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index 3574e01b928d..1fe6e420c963 100644 --- a/Documentation/gpu/vkms.rst +++ b/Documentation/gpu/vkms.rst @@ -87,10 +87,11 @@ Start by creating one or more planes:: =20 sudo mkdir /config/vkms/my-vkms/planes/plane0 =20 -Planes have 1 configurable attribute: +Planes have 2 configurable attributes: =20 - type: Plane type: 0 overlay, 1 primary, 2 cursor (same values as those exposed by the "type" property of a plane) +- name: Name of the plane =20 Continue by creating one or more CRTCs:: =20 diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vk= ms_configfs.c index 07ab794e1052..be6c3ba998b9 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -322,10 +322,42 @@ static ssize_t plane_type_store(struct config_item *i= tem, const char *page, return (ssize_t)count; } =20 +static ssize_t plane_name_show(struct config_item *item, char *page) +{ + struct vkms_configfs_plane *plane; + const char *name; + + plane =3D plane_item_to_vkms_configfs_plane(item); + + scoped_guard(mutex, &plane->dev->lock) + name =3D vkms_config_plane_get_name(plane->config); + + return sprintf(page, "%s\n", name); +} + +static ssize_t plane_name_store(struct config_item *item, const char *page, + size_t count) +{ + struct vkms_configfs_plane *plane; + + plane =3D plane_item_to_vkms_configfs_plane(item); + + scoped_guard(mutex, &plane->dev->lock) { + if (plane->dev->enabled) + return -EBUSY; + + vkms_config_plane_set_name(plane->config, page); + } + + return (ssize_t)count; +} + CONFIGFS_ATTR(plane_, type); +CONFIGFS_ATTR(plane_, name); =20 static struct configfs_attribute *plane_item_attrs[] =3D { &plane_attr_type, + &plane_attr_name, NULL, }; =20 --=20 2.51.0 From nobody Sun Feb 8 19:55:55 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 1BE6E33B6E6 for ; Wed, 29 Oct 2025 13:30:38 +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=1761744640; cv=none; b=sJFq9DjAOP7srPU6ePFNep1X4tDoMNXaFUktpW6K5/27/Q/9nvoqEOqls9w3ovZpiCt7xBycTBoLGElDPz7R4hRmlFm8bNVZrwxzxPeKp+j7YrgpUuE4dynoi80NB/G+SgktRHdFD+STvcwqDH/hlFbgw8KOrxoAw4hU6KXGll4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761744640; c=relaxed/simple; bh=Pl8/wLHil1+4yaisV9T8jn/VjcUTIXsuX+80D3wrKXM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=aLIf4kaxU9FEOsqUEpVpQuBjmeOcGkvCd7SDw+jKzbZmYcpHqkypZGvxK5oFCINoXsUMbGEdc1NESPWqx8BrrwqdeAF/v2KdscXpDHam5O3BdeQFNkQEDhgKDsLziPOC387Bq5TV6KJc8D7jMfRDiUfhkJacrJE7cTJ/eLxWAGI= 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=H6kGmU6x; 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="H6kGmU6x" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 601191A1744; Wed, 29 Oct 2025 13:30:37 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 30167606E8; Wed, 29 Oct 2025 13:30:37 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 172A2117F809D; Wed, 29 Oct 2025 14:30:35 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761744636; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=gZH4XqHEnkgG+WiGf4L3QVJCg6jApM4gvYwyfSScQxU=; b=H6kGmU6xvde7Lsv/zGgksKMvtDaWaqZa+dLq1SUu/J2AqnTsaPFhp4B4nRhDygTWZctegz vBoaEFw+0m7Fl4n/jSXy87YMb9Mqba0n/kPaNWb01GY1gGtKzUprsyJ/05Q55eg3dffzcD poMZaaA9YDFV3ZbRgMCfM2bGGcgIqbSITXibyjfBT1QH7ieCNjsT6i+H1NmH+xi5U1+ZoO a2fsoEr8IuN4tZXWx6IeIH1Z9vbQDkAdOWPF31tjSGDidGsJXSuqyjU0Ps0dExtsjC6LQt wo+3jP/byZAc3ERUEVyUJZPOwWB7Cw6GBBTiOzpPnCw80UEtqdjtoaoevPVvKA== From: Louis Chauvet Date: Wed, 29 Oct 2025 14:30:17 +0100 Subject: [PATCH v2 07/32] drm/blend: Get a rotation name from it's bitfield Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251029-vkms-all-config-v2-7-be20b9bf146e@bootlin.com> References: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=3321; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=Pl8/wLHil1+4yaisV9T8jn/VjcUTIXsuX+80D3wrKXM=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAhbqzxK7XWGtL5zJytb1q/bSIFCIo/o18iw6q lT7hxDn0kaJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQIW6gAKCRAgrS7GWxAs 4k4ID/0Vx8MJyB+BkiQ6MlTbL/jbSVpp2c67uCBpQgHYmIZLD7Zb5Rt3cqHcHcs9ubF+tJa5qJc OFT4GfK5pSWHeBWMOTJMFNU0fMLZHSqcXJxw1I7CQ7dW45M+vTEugNYOBR6LsqtcLtp8LY7ODxh +ACNwCJWHI0vkVXOcmUKljdECAsMBp4Ep5Hk2KCoSugYHBy3ypTOhbXbOA6DqNnIEvFDYJyNjKu oMq16CXZHuhP8op/tNfO3b4WyzFJKUwgDtWw40a8THQ8kg+j2huUOV1SIhtgm4oHBGi8+yGW56k Ilm8CISuCOfV6SLktKJtITOrfjdqBpwezhBA7XnMIKbmegyelsB44458j/dUJ77Nmtu0BNuQwQ7 KyGE1u9WYVOr3jwoCVtGAtHkk72CJpvmFzEZN5ZOFlByra6nlipjirI9cy+YwN/XNeaJOgnjLP+ MNFYyTxVesFlee3eWqNwnoj1SMIXWOenCst4viT/5G874+bki0VuWp6GaYIRd/0Oox0tTQFYo6U xkSZAfadUEk4jRJa/WT7nBGmdEx4BAMYB0ylnYr5/cEglWR02+4dXaEvo5jy4wUvxfJOthbW+1f 3St5BKOuCnq4GWmxYEez8S4W/K1JcH+wdkLE8rpiPJq0D6LqlPdNNCCFg/SvxzLU04Ue1z4yFaR mX5+HNOC5p+WfkA== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Having the rotation/reflection name from its value can be useful for debugging purpose. Extract the rotation property table and implement drm_get_rotation_name. Signed-off-by: Louis Chauvet --- drivers/gpu/drm/drm_blend.c | 35 ++++++++++++++++++++++++++--------- include/drm/drm_blend.h | 2 ++ 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/drm/drm_blend.c b/drivers/gpu/drm/drm_blend.c index 6852d73c931c..bc7c05e20242 100644 --- a/drivers/gpu/drm/drm_blend.c +++ b/drivers/gpu/drm/drm_blend.c @@ -241,6 +241,31 @@ int drm_plane_create_alpha_property(struct drm_plane *= plane) } EXPORT_SYMBOL(drm_plane_create_alpha_property); =20 +static const struct drm_prop_enum_list rotation_props[] =3D { + { __builtin_ffs(DRM_MODE_ROTATE_0) - 1, "rotate-0" }, + { __builtin_ffs(DRM_MODE_ROTATE_90) - 1, "rotate-90" }, + { __builtin_ffs(DRM_MODE_ROTATE_180) - 1, "rotate-180" }, + { __builtin_ffs(DRM_MODE_ROTATE_270) - 1, "rotate-270" }, + { __builtin_ffs(DRM_MODE_REFLECT_X) - 1, "reflect-x" }, + { __builtin_ffs(DRM_MODE_REFLECT_Y) - 1, "reflect-y" }, +}; + +/** + * drm_get_rotation_name - Return the name of a rotation + * @rotation: The rotation mask (DRM_MODE_ROTATE_* | DRM_MODE_REFLECT_*) + * + * Returns: the name of the rotation type (unknown) if rotation is not + * a known rotation/reflection + */ +const char *drm_get_rotation_name(unsigned int rotation) +{ + if (rotation < ARRAY_SIZE(rotation_props)) + return rotation_props[rotation].name; + + return "(unknown)"; +} +EXPORT_SYMBOL(drm_get_rotation_name); + /** * drm_plane_create_rotation_property - create a new rotation property * @plane: drm plane @@ -279,14 +304,6 @@ int drm_plane_create_rotation_property(struct drm_plan= e *plane, unsigned int rotation, unsigned int supported_rotations) { - static const struct drm_prop_enum_list props[] =3D { - { __builtin_ffs(DRM_MODE_ROTATE_0) - 1, "rotate-0" }, - { __builtin_ffs(DRM_MODE_ROTATE_90) - 1, "rotate-90" }, - { __builtin_ffs(DRM_MODE_ROTATE_180) - 1, "rotate-180" }, - { __builtin_ffs(DRM_MODE_ROTATE_270) - 1, "rotate-270" }, - { __builtin_ffs(DRM_MODE_REFLECT_X) - 1, "reflect-x" }, - { __builtin_ffs(DRM_MODE_REFLECT_Y) - 1, "reflect-y" }, - }; struct drm_property *prop; =20 WARN_ON((supported_rotations & DRM_MODE_ROTATE_MASK) =3D=3D 0); @@ -294,7 +311,7 @@ int drm_plane_create_rotation_property(struct drm_plane= *plane, WARN_ON(rotation & ~supported_rotations); =20 prop =3D drm_property_create_bitmask(plane->dev, 0, "rotation", - props, ARRAY_SIZE(props), + rotation_props, ARRAY_SIZE(rotation_props), supported_rotations); if (!prop) return -ENOMEM; diff --git a/include/drm/drm_blend.h b/include/drm/drm_blend.h index 88bdfec3bd88..381d1f8d815b 100644 --- a/include/drm/drm_blend.h +++ b/include/drm/drm_blend.h @@ -42,6 +42,8 @@ static inline bool drm_rotation_90_or_270(unsigned int ro= tation) =20 #define DRM_BLEND_ALPHA_OPAQUE 0xffff =20 +const char *drm_get_rotation_name(unsigned int rotation); + int drm_plane_create_alpha_property(struct drm_plane *plane); int drm_plane_create_rotation_property(struct drm_plane *plane, unsigned int rotation, --=20 2.51.0 From nobody Sun Feb 8 19:55:55 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 9264833B6F2; Wed, 29 Oct 2025 13:30:40 +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=1761744643; cv=none; b=T2XFXuIzASLr+WN3nZ8Yt+iU7YyV85GtNpp7LmUvnEVzWx7VTBrXL3hKXoTR8qGV1sxpG5/jJbaIf6lmhsCbjPLyVfB+pyKcIci0liY5Had+eEAqVC964Hdj+MOIkcZgGv+BRIDJtvz9kMTm4F+7Q+AdesWtEfcAG5z7inXmFKE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761744643; c=relaxed/simple; bh=EWVgtj5CqLfQMmBn4PxWSe+Ra69UhyW4oe1nnFTIWxY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ASfy2Kt8s5LxUIhDpXr1EssP0sJUrGxvT22YlvvCdTzH197os5DysXYWbYf07OSL9M9Bld/ZmwvVIbxPnrnmHRTU95ZQ10DZtGPigbGJsNbn92jXGk8pqgP4cDqYzNVP/Nm+33affJBkfpzC5ciTIQtgC+3tSG+FAm++WxE2P7s= 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=XlPjhOwF; 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="XlPjhOwF" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 3324B1A16EB; Wed, 29 Oct 2025 13:30:39 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 080CE606E8; Wed, 29 Oct 2025 13:30:39 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id B06D6117F809C; Wed, 29 Oct 2025 14:30:36 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761744638; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=DiQB9CvqPCMSCmfCQm+BM0yWoh/K98ULkreAzLkudAw=; b=XlPjhOwFp2gY+DrFIuWnfXi5LaWcpT/qRdWEhKNszh85ZKmBXRHBTzBLKlEHqmXo0SpV8o hSKGcQ3YrPOsx1lfgC52fyQa7AamjI78NmYpI99o1av02C7NSNcclbuXrp+5AJ9ag3LkAc MLZqItmch8NSKi3saRaT/RX1PoQ7q31NU6z7JEhBz8JqEbgwxyfIalgtnUV87ag4jqy91L 42tVsUoCPrWy3LcN6+5snJ8N+4L+7Ji8Ytsmko+RLa/EKQESSrnU7gc+nwXEROOkGfwMYC TCIdikWbnCASFMQ6cam6vVRiCY1E+YR66wEm0QRJs67i6uS3ZEjvI0xsRdlH9w== From: Louis Chauvet Date: Wed, 29 Oct 2025 14:30:18 +0100 Subject: [PATCH v2 08/32] drm/vkms: Introduce config for plane rotation Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251029-vkms-all-config-v2-8-be20b9bf146e@bootlin.com> References: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=11951; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=EWVgtj5CqLfQMmBn4PxWSe+Ra69UhyW4oe1nnFTIWxY=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAhbq/ORowCo53sfuuxJ30YiUvaC6Y23nfGble bgFxdQXqE2JAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQIW6gAKCRAgrS7GWxAs 4qqhD/4smtYR4onzZutjdlzcVrS+BJPQ3E6w8VGV1CnkQbqeJGl9huNOpAEJudxipLEKLYhlbe4 7R7esZbDu8SecpbrvIHu5ae+axsc2Ouz08WPVQDtlyfRQgcUJ3Vq5VVtL3vOyyF2pVylL6NjfdR 0327Yw+0FXjqXAHDMEqZpXGZ8ms9SMaVWi2AXseCqn00mmXWyE28/BLk1G4Mm4HyEodi7LHll1j COtw3lWW6dx7ur24LzzfCKhsRvFWhE7fDoEvlsDriDmHMfUCHIil+pquG3KIxDZ0i9rt3QHuefu UxoR+3b0FD/2rkvbN08v7ZP3bLfQMKX3oXuwWcWX6QE5k1vvR/7LQ3wZ3BRmn9f/i8T999FCpns HvvLvhg/96baPBff8cV2dyOOriFpVl/oEwVpA/PCZjVUOIwRL3/ccxnRcqXLjIzA6K0GvP82Zzw Zv9fBY+m2uqUSIExJv7blZ/rjM8JfYYxAAlZOHGk7B719rKn8e1NRHedQdYrUFH6GrmrPg4nMqw +iUj4URbYuOgKaLiuixPYbazF2wPDYJ53JAffoKYY7yIl6zNJX9tO33G5cT8HHwA9d/qxqpe2yh H8DTjMsK8bfBSoqStZa23h54qv+rR4ScSMf+KpkajnTIGF0mmndj3pBn/p67UmGgki2fFMSYPgZ 90r08f6CPob5m8g== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 VKMS driver supports all the rotation on planes, but for testing it can be useful to only advertise few of them. This new configuration interface will allow configuring the rotation per planes. Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/tests/vkms_config_test.c | 46 +++++++++++++++++++ drivers/gpu/drm/vkms/vkms_config.c | 63 +++++++++++++++++++++++= ++++ drivers/gpu/drm/vkms/vkms_config.h | 59 +++++++++++++++++++++++= ++ drivers/gpu/drm/vkms/vkms_plane.c | 6 ++- 4 files changed, 172 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/vkms/tests/vkms_config_test.c b/drivers/gpu/dr= m/vkms/tests/vkms_config_test.c index d75a6252e4d2..8d805084ad96 100644 --- a/drivers/gpu/drm/vkms/tests/vkms_config_test.c +++ b/drivers/gpu/drm/vkms/tests/vkms_config_test.c @@ -1,5 +1,6 @@ // SPDX-License-Identifier: GPL-2.0+ =20 +#include #include =20 #include "../vkms_config.h" @@ -172,6 +173,12 @@ static void vkms_config_test_default_config(struct kun= it *test) n_possible_crtcs++; } KUNIT_EXPECT_EQ(test, n_possible_crtcs, 1); + KUNIT_EXPECT_EQ(test, + vkms_config_plane_get_supported_rotations(plane_cfg), + DRM_MODE_ROTATE_MASK | DRM_MODE_REFLECT_MASK); + KUNIT_EXPECT_EQ(test, + vkms_config_plane_get_default_rotation(plane_cfg), + DRM_MODE_ROTATE_0); } =20 /* Encoders */ @@ -468,6 +475,44 @@ static void vkms_config_test_valid_plane_type(struct k= unit *test) vkms_config_destroy(config); } =20 +static void vkms_config_test_valid_plane_rotations(struct kunit *test) +{ + struct vkms_config *config; + struct vkms_config_plane *plane_cfg; + + config =3D vkms_config_default_create(false, false, false); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); + + plane_cfg =3D get_first_plane(config); + + /* Valid, no rotation, no reflection */ + vkms_config_plane_set_supported_rotations(plane_cfg, DRM_MODE_ROTATE_0); + vkms_config_plane_set_default_rotation(plane_cfg, DRM_MODE_ROTATE_0); + KUNIT_EXPECT_TRUE(test, vkms_config_valid_plane_rotation(config, plane_cf= g)); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Invalid, default rotation is not supported */ + vkms_config_plane_set_supported_rotations(plane_cfg, DRM_MODE_ROTATE_0); + vkms_config_plane_set_default_rotation(plane_cfg, DRM_MODE_ROTATE_90); + KUNIT_EXPECT_FALSE(test, vkms_config_valid_plane_rotation(config, plane_c= fg)); + KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); + + /* Invalid, supported rotations must contains at least one rotation */ + vkms_config_plane_set_supported_rotations(plane_cfg, DRM_MODE_REFLECT_MAS= K); + vkms_config_plane_set_default_rotation(plane_cfg, DRM_MODE_REFLECT_X | DR= M_MODE_ROTATE_0); + KUNIT_EXPECT_FALSE(test, vkms_config_valid_plane_rotation(config, plane_c= fg)); + KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); + + /* Invalid, default rotation must contains at least one rotation */ + vkms_config_plane_set_supported_rotations(plane_cfg, + DRM_MODE_REFLECT_MASK | DRM_MODE_ROTATE_0); + vkms_config_plane_set_default_rotation(plane_cfg, DRM_MODE_REFLECT_X); + KUNIT_EXPECT_FALSE(test, vkms_config_valid_plane_rotation(config, plane_c= fg)); + KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); + + vkms_config_destroy(config); +} + static void vkms_config_test_valid_plane_possible_crtcs(struct kunit *test) { struct vkms_config *config; @@ -990,6 +1035,7 @@ static struct kunit_case vkms_config_test_cases[] =3D { KUNIT_CASE(vkms_config_test_get_connectors), KUNIT_CASE(vkms_config_test_invalid_plane_number), KUNIT_CASE(vkms_config_test_valid_plane_type), + KUNIT_CASE(vkms_config_test_valid_plane_rotations), KUNIT_CASE(vkms_config_test_valid_plane_possible_crtcs), KUNIT_CASE(vkms_config_test_invalid_crtc_number), KUNIT_CASE(vkms_config_test_invalid_encoder_number), diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index bfafb5d2504d..dd951db88888 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -3,7 +3,9 @@ #include #include =20 +#include #include +#include #include #include #include @@ -146,6 +148,33 @@ static bool valid_plane_number(const struct vkms_confi= g *config) return true; } =20 +VISIBLE_IF_KUNIT +bool vkms_config_valid_plane_rotation(const struct vkms_config *config, + const struct vkms_config_plane *plane_cfg) +{ + struct drm_device *dev =3D config->dev ? &config->dev->drm : NULL; + + if ((vkms_config_plane_get_default_rotation(plane_cfg) & + vkms_config_plane_get_supported_rotations(plane_cfg)) !=3D + vkms_config_plane_get_default_rotation(plane_cfg)) { + drm_info(dev, "Configured default rotation is not supported by the plane= \n"); + return false; + } + + if ((vkms_config_plane_get_default_rotation(plane_cfg) & DRM_MODE_ROTATE_= MASK) =3D=3D 0) { + drm_info(dev, "Configured default rotation must contains at least one po= ssible rotation\n"); + return false; + } + + if ((vkms_config_plane_get_supported_rotations(plane_cfg) & DRM_MODE_ROTA= TE_MASK) =3D=3D 0) { + drm_info(dev, "Configured supported rotations must contains at least one= possible rotation\n"); + return false; + } + + return true; +} +EXPORT_SYMBOL_IF_KUNIT(vkms_config_valid_plane_rotation); + static bool valid_planes_for_crtc(const struct vkms_config *config, struct vkms_config_crtc *crtc_cfg) { @@ -303,6 +332,12 @@ static bool valid_connector_possible_encoders(const st= ruct vkms_config *config) bool vkms_config_is_valid(const struct vkms_config *config) { struct vkms_config_crtc *crtc_cfg; + struct vkms_config_plane *plane_cfg; + + vkms_config_for_each_plane(config, plane_cfg) { + if (!vkms_config_valid_plane_rotation(config, plane_cfg)) + return false; + } =20 if (!valid_plane_number(config)) return false; @@ -334,6 +369,22 @@ bool vkms_config_is_valid(const struct vkms_config *co= nfig) } EXPORT_SYMBOL_IF_KUNIT(vkms_config_is_valid); =20 +static void show_bitfield(struct seq_file *m, uint32_t value, const char *= callback(unsigned int)) +{ + u32 offset =3D 0; + bool first =3D true; + + while (value >=3D BIT(offset) && offset < 32) { + if (value & BIT(offset)) { + if (!first) + seq_puts(m, ","); + seq_printf(m, callback(offset)); + first =3D false; + } + offset +=3D 1; + } +} + static int vkms_config_show(struct seq_file *m, void *data) { struct drm_debugfs_entry *entry =3D m->private; @@ -354,6 +405,14 @@ static int vkms_config_show(struct seq_file *m, void *= data) drm_get_plane_type_name(vkms_config_plane_get_type(plane_cfg))); seq_printf(m, "\tname=3D%s\n", vkms_config_plane_get_name(plane_cfg)); + seq_puts(m, "\tsupported rotations=3D"); + show_bitfield(m, vkms_config_plane_get_supported_rotations(plane_cfg), + drm_get_rotation_name); + seq_puts(m, "\n"); + seq_puts(m, "\tdefault rotation=3D"); + show_bitfield(m, vkms_config_plane_get_default_rotation(plane_cfg), + drm_get_rotation_name); + seq_puts(m, "\n"); } =20 vkms_config_for_each_crtc(vkmsdev->config, crtc_cfg) { @@ -395,6 +454,10 @@ struct vkms_config_plane *vkms_config_create_plane(str= uct vkms_config *config) plane_cfg->config =3D config; vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_OVERLAY); vkms_config_plane_set_name(plane_cfg, NULL); + vkms_config_plane_set_supported_rotations(plane_cfg, + DRM_MODE_ROTATE_MASK | DRM_MODE_REFLECT_MASK); + vkms_config_plane_set_default_rotation(plane_cfg, DRM_MODE_ROTATE_0); + xa_init_flags(&plane_cfg->possible_crtcs, XA_FLAGS_ALLOC); =20 list_add_tail(&plane_cfg->link, &config->planes); diff --git a/drivers/gpu/drm/vkms/vkms_config.h b/drivers/gpu/drm/vkms/vkms= _config.h index 57342db5795a..8d413e02180a 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -39,6 +39,8 @@ struct vkms_config { * @type: Type of the plane. The creator of configuration needs to ensures= that * at least one primary plane is present. * @possible_crtcs: Array of CRTCs that can be used with this plane + * @default_rotation: Default rotation that should be used by this plane + * @supported_rotation: Rotation that this plane will support * @plane: Internal usage. This pointer should never be considered as vali= d. * It can be used to store a temporary reference to a VKMS plane d= uring * device creation. This pointer is not managed by the configurati= on and @@ -50,6 +52,8 @@ struct vkms_config_plane { =20 const char *name; enum drm_plane_type type; + unsigned int default_rotation; + unsigned int supported_rotations; struct xarray possible_crtcs; =20 /* Internal usage */ @@ -290,6 +294,61 @@ vkms_config_plane_set_type(struct vkms_config_plane *p= lane_cfg, plane_cfg->type =3D type; } =20 +/** + * vkms_config_plane_get_default_rotation() - Get the default rotation for= a plane + * @plane_cfg: Plane to get the default rotation from + * + * Returns: + * The default rotation for the plane. + */ +static inline unsigned int +vkms_config_plane_get_default_rotation(const struct vkms_config_plane *pla= ne_cfg) +{ + return plane_cfg->default_rotation; +} + +/** + * vkms_config_plane_set_default_rotation() - Set the default rotation for= a plane + * @plane_cfg: Plane to set the default rotation to + * @default_rotation: New default rotation for the plane + */ +static inline void +vkms_config_plane_set_default_rotation(struct vkms_config_plane *plane_cfg, + unsigned int default_rotation) +{ + plane_cfg->default_rotation =3D default_rotation; +} + +/** + * vkms_config_plane_get_supported_rotations() - Get the supported rotatio= ns for a plane + * @plane_cfg: Plane to get the supported rotations from + * + * Returns: + * The supported rotations for the plane. + */ +static inline unsigned int +vkms_config_plane_get_supported_rotations(const struct vkms_config_plane *= plane_cfg) +{ + return plane_cfg->supported_rotations; +} + +/** + * vkms_config_plane_set_supported_rotations() - Set the supported rotatio= ns for a plane + * @plane_cfg: Plane to set the supported rotations to + * @supported_rotations: New supported rotations for the plane + */ +static inline void +vkms_config_plane_set_supported_rotations(struct vkms_config_plane *plane_= cfg, + unsigned int supported_rotations) +{ + plane_cfg->supported_rotations =3D supported_rotations; +} + +#if IS_ENABLED(CONFIG_KUNIT) +bool vkms_config_valid_plane_rotation(const struct vkms_config *config, + const struct vkms_config_plane *plane_cfg); +#endif + /** * vkms_config_plane_set_name() - Set the plane name * @plane_cfg: Plane to set the name to diff --git a/drivers/gpu/drm/vkms/vkms_plane.c b/drivers/gpu/drm/vkms/vkms_= plane.c index 73180cbb78b1..d147b70692fa 100644 --- a/drivers/gpu/drm/vkms/vkms_plane.c +++ b/drivers/gpu/drm/vkms/vkms_plane.c @@ -1,5 +1,6 @@ // SPDX-License-Identifier: GPL-2.0+ =20 +#include "vkms_config.h" #include =20 #include @@ -233,8 +234,9 @@ struct vkms_plane *vkms_plane_init(struct vkms_device *= vkmsdev, =20 drm_plane_helper_add(&plane->base, &vkms_plane_helper_funcs); =20 - drm_plane_create_rotation_property(&plane->base, DRM_MODE_ROTATE_0, - DRM_MODE_ROTATE_MASK | DRM_MODE_REFLECT_MASK); + drm_plane_create_rotation_property(&plane->base, + vkms_config_plane_get_default_rotation(config), + vkms_config_plane_get_supported_rotations(config)); =20 drm_plane_create_color_properties(&plane->base, BIT(DRM_COLOR_YCBCR_BT601) | --=20 2.51.0 From nobody Sun Feb 8 19:55:55 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 5E3AB33F376 for ; Wed, 29 Oct 2025 13:30:42 +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=1761744644; cv=none; b=g4H1zNb1AhP+S4bpHiRitzp9zC+cWTNfMa9/OmHBGBDqYnSFeusfq1lY5ic9ka25kYzkl1+wjSRNr1Qr7cas8sX4+j1fX36t/69c+3cYllZ6BiiF8PrbE2eSBzz1mp2ag2aKVv4mPfznVmJ9j5gtdsBlti1Gzp6iXc1VBFoVoeY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761744644; c=relaxed/simple; bh=Dv+LTI2ccj4n/EV0vGVog8BjMGvNzDlPlpeBGi9mOcY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=tQVsMMfLzKN/Ka3q5s+dYY7ccSkv1CjCi18y1/gzkZ0MElBrE+2jOXzwkdJHhl5cfsU5tjGKrviaVRCnTa/AmOF63whUNYyQawju2D1SCTuBLce8HhwmUBQsB+CN633GdmLlWxi4jxA+H1ZGAFcNd5Nq9fgeojffzVOU+Nsfuzo= 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=XS6RVZK/; 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="XS6RVZK/" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id D91584E413CE; Wed, 29 Oct 2025 13:30:40 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id B000D606E8; Wed, 29 Oct 2025 13:30:40 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 88694117F809E; Wed, 29 Oct 2025 14:30:38 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761744639; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=iqMVLDuN4ai0MP2bHzX+4+j1XnBiI2VvRCwM5QgdY5E=; b=XS6RVZK/LSBiJ5sBzFx4KsvDZnS4+eTz0MxLnK7fX9QV/AH1itFPUAelUav5PlWThoUN3/ jNj0RbGlkNyTK6ZR3iFniklPIhQq8paCtQq7adJeMoQC0o1juQnKDGoNUQe1Bhul0Hz0Ws rJf8rSEg0CvEPgRKRhRf24kFh0pxg8CPue90NGb8yTA7+a/Xfl898LTJzKIbP7dXgr0DNu toUaaMlpmUnjg+tnz85as+fgwI7EVawVIS6QDmmx9pVZvxTZNkwo5N86mFF/Z0/5I4Thcj yAanEn93lXkTDBnBHUERyPY5Zip/WeWLjoiFONhDe2blo71s/Vxz+BmQspNlwQ== From: Louis Chauvet Date: Wed, 29 Oct 2025 14:30:19 +0100 Subject: [PATCH v2 09/32] drm/vkms: Introduce configfs for plane rotation Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251029-vkms-all-config-v2-9-be20b9bf146e@bootlin.com> References: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=4874; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=Dv+LTI2ccj4n/EV0vGVog8BjMGvNzDlPlpeBGi9mOcY=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAhbqJHR/L52167D6TUK2ZsRO4iasVIoZq8uiL MfvBmrUT46JAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQIW6gAKCRAgrS7GWxAs 4nogD/9FHvKHFsm1qN5HYhzd09CAF/KdjohECQGuaA4pYS8yyrfTBFCqdXli1YAt+Vd7QCry46Q RiFreHKEsnCYC0kS1935pdI1GOKUEmSh9rBk9dCgmFrxC5uhO8yCe134XBkpkTVcK4LZAsWm41X gzzxKJK8qAtQIMOV5bP8U1aSqLiBZPBIE/5wClNGFUCU4RiNPe7Oab0BFKA787Ya8/eqt+Z7EE+ L+Mm8XGvMzY75Hiq28ebozIxA8hwpMKrd//cxqG6WhEE8DR3ryaseUuFmGYG3J+yTL5s4B2Wloz tLq70/2r2DL85JsviMTek6VrEZWBA1KikvxVGRmJCz5+BmCLm/4Bidj8JhUv03K6zh6auY6K+HG SQwGG/o+3dtfbwqQO9HtWpCTG5HlZUpR+Ds+2RNZvM3Oi5ux6zdnKfPaZDmZuFmiN36NWSzSFh9 ySyU2tojaaxHrH+MjmG2erRUxmlKYfnaKku1JHoCY6sfcaqBmJCKq/d+rFLF2blJar3CHHp6pIh 6s0bdKP5vjAINuvThbKHiOPjd8LfgsiK4ohglTSAN3d5rBm/p5LFsEwsOHZs8LKPQZ7Ewzewh6d DBmILNBsRq7Pi1lQcIHG5nwibqwwE1PcJolkBsSDVCP/yLkaA6Nt50TuK+jyJfTHvu/3AHQrr4T BuIemq3HsYogYeQ== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 To allows the userspace to test many hardware configuration, introduce a new interface to configure the available rotation per planes. VKMS supports any rotation and reflection, so the userspace can choose any combination. The supported rotations are configured by writing a rotation bitmask to the file `supported_rotations` and the default rotation is chosen by writing a rotation bitmask to `default_rotation`. Signed-off-by: Louis Chauvet --- Documentation/gpu/vkms.rst | 7 ++- drivers/gpu/drm/vkms/vkms_configfs.c | 91 ++++++++++++++++++++++++++++++++= ++++ 2 files changed, 97 insertions(+), 1 deletion(-) diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index 1fe6e420c963..eac1a942d6c4 100644 --- a/Documentation/gpu/vkms.rst +++ b/Documentation/gpu/vkms.rst @@ -87,11 +87,16 @@ Start by creating one or more planes:: =20 sudo mkdir /config/vkms/my-vkms/planes/plane0 =20 -Planes have 2 configurable attributes: +Planes have 4 configurable attributes: =20 - type: Plane type: 0 overlay, 1 primary, 2 cursor (same values as those exposed by the "type" property of a plane) - name: Name of the plane +- possible_rotations: Available rotation for a plane, as a bitmask: 0x01 n= o rotation, + 0x02 rotate 90=C2=B0, 0x04 rotate 180=C2=B0, 0x08 rotate 270=C2=B0, 0x10= reflect x, 0x20 reflect y + (same values as those exposed by the "rotation" property of a plane) +- default_rotation: Default rotation presented to the userspace, same valu= es as + possible_rotations. =20 Continue by creating one or more CRTCs:: =20 diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vk= ms_configfs.c index be6c3ba998b9..7cc8ba315ef0 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -352,12 +352,103 @@ static ssize_t plane_name_store(struct config_item *= item, const char *page, return (ssize_t)count; } =20 +static ssize_t plane_supported_rotations_show(struct config_item *item, ch= ar *page) +{ + struct vkms_configfs_plane *plane; + unsigned int plane_supported_rotations; + + plane =3D plane_item_to_vkms_configfs_plane(item); + + scoped_guard(mutex, &plane->dev->lock) { + plane_supported_rotations =3D vkms_config_plane_get_supported_rotations(= plane->config); + } + + return sprintf(page, "%u", plane_supported_rotations); +} + +static ssize_t plane_supported_rotations_store(struct config_item *item, + const char *page, size_t count) +{ + struct vkms_configfs_plane *plane =3D plane_item_to_vkms_configfs_plane(i= tem); + int ret, val =3D 0; + + ret =3D kstrtouint(page, 0, &val); + if (ret) + return ret; + + /* Should be a supported value */ + if (val & ~(DRM_MODE_ROTATE_MASK | DRM_MODE_REFLECT_MASK)) + return -EINVAL; + /* Should at least provide one rotation */ + if (!(val & DRM_MODE_ROTATE_MASK)) + return -EINVAL; + + scoped_guard(mutex, &plane->dev->lock) { + /* Ensures that the default rotation is included in supported rotation */ + if (plane->dev->enabled) + return -EINVAL; + + vkms_config_plane_set_supported_rotations(plane->config, val); + } + + return count; +} + +static ssize_t plane_default_rotation_show(struct config_item *item, char = *page) +{ + struct vkms_configfs_plane *plane; + unsigned int plane_default_rotation; + + plane =3D plane_item_to_vkms_configfs_plane(item); + + scoped_guard(mutex, &plane->dev->lock) { + plane_default_rotation =3D vkms_config_plane_get_default_rotation(plane-= >config); + } + + return sprintf(page, "%u", plane_default_rotation); +} + +static ssize_t plane_default_rotation_store(struct config_item *item, + const char *page, size_t count) +{ + struct vkms_configfs_plane *plane =3D plane_item_to_vkms_configfs_plane(i= tem); + int ret, val =3D 0; + + ret =3D kstrtouint(page, 10, &val); + if (ret) + return ret; + + /* Should be a supported value */ + if (val & ~(DRM_MODE_ROTATE_MASK | DRM_MODE_REFLECT_MASK)) + return -EINVAL; + /* Should at least provide one rotation */ + if ((val & DRM_MODE_ROTATE_MASK) =3D=3D 0) + return -EINVAL; + /* Should contains only one rotation */ + if (!is_power_of_2(val & DRM_MODE_ROTATE_MASK)) + return -EINVAL; + + scoped_guard(mutex, &plane->dev->lock) { + /* Ensures that the default rotation is included in supported rotation */ + if (plane->dev->enabled) + return -EINVAL; + + vkms_config_plane_set_default_rotation(plane->config, val); + } + + return count; +} + CONFIGFS_ATTR(plane_, type); CONFIGFS_ATTR(plane_, name); +CONFIGFS_ATTR(plane_, supported_rotations); +CONFIGFS_ATTR(plane_, default_rotation); =20 static struct configfs_attribute *plane_item_attrs[] =3D { &plane_attr_type, &plane_attr_name, + &plane_attr_supported_rotations, + &plane_attr_default_rotation, NULL, }; =20 --=20 2.51.0 From nobody Sun Feb 8 19:55:55 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 12DF333F8BC for ; Wed, 29 Oct 2025 13:30: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=1761744646; cv=none; b=sH0Lt6dndJAubh31axsFl1suEm4DgmK9gnV3ZjQzsutgn2vYwRiCz1Qt3uBozfUYkYdR6eutSGtLxCqZTnD/M+JcRgVYXNRQ+oWtlZ/LDRMqXT3vdVv6+3FdAVay3YxHv/CJiuN3uEhugp42IrUb9PVlVmwU+83LkuPKs6JBn40= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761744646; c=relaxed/simple; bh=9TfPsJICnyPE31+Hej6T7C008mQBIxzh3S131zfeBZs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=cWWNQOG0iVjBP4TFqjAkz8rgdruY4KA8UMWYLBaouH+vhNAml2gQITSaU4nXhrhLhwzTXVvAbdQhLUQtdEn0mNtK13Uo0eUu3knrreIZAUGEajOZrunR7RTRIPIiNODCfrHwWdajI634PBi74OiiMAVw2Q675tzkeUdqIB1yNPo= 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=nd0edYDU; 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="nd0edYDU" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 7F7421A1744; Wed, 29 Oct 2025 13:30:42 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 56185606E8; Wed, 29 Oct 2025 13:30:42 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 40876117F80A0; Wed, 29 Oct 2025 14:30:40 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761744641; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=gKwfA60Mu6/uVfL7AHgIja/er1PeHgmxn0F8i6czpgo=; b=nd0edYDUyhm0q21E8iKTihi2iZswyf7BnghCGXvwb9eIllTR3lDotEWIOcsN+aynvYiBxC 25SVOc4fbJVBiIVBChaCOBpQBuUh7olJ+51VIygU5aWDIhTcKKPvBWSZd9k8ohyYVuQps1 LrMOogMQLnoilWcI3veEkarPJxV5OZmXo7zkGIlX+hWuWYuDLQpaLZuK6+qxjpoFKETcYt 25SlToP9ZyauEI2NraVHYBaXJwqcaPWnUmjIRCuYjX798Qfo9OzUW+2p078Cqtdxqw8XjL 7HpGsjEHLVeAJip8g/fc4J19GS80m/UJELGKjWl3eKJv8gyQxROM0zfrrJsphA== From: Louis Chauvet Date: Wed, 29 Oct 2025 14:30:20 +0100 Subject: [PATCH v2 10/32] drm/drm_color_mgmt: Expose drm_get_color_encoding_name Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251029-vkms-all-config-v2-10-be20b9bf146e@bootlin.com> References: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=2102; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=9TfPsJICnyPE31+Hej6T7C008mQBIxzh3S131zfeBZs=; b=kA0DAAoBIK0uxlsQLOIByyZiAGkCFuqgN+18wfzpaScwMhagWzteA4B+KM/YnSsMmbLFhILPw IkCMwQAAQoAHRYhBE+PuD++eDwxDFBZBCCtLsZbECziBQJpAhbqAAoJECCtLsZbECzi7Q8P/3hH LUu8mAen8jCzESUz8mO3pazAQ/8qNhHa9t8DN5nFKrIqEiEg2va3wZ+vsBWOktFDY294b+zfqUA Cfb8cHYJrEE8s1MG2jF1LjmO0zoCsi2NwQTkl019YlNa9f/Tbp3xGk0pyTvD3YsX8vPveWvGiMN Mnqer09UNqCgTQSMooK8VCvaqwJI4xFELq1Sh0W4IoOIyLJ1DvVuEdyC1+IDxKKaOBifTjsyNHr gDsCsJi1aFG8gIpkSP15c/R4xppxGrQDhL97Qz2PXHm3MRBqo67cp1dfd/9of6posEn8CERDGXy V08hNLFSmNxRL9gKC2MpeODr6REo0LrRdqdEgmBO2lhA0iJYHkxeMwQ1wM6rRDQZ2qo+B5lN3vG pLvr29T0rt+867C2PSd2IF2cnh48bMdFCnEZuhrjbApw2JRMiO/gWqgpO5t8Nrow6muIpfX4w5z 7jsfxdxHVx/s0lj4Knvn2oovg+j5ReUnSfDSPAbEzr/dkXCLD/uLv08h+o8M55yz1u1nDSLCSb+ jL3YyIsA+cmulRUgykXQXKsC4MO0YWR11t5/k1vUEOmjQkNQ4l2Dw5/9WY3cVK1NIdYkdzllvjj nezFP8SUBSJHjH0GxwSHdat5++NEO+di/xd+gWOzSbDVIH5sFslctiLC5QbKvh2TAzuh56ZJDHU jMVxS X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 drm_get_color_encoding_name can be useful to display debug information outside drm core. Export it so it could be used for VKMS Signed-off-by: Louis Chauvet --- drivers/gpu/drm/drm_color_mgmt.c | 2 +- drivers/gpu/drm/drm_crtc_internal.h | 2 -- include/drm/drm_color_mgmt.h | 2 ++ 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/drm_color_mgmt.c b/drivers/gpu/drm/drm_color_m= gmt.c index 131c1c9ae92f..b0a3be3cc016 100644 --- a/drivers/gpu/drm/drm_color_mgmt.c +++ b/drivers/gpu/drm/drm_color_mgmt.c @@ -496,7 +496,7 @@ const char *drm_get_color_encoding_name(enum drm_color_= encoding encoding) =20 return color_encoding_name[encoding]; } -EXPORT_SYMBOL_IF_KUNIT(drm_get_color_encoding_name); +EXPORT_SYMBOL(drm_get_color_encoding_name); =20 /** * drm_get_color_range_name - return a string for color range diff --git a/drivers/gpu/drm/drm_crtc_internal.h b/drivers/gpu/drm/drm_crtc= _internal.h index 89706aa8232f..68fd5385917f 100644 --- a/drivers/gpu/drm/drm_crtc_internal.h +++ b/drivers/gpu/drm/drm_crtc_internal.h @@ -38,7 +38,6 @@ #include #include =20 -enum drm_color_encoding; enum drm_color_range; enum drm_connector_force; enum drm_mode_status; @@ -121,7 +120,6 @@ int drm_mode_destroy_dumb_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv); =20 /* drm_color_mgmt.c */ -const char *drm_get_color_encoding_name(enum drm_color_encoding encoding); const char *drm_get_color_range_name(enum drm_color_range range); =20 /* IOCTLs */ diff --git a/include/drm/drm_color_mgmt.h b/include/drm/drm_color_mgmt.h index eccb71ab335a..eb55bdd33f50 100644 --- a/include/drm/drm_color_mgmt.h +++ b/include/drm/drm_color_mgmt.h @@ -85,6 +85,8 @@ enum drm_color_range { DRM_COLOR_RANGE_MAX, }; =20 +const char *drm_get_color_encoding_name(enum drm_color_encoding encoding); + int drm_plane_create_color_properties(struct drm_plane *plane, u32 supported_encodings, u32 supported_ranges, --=20 2.51.0 From nobody Sun Feb 8 19:55:55 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 BD06D340A67 for ; Wed, 29 Oct 2025 13:30:45 +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=1761744647; cv=none; b=KyaLIrzs+lJ5LPXOwBwSUSb0iMlWsnxFjiZQMKnjNEgmVGwHsIErqWQ8ge62hbq5uhyqSuIioCfzCW4xj6eH2cIYCSnlhRsagtjMdi6YQvmo+XQzaH1elbrnCseOMWmP9t6w8n9LpbYk+9r5fO9TKTxGcYJXBDiONUjnYbm3R70= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761744647; c=relaxed/simple; bh=fjA3uHrWGPIdRuzypNSgwDb9BsOZZE8SEPcDqjBca6M=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=POzWXT2QMgCoeFkS3ozEmDtoCqAVaHM7ZHMl5oCa6KyUxN0fnzP5QG3lFtEsThu8EG7Eh35vs8xgsqT/aI2vGOwy3Vmi4h4hkVLunAH/5ig7N17CeBFjZ+eVxGUhBnuGxBqjZprGz+oUzRxAfSDttWwidtISZSIibLvA0EdcbFs= 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=JsPuGMlG; 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="JsPuGMlG" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 2E15A4E413D0; Wed, 29 Oct 2025 13:30:44 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id F2424606E8; Wed, 29 Oct 2025 13:30:43 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id D7377117F80A1; Wed, 29 Oct 2025 14:30:41 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761744643; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=EiYlyg9skF8q1c98aSDi7YMXuCRISp0a8Q6aImyKbJc=; b=JsPuGMlG28I+oBb/FTXwJo//pKjWPfPCxgmq2zyc7NxGmV1CED9B/fj2tWzVTlZndyMxoa KOW01yD8OAfvV4KPPzBmxnPjIslL1Zp4l6dSSESvaC9YrNHBfkmv9+5O7CH6myTRuJVeCD WoQu3TZ7a5k7HdVL7oWAw58ypkYYI4QTa/0UY+OUf7R9pRSkg7axEoKtULW4totvxt5EL3 fPlUMQdflyLzKVCX7rnUmzJXM7oPoY5kZ5Cifc8o1WTDwQfZtYgSDEX98QIgE3RARSU5vo UA4S+3S7+yhtf4RS/PtYTJ1ArwEDzsoZGhtD5yT43UIw9/4NA1/7l35sGpmaAw== From: Louis Chauvet Date: Wed, 29 Oct 2025 14:30:21 +0100 Subject: [PATCH v2 11/32] drm/vkms: Introduce config for plane color encoding Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251029-vkms-all-config-v2-11-be20b9bf146e@bootlin.com> References: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=11725; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=fjA3uHrWGPIdRuzypNSgwDb9BsOZZE8SEPcDqjBca6M=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAhbqQlNW5UyxOqqLkPhNG8gW6GtQJDQ0SXvjm IiQOUYMsJCJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQIW6gAKCRAgrS7GWxAs 4k7mD/4mvTl9C4qagysbidmpTUjHUmuOMEyVB01UTkpGbJZys0fOMXlZ6uD8X71bJGpNg3clm1u LYOjvFPoUaE1Dw70SrcO9Y4jhdjG8lH996HoCabGN0nG5SEW9ox/TDuHADjQw4wPdlf+EoTEPye +boAVAgNX+iq//3EqxoizKdJN9dDRLLUN71TziyDTO/ngTIOfXcMj7nw9vaQDA8HBVrJRJKX30u VbFi500HbZD9bGJHRz22VwZuap5JrAssE+dLZO5NS6Oqd2CIH483u47elmA6Lkm+ZPIfTAj27o5 ll2ExAGejPslscTh0F4svQq8HEiJrSDF23wnBGbpCKc1P27EC2YRFVPdgv+mqbH3RCoZNrWppvZ EHxPrqfMnNRy5w5A63SXZfN+be7VBp57z9gTvritoTTwZhOh26VpF/aAe4pdFJiY1WDM0IXRvJJ wT5whrqSooaRBBYu0xB3Xt49FZvBlsYNwYIGzoPEZfFZBXQ/6BAu58RoekVs9hlQWSH8MEdSkQ2 eI9Vo/jrdjP8lgWHWI/D5Z7lkOdSUGNZUk8+5MOdEVxEM2XkSqWrLsFjUCmuLSEvJ//ik3OY3Bo Zrhez1JQi0RnMk+XgWnt9LGdzUfylsNnFyysxjsOKJzxTNXu+UplWyk+ha7Yu8/Zu9sNqcrtTA2 npZyKEc4DrW30Ig== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 VKMS driver supports all the color encoding on planes, but for testing it can be useful to only advertise few of them. This new configuration interface will allow configuring the color encoding per planes. Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/tests/vkms_config_test.c | 51 +++++++++++++++++++++ drivers/gpu/drm/vkms/vkms_config.c | 32 ++++++++++++++ drivers/gpu/drm/vkms/vkms_config.h | 64 +++++++++++++++++++++++= ++++ drivers/gpu/drm/vkms/vkms_plane.c | 15 +++---- 4 files changed, 154 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/vkms/tests/vkms_config_test.c b/drivers/gpu/dr= m/vkms/tests/vkms_config_test.c index 8d805084ad96..e9bc051188f9 100644 --- a/drivers/gpu/drm/vkms/tests/vkms_config_test.c +++ b/drivers/gpu/drm/vkms/tests/vkms_config_test.c @@ -179,6 +179,14 @@ static void vkms_config_test_default_config(struct kun= it *test) KUNIT_EXPECT_EQ(test, vkms_config_plane_get_default_rotation(plane_cfg), DRM_MODE_ROTATE_0); + KUNIT_EXPECT_EQ(test, + vkms_config_plane_get_supported_color_encodings(plane_cfg), + BIT(DRM_COLOR_YCBCR_BT601) | + BIT(DRM_COLOR_YCBCR_BT709) | + BIT(DRM_COLOR_YCBCR_BT2020)); + KUNIT_EXPECT_EQ(test, + vkms_config_plane_get_default_color_encoding(plane_cfg), + DRM_COLOR_YCBCR_BT601); } =20 /* Encoders */ @@ -513,6 +521,48 @@ static void vkms_config_test_valid_plane_rotations(str= uct kunit *test) vkms_config_destroy(config); } =20 +static void vkms_config_test_valid_plane_color_encoding(struct kunit *test) +{ + struct vkms_config *config; + struct vkms_config_plane *plane_cfg; + + config =3D vkms_config_default_create(false, false, false); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); + + plane_cfg =3D get_first_plane(config); + + /* Valid, all color encoding supported */ + vkms_config_plane_set_supported_color_encodings(plane_cfg, + BIT(DRM_COLOR_YCBCR_BT601) | + BIT(DRM_COLOR_YCBCR_BT709) | + BIT(DRM_COLOR_YCBCR_BT2020)); + vkms_config_plane_set_default_color_encoding(plane_cfg, DRM_COLOR_YCBCR_B= T601); + KUNIT_EXPECT_TRUE(test, vkms_config_valid_plane_color_encoding(config, pl= ane_cfg)); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Invalid, default color encoding is not supported */ + vkms_config_plane_set_supported_color_encodings(plane_cfg, + BIT(DRM_COLOR_YCBCR_BT601) | + BIT(DRM_COLOR_YCBCR_BT2020)); + vkms_config_plane_set_default_color_encoding(plane_cfg, DRM_COLOR_YCBCR_B= T709); + KUNIT_EXPECT_FALSE(test, vkms_config_valid_plane_color_encoding(config, p= lane_cfg)); + KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); + + /* Valid, no supported or color encoding */ + vkms_config_plane_set_supported_color_encodings(plane_cfg, 0); + vkms_config_plane_set_default_color_encoding(plane_cfg, 0); + KUNIT_EXPECT_TRUE(test, vkms_config_valid_plane_color_encoding(config, pl= ane_cfg)); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Valid, if no supported color encoding, default is ignored */ + vkms_config_plane_set_supported_color_encodings(plane_cfg, 0); + vkms_config_plane_set_default_color_encoding(plane_cfg, DRM_COLOR_YCBCR_B= T601); + KUNIT_EXPECT_TRUE(test, vkms_config_valid_plane_color_encoding(config, pl= ane_cfg)); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + vkms_config_destroy(config); +} + static void vkms_config_test_valid_plane_possible_crtcs(struct kunit *test) { struct vkms_config *config; @@ -1036,6 +1086,7 @@ static struct kunit_case vkms_config_test_cases[] =3D= { KUNIT_CASE(vkms_config_test_invalid_plane_number), KUNIT_CASE(vkms_config_test_valid_plane_type), KUNIT_CASE(vkms_config_test_valid_plane_rotations), + KUNIT_CASE(vkms_config_test_valid_plane_color_encoding), KUNIT_CASE(vkms_config_test_valid_plane_possible_crtcs), KUNIT_CASE(vkms_config_test_invalid_crtc_number), KUNIT_CASE(vkms_config_test_invalid_encoder_number), diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index dd951db88888..6a3d52c1141d 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -175,6 +175,25 @@ bool vkms_config_valid_plane_rotation(const struct vkm= s_config *config, } EXPORT_SYMBOL_IF_KUNIT(vkms_config_valid_plane_rotation); =20 +VISIBLE_IF_KUNIT +bool vkms_config_valid_plane_color_encoding(const struct vkms_config *conf= ig, + const struct vkms_config_plane *plane_cfg) +{ + struct drm_device *dev =3D config->dev ? &config->dev->drm : NULL; + + if (vkms_config_plane_get_supported_color_encodings(plane_cfg)) { + if ((BIT(vkms_config_plane_get_default_color_encoding(plane_cfg)) & + vkms_config_plane_get_supported_color_encodings(plane_cfg)) !=3D + BIT(vkms_config_plane_get_default_color_encoding(plane_cfg))) { + drm_info(dev, "Configured default color encoding is not supported by th= e plane\n"); + return false; + } + } + + return true; +} +EXPORT_SYMBOL_IF_KUNIT(vkms_config_valid_plane_color_encoding); + static bool valid_planes_for_crtc(const struct vkms_config *config, struct vkms_config_crtc *crtc_cfg) { @@ -337,6 +356,9 @@ bool vkms_config_is_valid(const struct vkms_config *con= fig) vkms_config_for_each_plane(config, plane_cfg) { if (!vkms_config_valid_plane_rotation(config, plane_cfg)) return false; + + if (!vkms_config_valid_plane_color_encoding(config, plane_cfg)) + return false; } =20 if (!valid_plane_number(config)) @@ -413,6 +435,12 @@ static int vkms_config_show(struct seq_file *m, void *= data) show_bitfield(m, vkms_config_plane_get_default_rotation(plane_cfg), drm_get_rotation_name); seq_puts(m, "\n"); + seq_puts(m, "\tsupported color encoding=3D"); + show_bitfield(m, vkms_config_plane_get_supported_color_encodings(plane_c= fg), + drm_get_color_encoding_name); + seq_puts(m, "\n"); + seq_printf(m, "\tdefault color encoding=3D%s\n", + drm_get_color_encoding_name(vkms_config_plane_get_default_color_enco= ding(plane_cfg))); } =20 vkms_config_for_each_crtc(vkmsdev->config, crtc_cfg) { @@ -457,6 +485,10 @@ struct vkms_config_plane *vkms_config_create_plane(str= uct vkms_config *config) vkms_config_plane_set_supported_rotations(plane_cfg, DRM_MODE_ROTATE_MASK | DRM_MODE_REFLECT_MASK); vkms_config_plane_set_default_rotation(plane_cfg, DRM_MODE_ROTATE_0); + vkms_config_plane_set_supported_color_encodings(plane_cfg, BIT(DRM_COLOR_= YCBCR_BT601) | + BIT(DRM_COLOR_YCBCR_BT709) | + BIT(DRM_COLOR_YCBCR_BT2020)); + vkms_config_plane_set_default_color_encoding(plane_cfg, DRM_COLOR_YCBCR_B= T601); =20 xa_init_flags(&plane_cfg->possible_crtcs, XA_FLAGS_ALLOC); =20 diff --git a/drivers/gpu/drm/vkms/vkms_config.h b/drivers/gpu/drm/vkms/vkms= _config.h index 8d413e02180a..d740c9478256 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -45,6 +45,8 @@ struct vkms_config { * It can be used to store a temporary reference to a VKMS plane d= uring * device creation. This pointer is not managed by the configurati= on and * must be managed by other means. + * @default_color_encoding: Default color encoding that should be used by = this plane + * @supported_color_encodings: Color encoding that this plane will support */ struct vkms_config_plane { struct list_head link; @@ -54,6 +56,8 @@ struct vkms_config_plane { enum drm_plane_type type; unsigned int default_rotation; unsigned int supported_rotations; + enum drm_color_encoding default_color_encoding; + unsigned int supported_color_encodings; struct xarray possible_crtcs; =20 /* Internal usage */ @@ -349,6 +353,66 @@ bool vkms_config_valid_plane_rotation(const struct vkm= s_config *config, const struct vkms_config_plane *plane_cfg); #endif =20 +/** + * vkms_config_plane_get_default_color_encoding() - Get the default color = encoding for a plane + * @plane_cfg: Plane to get the default color encoding from + * + * Returns: + * The default color encoding for the plane + */ +static inline enum drm_color_encoding +vkms_config_plane_get_default_color_encoding(const struct vkms_config_plan= e *plane_cfg) +{ + return plane_cfg->default_color_encoding; +} + +/** + * vkms_config_plane_set_default_color_encoding() - Set the default color = encoding for a plane + * @plane_cfg: Plane to set the default color encoding to + * @default_color_encoding: New default color encoding for the plane + */ +static inline void +vkms_config_plane_set_default_color_encoding(struct vkms_config_plane *pla= ne_cfg, + enum drm_color_encoding default_color_encoding) +{ + plane_cfg->default_color_encoding =3D default_color_encoding; +} + +/** + * vkms_config_plane_get_supported_color_encodings() - Get the supported c= olor encodings for a plane + * @plane_cfg: Plane to get the supported color encodings from + * + * Returns: + * The supported color encodings for the plane. Each set bit correspond to= a value of enum + * drm_color_encoding: BIT(DRM_COLOR_YCBCR_BT601) | BIT(DRM_COLOR_YCBCR_BT= 709) means that + * DRM_COLOR_YCBCR_BT601 and DRM_COLOR_YCBCR_BT709 are supported. + */ +static inline unsigned int +vkms_config_plane_get_supported_color_encodings(const struct vkms_config_p= lane *plane_cfg) +{ + return plane_cfg->supported_color_encodings; +} + +/** + * vkms_config_plane_set_supported_color_encodings() - Set the supported c= olor encodings for a plane + * @plane_cfg: Plane to set the supported color encodings to + * @supported_color_encodings: New supported color encodings for the plane= . Each set bit corresponds + * to a value of enum drm_color_encoding: + * BIT(DRM_COLOR_YCBCR_BT601) | BIT(DRM_COLOR_Y= CBCR_BT709) means that + * DRM_COLOR_YCBCR_BT601 and DRM_COLOR_YCBCR_BT= 709 are supported. + */ +static inline void +vkms_config_plane_set_supported_color_encodings(struct vkms_config_plane *= plane_cfg, + unsigned int supported_color_encodings) +{ + plane_cfg->supported_color_encodings =3D supported_color_encodings; +} + +#if IS_ENABLED(CONFIG_KUNIT) +bool vkms_config_valid_plane_color_encoding(const struct vkms_config *conf= ig, + const struct vkms_config_plane *plane_cfg); +#endif + /** * vkms_config_plane_set_name() - Set the plane name * @plane_cfg: Plane to set the name to diff --git a/drivers/gpu/drm/vkms/vkms_plane.c b/drivers/gpu/drm/vkms/vkms_= plane.c index d147b70692fa..9550831be51a 100644 --- a/drivers/gpu/drm/vkms/vkms_plane.c +++ b/drivers/gpu/drm/vkms/vkms_plane.c @@ -238,14 +238,13 @@ struct vkms_plane *vkms_plane_init(struct vkms_device= *vkmsdev, vkms_config_plane_get_default_rotation(config), vkms_config_plane_get_supported_rotations(config)); =20 - drm_plane_create_color_properties(&plane->base, - BIT(DRM_COLOR_YCBCR_BT601) | - BIT(DRM_COLOR_YCBCR_BT709) | - BIT(DRM_COLOR_YCBCR_BT2020), - BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) | - BIT(DRM_COLOR_YCBCR_FULL_RANGE), - DRM_COLOR_YCBCR_BT601, - DRM_COLOR_YCBCR_FULL_RANGE); + if (vkms_config_plane_get_supported_color_encodings(config) !=3D 0) + drm_plane_create_color_properties(&plane->base, + vkms_config_plane_get_supported_color_encodings(config), + BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) | + BIT(DRM_COLOR_YCBCR_FULL_RANGE), + vkms_config_plane_get_default_color_encoding(config), + DRM_COLOR_YCBCR_FULL_RANGE); =20 return plane; } --=20 2.51.0 From nobody Sun Feb 8 19:55:55 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 6230E3446B5 for ; Wed, 29 Oct 2025 13:30:46 +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=1761744650; cv=none; b=Ao32pTp3ba+ZPuB/eiQfOrRrOqLWeLor/1lhmnWXhZCYQUhASEz9JZS3trZpWG0Rr5srSf4nTdOlaAPFMGobFMq5cdPZLE6e5FgQ77KPwj2eb5QfTh6YIlbn8Ascpioh2B6gI5rUYkAuSilscmDXq+Cs7UkSVlRViJRHhAV8ogc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761744650; c=relaxed/simple; bh=kRHIbdbfnhVWw5i8K9kmqCMqIgSkq6c1b5MfkOrcekc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=f0Z4jROB1mwTF4FBz/u77Yv17TZD5T72F7AKwYCbISWqmfNZAmMSqWxNzyv1qIuL9eagxc457dYKJ2ITuXiaMZyWXZWA7DqSDfadP5X5XPDXwF1EeTSViQyXLvmDDk2I8jQy2Dvw62+QxnGf0koXGf9cHvCMHmi3z2blgswiASM= 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=J9SuWYbC; 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="J9SuWYbC" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 5FBABC0DB01; Wed, 29 Oct 2025 13:30:25 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id B6CE9606E8; Wed, 29 Oct 2025 13:30:45 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 82E11117F80A2; Wed, 29 Oct 2025 14:30:43 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761744644; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=lzv0r4HbW8ZPDlxxuNQc4DxHoOKfZX5QaG27pmKoI4k=; b=J9SuWYbCDfkuKUyM1KhZvr8jO8fSys1Ld/nGBbhDfz2+n9zRB4dKflK/kD7sBTb7K17/Fx YxYVDA2bIYONarVN1dwRGZtAHo2qPk/PPpOf3E5lquEpNPDGdBMFRkmea3h1wHXAJW6c+M QNSh1+T/vXYZB5HjXwsICm8U095MXr2pjZ9NHMp0AXVgfC1r0zrYtuMaVGuJXxDqoTbUZ0 mDXJDFlH1gCx9M07Qc6blxGlGMEdNE7A/W6jq7jN5cspnIxLyjpb4S6OuU7Gxx1wh4ZxiB nCWWbN7n0B7tmM4PkPSe+o9KdkYsUqS+//YxAbVEuVJ8pW5XReztbw5YnhB/+w== From: Louis Chauvet Date: Wed, 29 Oct 2025 14:30:22 +0100 Subject: [PATCH v2 12/32] drm/vkms: Introduce configfs for plane color encoding Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251029-vkms-all-config-v2-12-be20b9bf146e@bootlin.com> References: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=5578; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=kRHIbdbfnhVWw5i8K9kmqCMqIgSkq6c1b5MfkOrcekc=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAhbq6dPIKPQC1u+XPhmpbq22jb90+94b0IVxQ TNlx8lgkdGJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQIW6gAKCRAgrS7GWxAs 4v4MD/9hRkM4jGPJ0wHcTHYF2Un73zUgv4H4IqRKs3KVb1mEeZhFvCL2StTsbUA+DdlpqQPN4ad 1+RlBll9GRKTXomk5MEY3N5fchsEVERQmk9JvIHhsLfs93dHHlvlGv9PSt7AA15Bm4O+mm06CGT ReMhWWuqQoYZBRf/8rdAwq5OfX/EiJyeUwTzOnZfJLK3L3gF6iWwRBfXX31YdCsBCA2DzUIwjLF Eie38uSgo5DsM67uukW3jqD3yH8/nVK0GFdFlO5J68UTdKydkZ62vgO/IfM2Po+tU787QBx30Wn lMkj+fdyODxU2A6buEqwZjRmbbOIx2EiNMtJJWpc0igWU9Bufvgh+06/f0IMsBX/WOpQSaHnNsT bQr50vKjAq8egjxrntIhPD76U2WVWDiJX4HgDz6Bp45i6PJhAf3IxOCCNiu4jMDa0pZYtfswqEW vuqkL7kKwyVxVEDRk7fDc+0kxUkNHVu2FjDFWSri51R+CIKzZQ6JMLDsZMXRTx4AXj6BA3hFVuE Wpzz26Fy/kyOCi/F5zWmog3IVJLQ6mamK+vHW9r66qer3PRmXZxIuhPlgGxYTWXA3mQZK5DLDm6 NRq2irlzzdbAEQj1qTTlP7yGDit3l0GXQYxslvu6FA3WGVc6RhLa+GLo6Yrhjf2yL4oC6Oy7Eun RBndah3f/RDFBGw== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 To allows the userspace to test many hardware configuration, introduce a new interface to configure the available color encoding per planes. VKMS supports multiple color encoding, so the userspace can choose any combination. The supported color encoding are configured by writing a color encoding bitmask to the file `supported_color_encoding` and the default color encoding is chosen by writing a color encoding bitmask to `default_color_encoding`. Signed-off-by: Louis Chauvet --- Documentation/gpu/vkms.rst | 7 ++- drivers/gpu/drm/vkms/vkms_configfs.c | 98 ++++++++++++++++++++++++++++++++= ++++ 2 files changed, 104 insertions(+), 1 deletion(-) diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index eac1a942d6c4..dab6811687a2 100644 --- a/Documentation/gpu/vkms.rst +++ b/Documentation/gpu/vkms.rst @@ -87,7 +87,7 @@ Start by creating one or more planes:: =20 sudo mkdir /config/vkms/my-vkms/planes/plane0 =20 -Planes have 4 configurable attributes: +Planes have 6 configurable attributes: =20 - type: Plane type: 0 overlay, 1 primary, 2 cursor (same values as those exposed by the "type" property of a plane) @@ -97,6 +97,11 @@ Planes have 4 configurable attributes: (same values as those exposed by the "rotation" property of a plane) - default_rotation: Default rotation presented to the userspace, same valu= es as possible_rotations. +- supported_color_encoding: Available encoding for a plane, as a bitmask: + 0x01 YCBCR_BT601, 0x02: YCBCR_BT709, 0x04 YCBCR_BT2020 (same values as t= hose exposed + by the COLOR_ENCODING property of a plane) +- default_color_encoding: Default color encoding presented to the userspac= e, same + values as supported_color_encoding =20 Continue by creating one or more CRTCs:: =20 diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vk= ms_configfs.c index 7cc8ba315ef0..ee2e8d141f9e 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -439,16 +439,114 @@ static ssize_t plane_default_rotation_store(struct c= onfig_item *item, return count; } =20 +static ssize_t plane_supported_color_encodings_show(struct config_item *it= em, char *page) +{ + struct vkms_configfs_plane *plane; + unsigned int supported_color_encoding; + + plane =3D plane_item_to_vkms_configfs_plane(item); + + scoped_guard(mutex, &plane->dev->lock) { + supported_color_encoding =3D vkms_config_plane_get_supported_color_encod= ings(plane->config); + } + + return sprintf(page, "%u", supported_color_encoding); +} + +static ssize_t plane_supported_color_encodings_store(struct config_item *i= tem, + const char *page, size_t count) +{ + struct vkms_configfs_plane *plane =3D plane_item_to_vkms_configfs_plane(i= tem); + int ret, val =3D 0; + + ret =3D kstrtouint(page, 10, &val); + if (ret) + return ret; + + /* Should be a supported value */ + if (val & ~(BIT(DRM_COLOR_YCBCR_BT601) | + BIT(DRM_COLOR_YCBCR_BT709) | + BIT(DRM_COLOR_YCBCR_BT2020))) + return -EINVAL; + /* Should at least provide one color range */ + if ((val & (BIT(DRM_COLOR_YCBCR_BT601) | + BIT(DRM_COLOR_YCBCR_BT709) | + BIT(DRM_COLOR_YCBCR_BT2020))) =3D=3D 0) + return -EINVAL; + + scoped_guard(mutex, &plane->dev->lock) { + /* Ensures that the default rotation is included in supported rotation */ + if (plane->dev->enabled) + return -EINVAL; + + vkms_config_plane_set_supported_color_encodings(plane->config, val); + } + + return count; +} + +/* Plane default_color_encoding : vkms//planes//default_col= or_encoding */ + +static ssize_t plane_default_color_encoding_show(struct config_item *item,= char *page) +{ + struct vkms_configfs_plane *plane; + unsigned int default_color_encoding; + + plane =3D plane_item_to_vkms_configfs_plane(item); + + scoped_guard(mutex, &plane->dev->lock) { + default_color_encoding =3D vkms_config_plane_get_default_color_encoding(= plane->config); + } + + return sprintf(page, "%u", default_color_encoding); +} + +static ssize_t plane_default_color_encoding_store(struct config_item *item, + const char *page, size_t count) +{ + struct vkms_configfs_plane *plane =3D plane_item_to_vkms_configfs_plane(i= tem); + int ret, val =3D 0; + + ret =3D kstrtouint(page, 10, &val); + if (ret) + return ret; + + /* Should be a supported value */ + if (val & ~(BIT(DRM_COLOR_YCBCR_BT601) | + BIT(DRM_COLOR_YCBCR_BT709) | + BIT(DRM_COLOR_YCBCR_BT2020))) + return -EINVAL; + /* Should at least provide one color range */ + if ((val & (BIT(DRM_COLOR_YCBCR_BT601) | + BIT(DRM_COLOR_YCBCR_BT709) | + BIT(DRM_COLOR_YCBCR_BT2020))) =3D=3D 0) + return -EINVAL; + + scoped_guard(mutex, &plane->dev->lock) { + /* Ensures that the default rotation is included in supported rotation */ + if (plane->dev->enabled) + return -EINVAL; + + vkms_config_plane_set_default_color_encoding(plane->config, val); + } + + return count; +} + CONFIGFS_ATTR(plane_, type); CONFIGFS_ATTR(plane_, name); CONFIGFS_ATTR(plane_, supported_rotations); CONFIGFS_ATTR(plane_, default_rotation); +CONFIGFS_ATTR(plane_, supported_color_encodings); +CONFIGFS_ATTR(plane_, default_color_encoding); =20 static struct configfs_attribute *plane_item_attrs[] =3D { &plane_attr_type, &plane_attr_name, &plane_attr_supported_rotations, &plane_attr_default_rotation, + &plane_attr_supported_color_encodings, + &plane_attr_default_color_encoding, NULL, }; =20 --=20 2.51.0 From nobody Sun Feb 8 19:55:55 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 DF72128C866 for ; Wed, 29 Oct 2025 13:30:48 +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=1761744650; cv=none; b=Uh30eTRUITiN58Y3gAub9AoyrFiHucyW8Ngm7EVg1tlmOZnjFGAxGT33AZFNhLYReG9hjeGbSTwpu9bMLym9C4BFG35sGgOtOTIKHApeyWKpjA+iy68oug4RNdbRMJOrhobLvhkpcEqR7fNQpTZJBvZtX6fxk5wl2t1Sh+nC2Z0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761744650; c=relaxed/simple; bh=+Nk0u/KrijgE5zDh6uaPSGFr6ndPexSiMuF6ZPkPnok=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=sxkhT20AcurSvTB9LYeqyR+kVDY/3p03sescImIUI2lA2Zlqn7+xA3ROr7oTNWQHHl+XeqxUxqqPZZrf/DAJvs8n/hyV8CM7CquQ0jjCut2DlAphOg7yfA1K5YZWygNaXiH7Y8QYuXpne+f7U60dwfWzfGMj1Fd53YuYZPH8KVM= 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=ELl7iV1+; 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="ELl7iV1+" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 774B74E413CF; Wed, 29 Oct 2025 13:30:47 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 4C5D8606E8; Wed, 29 Oct 2025 13:30:47 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 3DA07117F80A3; Wed, 29 Oct 2025 14:30:45 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761744646; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=4muwKvrTXY2eKur3coogPiXaumR8M+FqVnR4hpQELAA=; b=ELl7iV1+daHOifJAnMDc4pNMnW5CcwlXHnySbbdrj52lKFr+AJoHzjsc2WG2yUZMljQBrK GMBYcqpkshSLzouXvxwNN2Cr1s12lI/F1+zEZlJsrZcXAYomQtbI0KKtHuL0BPUklsj0oz nXAfGpyEQ6M0MMnFu5DcvoKi61fapIMaCejRWoD9BUKXu7RlNkDoXtwlJq5hZGLYYlmbxt JaygWgm/ouz2T8DD1V1l100noTMMe2f+IyqkrfkOB1Q9kqvnteZRF2YzNVwF0L7U/enp7s jV266+CdPRXYN8n0AmABrj+x5ULIt+tV3mWFcok9AI2x16SebaNXrCqMgP9+cA== From: Louis Chauvet Date: Wed, 29 Oct 2025 14:30:23 +0100 Subject: [PATCH v2 13/32] drm/drm_color_mgmt: Expose drm_get_color_range_name Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251029-vkms-all-config-v2-13-be20b9bf146e@bootlin.com> References: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=2153; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=+Nk0u/KrijgE5zDh6uaPSGFr6ndPexSiMuF6ZPkPnok=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAhbql1UMg6xHECN89J3YBGgKB0//neNYGL8C5 KyjbqFLjkiJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQIW6gAKCRAgrS7GWxAs 4pmKD/9m6UU4Fet0eVOx7sd2PT6nCgZexnf0JWDttzBsf9+EA/Z6qVgnXgFy9g/cZNhLjRJvNhr pNOuDdpRaLSE4NoIDM+JFyhH5sIO1UCsVd2ZJpKAK9Hxf34kN01KeUhQdUfToMWK/LrVoNwbmQz 3nQ2Nu7FQTd+Av4Q4RP4D46bbbXizFC456EjXVlHwGkK5hnBDjWOz24wxVguE5PKoINOVZT6fZO eY0wLIjnh+UmDFjjHYl6rq1pjZQgsw9q1wZB+zB4P0iz8coD7PRpQrwQBu4H/hJnVBpx6EXV7iW a983IKSyjOblL2d6Qu7PoBQI5tvk9j40K0Tp50+SJAMcImSjp9zBprKEy1vMQRTyJ+CwBRKH+Ps MmD5bnP8V3M3ZJXB3GIVHG/ydxrCzyfxths+PCsZTptEXPv11n8NSjzsMB1LeFfZnnOOa6wcZyb ZvG2O6a0FWWuB/5D7qEOmQ/JVRyyEzJJUqHN6zpuxBzTlH8NTbWmEvQznpTD3Q+gbE6EJd+/5al i5lwSYydeWTgfeewYP4zKQutDTVI1y7rLkfVc95RypixwewxDKGYBBNy2ih7M58Q94piDygwO69 3mX60yW+p9vy4Z+z2BuYifGHvAvpuZy7kHf9H0Qoe8OKxGcjtxDLVveNwYIfujpCsWHWwd4Y+6E Ecl2DYC7RhVMVJg== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 drm_get_color_range_name can be useful to print debugging information. Export it so it could be used from VKMS. Signed-off-by: Louis Chauvet --- drivers/gpu/drm/drm_color_mgmt.c | 2 +- drivers/gpu/drm/drm_crtc_internal.h | 4 ---- include/drm/drm_color_mgmt.h | 1 + 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/drm_color_mgmt.c b/drivers/gpu/drm/drm_color_m= gmt.c index b0a3be3cc016..5b24b9843531 100644 --- a/drivers/gpu/drm/drm_color_mgmt.c +++ b/drivers/gpu/drm/drm_color_mgmt.c @@ -512,7 +512,7 @@ const char *drm_get_color_range_name(enum drm_color_ran= ge range) =20 return color_range_name[range]; } -EXPORT_SYMBOL_IF_KUNIT(drm_get_color_range_name); +EXPORT_SYMBOL(drm_get_color_range_name); =20 /** * drm_plane_create_color_properties - color encoding related plane proper= ties diff --git a/drivers/gpu/drm/drm_crtc_internal.h b/drivers/gpu/drm/drm_crtc= _internal.h index 68fd5385917f..9141127a16ab 100644 --- a/drivers/gpu/drm/drm_crtc_internal.h +++ b/drivers/gpu/drm/drm_crtc_internal.h @@ -38,7 +38,6 @@ #include #include =20 -enum drm_color_range; enum drm_connector_force; enum drm_mode_status; =20 @@ -119,9 +118,6 @@ int drm_mode_mmap_dumb_ioctl(struct drm_device *dev, int drm_mode_destroy_dumb_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv); =20 -/* drm_color_mgmt.c */ -const char *drm_get_color_range_name(enum drm_color_range range); - /* IOCTLs */ int drm_mode_gamma_get_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv); diff --git a/include/drm/drm_color_mgmt.h b/include/drm/drm_color_mgmt.h index eb55bdd33f50..0d25b7d9cb29 100644 --- a/include/drm/drm_color_mgmt.h +++ b/include/drm/drm_color_mgmt.h @@ -86,6 +86,7 @@ enum drm_color_range { }; =20 const char *drm_get_color_encoding_name(enum drm_color_encoding encoding); +const char *drm_get_color_range_name(enum drm_color_range range); =20 int drm_plane_create_color_properties(struct drm_plane *plane, u32 supported_encodings, --=20 2.51.0 From nobody Sun Feb 8 19:55:55 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 C0B9F345CD6 for ; Wed, 29 Oct 2025 13:30:50 +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=1761744653; cv=none; b=OoI04VM6QO9hRX9vQsl6bSrWlIA6wsihmutAtaOXePC2q3gwZv+WG7zlpJl7+ss4Iof0KTU11uOcMdNSHdfFPfT3+OwY1tiX7/IX6gU3lieZ0plVbwlz/n97zYwF7wYmT6szsdRaxtLoEaORvIHeRnsZfVTC1X1shlxcvKqmOVI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761744653; c=relaxed/simple; bh=T760Ea0lymjEwsCgtjQB1XIujALcHIbvM/hl+VMkLp8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Y3l8zYFTkbctL0SQuQeQR0J+6aM4t3uahVzJEqndxNR+AfUbQomgf0r7Ybk9ICxsZMvCpiQd9a6O5QbO5CvB5wh/yvxV+/C93ZrTIQ2hVFDDvSU1sPv0SowuOHY/c24lz/2Q67eFj38WXrym0zvsmoGSTVlWtalgAyvVWXTRa3I= 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=YBDPP5vY; 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="YBDPP5vY" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 04531C0DB02; Wed, 29 Oct 2025 13:30:29 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 5A2EC606E8; Wed, 29 Oct 2025 13:30:49 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id DAF76117F80A4; Wed, 29 Oct 2025 14:30:46 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761744648; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=uO84+iwcTFjRfhgWoOtSFw3ivQXohz4k3QCtmL+xJPg=; b=YBDPP5vY2sODvN7EMRmXzYs7Q3pJSWBVsQUKoCRRQb05X41w2iuOb8JsyqCTTnh30rEWku 3n/ULTecByi8rnz7AWHqQfLpkXyzhVQx5G9L5FliDVH7RKs/7qBlcPbpPrb9shate7n+Fc NkTNs8KIbklUWNHt+KmcuFOsHEgjifxkthkqrp9TDOCCOqwCj0F+Bkv8bbeh6dXuDZEHsW duZL5bMxjCD+iB8O715DTY1gODee95/RxKRYCKEJ2ptimEcXo4gZ0iYiurCPVX6wEdIPyE 2mBrV8QX+UA9yrGbGKvL6WYgmNZC6YfAzWBwf2XTkCNihEeg+gTRfS7vfqdV6w== From: Louis Chauvet Date: Wed, 29 Oct 2025 14:30:24 +0100 Subject: [PATCH v2 14/32] drm/vkms: Introduce config for plane color range Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251029-vkms-all-config-v2-14-be20b9bf146e@bootlin.com> References: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=10762; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=T760Ea0lymjEwsCgtjQB1XIujALcHIbvM/hl+VMkLp8=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAhbqNqbvI5hXSUbhpsBEQI/HmMzxecJP+tFRu FUZGvzjrWOJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQIW6gAKCRAgrS7GWxAs 4pHdEACEJD3Kudeg2vodF5yZ80A6+d5UtfR7/IHiqdpVYYg6k5wGrvPgPg0E2T7XoaZvXiKE650 xxKlNmQPatF7PRO3JkomO9I4ht84AA0q8A6VbyxFrRZSPrkPRqeh1yYgp1pmBShLj9Wa/y7edRR vnk5xrieW597C73njVQIunu7AD5YeyYF34D7Ns4DJBwmdt2He8CjGPx1+5QJkC3emoKdkCRAnkC a3wOQTRdpl8EQ18v3a5CLcd1xM2MKOuhK4CRkYAHpvOGIeEefR9pR3TvQP0nRW5AlBQJlNOouHl 5JlnxXOEufm7iSROG4wMkN0WlFJOno8adkLkTfSV8+6EAP3IFulUwWjfGnCxUcU5UOUxfTeRjvG wsJx+Edb4mA/FPzv7Z4lKnMYb66ouAsdOOhKI9oFJNBnOABwW4L8Ucg6va+iWN0yJ8J36/Ma9vQ 5Fp3p1tEg+sG6L4WsANFLtdG9DI0h56cxUGuZd06PeNw91ncbI7LptzkGJfBvhRrE0uR/+ANtpW ADBjosoiljHKga8CmVoWsEPlxpelzdH9xsITb7VdDUkkwVwOuMJLh0HIbAAbMW1m7n52tyO7RnA qHo+5QCq9vzPSHmHMLhfPaUD9TYFV+02tvjAxHi8Jf75Gj4Yie35Dv/26gzY+R3wm3sTFRJXs2R WXBkNdAD9gpBcAA== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 VKMS driver supports all the color range on planes, but for testing it can be useful to only advertise few of them. This new configuration interface will allow configuring the color range per planes. Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/tests/vkms_config_test.c | 44 +++++++++++++++++++++++= ++++ drivers/gpu/drm/vkms/vkms_config.c | 39 ++++++++++++++++++++++++ drivers/gpu/drm/vkms/vkms_config.h | 35 +++++++++++++++++++++ drivers/gpu/drm/vkms/vkms_plane.c | 8 ++--- 4 files changed, 122 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/vkms/tests/vkms_config_test.c b/drivers/gpu/dr= m/vkms/tests/vkms_config_test.c index e9bc051188f9..d962fec8d3b3 100644 --- a/drivers/gpu/drm/vkms/tests/vkms_config_test.c +++ b/drivers/gpu/drm/vkms/tests/vkms_config_test.c @@ -1,5 +1,6 @@ // SPDX-License-Identifier: GPL-2.0+ =20 +#include #include #include =20 @@ -549,6 +550,7 @@ static void vkms_config_test_valid_plane_color_encoding= (struct kunit *test) KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); =20 /* Valid, no supported or color encoding */ + vkms_config_plane_set_supported_color_ranges(plane_cfg, 0); vkms_config_plane_set_supported_color_encodings(plane_cfg, 0); vkms_config_plane_set_default_color_encoding(plane_cfg, 0); KUNIT_EXPECT_TRUE(test, vkms_config_valid_plane_color_encoding(config, pl= ane_cfg)); @@ -563,6 +565,47 @@ static void vkms_config_test_valid_plane_color_encodin= g(struct kunit *test) vkms_config_destroy(config); } =20 +static void vkms_config_test_valid_plane_color_range(struct kunit *test) +{ + struct vkms_config *config; + struct vkms_config_plane *plane_cfg; + + config =3D vkms_config_default_create(false, false, false); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); + + plane_cfg =3D get_first_plane(config); + + /* Valid, all color range supported */ + vkms_config_plane_set_supported_color_ranges(plane_cfg, + BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) | + BIT(DRM_COLOR_YCBCR_FULL_RANGE)); + vkms_config_plane_set_default_color_range(plane_cfg, DRM_COLOR_YCBCR_FULL= _RANGE); + KUNIT_EXPECT_TRUE(test, vkms_config_valid_plane_color_range(config, plane= _cfg)); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Invalid, default color range is not supported */ + vkms_config_plane_set_supported_color_ranges(plane_cfg, + BIT(DRM_COLOR_YCBCR_FULL_RANGE)); + vkms_config_plane_set_default_color_range(plane_cfg, DRM_COLOR_YCBCR_LIMI= TED_RANGE); + KUNIT_EXPECT_FALSE(test, vkms_config_valid_plane_color_range(config, plan= e_cfg)); + KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); + + /* Valid, no supported or color range */ + vkms_config_plane_set_supported_color_encodings(plane_cfg, 0); + vkms_config_plane_set_supported_color_ranges(plane_cfg, 0); + vkms_config_plane_set_default_color_range(plane_cfg, 0); + KUNIT_EXPECT_TRUE(test, vkms_config_valid_plane_color_range(config, plane= _cfg)); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Valid, if no supported color range, default is ignored */ + vkms_config_plane_set_supported_color_ranges(plane_cfg, 0); + vkms_config_plane_set_default_color_range(plane_cfg, DRM_COLOR_YCBCR_LIMI= TED_RANGE); + KUNIT_EXPECT_TRUE(test, vkms_config_valid_plane_color_range(config, plane= _cfg)); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + vkms_config_destroy(config); +} + static void vkms_config_test_valid_plane_possible_crtcs(struct kunit *test) { struct vkms_config *config; @@ -1087,6 +1130,7 @@ static struct kunit_case vkms_config_test_cases[] =3D= { KUNIT_CASE(vkms_config_test_valid_plane_type), KUNIT_CASE(vkms_config_test_valid_plane_rotations), KUNIT_CASE(vkms_config_test_valid_plane_color_encoding), + KUNIT_CASE(vkms_config_test_valid_plane_color_range), KUNIT_CASE(vkms_config_test_valid_plane_possible_crtcs), KUNIT_CASE(vkms_config_test_invalid_crtc_number), KUNIT_CASE(vkms_config_test_invalid_encoder_number), diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index 6a3d52c1141d..823039fb4145 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -194,6 +194,25 @@ bool vkms_config_valid_plane_color_encoding(const stru= ct vkms_config *config, } EXPORT_SYMBOL_IF_KUNIT(vkms_config_valid_plane_color_encoding); =20 +VISIBLE_IF_KUNIT +bool vkms_config_valid_plane_color_range(const struct vkms_config *config, + const struct vkms_config_plane *plane_cfg) +{ + struct drm_device *dev =3D config->dev ? &config->dev->drm : NULL; + + if (vkms_config_plane_get_supported_color_ranges(plane_cfg)) { + if ((BIT(vkms_config_plane_get_default_color_range(plane_cfg)) & + vkms_config_plane_get_supported_color_ranges(plane_cfg)) !=3D + BIT(vkms_config_plane_get_default_color_range(plane_cfg))) { + drm_info(dev, "Configured default color range is not supported by the p= lane\n"); + return false; + } + } + + return true; +} +EXPORT_SYMBOL_IF_KUNIT(vkms_config_valid_plane_color_range); + static bool valid_planes_for_crtc(const struct vkms_config *config, struct vkms_config_crtc *crtc_cfg) { @@ -350,6 +369,7 @@ static bool valid_connector_possible_encoders(const str= uct vkms_config *config) =20 bool vkms_config_is_valid(const struct vkms_config *config) { + struct drm_device *dev =3D config->dev ? &config->dev->drm : NULL; struct vkms_config_crtc *crtc_cfg; struct vkms_config_plane *plane_cfg; =20 @@ -359,6 +379,16 @@ bool vkms_config_is_valid(const struct vkms_config *co= nfig) =20 if (!vkms_config_valid_plane_color_encoding(config, plane_cfg)) return false; + + if (!vkms_config_valid_plane_color_range(config, plane_cfg)) + return false; + + if ((vkms_config_plane_get_supported_color_encodings(plane_cfg) =3D=3D 0= ) !=3D + (vkms_config_plane_get_supported_color_ranges(plane_cfg) =3D=3D 0)) { + drm_info(dev, + "Both supported color encoding and color range must be set, or none\n= "); + return false; + } } =20 if (!valid_plane_number(config)) @@ -441,6 +471,12 @@ static int vkms_config_show(struct seq_file *m, void *= data) seq_puts(m, "\n"); seq_printf(m, "\tdefault color encoding=3D%s\n", drm_get_color_encoding_name(vkms_config_plane_get_default_color_enco= ding(plane_cfg))); + seq_puts(m, "\tsupported color range=3D"); + show_bitfield(m, vkms_config_plane_get_supported_color_ranges(plane_cfg), + drm_get_color_range_name); + seq_puts(m, "\n"); + seq_printf(m, "\tdefault color range=3D%s\n", + drm_get_color_range_name(vkms_config_plane_get_default_color_range(p= lane_cfg))); } =20 vkms_config_for_each_crtc(vkmsdev->config, crtc_cfg) { @@ -489,6 +525,9 @@ struct vkms_config_plane *vkms_config_create_plane(stru= ct vkms_config *config) BIT(DRM_COLOR_YCBCR_BT709) | BIT(DRM_COLOR_YCBCR_BT2020)); vkms_config_plane_set_default_color_encoding(plane_cfg, DRM_COLOR_YCBCR_B= T601); + vkms_config_plane_set_supported_color_ranges(plane_cfg, BIT(DRM_COLOR_YCB= CR_LIMITED_RANGE) | + BIT(DRM_COLOR_YCBCR_FULL_RANGE)); + vkms_config_plane_set_default_color_range(plane_cfg, DRM_COLOR_YCBCR_FULL= _RANGE); =20 xa_init_flags(&plane_cfg->possible_crtcs, XA_FLAGS_ALLOC); =20 diff --git a/drivers/gpu/drm/vkms/vkms_config.h b/drivers/gpu/drm/vkms/vkms= _config.h index d740c9478256..d8648bf844d4 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -47,6 +47,8 @@ struct vkms_config { * must be managed by other means. * @default_color_encoding: Default color encoding that should be used by = this plane * @supported_color_encodings: Color encoding that this plane will support + * @default_color_range: Default color range that should be used by this p= lane + * @supported_color_ranges: Color range that this plane will support */ struct vkms_config_plane { struct list_head link; @@ -58,6 +60,8 @@ struct vkms_config_plane { unsigned int supported_rotations; enum drm_color_encoding default_color_encoding; unsigned int supported_color_encodings; + enum drm_color_range default_color_range; + unsigned int supported_color_ranges; struct xarray possible_crtcs; =20 /* Internal usage */ @@ -413,6 +417,37 @@ bool vkms_config_valid_plane_color_encoding(const stru= ct vkms_config *config, const struct vkms_config_plane *plane_cfg); #endif =20 +static inline enum drm_color_range +vkms_config_plane_get_default_color_range(const struct vkms_config_plane *= plane_cfg) +{ + return plane_cfg->default_color_range; +} + +static inline void +vkms_config_plane_set_default_color_range(struct vkms_config_plane *plane_= cfg, + enum drm_color_range default_color_range) +{ + plane_cfg->default_color_range =3D default_color_range; +} + +static inline unsigned int +vkms_config_plane_get_supported_color_ranges(const struct vkms_config_plan= e *plane_cfg) +{ + return plane_cfg->supported_color_ranges; +} + +static inline void +vkms_config_plane_set_supported_color_ranges(struct vkms_config_plane *pla= ne_cfg, + unsigned int supported_color_ranges) +{ + plane_cfg->supported_color_ranges =3D supported_color_ranges; +} + +#if IS_ENABLED(CONFIG_KUNIT) +bool vkms_config_valid_plane_color_range(const struct vkms_config *config, + const struct vkms_config_plane *plane_cfg); +#endif + /** * vkms_config_plane_set_name() - Set the plane name * @plane_cfg: Plane to set the name to diff --git a/drivers/gpu/drm/vkms/vkms_plane.c b/drivers/gpu/drm/vkms/vkms_= plane.c index 9550831be51a..5dbc7c67de1d 100644 --- a/drivers/gpu/drm/vkms/vkms_plane.c +++ b/drivers/gpu/drm/vkms/vkms_plane.c @@ -238,13 +238,13 @@ struct vkms_plane *vkms_plane_init(struct vkms_device= *vkmsdev, vkms_config_plane_get_default_rotation(config), vkms_config_plane_get_supported_rotations(config)); =20 - if (vkms_config_plane_get_supported_color_encodings(config) !=3D 0) + if (vkms_config_plane_get_supported_color_encodings(config) !=3D 0 && + vkms_config_plane_get_supported_color_ranges(config) !=3D 0) drm_plane_create_color_properties(&plane->base, vkms_config_plane_get_supported_color_encodings(config), - BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) | - BIT(DRM_COLOR_YCBCR_FULL_RANGE), + vkms_config_plane_get_supported_color_ranges(config), vkms_config_plane_get_default_color_encoding(config), - DRM_COLOR_YCBCR_FULL_RANGE); + vkms_config_plane_get_default_color_range(config)); =20 return plane; } --=20 2.51.0 From nobody Sun Feb 8 19:55:55 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 7D3B3346E51 for ; Wed, 29 Oct 2025 13:30: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=1761744654; cv=none; b=apMMuy5qhE+CnuROxl6/Zok1yeJA5mKocp1/u5uhz0HxDmeCJgIPch929bwWLTeSVimp+gQ0MwqA9FNZg89x8u0tOThY+/JyRpu/Zlh2xiBvX9zKnRgQj9TtbT8aVgIPUn7qO+6ZMO2yzte+KSQOW7SlJOSxioTgvsl+kOATFgc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761744654; c=relaxed/simple; bh=C/MMRwVv7tqxhyIue1VDDpDHYOcgFuMbnkd6mU2hgRk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=j9Z1aiTRPGI/ECR0x73xJcRdE3SXXn9EVFR1qFPQs6WaSIWJ2byKjfpZpuA3VifNpYC88PylsdcTHDXuEpJzze2oI7OE4yM8tRf62qC6H2lDnwBTbx8OiKcE5aoRglo4St3RfT612g8scNk5/TeL5eE1YExVT/JbqdYDyE22fO0= 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=zb+dQGXT; 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="zb+dQGXT" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 2EA214E413CE; Wed, 29 Oct 2025 13:30:51 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 04068606E8; Wed, 29 Oct 2025 13:30:51 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id B99A5117F809A; Wed, 29 Oct 2025 14:30:48 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761744650; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=+evWkGwW+11FOg/3gUJ1wDOagGB2wDut1Bio9XWm4W4=; b=zb+dQGXTUqAH3BlHDxxPOFWGyQODIqR/QLXKX3SfYDcW7PKLNLNbeUL2rp65G0sP3Lpe7d vmF/r81Y5wW9pSWURfuPrKZLrl/BW7tMv99DsffxZcT2S0iU6BhUuq4H9zKVheXzu811G2 nMN7B0ibOqRoarU+wmbqV2l4bENeK6oijU1OCDKFsbSCIm/y858PIbINwz5zNfNiDAVwl8 6gBuN7b7geqsRfkeiS13CCc0j8ZTVusdJ21VX+ZFXCq/9OwIeVn96mXlWTjdFQwcEBs2+q Uuoa63j6qXApeVGIPISR5+RZ2Ro08+PMHTCjXI/bwEXtWtehK23s1+XYO1EiJw== From: Louis Chauvet Date: Wed, 29 Oct 2025 14:30:25 +0100 Subject: [PATCH v2 15/32] drm/vkms: Introduce configfs for plane color range Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251029-vkms-all-config-v2-15-be20b9bf146e@bootlin.com> References: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=5958; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=C/MMRwVv7tqxhyIue1VDDpDHYOcgFuMbnkd6mU2hgRk=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAhbqDkl576Eyq7/m+Wt9htCFCFnB46sosP0Jh 12KTPvp04uJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQIW6gAKCRAgrS7GWxAs 4jgXD/9Gm9+e2USYCUxFzNaZfTXxeBQqMepLfz1CMyLW7a/YhIYt8/+ViBkGnhQIYnZuhELFDmI fvSNBHqM7t2JOjwwF2H7+UnA25dgWVdNoGQK3owwDS1KShWh8a0av6rQ6qw07wuk/TJnCg0sbmK Nvf6eL8RYtR1Brp3qRTO8mNBTtF4Sg/JDS7aw1cLOec/BYecOvqbnbSqO4aHROhfUFarMhFfVaX WgXOWA2z1+KgafiEyfX7ZdOai3OQulQLepb3pRfZCznJs4buIOi9Uc0c/q2f/NRiK31EvptOenc p6KaASMLQTbliM5cr5dgLKnPRydlyGPo5RnYtDeFjAQF6LBGB824qaLOEUfPRWwTxJKCvqfpGhl /MaicfGZJRBwSiBLayqrfKhZg3BHzY+VpSzS9rYBRy9k0q4hcHbEpDLPY2LCj81Iak8LfaCWPRV uWVHWtHVSOfyfCC3V/hDuvgt1gOxjFnO6WWpz2QklpKF6OuLNfujPAJNStBmFgNRxgVp2baujDk yshZpYP05ZlntvJE5f1LycGeeIuaTYFwQQEjeC2gFdvnJyHa+uOzheNRn9NJM61oesahBTQ5ATx DJvkYScRZQLk5JEFtHlMtx0MvFfof7hD56YCIDfalnrM425TjyZ19q8cdawHajFW7Mwjm6+wocZ X8lSlGcMak5m9dw== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 To allows the userspace to test many hardware configuration, introduce a new interface to configure the available color ranges per planes. VKMS supports multiple color ranges, so the userspace can choose any combination. The supported color ranges are configured by writing a color range bitmask to the file `supported_color_ranges` and the default color range is chosen by writing a color encoding bitmask to `default_color_range`. Signed-off-by: Louis Chauvet --- Documentation/gpu/vkms.rst | 11 ++++- drivers/gpu/drm/vkms/vkms_configfs.c | 89 ++++++++++++++++++++++++++++++++= ++++ 2 files changed, 98 insertions(+), 2 deletions(-) diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index dab6811687a2..8383e1b94668 100644 --- a/Documentation/gpu/vkms.rst +++ b/Documentation/gpu/vkms.rst @@ -87,7 +87,7 @@ Start by creating one or more planes:: =20 sudo mkdir /config/vkms/my-vkms/planes/plane0 =20 -Planes have 6 configurable attributes: +Planes have 8 configurable attributes: =20 - type: Plane type: 0 overlay, 1 primary, 2 cursor (same values as those exposed by the "type" property of a plane) @@ -99,9 +99,16 @@ Planes have 6 configurable attributes: possible_rotations. - supported_color_encoding: Available encoding for a plane, as a bitmask: 0x01 YCBCR_BT601, 0x02: YCBCR_BT709, 0x04 YCBCR_BT2020 (same values as t= hose exposed - by the COLOR_ENCODING property of a plane) + by the COLOR_ENCODING property of a plane). If set, supported_color_range + must be set too. - default_color_encoding: Default color encoding presented to the userspac= e, same values as supported_color_encoding +- supported_color_range: Available color range for a plane, as a bitmask: + 0x1 DRM_COLOR_YCBCR_LIMITED_RANGE, 0x2 DRM_COLOR_YCBCR_FULL_RANGE (same = values as + those exposed by the COLOR_RANGE property of a plane). If set, supported= _color_encoding + must be set too. +- default_color_range: Default color range presented to the userspace, same + values as supported_color_range =20 Continue by creating one or more CRTCs:: =20 diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vk= ms_configfs.c index ee2e8d141f9e..3f658dd41272 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -439,6 +439,91 @@ static ssize_t plane_default_rotation_store(struct con= fig_item *item, return count; } =20 +static ssize_t plane_supported_color_ranges_show(struct config_item *item,= char *page) +{ + struct vkms_configfs_plane *plane; + unsigned int supported_color_range; + + plane =3D plane_item_to_vkms_configfs_plane(item); + + scoped_guard(mutex, &plane->dev->lock) { + supported_color_range =3D vkms_config_plane_get_supported_color_ranges(p= lane->config); + } + + return sprintf(page, "%u", supported_color_range); +} + +static ssize_t plane_supported_color_ranges_store(struct config_item *item, + const char *page, size_t count) +{ + struct vkms_configfs_plane *plane =3D plane_item_to_vkms_configfs_plane(i= tem); + int ret, val =3D 0; + + ret =3D kstrtouint(page, 10, &val); + if (ret) + return ret; + + /* Should be a supported value */ + if (val & ~(BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) | + BIT(DRM_COLOR_YCBCR_FULL_RANGE))) + return -EINVAL; + /* Should at least provide one color range */ + if ((val & (BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) | + BIT(DRM_COLOR_YCBCR_FULL_RANGE))) =3D=3D 0) + return -EINVAL; + + scoped_guard(mutex, &plane->dev->lock) { + /* Ensures that the default rotation is included in supported rotation */ + if (plane->dev->enabled) + return -EINVAL; + vkms_config_plane_set_supported_color_ranges(plane->config, val); + } + + return count; +} + +static ssize_t plane_default_color_range_show(struct config_item *item, ch= ar *page) +{ + struct vkms_configfs_plane *plane; + unsigned int default_color_range; + + plane =3D plane_item_to_vkms_configfs_plane(item); + + scoped_guard(mutex, &plane->dev->lock) + default_color_range =3D vkms_config_plane_get_default_color_range(plane-= >config); + + return sprintf(page, "%u", default_color_range); +} + +static ssize_t plane_default_color_range_store(struct config_item *item, + const char *page, size_t count) +{ + struct vkms_configfs_plane *plane =3D plane_item_to_vkms_configfs_plane(i= tem); + int ret, val =3D 0; + + ret =3D kstrtouint(page, 10, &val); + if (ret) + return ret; + + /* Should be a supported value */ + if (val & ~(BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) | + BIT(DRM_COLOR_YCBCR_FULL_RANGE))) + return -EINVAL; + /* Should at least provide one color range */ + if ((val & (BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) | + BIT(DRM_COLOR_YCBCR_FULL_RANGE))) =3D=3D 0) + return -EINVAL; + + scoped_guard(mutex, &plane->dev->lock) { + /* Ensures that the default rotation is included in supported rotation */ + if (plane->dev->enabled) + return -EINVAL; + vkms_config_plane_set_default_color_range(plane->config, val); + } + + return count; +} + static ssize_t plane_supported_color_encodings_show(struct config_item *it= em, char *page) { struct vkms_configfs_plane *plane; @@ -537,6 +622,8 @@ CONFIGFS_ATTR(plane_, type); CONFIGFS_ATTR(plane_, name); CONFIGFS_ATTR(plane_, supported_rotations); CONFIGFS_ATTR(plane_, default_rotation); +CONFIGFS_ATTR(plane_, supported_color_ranges); +CONFIGFS_ATTR(plane_, default_color_range); CONFIGFS_ATTR(plane_, supported_color_encodings); CONFIGFS_ATTR(plane_, default_color_encoding); =20 @@ -545,6 +632,8 @@ static struct configfs_attribute *plane_item_attrs[] = =3D { &plane_attr_name, &plane_attr_supported_rotations, &plane_attr_default_rotation, + &plane_attr_supported_color_ranges, + &plane_attr_default_color_range, &plane_attr_supported_color_encodings, &plane_attr_default_color_encoding, NULL, --=20 2.51.0 From nobody Sun Feb 8 19:55:55 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 205DB347FC6; Wed, 29 Oct 2025 13:30: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=1761744656; cv=none; b=OG4CNZBTmUWxOrnzNwYox/MRlApougsVIY25Qp/W7cZYHfLMpqfa/p7ZoP0+gmFYeTAv6A08/7RawASvJF6enr1Y4ZRVA2D5tMGOUoYhJWucdZNfxG3LUjp0K7TNSTa1Au5RvWeS5NKf8OLbeOkOQLSaDTXKzCj3xo/jTK83p1I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761744656; c=relaxed/simple; bh=rcbzjgVxA4Jez3zrGuCjbePTCA++bw2wssPuLSi1PnU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=DeLQmymCUelovU+qwt4gywz+SfQevzL78rPwA0UwWVk+61albMqNRNN6d7BPXFGv+EDFte93WGmtTBS+eWkG0HLrnnimQrgLtHEyT9d+1qdfPHuvI86UkbjTjp4DjFkGZiLpg+POKvCgNcaoBEami23rNf8ZnJCwlZPb/5PWVeE= 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=Qajpg7MZ; 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="Qajpg7MZ" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 5B09DC0DB00; Wed, 29 Oct 2025 13:30:32 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id B0EE8606E8; Wed, 29 Oct 2025 13:30:52 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 77D28117F8098; Wed, 29 Oct 2025 14:30:50 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761744651; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=bJvliQF2se397IGqvdiAT2buACguHu4DPZiFQtOO7UQ=; b=Qajpg7MZkaXjLnbysXK7vt6IBC+mZ0AoSSOaUfQxe/4tsJSdUCR8RyyrScgPOrTUGfkXH2 F+IlFHSgApAar8wWO2u9PTv3LMqR9H2ct1m2qELBxtDTxjjt557TiwDJShdMub7Kb+XTM7 +qaqI9y2mTSsr8Ob9EC7lIKH+i941cwTAOQ7xmqQCZr4xlov+A3gBYhR2igOc2UiFlkleM lIsXRxslzbKg6ElS4qTRbcoH0luaITNwRZbAL2AdfEGdHZNK8vem96F+HDiwG4Q//8+ZsJ DM5ihynCI2tfM35fwnnoV6ASz2yVKeecDzjijv7WGaUbA+HcRA4IFfhE4xRozg== From: Louis Chauvet Date: Wed, 29 Oct 2025 14:30:26 +0100 Subject: [PATCH v2 16/32] drm/vkms: Introduce config for plane format Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251029-vkms-all-config-v2-16-be20b9bf146e@bootlin.com> References: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=9903; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=rcbzjgVxA4Jez3zrGuCjbePTCA++bw2wssPuLSi1PnU=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAhbr4+hcWmPaXzfzsaRYh9tvgpthWQrw517st GaCaNSkqHmJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQIW6wAKCRAgrS7GWxAs 4vp6D/0ecB6iQ8qeVkw3nmtCZIyPNke/0X1d+SOm6VzxChjihgEqSX8yrc5QqBLesKQ1cNM9KzZ R1316qv/c9UZep8jUozlnijBb869m9bTp1C9pNgXXZISGXemMnUdFqn2Y0cg1bQMXIJAlBaoV4z uBGmBKe2dtY2u/XpX+UcKQdBBpu8xZ/EXizL0lB+ZwPZ6c4BbGPKfRJkQ5s6wCRL8MGhUt0ypXP x7Zk93kCI5BWq9ZzQv6ct7ePTf14YTBJwk+09U1eh1oOXjlva6gJu2s/F9OHoEElO3DTVKFxaAh JIZN6ijnz+iv00tECw7YAXvOdsr2J3xB4hlteyZ3I0LjzMsUAaZiTsj+rW0tEuCLz9J1XrjmY4t 9YBEccBcGzM31rvpU5i7ZgIWoBhttuSapBye+u7xCk7pcK4GsupVo088jkdQM+CgXOt5mIwYCqJ KAXX7uRFwD6yyZgYAtSjLOXVJu2aFkeCEo3JEhtjjc0xn+YeRiV9Q2v7nqVrg6qhut44GDX04he Bn2bKX1s3aPB5RrZlDYsULWf7wDaz+3IsOzmoE9vJLdMOwdtUcWiRaYWP4VNKb1NOTwedsfmTFq kSN7peEq0hByuRmu5RlvXE8acmzHzi8TlwV5iW27vKxpu8GAubFWnqNIo8Xm+zEAqaEslhanllX FXcMHsU6YWmsT9w== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 VKMS driver supports all the pixel formats for planes, but for testing it can be useful to only advertise few of them. This new configuration interface will allow configuring the pixel format per planes. Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/vkms_config.c | 114 +++++++++++++++++++++++++++++++++= ++++ drivers/gpu/drm/vkms/vkms_config.h | 51 +++++++++++++++++ drivers/gpu/drm/vkms/vkms_plane.c | 39 +------------ 3 files changed, 167 insertions(+), 37 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index 823039fb4145..a3fb80451b30 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -12,6 +12,42 @@ =20 #include "vkms_config.h" =20 +static const u32 vkms_supported_plane_formats[] =3D { + DRM_FORMAT_ARGB8888, + DRM_FORMAT_ABGR8888, + DRM_FORMAT_BGRA8888, + DRM_FORMAT_RGBA8888, + DRM_FORMAT_XRGB8888, + DRM_FORMAT_XBGR8888, + DRM_FORMAT_RGB888, + DRM_FORMAT_BGR888, + DRM_FORMAT_XRGB16161616, + DRM_FORMAT_XBGR16161616, + DRM_FORMAT_ARGB16161616, + DRM_FORMAT_ABGR16161616, + DRM_FORMAT_RGB565, + DRM_FORMAT_BGR565, + DRM_FORMAT_NV12, + DRM_FORMAT_NV16, + DRM_FORMAT_NV24, + DRM_FORMAT_NV21, + DRM_FORMAT_NV61, + DRM_FORMAT_NV42, + DRM_FORMAT_YUV420, + DRM_FORMAT_YUV422, + DRM_FORMAT_YUV444, + DRM_FORMAT_YVU420, + DRM_FORMAT_YVU422, + DRM_FORMAT_YVU444, + DRM_FORMAT_P010, + DRM_FORMAT_P012, + DRM_FORMAT_P016, + DRM_FORMAT_R1, + DRM_FORMAT_R2, + DRM_FORMAT_R4, + DRM_FORMAT_R8, +}; + struct vkms_config *vkms_config_create(const char *dev_name) { struct vkms_config *config; @@ -437,6 +473,15 @@ static void show_bitfield(struct seq_file *m, uint32_t= value, const char *callba } } =20 +static void show_formats(struct seq_file *m, u32 *formats, size_t formats_= count) +{ + for (int i =3D 0; i < formats_count; i++) { + seq_printf(m, "%p4cc", &formats[i]); + if (i !=3D formats_count - 1) + seq_puts(m, ", "); + } +} + static int vkms_config_show(struct seq_file *m, void *data) { struct drm_debugfs_entry *entry =3D m->private; @@ -477,6 +522,10 @@ static int vkms_config_show(struct seq_file *m, void *= data) seq_puts(m, "\n"); seq_printf(m, "\tdefault color range=3D%s\n", drm_get_color_range_name(vkms_config_plane_get_default_color_range(p= lane_cfg))); + seq_puts(m, "\tsupported formats=3D"); + show_formats(m, vkms_config_plane_get_supported_formats(plane_cfg), + vkms_config_plane_get_supported_formats_count(plane_cfg)); + seq_puts(m, "\n"); } =20 vkms_config_for_each_crtc(vkmsdev->config, crtc_cfg) { @@ -515,6 +564,11 @@ struct vkms_config_plane *vkms_config_create_plane(str= uct vkms_config *config) if (!plane_cfg) return ERR_PTR(-ENOMEM); =20 + if (vkms_config_plane_add_all_formats(plane_cfg)) { + kfree(plane_cfg); + return ERR_PTR(-ENOMEM); + } + plane_cfg->config =3D config; vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_OVERLAY); vkms_config_plane_set_name(plane_cfg, NULL); @@ -644,6 +698,66 @@ static struct vkms_config_plane *vkms_config_crtc_get_= plane(const struct vkms_co return NULL; } =20 +int __must_check vkms_config_plane_add_all_formats(struct vkms_config_plan= e *plane_cfg) +{ + u32 *ret =3D krealloc_array(plane_cfg->supported_formats, + ARRAY_SIZE(vkms_supported_plane_formats), + sizeof(uint32_t), GFP_KERNEL); + if (!ret) + return -ENOMEM; + plane_cfg->supported_formats =3D ret; + + memcpy(plane_cfg->supported_formats, vkms_supported_plane_formats, + sizeof(vkms_supported_plane_formats)); + plane_cfg->supported_formats_count =3D ARRAY_SIZE(vkms_supported_plane_fo= rmats); + return 0; +} + +int __must_check vkms_config_plane_add_format(struct vkms_config_plane *pl= ane_cfg, u32 drm_format) +{ + bool found =3D false; + + for (int i =3D 0; i < ARRAY_SIZE(vkms_supported_plane_formats); i++) { + if (vkms_supported_plane_formats[i] =3D=3D drm_format) { + found =3D true; + break; + } + } + + if (!found) + return -EINVAL; + for (unsigned int i =3D 0; i < plane_cfg->supported_formats_count; i++) { + if (plane_cfg->supported_formats[i] =3D=3D drm_format) + return 0; + } + u32 *new_ptr =3D krealloc_array(plane_cfg->supported_formats, + plane_cfg->supported_formats_count + 1, + sizeof(*plane_cfg->supported_formats), GFP_KERNEL); + if (!new_ptr) + return -ENOMEM; + + plane_cfg->supported_formats =3D new_ptr; + plane_cfg->supported_formats[plane_cfg->supported_formats_count] =3D drm_= format; + plane_cfg->supported_formats_count++; + + return 0; +} + +void vkms_config_plane_remove_all_formats(struct vkms_config_plane *plane_= cfg) +{ + plane_cfg->supported_formats_count =3D 0; +} + +void vkms_config_plane_remove_format(struct vkms_config_plane *plane_cfg, = u32 drm_format) +{ + for (unsigned int i =3D 0; i < plane_cfg->supported_formats_count; i++) { + if (plane_cfg->supported_formats[i] =3D=3D drm_format) { + plane_cfg->supported_formats[i] =3D plane_cfg->supported_formats[plane_= cfg->supported_formats_count - 1]; + plane_cfg->supported_formats_count--; + } + } +} + struct vkms_config_plane *vkms_config_crtc_primary_plane(const struct vkms= _config *config, struct vkms_config_crtc *crtc_cfg) { diff --git a/drivers/gpu/drm/vkms/vkms_config.h b/drivers/gpu/drm/vkms/vkms= _config.h index d8648bf844d4..2d9e35b7caad 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -49,6 +49,8 @@ struct vkms_config { * @supported_color_encodings: Color encoding that this plane will support * @default_color_range: Default color range that should be used by this p= lane * @supported_color_ranges: Color range that this plane will support + * @supported_formats: List of supported formats + * @supported_formats_count: Length of @supported_formats */ struct vkms_config_plane { struct list_head link; @@ -62,6 +64,8 @@ struct vkms_config_plane { unsigned int supported_color_encodings; enum drm_color_range default_color_range; unsigned int supported_color_ranges; + u32 *supported_formats; + unsigned int supported_formats_count; struct xarray possible_crtcs; =20 /* Internal usage */ @@ -448,6 +452,53 @@ bool vkms_config_valid_plane_color_range(const struct = vkms_config *config, const struct vkms_config_plane *plane_cfg); #endif =20 +static inline u32 * +vkms_config_plane_get_supported_formats(const struct vkms_config_plane *pl= ane_cfg) +{ + return plane_cfg->supported_formats; +} + +static inline unsigned int +vkms_config_plane_get_supported_formats_count(struct vkms_config_plane *pl= ane_cfg) +{ + return plane_cfg->supported_formats_count; +} + +/** vkms_config_plane_add_format - Add a format to the list of supported f= ormat of a plane + * + * The passed drm_format can already be present in the list. This may fail= if the allocation of a + * bigger array fails. + * + * @plane_cfg: Plane to add the format to + * @drm_format: Format to add to this plane + * + * Returns: 0 on success, -ENOMEM if array allocation fails, -EINVAL if th= e format is not supported + * by VKMS + */ +int __must_check vkms_config_plane_add_format(struct vkms_config_plane *pl= ane_cfg, u32 drm_format); + +/** + * vkms_config_plane_add_all_formats - Helper to quickly add all the suppo= rted formats + * @plane_cfg: Plane to add the formats to + * + * Returns: 0 on success, -ENOMEM if array allocation fails, -EINVAL if th= e format is not supported + * by VKMS + */ +int __must_check vkms_config_plane_add_all_formats(struct vkms_config_plan= e *plane_cfg); + +/** + * vkms_config_plane_remove_format - Remove a specific format from a plane + * @plane_cfg: Plane to remove the format to + * @drm_format: Format to remove + */ +void vkms_config_plane_remove_format(struct vkms_config_plane *plane_cfg, = u32 drm_format); + +/** + * vkms_config_plane_remove_all_formats - Remove all formast from a plane + * @plane_cfg: Plane to remove the formats from + */ +void vkms_config_plane_remove_all_formats(struct vkms_config_plane *plane_= cfg); + /** * vkms_config_plane_set_name() - Set the plane name * @plane_cfg: Plane to set the name to diff --git a/drivers/gpu/drm/vkms/vkms_plane.c b/drivers/gpu/drm/vkms/vkms_= plane.c index 5dbc7c67de1d..945abbbeac99 100644 --- a/drivers/gpu/drm/vkms/vkms_plane.c +++ b/drivers/gpu/drm/vkms/vkms_plane.c @@ -14,42 +14,6 @@ #include "vkms_drv.h" #include "vkms_formats.h" =20 -static const u32 vkms_formats[] =3D { - DRM_FORMAT_ARGB8888, - DRM_FORMAT_ABGR8888, - DRM_FORMAT_BGRA8888, - DRM_FORMAT_RGBA8888, - DRM_FORMAT_XRGB8888, - DRM_FORMAT_XBGR8888, - DRM_FORMAT_RGB888, - DRM_FORMAT_BGR888, - DRM_FORMAT_XRGB16161616, - DRM_FORMAT_XBGR16161616, - DRM_FORMAT_ARGB16161616, - DRM_FORMAT_ABGR16161616, - DRM_FORMAT_RGB565, - DRM_FORMAT_BGR565, - DRM_FORMAT_NV12, - DRM_FORMAT_NV16, - DRM_FORMAT_NV24, - DRM_FORMAT_NV21, - DRM_FORMAT_NV61, - DRM_FORMAT_NV42, - DRM_FORMAT_YUV420, - DRM_FORMAT_YUV422, - DRM_FORMAT_YUV444, - DRM_FORMAT_YVU420, - DRM_FORMAT_YVU422, - DRM_FORMAT_YVU444, - DRM_FORMAT_P010, - DRM_FORMAT_P012, - DRM_FORMAT_P016, - DRM_FORMAT_R1, - DRM_FORMAT_R2, - DRM_FORMAT_R4, - DRM_FORMAT_R8, -}; - static struct drm_plane_state * vkms_plane_duplicate_state(struct drm_plane *plane) { @@ -226,7 +190,8 @@ struct vkms_plane *vkms_plane_init(struct vkms_device *= vkmsdev, =20 plane =3D drmm_universal_plane_alloc(dev, struct vkms_plane, base, 0, &vkms_plane_funcs, - vkms_formats, ARRAY_SIZE(vkms_formats), + vkms_config_plane_get_supported_formats(config), + vkms_config_plane_get_supported_formats_count(config), NULL, vkms_config_plane_get_type(config), vkms_config_plane_get_name(config)); if (IS_ERR(plane)) --=20 2.51.0 From nobody Sun Feb 8 19:55:55 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 00C57348877; Wed, 29 Oct 2025 13:30:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.85.4 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761744658; cv=none; b=OJDuCx1ka90ZH0y96cC2jOY+6Zjl+ZOM1ZKRHE4wWzmdhLkhxnr6eSTFjS3YYiyF70ilI4HApTKMnXBaOv7aVl3CYnNVS4lKD313bAT6AyeGAwZIqM+KqJnG6yx4Wych7SeWyseyGN38zLLif9P42j8wIKsX8wNCfPaXZT0kl2s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761744658; c=relaxed/simple; bh=BMVGN+9+t9auyeVa0Egl37tcKEFQ9wQUAEN2uScKJxI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=dkS1kkjifdc6nUZHgClXtwSzfhCS8X38FCwYU3mh0AdU0+ffx6jJZtBgUeImqTD+QMnxQxZjRMP0SXSlGO9L6glqf9vaY3I2LLba/211g8Px3LYNaahmtlHIv9r1cxYS02e/GlWp703p7NJqusHlkqaFcGLdz2dFIb4ZrE6AirM= 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=T2xPsI9b; 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="T2xPsI9b" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id A75024E413D0; Wed, 29 Oct 2025 13:30:54 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 727D2606E8; Wed, 29 Oct 2025 13:30:54 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 414AD117F8047; Wed, 29 Oct 2025 14:30:52 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761744653; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=RDpTgbAVmwlCytnSgkakGECg7adgLDFGZNh1TIOlRlw=; b=T2xPsI9baanfR5P3/tZVY7YxR0rp/OcohpU79jQtzuHQlXUguG0eoLJcxVBq8lekZj16v1 x7HdF9gQEpOb3QHXMu65FJtOnUdvrmtDWPsNIb3Zd4bO1ywkjrgeFDlhTqJjN2ysmksi20 Q04G9ahj4mQ6RV9lwEFCP8o1Q+GXol1/omtNhrhxIbrTz/9Mh6txKSZfWM2uJJVdgXyhFd R3hnJIu3AsiJ4B+kcLj8wyRC0o6BWze7UUuCEasTCp18vcxxHHsfwWiPustWJ+Kx3hDEib h2GC7vdhGcFBP1QfarIWhWLDAqY9dknan45PHJUHm3D6jXaYFL8OzrWYsTFD0w== From: Louis Chauvet Date: Wed, 29 Oct 2025 14:30:27 +0100 Subject: [PATCH v2 17/32] drm/vkms: Introduce configfs for plane format Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251029-vkms-all-config-v2-17-be20b9bf146e@bootlin.com> References: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=10458; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=BMVGN+9+t9auyeVa0Egl37tcKEFQ9wQUAEN2uScKJxI=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAhbrtiEdWcSV2NOayXdSjqF+6TdyBXJqeBKxT V+O0s2GKFyJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQIW6wAKCRAgrS7GWxAs 4nmLD/9H0YT5x+8nydbcPgkwqy3AqfCu+poRWwjViT9699UXeXBjt892qOaw7mcIT+PHVKS0yOa xleZsqyIH9xet2GnsZtzWSMFPm4+PBKOdT1LrtI3sFNwTz7szxRoa74VmPWnMf1oMQnBRHms/l5 V9OBG7CBgXuUcXTzVo6e9/tB5K0MnAAxrActIUwrpXbc1PL9P4kOtzUXpcgeC1x1bG77U/T4SfF luDhf4huqdVadLMXwXgbsYRpktsF9YN4SYmnupTH8Tzx0kRJ7f1/R199I8miD/wWe6MAXpOj/wS 27vKNj59VT0qgLlsmnPMoGIHcXLJ5t1ofVcnL4D1+QMBy9kNpZzHQ+inn8Fs3AgN0VIayMPI8rv JOlKMaMWHSZClM+oTx0KGzUNxUhJIr9cc/Zk4nyDm8usWpbCJxfZUfnJGelVCfiHvfJal9aDgfj FoQlSeOkjnnFervSe0y8H+b7W1Cv+pLqXE00ySnlPMGIhCqqhOUYwgEP1milK917oC/kXNXMpqT zTaSA5cljeC4SxjLug/LFQh6SS6+INjT/d3ItoWfyUgd+Hymi8S7aT3mf69mCKfEvIkpuIYT7jD lMVmHvJzkonF2mCbgim3d7GlSDdCA/4v5UoEX3fjJXPEbmM52IQzPF3eg10wc3o7i00ds7L7G7F fhRn9HeWTppvuNw== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 To allow the userspace to test many hardware configuration, introduce a new interface to configure the available formats per planes. VKMS supports multiple formats, so the userspace can choose any combination. The supported formats are configured by writing the fourcc code in supported_formats: # enable AR24 format echo '+AR24' > /config/vkms/DEVICE_1/planes/PLANE_1/supported_formats # disable AR24 format echo '-AR24' > /config/vkms/DEVICE_1/planes/PLANE_1/supported_formats # enable all format supported by VKMS echo '+*' > /config/vkms/DEVICE_1/planes/PLANE_1/supported_formats # disable all formats echo '-*' > /config/vkms/DEVICE_1/planes/PLANE_1/supported_formats Signed-off-by: Louis Chauvet --- Documentation/gpu/vkms.rst | 7 +- drivers/gpu/drm/vkms/tests/Makefile | 1 + drivers/gpu/drm/vkms/tests/vkms_configfs_test.c | 102 ++++++++++++++++++++ drivers/gpu/drm/vkms/vkms_configfs.c | 119 ++++++++++++++++++++= ++++ drivers/gpu/drm/vkms/vkms_configfs.h | 6 ++ 5 files changed, 234 insertions(+), 1 deletion(-) diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index 8383e1b94668..779ae363110d 100644 --- a/Documentation/gpu/vkms.rst +++ b/Documentation/gpu/vkms.rst @@ -87,7 +87,7 @@ Start by creating one or more planes:: =20 sudo mkdir /config/vkms/my-vkms/planes/plane0 =20 -Planes have 8 configurable attributes: +Planes have 9 configurable attributes: =20 - type: Plane type: 0 overlay, 1 primary, 2 cursor (same values as those exposed by the "type" property of a plane) @@ -109,6 +109,11 @@ Planes have 8 configurable attributes: must be set too. - default_color_range: Default color range presented to the userspace, same values as supported_color_range +- supported_formats: List of supported formats for this plane. To add a ne= w item in the + list, write it using a plus its fourcc code: +XR24 + To remove a format, use a minus and its fourcc: -XR24 + To add all formats use +* + To remove all formats, use -* =20 Continue by creating one or more CRTCs:: =20 diff --git a/drivers/gpu/drm/vkms/tests/Makefile b/drivers/gpu/drm/vkms/tes= ts/Makefile index 5750f0bd9d40..a2dc4008d27e 100644 --- a/drivers/gpu/drm/vkms/tests/Makefile +++ b/drivers/gpu/drm/vkms/tests/Makefile @@ -2,6 +2,7 @@ =20 vkms-kunit-tests-y :=3D \ vkms_config_test.o \ + vkms_configfs_test.o \ vkms_format_test.o =20 obj-$(CONFIG_DRM_VKMS_KUNIT_TEST) +=3D vkms-kunit-tests.o diff --git a/drivers/gpu/drm/vkms/tests/vkms_configfs_test.c b/drivers/gpu/= drm/vkms/tests/vkms_configfs_test.c new file mode 100644 index 000000000000..0963a8e8a585 --- /dev/null +++ b/drivers/gpu/drm/vkms/tests/vkms_configfs_test.c @@ -0,0 +1,102 @@ +// SPDX-License-Identifier: GPL-2.0+ + +#include "linux/printk.h" +#include + +#include "../vkms_configfs.h" + +MODULE_IMPORT_NS("EXPORTED_FOR_KUNIT_TESTING"); + +/** + * struct vkms_configfs_parse_format_case - Store test case for format par= sing + * @data: Contains the string to parse + * @data_len: data len + * @expected_len: expected len of the matched format + * @expected_offset: expected offset in the string for the parsed format + */ +struct vkms_configfs_parse_format_case { + const char *data; + int data_len; + int expected_len; + int expected_offset; +}; + +struct vkms_configfs_parse_format_case vkms_configfs_parse_format_test_cas= es[] =3D { + { + .data =3D "+RG24", + .data_len =3D 6, + .expected_len =3D 5, + .expected_offset =3D 0, + }, { + .data =3D "-RG24", + .data_len =3D 6, + .expected_len =3D 5, + .expected_offset =3D 0 + }, { + .data =3D " -RG24", + .data_len =3D 8, + .expected_len =3D 5, + .expected_offset =3D 2 + }, { + .data =3D "+*", + .data_len =3D 3, + .expected_len =3D 2, + .expected_offset =3D 0 + }, { + .data =3D "-RG24+RG24", + .data_len =3D 11, + .expected_len =3D 5, + .expected_offset =3D 0 + }, { + .data =3D "-R1+RG24", + .data_len =3D 9, + .expected_len =3D 3, + .expected_offset =3D 0 + }, { + .data =3D "\n-R1", + .data_len =3D 5, + .expected_len =3D 3, + .expected_offset =3D 1 + }, { + .data =3D "-R1111", + .data_len =3D 3, + .expected_len =3D 3, + .expected_offset =3D 0 + } +}; + +static void vkms_configfs_test_parse_format(struct kunit *test) +{ + const struct vkms_configfs_parse_format_case *param =3D test->param_value; + char *out; + int len =3D vkms_configfs_parse_next_format(param->data, param->data + pa= ram->data_len, &out); + + KUNIT_EXPECT_EQ(test, len, param->expected_len); + KUNIT_EXPECT_PTR_EQ(test, out, param->data + param->expected_offset); +} + +static void vkms_configfs_test_parse_format_get_desc(struct vkms_configfs_= parse_format_case *t, + char *desc) +{ + snprintf(desc, KUNIT_PARAM_DESC_SIZE, "%s", t->data); +} + +KUNIT_ARRAY_PARAM(vkms_configfs_test_parse_format, vkms_configfs_parse_for= mat_test_cases, + vkms_configfs_test_parse_format_get_desc +); + +static struct kunit_case vkms_configfs_test_cases[] =3D { + KUNIT_CASE_PARAM(vkms_configfs_test_parse_format, + vkms_configfs_test_parse_format_gen_params), + {} +}; + +static struct kunit_suite vkms_configfs_test_suite =3D { + .name =3D "vkms-configfs", + .test_cases =3D vkms_configfs_test_cases, +}; + +kunit_test_suite(vkms_configfs_test_suite); + +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Kunit test for vkms configfs utility"); diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vk= ms_configfs.c index 3f658dd41272..b0a26c4dbebe 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -1,8 +1,11 @@ // SPDX-License-Identifier: GPL-2.0+ + #include #include #include #include +#include +#include =20 #include "vkms_drv.h" #include "vkms_config.h" @@ -618,6 +621,120 @@ static ssize_t plane_default_color_encoding_store(str= uct config_item *item, return count; } =20 +static ssize_t plane_supported_formats_show(struct config_item *item, char= *page) +{ + struct vkms_configfs_plane *plane; + + plane =3D plane_item_to_vkms_configfs_plane(item); + + page[0] =3D '\0'; + + scoped_guard(mutex, &plane->dev->lock) { + u32 *formats =3D vkms_config_plane_get_supported_formats(plane->config); + + for (int i =3D 0; + i < vkms_config_plane_get_supported_formats_count(plane->config); + i++) { + char tmp[6] =3D { 0 }; + const ssize_t ret =3D snprintf(tmp, ARRAY_SIZE(tmp), "%.*s\n", + (int)sizeof(*formats), + (char *)&formats[i]); + if (ret < 0) + return ret; + /* + * Limitation of ConfigFS attributes, an attribute can't be bigger + * than PAGE_SIZE. This will crop the result if this plane support + * more than =E2=89=881000 formats. + */ + if (ret + strlen(page) > PAGE_SIZE - 1) + return -ENOMEM; + strncat(page, tmp, ARRAY_SIZE(tmp)); + } + } + + return strlen(page); +} + +/** + * parse_next_format() - Parse the next format in page, skipping all non f= ourcc-related characters + * @page: page to search into + * @page_end: last charater of the page + * @out: Output pointer, will point inside page + * + * Returns: size of the matched format, @out will point to the + or - + */ +VISIBLE_IF_KUNIT +int vkms_configfs_parse_next_format(const char *page, const char *page_end= , char **out) +{ + int count =3D page - page_end; + char *tmp_plus =3D strnchr(page, count, '+'); + char *tmp_minus =3D strnchr(page, count, '-'); + + if (!tmp_plus && !tmp_minus) + return 0; + if (!tmp_plus) + *out =3D tmp_minus; + else if (!tmp_minus) + *out =3D tmp_plus; + else + *out =3D min(tmp_plus, tmp_minus); + + char *end =3D *out + 1; + + while (end < page_end) { + if (!isalnum(*end) && *end !=3D '*') + break; + end++; + } + + return end - *out; +} +EXPORT_SYMBOL_IF_KUNIT(vkms_configfs_parse_next_format); + +static ssize_t plane_supported_formats_store(struct config_item *item, + const char *page, size_t count) +{ + struct vkms_configfs_plane *plane; + + plane =3D plane_item_to_vkms_configfs_plane(item); + int ret =3D 0; + const char *end_page =3D page + count; + + scoped_guard(mutex, &plane->dev->lock) { + while (1) { + char *tmp; + char fmt[4] =3D {' ', ' ', ' ', ' '}; + int len =3D vkms_configfs_parse_next_format(page, end_page, &tmp); + + // No fourcc code found + if (len <=3D 1) + break; + + page =3D tmp + len; + memcpy(tmp, &fmt[1], min(len - 1, 4)); + if (tmp[0] =3D=3D '+') { + if (fmt[0] =3D=3D '*') { + ret =3D vkms_config_plane_add_all_formats(plane->config); + if (ret) + return ret; + } else { + ret =3D vkms_config_plane_add_format(plane->config, + *(int *)fmt); + if (ret) + return ret; + } + } else if (tmp[0] =3D=3D '-') { + if (fmt[0] =3D=3D '*') + vkms_config_plane_remove_all_formats(plane->config); + else + vkms_config_plane_remove_format(plane->config, *(int *)fmt); + } + } + } + + return count; +} + CONFIGFS_ATTR(plane_, type); CONFIGFS_ATTR(plane_, name); CONFIGFS_ATTR(plane_, supported_rotations); @@ -626,6 +743,7 @@ CONFIGFS_ATTR(plane_, supported_color_ranges); CONFIGFS_ATTR(plane_, default_color_range); CONFIGFS_ATTR(plane_, supported_color_encodings); CONFIGFS_ATTR(plane_, default_color_encoding); +CONFIGFS_ATTR(plane_, supported_formats); =20 static struct configfs_attribute *plane_item_attrs[] =3D { &plane_attr_type, @@ -636,6 +754,7 @@ static struct configfs_attribute *plane_item_attrs[] = =3D { &plane_attr_default_color_range, &plane_attr_supported_color_encodings, &plane_attr_default_color_encoding, + &plane_attr_supported_formats, NULL, }; =20 diff --git a/drivers/gpu/drm/vkms/vkms_configfs.h b/drivers/gpu/drm/vkms/vk= ms_configfs.h index e9020b0043db..2774655bfcc5 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.h +++ b/drivers/gpu/drm/vkms/vkms_configfs.h @@ -2,7 +2,13 @@ #ifndef _VKMS_CONFIGFS_H_ #define _VKMS_CONFIGFS_H_ =20 +#include + int vkms_configfs_register(void); void vkms_configfs_unregister(void); =20 +#if IS_ENABLED(CONFIG_KUNIT) +int vkms_configfs_parse_next_format(const char *page, const char *end_page= , char **out); +#endif + #endif /* _VKMS_CONFIGFS_H_ */ --=20 2.51.0 From nobody Sun Feb 8 19:55:55 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 7449229A9F9 for ; Wed, 29 Oct 2025 13:30: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=1761744659; cv=none; b=tmDYQ0Y4/Cof9+zZF6xJl7jZ0+trpbwyrUatAm+IFTHjr2c9N5DPkbZS/QAxjmkoiVvFyr4hoOCYZEJFmKLW9/9siyKqetgrXOWthFtxUZHy8gy75mSQ92dOnjKFmIskMVj487s5of9E4BKJh3oa/4Gz/LQBLT4URzYX+HNUnCU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761744659; c=relaxed/simple; bh=rnZm7r0xEd9LrIvetwHGtyd26t99JexCbu1jReAcAkA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Z51u9f+zE2apIWL9OE52FQktHOwLchLZvSwo4CRXKSGPavafL27qdH9j+q6tTUsfS2pqzSMWDhGJPcAr6k7nmpPIaDPG4GdSoWcAf1FMi6cFpk8P8epCR44ys9tr5SymVMzvzuRb241knzoTRbW+XzlrfLRctPUp71DNCpi2+MM= 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=ASZ5Zlsx; 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="ASZ5Zlsx" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 0CD5F4E413CE; Wed, 29 Oct 2025 13:30:56 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id D51A4606E8; Wed, 29 Oct 2025 13:30:55 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id ED79C117F809B; Wed, 29 Oct 2025 14:30:53 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761744655; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=wuzcvgdxKucfzXi8j9im5vi/vTJhBZGMa5n+dwDEVE8=; b=ASZ5Zlsx4A0Y/RcACYw3dQWnbPKhYPnCJqDmprrPg709u8mwkGDgXs0dUiQ4ivlm0cnD6B RDsgnhpY9nlkxtMauuDjJ6PAdC4LgCYy6oZsFebyZ4O5cEa8g90Nrv/VlyX7USlf39xXfA lGuQQaAsIHxpqQeZms4aKIVOTiA5pLAsBzSTqiG4FwQC4B9RQtvUmgGp8yRWYwMB+1Adhi JEt2JLNW4bLF/MlgDL2FrlpYiIZGWQvM0VU4OcUtY/w5cfsTrcig1NkYZpaa8gRgRxDGUH ID6xOrjAKcCDRygEW13YmH5n6cjjnKLxSRo+H370TdvZuEbQcqhX/ZSh77Z5pg== From: Louis Chauvet Date: Wed, 29 Oct 2025 14:30:28 +0100 Subject: [PATCH v2 18/32] drm/vkms: Properly render plane using their zpos Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251029-vkms-all-config-v2-18-be20b9bf146e@bootlin.com> References: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1521; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=rnZm7r0xEd9LrIvetwHGtyd26t99JexCbu1jReAcAkA=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAhbr5Et15Lks27W8MDhnUIKB9p1+Dwhs8Ene2 hoCdZOSIfmJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQIW6wAKCRAgrS7GWxAs 4rzKD/4ijWYQu1vkdHRqzD+m7+lRrQKc6YHLy4CkzlgfJsvTyTC+sporUwIWM+bqPw077FEa+rS R+fD8hInSc/Pj6MhLLBhpb6nC1zM6SI2nWUjW0JeE9kWruRMLE7eG1kD2uVoWLoLvlbMNYZTSFQ j65v2xSQF+C6WZ74WoovlzytXaWDmBdt9+5r+TGj9AHLgMRxUd1DGdhCt628osgiJRcVnYMfDJo JfEj59KO505PHJs1L/PglfpjWwrvfIi9xrF7YTnWRPqXjrF/BGApJ1b98XUAGpvogVmLAcU/FxK sINMakhPCvlI/Q2cdYzSzdp38B5Y+dx6QycdeQ952m3Nf6gYQsa7oZNrTXBIYGrym4AlK5D/QYU isLeQpm7yOZBgIz/lkucfGSWYJbKx+urH7eGzHkAcSzCoxANahE55aHYj9SHUOq3toqlp3jr5xS qH2l5XHSU4TjeQb2wqya1QCscbdEk7ntCOGC/i7CfHlZ8qHEJUFjD5J16R8bp0QquddzWBGnlQG BhoqxMQMte1wuC2p8EQMrfuRZn4pVjM1afimDsqKIdrc3LJXCgg4fwmD+pq/0ksKZyijsPDtECB qwT3/VaTstvybWfIDRlJtZ+0promJP6RlWLCqVyEEKfWpCiIHCWtm+ibNI9FcwkjTHpXz1SViaO wMrfj2j7ZQC36fg== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Currently planes are rendered in creation order. This is not an issue, but with the introduction of new zpos configuration, it is required to properly render planes. Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/vkms_crtc.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c b/drivers/gpu/drm/vkms/vkms_c= rtc.c index bac0790c6577..0524c47460fb 100644 --- a/drivers/gpu/drm/vkms/vkms_crtc.c +++ b/drivers/gpu/drm/vkms/vkms_crtc.c @@ -4,6 +4,7 @@ =20 #include #include +#include #include #include #include @@ -141,14 +142,20 @@ static int vkms_crtc_atomic_check(struct drm_crtc *cr= tc, return -ENOMEM; vkms_state->num_active_planes =3D i; =20 - i =3D 0; + ret =3D drm_atomic_normalize_zpos(crtc->dev, state); + if (ret) + return ret; + drm_for_each_plane_mask(plane, crtc->dev, crtc_state->plane_mask) { plane_state =3D drm_atomic_get_new_plane_state(crtc_state->state, plane); =20 if (!plane_state->visible) continue; =20 - vkms_state->active_planes[i++] =3D + // Order planes according to their normalized_zpos + // After drm_atomic_normalize_zpos, the possible values are 0..n_planes-1 + // so store them using this index + vkms_state->active_planes[plane_state->normalized_zpos] =3D to_vkms_plane_state(plane_state); } =20 --=20 2.51.0 From nobody Sun Feb 8 19:55:55 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 0E88D34AAF0; Wed, 29 Oct 2025 13:30:59 +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=1761744661; cv=none; b=tJ1qM4m9ri2A6Nm9f11fCWpwRyFEN4V/4iCAdeTkqChevmE9UgIekZlk5zFfPlPJ2VH5jW30zqIRDULrNEvAF5GP5Qub41jQAJ8xwlrC9fek3D1IDU4+aUF+zCepjb3gARZowvvK7kDwCxNUl4TAjKGGv3Y5Chc0tIPs0ClNAyU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761744661; c=relaxed/simple; bh=mKwvYcW2Hz25Zl72QZxI3VVT1IcCPbam0gHPfRqJ4iY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=dYursKXR2aqCp+rtWiEmvwh8+DTzV1Pzs7M0cKJ6cu1mTwv32Bf43sx8aah4iS34uw7Ddbj6AsTfNkC7NrxfQo9A5elAlh9hb08P9Zmog3+8o6xIKw3MdrYcWOTdoMrh9FSwAmkTo0bj1yhJgFmEvWQZWUpWjqdJd0bs8oTnqeQ= 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=cA0YQQaM; 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="cA0YQQaM" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 84F32C0DB00; Wed, 29 Oct 2025 13:30:37 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id DB13E606E8; Wed, 29 Oct 2025 13:30:57 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 6BB4F117F809C; Wed, 29 Oct 2025 14:30:55 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761744657; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=ZDoaOquusQDSLp7HQRJOshugz0KBDod0mdS1BtA/zy4=; b=cA0YQQaMNeEuA3kvPZ25VVCEA4XgzfRtSRGLgjhQ7CUhRgDpc9/rRPyMoLTT+iqMFupZ09 HK/aADi4XFfIejlSw9ELUyMHJPWXhZ8Z5wRu1Bsa1zI/S2NHcRr77zGhKm+PVlHYUFUm2g 9fk70L/IjC64kzTAvHGMq9CRfVhsWYNIXRNyYiThy/lxBt1gsysSQNOypXnVRIsV90ep4Y FGdEg28mUlHiK5ZCMlnyIOcVYaGaFmvC5xKRSP2jnJiWVqFZ7STQo7DTMDYiSOw5I05GJR eN9HQbNTNBpFdbZgvOlRwo/MOXhGSOZOJEpnXV4e1IIYnKuEBCvfeiP/wM7N6w== From: Louis Chauvet Date: Wed, 29 Oct 2025 14:30:29 +0100 Subject: [PATCH v2 19/32] drm/vkms: Introduce config for plane zpos property Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251029-vkms-all-config-v2-19-be20b9bf146e@bootlin.com> References: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=15646; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=mKwvYcW2Hz25Zl72QZxI3VVT1IcCPbam0gHPfRqJ4iY=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAhbrWkxSQvzUh1wyFwNkd1vouPNsL+DuviekT y/Il1+DyRGJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQIW6wAKCRAgrS7GWxAs 4nTOD/40KcQkoGCrs2660aCejXv+bLHBcDL0sSHueGQabF7K2qY6YSV9/j6OIf7LhUHNQZ+g0Q3 0cURBj7T4NOCxqBGcNaKnYMzJPU93GCRCpwybgyE2MlPLoRc5zgZ22bMCOunEAsHJGE2ZihPcZC Oh0mG5OpsSmkJnCCHfbqziT8WGbnIkfXjStfONLC69GXPFPZhFaJM6BhNjOWcq4iJBLhmwS+azr 4Y4R8DmQSudRwkrdRdMMq9dLgsj9J287ZjpbNfl39AUOkmmESFpqC9g9YFZ5R+uBtb4dmkGhxiO AQt2W7ZALZDV+RYl3yVdkQPXmfcqseKaDlO7H2oPyWU3l7030Ui9pFEksRq3K5glXbF9/RAuVwk NUE0GCfvDNo7krZPTdwtQuek+267/mm3E8XQd0FjS/UxrvYZMRaL9CAzvU1lPGq+zMvVUTlZhqR 2O8w++/siRetV+nIX11a/3wWHKhR/0DopVIBu99/qaY5Wyqgwgb0L/oPWjqdUj1RDy39zDu31gC Btx5qlq4r8g+2jmKdgwVdf7dtTtnJPNL5mDsP8uMkwNqClC/CpauySMFD9sOcjtdog/b+b7OXt3 OsFPKtgQ6i8ips19ZsgLY8GDJyY+tLkjzsVQF1WPwfme43tIvImZokpTiK8awqg3owjzMBJtmSx rRigN9WMrvlhNyw== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 VKMS can render plane in any order. Introduce the appropriate configuration. Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/tests/vkms_config_test.c | 92 ++++++++++++++++ drivers/gpu/drm/vkms/vkms_config.c | 47 ++++++++ drivers/gpu/drm/vkms/vkms_config.h | 147 ++++++++++++++++++++++= ++++ drivers/gpu/drm/vkms/vkms_plane.c | 11 ++ 4 files changed, 297 insertions(+) diff --git a/drivers/gpu/drm/vkms/tests/vkms_config_test.c b/drivers/gpu/dr= m/vkms/tests/vkms_config_test.c index d962fec8d3b3..518e68c17122 100644 --- a/drivers/gpu/drm/vkms/tests/vkms_config_test.c +++ b/drivers/gpu/drm/vkms/tests/vkms_config_test.c @@ -188,6 +188,9 @@ static void vkms_config_test_default_config(struct kuni= t *test) KUNIT_EXPECT_EQ(test, vkms_config_plane_get_default_color_encoding(plane_cfg), DRM_COLOR_YCBCR_BT601); + KUNIT_EXPECT_EQ(test, vkms_config_plane_get_zpos_enabled(plane_cfg), fal= se); + // No need to test the other zpos configurations as they are discarded if + // the zpos property is not created. } =20 /* Encoders */ @@ -606,6 +609,94 @@ static void vkms_config_test_valid_plane_color_range(s= truct kunit *test) vkms_config_destroy(config); } =20 +static void vkms_config_test_valid_plane_zpos(struct kunit *test) +{ + struct vkms_config *config; + struct vkms_config_plane *plane_cfg; + + config =3D vkms_config_default_create(false, false, false); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); + + plane_cfg =3D get_first_plane(config); + + /* Valid, all color range supported */ + plane_cfg =3D get_first_plane(config); + + /* Valid, zpos disabled */ + vkms_config_plane_set_zpos_enabled(plane_cfg, false); + vkms_config_plane_set_zpos_mutable(plane_cfg, false); + vkms_config_plane_set_zpos_initial(plane_cfg, 0); + vkms_config_plane_set_zpos_min(plane_cfg, 0); + vkms_config_plane_set_zpos_max(plane_cfg, 0); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Valid, zpos disabled, min/max are ignored */ + vkms_config_plane_set_zpos_enabled(plane_cfg, false); + vkms_config_plane_set_zpos_mutable(plane_cfg, false); + vkms_config_plane_set_zpos_initial(plane_cfg, 8); + vkms_config_plane_set_zpos_min(plane_cfg, 3); + vkms_config_plane_set_zpos_max(plane_cfg, 2); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Valid, zpos enabled but initial value is out of range */ + vkms_config_plane_set_zpos_enabled(plane_cfg, true); + vkms_config_plane_set_zpos_mutable(plane_cfg, false); + vkms_config_plane_set_zpos_initial(plane_cfg, 1); + vkms_config_plane_set_zpos_min(plane_cfg, 0); + vkms_config_plane_set_zpos_max(plane_cfg, 0); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Valid, zpos enabled with valid initial value */ + vkms_config_plane_set_zpos_enabled(plane_cfg, true); + vkms_config_plane_set_zpos_mutable(plane_cfg, false); + vkms_config_plane_set_zpos_initial(plane_cfg, 0); + vkms_config_plane_set_zpos_min(plane_cfg, 0); + vkms_config_plane_set_zpos_max(plane_cfg, 0); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Invalid, zpos enabled with min > max */ + vkms_config_plane_set_zpos_enabled(plane_cfg, true); + vkms_config_plane_set_zpos_mutable(plane_cfg, true); + vkms_config_plane_set_zpos_initial(plane_cfg, 0); + vkms_config_plane_set_zpos_min(plane_cfg, 1); + vkms_config_plane_set_zpos_max(plane_cfg, 0); + KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); + + /* Valid, zpos enabled with min <=3D max */ + vkms_config_plane_set_zpos_enabled(plane_cfg, true); + vkms_config_plane_set_zpos_mutable(plane_cfg, true); + vkms_config_plane_set_zpos_initial(plane_cfg, 0); + vkms_config_plane_set_zpos_min(plane_cfg, 0); + vkms_config_plane_set_zpos_max(plane_cfg, 1); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Invalid, zpos enabled with initial < min */ + vkms_config_plane_set_zpos_enabled(plane_cfg, true); + vkms_config_plane_set_zpos_mutable(plane_cfg, true); + vkms_config_plane_set_zpos_initial(plane_cfg, 0); + vkms_config_plane_set_zpos_min(plane_cfg, 1); + vkms_config_plane_set_zpos_max(plane_cfg, 2); + KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); + + /* Invalid, zpos enabled with initial > max */ + vkms_config_plane_set_zpos_enabled(plane_cfg, true); + vkms_config_plane_set_zpos_mutable(plane_cfg, true); + vkms_config_plane_set_zpos_initial(plane_cfg, 3); + vkms_config_plane_set_zpos_min(plane_cfg, 1); + vkms_config_plane_set_zpos_max(plane_cfg, 2); + KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); + + /* Valid, zpos enabled with initial between min and max */ + vkms_config_plane_set_zpos_enabled(plane_cfg, true); + vkms_config_plane_set_zpos_mutable(plane_cfg, true); + vkms_config_plane_set_zpos_initial(plane_cfg, 1); + vkms_config_plane_set_zpos_min(plane_cfg, 0); + vkms_config_plane_set_zpos_max(plane_cfg, 2); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + vkms_config_destroy(config); +} + static void vkms_config_test_valid_plane_possible_crtcs(struct kunit *test) { struct vkms_config *config; @@ -1131,6 +1222,7 @@ static struct kunit_case vkms_config_test_cases[] =3D= { KUNIT_CASE(vkms_config_test_valid_plane_rotations), KUNIT_CASE(vkms_config_test_valid_plane_color_encoding), KUNIT_CASE(vkms_config_test_valid_plane_color_range), + KUNIT_CASE(vkms_config_test_valid_plane_zpos), KUNIT_CASE(vkms_config_test_valid_plane_possible_crtcs), KUNIT_CASE(vkms_config_test_invalid_crtc_number), KUNIT_CASE(vkms_config_test_invalid_encoder_number), diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index a3fb80451b30..801019cf04c1 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -90,6 +90,7 @@ struct vkms_config *vkms_config_default_create(bool enabl= e_cursor, if (IS_ERR(plane_cfg)) goto err_alloc; vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_PRIMARY); + vkms_config_plane_set_zpos_enabled(plane_cfg, false); =20 crtc_cfg =3D vkms_config_create_crtc(config); if (IS_ERR(crtc_cfg)) @@ -107,6 +108,7 @@ struct vkms_config *vkms_config_default_create(bool ena= ble_cursor, =20 vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_OVERLAY); + vkms_config_plane_set_zpos_enabled(plane_cfg, false); =20 if (vkms_config_plane_attach_crtc(plane_cfg, crtc_cfg)) goto err_alloc; @@ -119,6 +121,7 @@ struct vkms_config *vkms_config_default_create(bool ena= ble_cursor, goto err_alloc; =20 vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_CURSOR); + vkms_config_plane_set_zpos_enabled(plane_cfg, false); =20 if (vkms_config_plane_attach_crtc(plane_cfg, crtc_cfg)) goto err_alloc; @@ -249,6 +252,37 @@ bool vkms_config_valid_plane_color_range(const struct = vkms_config *config, } EXPORT_SYMBOL_IF_KUNIT(vkms_config_valid_plane_color_range); =20 +VISIBLE_IF_KUNIT +bool vkms_config_valid_plane_zpos(const struct vkms_config *config, + const struct vkms_config_plane *plane_cfg) +{ + struct drm_device *dev =3D config->dev ? &config->dev->drm : NULL; + + if (!vkms_config_plane_get_zpos_enabled(plane_cfg) || + !vkms_config_plane_get_zpos_mutable(plane_cfg)) + return true; + + if (vkms_config_plane_get_zpos_initial(plane_cfg) > + vkms_config_plane_get_zpos_max(plane_cfg)) { + drm_info(dev, "Configured initial zpos value bigger than zpos max\n"); + return false; + } + + if (vkms_config_plane_get_zpos_max(plane_cfg) < + vkms_config_plane_get_zpos_min(plane_cfg)) { + drm_info(dev, "Configured zpos max value smaller than zpos min\n"); + return false; + } + + if (vkms_config_plane_get_zpos_initial(plane_cfg) < + vkms_config_plane_get_zpos_min(plane_cfg)) { + drm_info(dev, "Configured initial zpos value smaller than zpos min\n"); + return false; + } + + return true; +} + static bool valid_planes_for_crtc(const struct vkms_config *config, struct vkms_config_crtc *crtc_cfg) { @@ -425,6 +459,9 @@ bool vkms_config_is_valid(const struct vkms_config *con= fig) "Both supported color encoding and color range must be set, or none\n= "); return false; } + + if (!vkms_config_valid_plane_zpos(config, plane_cfg)) + return false; } =20 if (!valid_plane_number(config)) @@ -526,6 +563,16 @@ static int vkms_config_show(struct seq_file *m, void *= data) show_formats(m, vkms_config_plane_get_supported_formats(plane_cfg), vkms_config_plane_get_supported_formats_count(plane_cfg)); seq_puts(m, "\n"); + seq_printf(m, "\tzpos_enabled=3D%s\n", + str_true_false(vkms_config_plane_get_zpos_enabled(plane_cfg))); + seq_printf(m, "\tzpos_mutable=3D%s\n", + str_true_false(vkms_config_plane_get_zpos_mutable(plane_cfg))); + seq_printf(m, "\tzpos_min=3D%d\n", + vkms_config_plane_get_zpos_min(plane_cfg)); + seq_printf(m, "\tzpos_initial=3D%d\n", + vkms_config_plane_get_zpos_initial(plane_cfg)); + seq_printf(m, "\tzpos_max=3D%d\n", + vkms_config_plane_get_zpos_max(plane_cfg)); } =20 vkms_config_for_each_crtc(vkmsdev->config, crtc_cfg) { diff --git a/drivers/gpu/drm/vkms/vkms_config.h b/drivers/gpu/drm/vkms/vkms= _config.h index 2d9e35b7caad..baed036a07cd 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -51,6 +51,11 @@ struct vkms_config { * @supported_color_ranges: Color range that this plane will support * @supported_formats: List of supported formats * @supported_formats_count: Length of @supported_formats + * @zpos_enabled: Enable or disable the zpos property + * @zpos_mutable: Make the zpos property mutable or not (ignored if @zpos_= enabled is false) + * @zpos_initial: Initial value for zpos property (ignored if @zpos_enable= d is false) + * @zpos_min: Minimal value for zpos property (ignored if @zpos_enabled is= false) + * @zpos_max: Maximal value for zpos property (ignored if @zpos_enabled is= false) */ struct vkms_config_plane { struct list_head link; @@ -67,6 +72,11 @@ struct vkms_config_plane { u32 *supported_formats; unsigned int supported_formats_count; struct xarray possible_crtcs; + bool zpos_enabled; + bool zpos_mutable; + unsigned int zpos_initial; + unsigned int zpos_min; + unsigned int zpos_max; =20 /* Internal usage */ struct vkms_plane *plane; @@ -523,6 +533,143 @@ vkms_config_plane_get_name(const struct vkms_config_p= lane *plane_cfg) return plane_cfg->name; } =20 +/** + * vkms_config_plane_set_zpos_enabled() - Enable or disable zpos property = for a plane + * @plane_cfg: Plane configuration to modify + * @zpos_enabled: Whether to enable the zpos property + */ +static inline +void vkms_config_plane_set_zpos_enabled(struct vkms_config_plane *plane_cf= g, + bool zpos_enabled) +{ + plane_cfg->zpos_enabled =3D zpos_enabled; +} + +/** + * vkms_config_plane_set_zpos_mutable() - Set whether zpos property is mut= able + * @plane_cfg: Plane configuration to modify + * @zpos_mutable: Whether the zpos property should be mutable + */ +static inline +void vkms_config_plane_set_zpos_mutable(struct vkms_config_plane *plane_cf= g, + bool zpos_mutable) +{ + plane_cfg->zpos_mutable =3D zpos_mutable; +} + +/** + * vkms_config_plane_set_zpos_initial() - Set the initial zpos value + * @plane_cfg: Plane configuration to modify + * @zpos_initial: Initial zpos value + */ +static inline +void vkms_config_plane_set_zpos_initial(struct vkms_config_plane *plane_cf= g, + unsigned int zpos_initial) +{ + plane_cfg->zpos_initial =3D zpos_initial; +} + +/** + * vkms_config_plane_set_zpos_min() - Set the minimum zpos value + * @plane_cfg: Plane configuration to modify + * @zpos_min: Minimum zpos value + */ +static inline +void vkms_config_plane_set_zpos_min(struct vkms_config_plane *plane_cfg, + unsigned int zpos_min) +{ + plane_cfg->zpos_min =3D zpos_min; +} + +/** + * vkms_config_plane_set_zpos_max() - Set the maximum zpos value + * @plane_cfg: Plane configuration to modify + * @zpos_max: Maximum zpos value + * + * Sets the maximum allowed value for the zpos property. This setting is + * ignored if zpos is disabled. + */ +static inline +void vkms_config_plane_set_zpos_max(struct vkms_config_plane *plane_cfg, + unsigned int zpos_max) +{ + plane_cfg->zpos_max =3D zpos_max; +} + +/** + * vkms_config_plane_get_zpos_enabled() - Check if zpos property is enabled + * @plane_cfg: Plane configuration to check + * + * Returns: + * True if the zpos property is enabled for this plane, false otherwise. + */ +static inline +bool vkms_config_plane_get_zpos_enabled(const struct vkms_config_plane *pl= ane_cfg) +{ + return plane_cfg->zpos_enabled; +} + +/** + * vkms_config_plane_get_zpos_mutable() - Check if zpos property is mutable + * @plane_cfg: Plane configuration to check + * + * Returns: + * True if the zpos property is mutable for this plane, false otherwise. + * Returns false if zpos is disabled. + */ +static inline +bool vkms_config_plane_get_zpos_mutable(const struct vkms_config_plane *pl= ane_cfg) +{ + return plane_cfg->zpos_mutable; +} + +/** + * vkms_config_plane_get_zpos_initial() - Get the initial zpos value + * @plane_cfg: Plane configuration to check + * + * Returns: + * The initial zpos value for this plane. The return value is undefined if + * zpos is disabled. + */ +static inline +unsigned int vkms_config_plane_get_zpos_initial(const struct vkms_config_p= lane *plane_cfg) +{ + return plane_cfg->zpos_initial; +} + +/** + * vkms_config_plane_get_zpos_min() - Get the minimum zpos value + * @plane_cfg: Plane configuration to check + * + * Returns: + * The minimum allowed zpos value for this plane. The return value is unde= fined + * if zpos is disabled. + */ +static inline +unsigned int vkms_config_plane_get_zpos_min(const struct vkms_config_plane= *plane_cfg) +{ + return plane_cfg->zpos_min; +} + +/** + * vkms_config_plane_get_zpos_max() - Get the maximum zpos value + * @plane_cfg: Plane configuration to check + * + * Returns: + * The maximum allowed zpos value for this plane. The return value is unde= fined + * if zpos is disabled. + */ +static inline +unsigned int vkms_config_plane_get_zpos_max(const struct vkms_config_plane= *plane_cfg) +{ + return plane_cfg->zpos_max; +} + +#if IS_ENABLED(CONFIG_KUNIT) +bool vkms_config_valid_plane_zpos(const struct vkms_config *config, + const struct vkms_config_plane *plane_cfg); +#endif + /** * vkms_config_plane_attach_crtc - Attach a plane to a CRTC * @plane_cfg: Plane to attach diff --git a/drivers/gpu/drm/vkms/vkms_plane.c b/drivers/gpu/drm/vkms/vkms_= plane.c index 945abbbeac99..11a6b7bc74a7 100644 --- a/drivers/gpu/drm/vkms/vkms_plane.c +++ b/drivers/gpu/drm/vkms/vkms_plane.c @@ -211,5 +211,16 @@ struct vkms_plane *vkms_plane_init(struct vkms_device = *vkmsdev, vkms_config_plane_get_default_color_encoding(config), vkms_config_plane_get_default_color_range(config)); =20 + if (vkms_config_plane_get_zpos_enabled(config)) { + if (vkms_config_plane_get_zpos_mutable(config)) + drm_plane_create_zpos_property(&plane->base, + vkms_config_plane_get_zpos_initial(config), + vkms_config_plane_get_zpos_min(config), + vkms_config_plane_get_zpos_max(config)); + else + drm_plane_create_zpos_immutable_property(&plane->base, + vkms_config_plane_get_zpos_initial(config)); + } + return plane; } --=20 2.51.0 From nobody Sun Feb 8 19:55:55 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 095E234C149; Wed, 29 Oct 2025 13:31:00 +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=1761744662; cv=none; b=VJ+17jWOX/I2IuhbX7ZzLU9MXyRTNZKORWddwdS6smDmt9KgULiw2LhlpaLQmEUx3/9MK7XaCbhyU7DaiCV+/T6NOvfEbSPNa0c6eaNL7bEqvJfL0rpawJsvc/kOpYdLrgPVpWlU+rxMC8qHddsxuLPWrJEg1NNBggRGK8xGdpo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761744662; c=relaxed/simple; bh=P0mWYpyiiMrPDse27em7Q4FFig+ra+2u7mDuWs/kj0I=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JHU8ZWfEVaKnSlcnwAF+eIn6oaWroAPyhtRVWn9p6VoqBMeVZgJA1f9H2ML5hOI4CGgpG2PG723sQnTIBAqdpWYFsvXKfCNI7ii0FXuYAjo6u1m2HFc2sUdXbDaTvGThc8eiqjULDSBWoPOYfZGRYE7ztZjA4l54J7v4bWAx140= 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=db5rRRBy; 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="db5rRRBy" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 5C722C0DB01; Wed, 29 Oct 2025 13:30:39 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id B3D73606E8; Wed, 29 Oct 2025 13:30:59 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 602CF117F809E; Wed, 29 Oct 2025 14:30:57 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761744658; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=zFCTYSXu8zR0H2WC/3HxAVrv/TDK9xKwNmxiQq5HQMo=; b=db5rRRByhaR5sKhs2jy7PXXWmU6Uk3s8lSf7LgIoHlw4SxiZeJsD+1QdmylTXDtA8JNwhk wZyzNN0VoxobFazv0oVrz8QSUosPzsXfmVtTTAiclJcLR8WUotT4rpcPH2sJO7k3fj4378 Ua9/MUlkPIN9v5weibDyTDLBALU1NVY+4zbWGXWu4pctrLs6GtaphWQpV1G2OVv5gSQv8C jvcHbKmS2ivZnfHzF2CEgLBJ+E7TYsFa5b8qIjcCFhaV/KroBj5IpJBZzRjQv6L3xDAYVa xGa3ddJnxB1njb9+wEOpzRD+0Yq/DfQOeZfQIiA3/jjCWq8IPodfx0uzQkjvGw== From: Louis Chauvet Date: Wed, 29 Oct 2025 14:30:30 +0100 Subject: [PATCH v2 20/32] drm/vkms: Introduce configfs for plane zpos property Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251029-vkms-all-config-v2-20-be20b9bf146e@bootlin.com> References: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=7640; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=P0mWYpyiiMrPDse27em7Q4FFig+ra+2u7mDuWs/kj0I=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAhbrNYQYHKveWgBEuJADeFEM62+xxvGEEPUt+ P7RPum4OpyJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQIW6wAKCRAgrS7GWxAs 4iuyEAChD5Vm+RkIU0HXIK5BW1qxbfpV2iBB+VHG/5J1wvU07xOHqxAiFpzdZa1F9iOIBxlEk8X Io4gNszEa19dqSTBE2RePGJmmay/Nsqti+GKqFJMNGeCkTFIQ+ynQ6gvAvvk+9h9XT+sX2qefqa mVz+063RfGZ2lxHf0oLQ5n6VW3oXv9wIuGsK3DQ+zt1z5dSqt58yipnomoSX6ASHFL5btFXk+vs K/SfjCrAsVqKyPkEjEfF3P4hWKl8TcZROQnikt1I4XDgHJmltAPmJAd71B//BMG8cpPRQIPT22I Q28t/2rtztk82GYnk6Q5NRx39rl18bHz2v+3hv5GhuWLLmzuyVbZfc16I0YNQLpqMIvfLoQH4Hr z+NpytDHuNzA5CO+6t2zkC/VcGJSAjCZd7XlP6FhjfFsfdCPT60cGfx5goFYt3LRNyw+/MVQ6wn PFA1+gA2MYOTtDTIO1xgm/QdfU2uxbbYSe7CJ3oX/wIWyQ5o45/JI31w3kAwA1ObIJqJ3qCIHfL 9q9B2pIAf2eWLWY5/IrkceqHjlk1kkncxkdkP8+4zgEiZOTtoHkEgtpvE8dtBNJPfPiaQyr8Rod prrh4x9T1TdqRMtcqIRfORHdwChy08gXLG9WSGnCFwzuBeYg0rqbGj5bWonlvYM6ba6pk7JzVS6 oZsPsWyZ1XZgX5w== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Modern compositor rely on zpos management to offload some processing to deticated hardware. In order to test multiple configurations, add zpos configuration to configFS. Introduce multiple attributes to configure zpos: - zpos_enabled - Create or not the zpos property. If not created, the zpos is undefined. - zpos_mutable - If the zpos property is created, allow or not the userspace to modify it - zpos_initial - Initial value for zpos property. Must be between zpos_min and zpos_max - zpos_min - Minimal zpos value for this plane. Must be smaller than or equals to zpos_max - zpos_max - Maximal zpos value for this plane. Must be greater than or equals to zpos_min Signed-off-by: Louis Chauvet --- Documentation/gpu/vkms.rst | 9 +- drivers/gpu/drm/vkms/vkms_configfs.c | 180 +++++++++++++++++++++++++++++++= ++++ 2 files changed, 188 insertions(+), 1 deletion(-) diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index 779ae363110d..32858f9a3357 100644 --- a/Documentation/gpu/vkms.rst +++ b/Documentation/gpu/vkms.rst @@ -87,7 +87,7 @@ Start by creating one or more planes:: =20 sudo mkdir /config/vkms/my-vkms/planes/plane0 =20 -Planes have 9 configurable attributes: +Planes have 14 configurable attributes: =20 - type: Plane type: 0 overlay, 1 primary, 2 cursor (same values as those exposed by the "type" property of a plane) @@ -114,6 +114,13 @@ Planes have 9 configurable attributes: To remove a format, use a minus and its fourcc: -XR24 To add all formats use +* To remove all formats, use -* +- zpos_enabled: Enable or not the zpos property: 1 enable, 0 disable +- zpos_mutable: Create the zpos property as a mutable or imutable property= : 1 mutable, + 0 disable. No effect if zpos_enabled is not set. +- zpos_initial: Set the initial zpos value. Must be between zpos_min and z= pos_max. No + effect if zpos_enabled is not set. +- zpos_min: Set the minimal zpos value. No effect if zpos_enabled is not s= et. +- zpos_max: Set the maximal zpos value. No effect if zpos_enabled is not s= et. =20 Continue by creating one or more CRTCs:: =20 diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vk= ms_configfs.c index b0a26c4dbebe..1c0a6ecf2f29 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -735,6 +735,176 @@ static ssize_t plane_supported_formats_store(struct c= onfig_item *item, return count; } =20 +static ssize_t plane_zpos_enabled_show(struct config_item *item, char *pag= e) +{ + struct vkms_configfs_plane *plane; + bool enabled; + + plane =3D plane_item_to_vkms_configfs_plane(item); + + scoped_guard(mutex, &plane->dev->lock) + enabled =3D vkms_config_plane_get_zpos_enabled(plane->config); + + return sprintf(page, "%d\n", enabled); +} + +static ssize_t plane_zpos_enabled_store(struct config_item *item, const ch= ar *page, + size_t count) +{ + struct vkms_configfs_plane *plane; + bool enabled; + + plane =3D plane_item_to_vkms_configfs_plane(item); + + if (kstrtobool(page, &enabled)) + return -EINVAL; + + scoped_guard(mutex, &plane->dev->lock) { + if (plane->dev->enabled) + return -EBUSY; + + vkms_config_plane_set_zpos_enabled(plane->config, enabled); + } + + return (ssize_t)count; +} + +static ssize_t plane_zpos_mutable_show(struct config_item *item, char *pag= e) +{ + struct vkms_configfs_plane *plane; + bool mutable; + + plane =3D plane_item_to_vkms_configfs_plane(item); + + scoped_guard(mutex, &plane->dev->lock) + mutable =3D vkms_config_plane_get_zpos_mutable(plane->config); + + return sprintf(page, "%d\n", mutable); +} + +static ssize_t plane_zpos_mutable_store(struct config_item *item, const ch= ar *page, + size_t count) +{ + struct vkms_configfs_plane *plane; + bool mutable; + + plane =3D plane_item_to_vkms_configfs_plane(item); + + if (kstrtobool(page, &mutable)) + return -EINVAL; + + scoped_guard(mutex, &plane->dev->lock) { + if (plane->dev->enabled) + return -EBUSY; + + vkms_config_plane_set_zpos_mutable(plane->config, mutable); + } + + return (ssize_t)count; +} + +static ssize_t plane_zpos_initial_show(struct config_item *item, char *pag= e) +{ + struct vkms_configfs_plane *plane; + unsigned int initial; + + plane =3D plane_item_to_vkms_configfs_plane(item); + + scoped_guard(mutex, &plane->dev->lock) + initial =3D vkms_config_plane_get_zpos_initial(plane->config); + + return sprintf(page, "%u\n", initial); +} + +static ssize_t plane_zpos_initial_store(struct config_item *item, const ch= ar *page, + size_t count) +{ + struct vkms_configfs_plane *plane; + unsigned int initial; + + plane =3D plane_item_to_vkms_configfs_plane(item); + + if (kstrtouint(page, 10, &initial)) + return -EINVAL; + + scoped_guard(mutex, &plane->dev->lock) { + if (plane->dev->enabled) + return -EBUSY; + + vkms_config_plane_set_zpos_initial(plane->config, initial); + } + + return (ssize_t)count; +} + +static ssize_t plane_zpos_min_show(struct config_item *item, char *page) +{ + struct vkms_configfs_plane *plane; + unsigned int min; + + plane =3D plane_item_to_vkms_configfs_plane(item); + + scoped_guard(mutex, &plane->dev->lock) + min =3D vkms_config_plane_get_zpos_min(plane->config); + + return sprintf(page, "%u\n", min); +} + +static ssize_t plane_zpos_min_store(struct config_item *item, const char *= page, + size_t count) +{ + struct vkms_configfs_plane *plane; + unsigned int min; + + plane =3D plane_item_to_vkms_configfs_plane(item); + + if (kstrtouint(page, 10, &min)) + return -EINVAL; + + scoped_guard(mutex, &plane->dev->lock) { + if (plane->dev->enabled) + return -EBUSY; + + vkms_config_plane_set_zpos_min(plane->config, min); + } + + return (ssize_t)count; +} + +static ssize_t plane_zpos_max_show(struct config_item *item, char *page) +{ + struct vkms_configfs_plane *plane; + unsigned int max; + + plane =3D plane_item_to_vkms_configfs_plane(item); + + scoped_guard(mutex, &plane->dev->lock) + max =3D vkms_config_plane_get_zpos_max(plane->config); + + return sprintf(page, "%u\n", max); +} + +static ssize_t plane_zpos_max_store(struct config_item *item, const char *= page, + size_t count) +{ + struct vkms_configfs_plane *plane; + unsigned int max; + + plane =3D plane_item_to_vkms_configfs_plane(item); + + if (kstrtouint(page, 10, &max)) + return -EINVAL; + + scoped_guard(mutex, &plane->dev->lock) { + if (plane->dev->enabled) + return -EBUSY; + + vkms_config_plane_set_zpos_max(plane->config, max); + } + + return (ssize_t)count; +} + CONFIGFS_ATTR(plane_, type); CONFIGFS_ATTR(plane_, name); CONFIGFS_ATTR(plane_, supported_rotations); @@ -744,6 +914,11 @@ CONFIGFS_ATTR(plane_, default_color_range); CONFIGFS_ATTR(plane_, supported_color_encodings); CONFIGFS_ATTR(plane_, default_color_encoding); CONFIGFS_ATTR(plane_, supported_formats); +CONFIGFS_ATTR(plane_, zpos_enabled); +CONFIGFS_ATTR(plane_, zpos_mutable); +CONFIGFS_ATTR(plane_, zpos_initial); +CONFIGFS_ATTR(plane_, zpos_min); +CONFIGFS_ATTR(plane_, zpos_max); =20 static struct configfs_attribute *plane_item_attrs[] =3D { &plane_attr_type, @@ -755,6 +930,11 @@ static struct configfs_attribute *plane_item_attrs[] = =3D { &plane_attr_supported_color_encodings, &plane_attr_default_color_encoding, &plane_attr_supported_formats, + &plane_attr_zpos_enabled, + &plane_attr_zpos_mutable, + &plane_attr_zpos_initial, + &plane_attr_zpos_min, + &plane_attr_zpos_max, NULL, }; =20 --=20 2.51.0 From nobody Sun Feb 8 19:55:55 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 0502234D91D for ; Wed, 29 Oct 2025 13:31:02 +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=1761744665; cv=none; b=jWQybetHgb+BT11ACp4XqsObbyfgym9SkFcJiGxfb0kXOoM4gCGUfXi49N1m0SRZLPAtNH2pecx7ZaAPQxsYetTNfNXaWrY7w5O4axzmYFFNlVau9e9uNeNZVz3ewMFt/uxNJ3L3ENjzz5KirqtfxU1nyOMc1jEdxADmzmZYPA4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761744665; c=relaxed/simple; bh=MW+TBo4PtU3ICsaNvIu8XELjIkOf8Ka1JhDlVk3E2vU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=bNH1x00ClzvODe8Pz469Jbr6o5RtE0VcWYtkTWppfa5zhVweEk2kmCbmX6smzsZYI87KXppcCG6yktCOtjCOil4gRwfluOFi7VMUz8zseJlnyQObkULADkBbZg/PWiVFyeWdxuG+xx6ii3doVy/dofykuzKzhz0+UZ853ax5tVQ= 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=UHs1/BtP; 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="UHs1/BtP" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 7B8274E413D0; Wed, 29 Oct 2025 13:31:01 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 4B624606E8; Wed, 29 Oct 2025 13:31:01 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 4052C117F80A0; Wed, 29 Oct 2025 14:30:59 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761744660; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=k+CPr3GRQ9NHOG87KjHsgaVZ994Pa6rjX1YtzoCQq6c=; b=UHs1/BtPUHzF4pJ4eoWtqGhUgg3Hfs2tM/tTunyiWDnKHwzyeBxdg8USZbibZ/zd40qdxB mMgchdjY3MpE+Xagx7XEa1zQr1KCCrkuWqd/Ug5cgJkpFAm818D1CSLmPmxcFYWbrlHdIr MbBIh39Ay+PFg6m6ANZEBUHId870iduGHVrg9XJHXq8SpGxAMeeP903Q6hBHhLvA8zF6ky ddkI7Jseibr2d0PAVhDBpoVd8Oz2BEHukeBUE9WbB4WOtzLk8c22KbP//hlYvK/tEs8edO yq9ap/2AtL1oTZV6RI6tBMWZhHjNgu6CibVWMDTelmVIUlSiT4xq3h4jn0ailQ== From: Louis Chauvet Date: Wed, 29 Oct 2025 14:30:31 +0100 Subject: [PATCH v2 21/32] drm/vkms: Introduce config for connector type Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251029-vkms-all-config-v2-21-be20b9bf146e@bootlin.com> References: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=6484; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=MW+TBo4PtU3ICsaNvIu8XELjIkOf8Ka1JhDlVk3E2vU=; b=kA0DAAoBIK0uxlsQLOIByyZiAGkCFuugmwm6bvmukTl/GIPlVEjV4r14Fq1nXIXQ5xH+wjCam IkCMwQAAQoAHRYhBE+PuD++eDwxDFBZBCCtLsZbECziBQJpAhbrAAoJECCtLsZbECziRgkP/0nB qygCL+yL/ZMLt0AUxB0jwZ5Ks/De4AH3GQ3T38pTVh86KYn9V6Y0I6QYBAouW68uPuKkOQDxKfO re4jl7jGEZEha2JxgGxLJJQUCuCnpY4MlNsuZDQhwuGeCSulQrpvgTCdbPlaK1IYKAnThXLU45j ULxEIrsmIKqvaJJsBopP4b36hebAfJVWkRMqUuRSITVc6hEnOuknQabqJOqrPQHWOXv+bZsmAGl yaSIjJkHbJubxgV6/30KoLsqB0cg1IXhvAJ7w1j58t94eEjtq2gWgDmrwJNtPuyHxkjg3YuvEzi +3cIek1Oo3JIAq3vxkQvON/3j2E9Wql9sFjjLkVDM5Kf2y5tamGfXts6RI9cW0Lq4E6JIYCo1Hd ZsuhTZHTsNBRnWnMljeDZV+WX1KxL4nmrfiGDSIUGS6kxSTPd9wDYvf9/J8Mn/QYTlGBFSfeKQC TfDLZcjkh6nc2chco6l3irMtZH5DQsjkwkOx6HPRFVNYmhwA+BpDOV1htyTAr1FNj2qiJwwm36k 5cR75hfGMV0YDHOz0I3pTeRbnT0pXzy5I7fmVVWxAyQeB220bH3axljg1KcD2MKL456UydDM6cp KxQ8uzQ8638dXDTlWQVf0Rw1s/QLx5XU5Pd8mQF2NrdFZQZGOm0Vq37EynAWQWOSOJIf1zEI2bT Pl6tg X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 In order to emulate connector-specific behavior, add connector type configuration. Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/tests/vkms_config_test.c | 5 +++++ drivers/gpu/drm/vkms/vkms_config.c | 3 +++ drivers/gpu/drm/vkms/vkms_config.h | 24 ++++++++++++++++++++++++ drivers/gpu/drm/vkms/vkms_connector.c | 5 +++-- drivers/gpu/drm/vkms/vkms_connector.h | 3 ++- drivers/gpu/drm/vkms/vkms_output.c | 2 +- 6 files changed, 38 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/vkms/tests/vkms_config_test.c b/drivers/gpu/dr= m/vkms/tests/vkms_config_test.c index 518e68c17122..c8b885306eed 100644 --- a/drivers/gpu/drm/vkms/tests/vkms_config_test.c +++ b/drivers/gpu/drm/vkms/tests/vkms_config_test.c @@ -128,6 +128,7 @@ static void vkms_config_test_default_config(struct kuni= t *test) struct vkms_config *config; struct vkms_config_plane *plane_cfg; struct vkms_config_crtc *crtc_cfg; + struct vkms_config_connector *connector_cfg; int n_primaries =3D 0; int n_cursors =3D 0; int n_overlays =3D 0; @@ -198,6 +199,10 @@ static void vkms_config_test_default_config(struct kun= it *test) =20 /* Connectors */ KUNIT_EXPECT_EQ(test, vkms_config_get_num_connectors(config), 1); + vkms_config_for_each_connector(config, connector_cfg) { + KUNIT_EXPECT_EQ(test, vkms_config_connector_get_type(connector_cfg), + DRM_MODE_CONNECTOR_VIRTUAL); + } =20 KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); =20 diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index 801019cf04c1..02e2f0249fb0 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -588,6 +588,8 @@ static int vkms_config_show(struct seq_file *m, void *d= ata) seq_puts(m, "connector:\n"); seq_printf(m, "\tstatus=3D%s\n", drm_get_connector_status_name(vkms_config_connector_get_status(conne= ctor_cfg))); + seq_printf(m, "\ttype=3D%s\n", + drm_get_connector_type_name(vkms_config_connector_get_type(connector= _cfg))); } =20 return 0; @@ -893,6 +895,7 @@ struct vkms_config_connector *vkms_config_create_connec= tor(struct vkms_config *c =20 connector_cfg->config =3D config; connector_cfg->status =3D connector_status_connected; + vkms_config_connector_set_type(connector_cfg, DRM_MODE_CONNECTOR_VIRTUAL); xa_init_flags(&connector_cfg->possible_encoders, XA_FLAGS_ALLOC); =20 list_add_tail(&connector_cfg->link, &config->connectors); diff --git a/drivers/gpu/drm/vkms/vkms_config.h b/drivers/gpu/drm/vkms/vkms= _config.h index baed036a07cd..6a50ec7535af 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -128,6 +128,7 @@ struct vkms_config_encoder { * struct vkms_config_connector * * @link: Link to the others connector in vkms_config + * @type: Store the type of connector using DRM_MODE_CONNECTOR_* values * @config: The vkms_config this connector belongs to * @status: Status (connected, disconnected...) of the connector * @possible_encoders: Array of encoders that can be used with this connec= tor @@ -140,6 +141,7 @@ struct vkms_config_connector { struct list_head link; struct vkms_config *config; =20 + int type; enum drm_connector_status status; struct xarray possible_encoders; =20 @@ -317,6 +319,28 @@ vkms_config_plane_set_type(struct vkms_config_plane *p= lane_cfg, } =20 /** + * vkms_config_connector_get_type() - Return the connector type + * @connector_cfg: Connector to get the type from + */ +static inline int +vkms_config_connector_get_type(const struct vkms_config_connector *connect= or_cfg) +{ + return connector_cfg->type; +} + +/** + * vkms_config_connector_set_type() - Set the connector type + * @connector_cfg: Connector to set the type to + * @type: New connector type + */ +static inline void +vkms_config_connector_set_type(struct vkms_config_connector *connector_cfg, + int type) +{ + connector_cfg->type =3D type; +} + +/* * vkms_config_plane_get_default_rotation() - Get the default rotation for= a plane * @plane_cfg: Plane to get the default rotation from * diff --git a/drivers/gpu/drm/vkms/vkms_connector.c b/drivers/gpu/drm/vkms/v= kms_connector.c index b0a6b212d3f4..5a87dc2d4c63 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.c +++ b/drivers/gpu/drm/vkms/vkms_connector.c @@ -68,7 +68,8 @@ static const struct drm_connector_helper_funcs vkms_conn_= helper_funcs =3D { .best_encoder =3D vkms_conn_best_encoder, }; =20 -struct vkms_connector *vkms_connector_init(struct vkms_device *vkmsdev) +struct vkms_connector *vkms_connector_init(struct vkms_device *vkmsdev, + struct vkms_config_connector *connector_cfg) { struct drm_device *dev =3D &vkmsdev->drm; struct vkms_connector *connector; @@ -79,7 +80,7 @@ struct vkms_connector *vkms_connector_init(struct vkms_de= vice *vkmsdev) return ERR_PTR(-ENOMEM); =20 ret =3D drmm_connector_init(dev, &connector->base, &vkms_connector_funcs, - DRM_MODE_CONNECTOR_VIRTUAL, NULL); + vkms_config_connector_get_type(connector_cfg), NULL); if (ret) return ERR_PTR(ret); =20 diff --git a/drivers/gpu/drm/vkms/vkms_connector.h b/drivers/gpu/drm/vkms/v= kms_connector.h index ed312f4eff3a..a124c5403697 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.h +++ b/drivers/gpu/drm/vkms/vkms_connector.h @@ -24,7 +24,8 @@ struct vkms_connector { * Returns: * The connector or an error on failure. */ -struct vkms_connector *vkms_connector_init(struct vkms_device *vkmsdev); +struct vkms_connector *vkms_connector_init(struct vkms_device *vkmsdev, + struct vkms_config_connector *connector_cfg); =20 /** * vkms_trigger_connector_hotplug() - Update the device's connectors status diff --git a/drivers/gpu/drm/vkms/vkms_output.c b/drivers/gpu/drm/vkms/vkms= _output.c index 22208d02afa4..217f054d9598 100644 --- a/drivers/gpu/drm/vkms/vkms_output.c +++ b/drivers/gpu/drm/vkms/vkms_output.c @@ -96,7 +96,7 @@ int vkms_output_init(struct vkms_device *vkmsdev) struct vkms_config_encoder *possible_encoder; unsigned long idx =3D 0; =20 - connector_cfg->connector =3D vkms_connector_init(vkmsdev); + connector_cfg->connector =3D vkms_connector_init(vkmsdev, connector_cfg); if (IS_ERR(connector_cfg->connector)) { DRM_ERROR("Failed to init connector\n"); return PTR_ERR(connector_cfg->connector); --=20 2.51.0 From nobody Sun Feb 8 19:55:55 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 23996348877; Wed, 29 Oct 2025 13:31:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761744665; cv=none; b=o/6zpxSPqtcbEZbl4FJ3ZBbIWUr/B2DAeS4Kicc5cqlNKooORa+psWmhg79l16Pi6CQaNSTCnTPaUrLnSciY194/qR/rsrsqedt3co2LhtRncCGsYiaGBXZlBsj7HZZ01DPmQFE4gZuBHaYROI3c1jj98/q9HoDzaJVu3Te0KfM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761744665; c=relaxed/simple; bh=LUx3WgpJ+5BY9H52t76Y/Q40Ik9Sz02o7+/xgILTIdY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=sIpoLSZVXn7zweWmKDwSZY1vg3ZF7sxzRyAdwOrjKkoOBlQiSeuj10dLaiBWrMjZUK3mwFGjlXzVPXi8K75eOpUAtWPHhp62xsVaI0JV3tC5AkaMZEe3mvVBIO6a0Wz+TGWM/kH5NKoYvyhEFYwAZibQWa68Av7iyTesjT/Sz/Q= 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=SFJ1+IXg; 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="SFJ1+IXg" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 8E936C0DB00; Wed, 29 Oct 2025 13:30:42 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id E35B1606E8; Wed, 29 Oct 2025 13:31:02 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id C7714117F80A1; Wed, 29 Oct 2025 14:31:00 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761744662; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=TiSP9apTRMTQa/+Qm2OMWAOpekvvQHx/ArvOL/FMv3k=; b=SFJ1+IXgGzZdn/sKastjsp4rPpjTT8efJI2eBlQN3KH/bvjas8GCYjSWzBym3BE5WuDacK G3P64CgesZTgmiI71buol0vDAtQw8c3AS/PnwWvzh1wuxF1yCbJesQxrl2WZU6ZKM8ciBn +7pbuQAtFuRWpfqy0/qDBHc0uB8gCqtHkb/4MVAxLn2ZJYBwYiG9VGd0YKRXmnsNRY770p tPMhldvXAkyWbVUOzVA2jUHgBJo/HdnvI9+rf8QMxhyOT/tFQ6ve1xZ84Isl7BnoVTFwVh yyb/OL5mvdSVziBESKEdXKyhpEgsxVHnurEGyN1T8JF8t8/CW8Mxa6pVWAZe6Q== From: Louis Chauvet Date: Wed, 29 Oct 2025 14:30:32 +0100 Subject: [PATCH v2 22/32] drm/vkms: Introduce configfs for connector type Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251029-vkms-all-config-v2-22-be20b9bf146e@bootlin.com> References: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=3281; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=LUx3WgpJ+5BY9H52t76Y/Q40Ik9Sz02o7+/xgILTIdY=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAhbrzftPuWCVBhOPaQZWdYU1MCCIu1yeDM14t oWibudteqyJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQIW6wAKCRAgrS7GWxAs 4nOzEACzKB9I1hsBPD3cz/cdvtoUFo3YysXlD7C3i2OLw3+U99nQGkzEr6+B8QMRAvKy/PCrnlu XPw1Yqxh1MQDLvcns7De4igEnbhV0eBZly8h2PIpHzDTUH/OwfDalMHXpTfqWDEgXIibSdXnGP1 +i6Z56cNBtEi5AyQgAklTYqmLLq3e9ctAJ5Hws9PSWofrfpH5HCv0r+z0aFPx79A4kdrpcvOk3u 8NNNUUJLJP9vrKLh0VvfR5N7//VHfuX2yOgxZqk4s2zFs/5BkX47ZbUaVfjGj11F+oBo4iwyPGr DsigKKvy3Yno6IiIrvzLmmt0/Ox+iIzUDT6yuMxAsSbGjv0gvTnqB90VKWHFTcLZx4A7Lhy4/Oj g2WR2zQA0jmIDvSBWi68mKC6h5NvUDOJnmaSE3mGrIlSm1PnXG4Bp4Q7vmBQd2M5766LuT68dJ+ aQwO3r2jiLB1uJDk2bNWxFFFvoej5yQ8fVzel6RINNHTRpflTO2GQaxVbj3zNWBGXlp5N7f0G9k P8zMwcy5kWrV6TyZ7jsvybKj/ODCYPQWbbKVmz2F/4r+0X6hpuarWfZtYIhlT71pXAdefrAYHxV 2TE9TNWtJeZoygXIe7kzAXpOS3Yr2yvEImTvfUDCALizjdwFrx09Gm0zLnptMxmScWL6zLo4FA9 1VnFWtaXZMFqfZQ== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Add a new attribute to connector to change its type. This is mostly cosmetic and don't have direct effect in VKMS behavior. Signed-off-by: Louis Chauvet --- Documentation/gpu/vkms.rst | 3 +- drivers/gpu/drm/vkms/vkms_configfs.c | 64 ++++++++++++++++++++++++++++++++= ++++ 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index 32858f9a3357..99c5cf3dbd78 100644 --- a/Documentation/gpu/vkms.rst +++ b/Documentation/gpu/vkms.rst @@ -138,10 +138,11 @@ Last but not least, create one or more connectors:: =20 sudo mkdir /config/vkms/my-vkms/connectors/connector0 =20 -Connectors have 1 configurable attribute: +Connectors have 2 configurable attribute: =20 - status: Connection status: 1 connected, 2 disconnected, 3 unknown (same = values as those exposed by the "status" property of a connector) +- type: Type of connector. Same values as exposed by the "type" field in d= rm_connector. =20 To finish the configuration, link the different pipeline items:: =20 diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vk= ms_configfs.c index 1c0a6ecf2f29..b03e9af569b6 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -1161,10 +1161,74 @@ static ssize_t connector_status_store(struct config= _item *item, return (ssize_t)count; } =20 +static ssize_t connector_type_show(struct config_item *item, char *page) +{ + struct vkms_configfs_connector *connector; + int type; + + connector =3D connector_item_to_vkms_configfs_connector(item); + + scoped_guard(mutex, &connector->dev->lock) { + type =3D vkms_config_connector_get_type(connector->config); + } + + return sprintf(page, "%u", type); +} + +static ssize_t connector_type_store(struct config_item *item, + const char *page, size_t count) +{ + struct vkms_configfs_connector *connector; + int val, ret; + + connector =3D connector_item_to_vkms_configfs_connector(item); + + ret =3D kstrtouint(page, 10, &val); + + if (ret) + return ret; + + switch (val) { + case DRM_MODE_CONNECTOR_Unknown: + case DRM_MODE_CONNECTOR_VGA: + case DRM_MODE_CONNECTOR_DVII: + case DRM_MODE_CONNECTOR_DVID: + case DRM_MODE_CONNECTOR_DVIA: + case DRM_MODE_CONNECTOR_Composite: + case DRM_MODE_CONNECTOR_SVIDEO: + case DRM_MODE_CONNECTOR_LVDS: + case DRM_MODE_CONNECTOR_Component: + case DRM_MODE_CONNECTOR_9PinDIN: + case DRM_MODE_CONNECTOR_DisplayPort: + case DRM_MODE_CONNECTOR_HDMIA: + case DRM_MODE_CONNECTOR_HDMIB: + case DRM_MODE_CONNECTOR_TV: + case DRM_MODE_CONNECTOR_eDP: + case DRM_MODE_CONNECTOR_VIRTUAL: + case DRM_MODE_CONNECTOR_DSI: + case DRM_MODE_CONNECTOR_DPI: + case DRM_MODE_CONNECTOR_SPI: + case DRM_MODE_CONNECTOR_USB: + break; + default: + return -EINVAL; + } + + scoped_guard(mutex, &connector->dev->lock) { + if (connector->dev->enabled) + return -EINVAL; + vkms_config_connector_set_type(connector->config, val); + } + + return count; +} + CONFIGFS_ATTR(connector_, status); +CONFIGFS_ATTR(connector_, type); =20 static struct configfs_attribute *connector_item_attrs[] =3D { &connector_attr_status, + &connector_attr_type, NULL, }; =20 --=20 2.51.0 From nobody Sun Feb 8 19:55:55 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 2434434EEEC for ; Wed, 29 Oct 2025 13:31:05 +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=1761744667; cv=none; b=XbvAXVrnXj53IM7qKjBRkbm9OdzICHnNOPFJFhwRKTMdaXLT7NX56wfnjig8dXUwlOXD1rdqtERzt14ZYdYiB7ABuRiu8zyTmgPTqHR0Drym5hhFUWAMnay7RMdLdTOB0yUv7I5/E3XZYShSGeE5Mn8G8kc0VP2oJ+65Qce+i0Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761744667; c=relaxed/simple; bh=to6N0s2e3g5+ds9m2twnzI2TlMbRSBVJUFTnMgjwSAk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=SXISLuWG4u1L2lTmp3ODyptxz3pSR1IulcXZDgNxazY1bLIdhmBDnofCup4pY320a1TVVwLl9pgWCQasLUbQyDusLgTU3cF6EhOaA5MYUIpoXiaGQajUExXYhs00wSoey9cSJG3C0yQcgYdJZsGxaL6Z6bkY6tvwZ96Qxk9kaU4= 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=dVGPvrbw; 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="dVGPvrbw" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 4BD13C0DB01; Wed, 29 Oct 2025 13:30:44 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id A35F5606E8; Wed, 29 Oct 2025 13:31:04 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 75B1D117F809D; Wed, 29 Oct 2025 14:31:02 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761744664; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=qMP9RjOBCxKmLcvhFceO5QO4aOVeU1xn/DHi3LCTl8E=; b=dVGPvrbwyxy6NPnkU/YOR+Nz+AMrR25ymh7vHZRbY5yAlL1O/d12lo+hk9MytdVexhi13a rsTCSjG5MZiVsaylY5afR3MvkGowBuhe14cUjkRCPg8cB1HKkR80Fy4IfIypTjsfoivtnW 4CqcgapoHiFybzSnQDsNaHNo8U6ZLN+8jz6pcfehCdvPR/kVnEzit+ovCVDk8tdvNbmaUi OdRtV0o1DoEYD8s2gF9P7rmiCb5u4KHBoHS7q8SB9i4//5ZpI15PhAs+h990tcnqUw+k+F xKztZEeD0aST4zG37wx9vo++BmADVg+6XWo0Z0XEAtayMaY9Ms3zMmO6wd3icA== From: Louis Chauvet Date: Wed, 29 Oct 2025 14:30:33 +0100 Subject: [PATCH v2 23/32] drm/connector: Export drm_get_colorspace_name Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251029-vkms-all-config-v2-23-be20b9bf146e@bootlin.com> References: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=667; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=to6N0s2e3g5+ds9m2twnzI2TlMbRSBVJUFTnMgjwSAk=; b=owEBbAKT/ZANAwAKASCtLsZbECziAcsmYgBpAhbreUvmaK15r9x36RGTfxku7ZhlBYc76vQ7d kWgQB2KCkCJAjIEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQIW6wAKCRAgrS7GWxAs 4pXfD/iLXsc3N9OqiBx32aDwvZ/Z4YCSay/VDoLRfjjzEOCJELxWHj7+veweFdcyegM9pxN0rQz SXNXxmKpo7/023p4FJ9rvQyCKiYlamDSJIlualT/dIZw/qnB0Ml7GHB93EQDpwkRMFmIVCUQX1v 8/Eofv9AvvUKCVFIbbLRvCzxx86h+lvBmCwSGNXn6EfQRNLlRgSfRnfaOASaoZVMTSonW1Ec8K4 3bZMOeE1zchwMmQJzHyuyu2Ls9I8hY8isCrEkPiiz6XryaoozQ//+NzPKNFithwrqFMGsQxrwoA qLdAR64cPduXra3SvJfWaGsUzB5O9K1B75G8zSD8qoIfBsk8ukTbCQ9O0oCHMdNRxV8xKeTYd6x afymUQJy3Ll8hVCzmHKhO59F/Eg4CRkY/Feao9xx+2TDAk/ZKzczpY2acPxjxNo+D+dDajN8VFL QsotzH4r/2Gbvw5Jisy+RUM6VQbNog5MIT61POBXvwVcW+hKa+2sN4YjBnS3CQYPlcWdmvomTLs rV/RPgq96UsxzMMLLDUavyHi0NTRl8Yqnv2M0/kTvQPyG5THh+BP4Qt1TW1QuYyZnh+EYjO5QSj XMQ0iX5PfSf1bNfeQB6q7HNiIMVfZX1esn4sFl85YxV4jj91l1Cfxt8uwke8B51XrzhJLLulmRl vYvl6e/7D6MBB X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Export drm_get_colorspace_name so it could be used by VKMS Signed-off-by: Louis Chauvet --- drivers/gpu/drm/drm_connector.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connecto= r.c index 272d6254ea47..5b777fb75b05 100644 --- a/drivers/gpu/drm/drm_connector.c +++ b/drivers/gpu/drm/drm_connector.c @@ -1362,6 +1362,7 @@ const char *drm_get_colorspace_name(enum drm_colorspa= ce colorspace) else return "(null)"; } +EXPORT_SYMBOL(drm_get_colorspace_name); =20 static const u32 hdmi_colorspaces =3D BIT(DRM_MODE_COLORIMETRY_SMPTE_170M_YCC) | --=20 2.51.0 From nobody Sun Feb 8 19:55:55 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 BB97234F47C; Wed, 29 Oct 2025 13:31:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761744669; cv=none; b=Mois2wZWFROwX0BRqBYfNvq8W0+tvHx47eSrHf+4yCUGMXIrh45YQcsDB92qQ4kr2+ganZRpzldF/8pFLm5TAqqlCspliTBb1D5bNiUTaXlSjiNm9JX/Iqw31cpa5j3otL50MUuPtGkQ2jW0zJcIa1gccd3vO91l73ZqN7qezWc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761744669; c=relaxed/simple; bh=0+98kTspyGPOT1vZSC+v8rAN3ugo7Kzz9vOSVYqHbkY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=d7wkERSXbAavUV8Y72ip/JSTjo9MKSB7qKNHHFK0FD9bMS4xfi6W+PUcsdU+r3OS/V58ontFfKrJQIyMrCQHxXPNGKXT7KxZ5CaQWEei8Ggx40O0zPDpkUFjp7JmlHgjjD2M310jDuTJxbPWK72ODE0oX1PmWxKlQPm9lLKj+Z8= 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=YQD5QWWM; 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="YQD5QWWM" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 2F178C0DB02; Wed, 29 Oct 2025 13:30:46 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 86FAC606E8; Wed, 29 Oct 2025 13:31:06 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 2FC93117F80A2; Wed, 29 Oct 2025 14:31:04 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761744665; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=xS/1Ec3oJHE02YD4Fccj9Q73h4DqLCBWTIm+KKVpV/4=; b=YQD5QWWMVoYwXYhkpB9Iwr3sha+mebpK6hNsDwENpjcmO1G65Ct7CCjSHlpfDKby+5Jell HpMhK/pCwk0pJtGvTXDdSaqfSL2uU7kYqKKEmC239GBYslc/IrBJ3532VXsylYBorve+Qd N88hzOVnp7tlUE1lhGK5SCqzmM2aGjdkhsjRq8U06T71TXPz6+3th4dqm9YRB4nra0i7su ygyuVuQHuZt9nGruMkvXT41bAc7w49yJAYxnbIvbnGuDbYqtVezeo75R6PPHEzrNDHEqM3 psul5Fhn7nC4T5xXkT0Ixs3A9SbzbpbUvDh8JTrfhgPtheOSF4X2cDDty8JUKw== From: Louis Chauvet Date: Wed, 29 Oct 2025 14:30:34 +0100 Subject: [PATCH v2 24/32] drm/vkms: Introduce config for connector supported colorspace Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251029-vkms-all-config-v2-24-be20b9bf146e@bootlin.com> References: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=6028; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=0+98kTspyGPOT1vZSC+v8rAN3ugo7Kzz9vOSVYqHbkY=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAhbr5cftV6WPMOehVKQezeU6wtwH2PLp2jNe4 JyjilbxWW2JAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQIW6wAKCRAgrS7GWxAs 4rAiEACiqIjp7EGAQKkjH2sUuLjwKV+Kwf5eod93ct5gkiAUCLIMUJ5dvot5PbEWwTrcU+cCfQH U+grWxtgs+M2iiLQRwNKX4zgHMqFYXnBqrxSUypCE4SA7LUP6hYCmJDyzO1MlKqbxDeORbZvoHi X2CriYROGOw0jVB7M5dS3MMlA99wvzu26DZxKLyhvaijqdIHqpIDP9mVVPP/V/vWaqIKCKQT6Dx xNeAW8u5vqvv1haShwI0QfiF5UwE28vhontwNlm8ASP9/efZFVf/vV2kIQXti67lKSH+qbQrKur FNDcWLh10F7OSaolOKYhHBxbpL0LiuABbFH8s+XUYUaCwbd9bbk9Q40329XMkPB7E1xoIcuwl+q s76e39u4d09ryJ9owNqw0HWpX+klN8QVBr3bRfyhTgAi0bt9hS1Q+pmJw6DpSqTAU5th+1TmMbV t534s81/wuhLcTZoVGMcBorh7rKrBHpGjXZYI+Uh1bN+sHPIdXJ33k5qzR7ACd0LGPhWu4olWWv 3xERcOsy4WwlHW8pQ42VPtvEiawDWN5Awl1tUVlEeRCKpC71y7eYS+7KFv0uaPe/V1U/juVGaMm 2N1QDiFwhsHkMFCYsshIcPKm1NL2j3pg1quQqgtxKbPRhQ0Bha8+PUqOhw5lfTXfRNB9y4+lsW8 oZC4309Wz2plu1g== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 To emulate some HDR features of displays, it is required to expose some properties on HDMI, eDP and DP connectors. Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/tests/vkms_config_test.c | 3 +++ drivers/gpu/drm/vkms/vkms_config.c | 5 +++++ drivers/gpu/drm/vkms/vkms_config.h | 30 +++++++++++++++++++++++= ++++ drivers/gpu/drm/vkms/vkms_connector.c | 15 ++++++++++++++ 4 files changed, 53 insertions(+) diff --git a/drivers/gpu/drm/vkms/tests/vkms_config_test.c b/drivers/gpu/dr= m/vkms/tests/vkms_config_test.c index c8b885306eed..e0ceecf2e2dd 100644 --- a/drivers/gpu/drm/vkms/tests/vkms_config_test.c +++ b/drivers/gpu/drm/vkms/tests/vkms_config_test.c @@ -202,6 +202,9 @@ static void vkms_config_test_default_config(struct kuni= t *test) vkms_config_for_each_connector(config, connector_cfg) { KUNIT_EXPECT_EQ(test, vkms_config_connector_get_type(connector_cfg), DRM_MODE_CONNECTOR_VIRTUAL); + KUNIT_EXPECT_EQ(test, + vkms_config_connector_get_supported_colorspaces(connector_cfg), + 0); } =20 KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index 02e2f0249fb0..6f939b82c33f 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -590,6 +590,10 @@ static int vkms_config_show(struct seq_file *m, void *= data) drm_get_connector_status_name(vkms_config_connector_get_status(conne= ctor_cfg))); seq_printf(m, "\ttype=3D%s\n", drm_get_connector_type_name(vkms_config_connector_get_type(connector= _cfg))); + seq_puts(m, "\tsupported colorspaces=3D"); + show_bitfield(m, vkms_config_connector_get_supported_colorspaces(connect= or_cfg), + drm_get_colorspace_name); + seq_puts(m, "\n"); } =20 return 0; @@ -896,6 +900,7 @@ struct vkms_config_connector *vkms_config_create_connec= tor(struct vkms_config *c connector_cfg->config =3D config; connector_cfg->status =3D connector_status_connected; vkms_config_connector_set_type(connector_cfg, DRM_MODE_CONNECTOR_VIRTUAL); + vkms_config_connector_set_supported_colorspaces(connector_cfg, 0); xa_init_flags(&connector_cfg->possible_encoders, XA_FLAGS_ALLOC); =20 list_add_tail(&connector_cfg->link, &config->connectors); diff --git a/drivers/gpu/drm/vkms/vkms_config.h b/drivers/gpu/drm/vkms/vkms= _config.h index 6a50ec7535af..d68133723444 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -131,6 +131,10 @@ struct vkms_config_encoder { * @type: Store the type of connector using DRM_MODE_CONNECTOR_* values * @config: The vkms_config this connector belongs to * @status: Status (connected, disconnected...) of the connector + * @supported_colorspaces: Bitmask of all the supported colorspaces. Values + * are the sames as ones accepted by + * drm_mode_create_hdmi_colorspace_property() and + * drm_mode_create_dp_colorspace_property() * @possible_encoders: Array of encoders that can be used with this connec= tor * @connector: Internal usage. This pointer should never be considered as = valid. * It can be used to store a temporary reference to a VKMS con= nector @@ -143,6 +147,7 @@ struct vkms_config_connector { =20 int type; enum drm_connector_status status; + u32 supported_colorspaces; struct xarray possible_encoders; =20 /* Internal usage */ @@ -241,6 +246,31 @@ struct vkms_config *vkms_config_default_create(bool en= able_cursor, */ void vkms_config_destroy(struct vkms_config *config); =20 +/** + * vkms_config_connector_set_supported_colorspaces() - Set the supported c= olorspaces for a connector + * @connector_cfg: Connector configuration to modify + * @supported_colorspaces: Bitmask of supported colorspaces (DRM_COLOR_YCB= CR_*) + */ +static inline void +vkms_config_connector_set_supported_colorspaces(struct vkms_config_connect= or *connector_cfg, + u32 supported_colorspaces) +{ + connector_cfg->supported_colorspaces =3D supported_colorspaces; +} + +/** + * vkms_config_connector_get_supported_colorspaces() - Get the supported c= olorspaces for a connector + * @connector_cfg: Connector configuration to query + * + * Returns: + * Bitmask of supported colorspaces (DRM_COLOR_YCBCR_*) + */ +static inline u32 +vkms_config_connector_get_supported_colorspaces(const struct vkms_config_c= onnector *connector_cfg) +{ + return connector_cfg->supported_colorspaces; +} + /** * vkms_config_get_device_name() - Return the name of the device * @config: Configuration to get the device name from diff --git a/drivers/gpu/drm/vkms/vkms_connector.c b/drivers/gpu/drm/vkms/v= kms_connector.c index 5a87dc2d4c63..cc59d13c2d22 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.c +++ b/drivers/gpu/drm/vkms/vkms_connector.c @@ -84,6 +84,21 @@ struct vkms_connector *vkms_connector_init(struct vkms_d= evice *vkmsdev, if (ret) return ERR_PTR(ret); =20 + if (vkms_config_connector_get_supported_colorspaces(connector_cfg)) { + if (connector_cfg->type =3D=3D DRM_MODE_CONNECTOR_HDMIA) { + drm_mode_create_hdmi_colorspace_property(&connector->base, + vkms_config_connector_get_supported_colorspaces(connector_cfg)); + drm_connector_attach_hdr_output_metadata_property(&connector->base); + drm_connector_attach_colorspace_property(&connector->base); + } else if (connector_cfg->type =3D=3D DRM_MODE_CONNECTOR_DisplayPort || + connector_cfg->type =3D=3D DRM_MODE_CONNECTOR_eDP) { + drm_mode_create_dp_colorspace_property(&connector->base, + vkms_config_connector_get_supported_colorspaces(connector_cf= g)); + drm_connector_attach_hdr_output_metadata_property(&connector->base); + drm_connector_attach_colorspace_property(&connector->base); + } + } + drm_connector_helper_add(&connector->base, &vkms_conn_helper_funcs); =20 return connector; --=20 2.51.0 From nobody Sun Feb 8 19:55:55 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 789AD35028E for ; Wed, 29 Oct 2025 13:31: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=1761744671; cv=none; b=jkibYL1Adzsl49TYOtCZeIEaqQmoRNixv2gIRPztBTULxDn3Hf7LAHGy2630YPOJo1bzH3XWUQeXtPC0iX/cdoDslsnmDI8MwnJqwljLyzebzrA93Rft+DTVfMwF3x5zLdX2Uvgas01NjZE7nNvReVhuRSQIpUm6Oxb6tthRHB4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761744671; c=relaxed/simple; bh=v5g2/tFW6cJCpWfZKG7ctdaqLbdAUNKogwWbJ6drI8c=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=TS1KFmjQ+dg7BKBVm7CO151zUFXR9p+cubYkGeYZETGhBvQFbu95dRyxJ9uH6L4gQ1oSUR/l0kPNYmM9bXLaA7BUz0m3uezE6jH+40rSABEW6wOnxj3FsNVV2X8cRZZmKskFg6IOWr1w4r7tqvBCBB+5pu7LPbm/2zpMkt5Sh1M= 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=JgqTkuzb; 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="JgqTkuzb" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id F1E35C0DB01; Wed, 29 Oct 2025 13:30:47 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 54492606E8; Wed, 29 Oct 2025 13:31:08 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 0DFDA117F80A4; Wed, 29 Oct 2025 14:31:05 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761744667; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=/SkxqVl9RtXMg923ohzK0NptHaF/IbRJVg/+pganUWk=; b=JgqTkuzbY3+L1y0mmRxvnxair70GfxKsKxe9ukvPdT35B8K8ZnSyEZKl81nniOlv3fRXMc 9mtRlROu7bg9P5lGMWZ42oNbMGPg6DOmMVkCaHI4LO0RuNFS82qNq2z/zqGiMMaWiKL/ZR nFWVzpoM7oZUYkR2rqK6kaV/KxSrLKBYf5lxyDA7GtqkSuD4R/v6iqqdDW6XS2JqEyvai+ uf9U276bVIgNh+gHatUXwY4O9m6K+hM26Tx7n246tcmwrDsRy0r8zP/2bfcZYwXQRWJ4W2 IfEPn/B7LFXWNrHWp9a+VC5IJUFR7d8BHb7H59Ft5Gaz7M1gd7oOaTNvkJQBPg== From: Louis Chauvet Date: Wed, 29 Oct 2025 14:30:35 +0100 Subject: [PATCH v2 25/32] drm/vkms: Introduce configfs for connector supported colorspace Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251029-vkms-all-config-v2-25-be20b9bf146e@bootlin.com> References: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=3130; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=v5g2/tFW6cJCpWfZKG7ctdaqLbdAUNKogwWbJ6drI8c=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAhbspkryN96quLjbPBv5BqhaHOnB4SNSMUPht QUlwyjqQEyJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQIW7AAKCRAgrS7GWxAs 4qC/EACtMtRnvfWj5jXVa99ay5thF0GydfJjj8vSHtXP9W0bv+ID6jmBFVrPr0vjHHuTScX14pW 9M5ac22xHI6No2Gx+zqbcLojNWksTxgwUisVTZSH5fRsrnHQefoEMR2dbYf8K0Knc5LCwnapt1z F64BP+bx0apEGwx+/T7IFDmuvOZPQz8V8sN7Q8qIVx5ukayACg9wDKut8skdhn+y3GU/9GoJueH Bl1IcZxUpLBLLBSCWLQztQBefbn4qScB0/vYp8qTTiCeuipH2PIWaU2mPz9jj+Qpj4s766YjihB fvUfwZVPCYLH8jIOg4mAgECPw/woH+SDkfUgrLmp8HFqo40LaSYzT92sf6efQ0tyStD2DxKSPYT ZsPLbPwrtvuIKdycATdRUgOvdbKfmpKgMUKEpAHsRZ5WkAWc5snOxb/mSv5BYjC+fXN/k7dPyWK FBgfwk09SW/10WFsvTpKsUu8JcYxNokyug9v9SIZla/JxhJOymwEHTMv8SFZ/XjAMaR+Bxx6VJU NGZBXHp11x0xHsEMz8kTZ+8UMBd2LKYee0e2HjblZ6LgwstB4IYnHalzzKOn9yHNWuIBIbQ/9Dh haxmw6rc2F/EXYVaTt8LbnSLnP7/Zd4zuAzlnJzj9Rbx3yt5ffTa2wurddsW8R7t7rnQR1+uqk9 vwD2CV7yqjyJBCA== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Add the attribute supported_colorspaces to configure the supported colorspace of a connector. It will allows emulating some HDR features of displays. This feature is only supported for HDMI, DP and eDP connectors. Signed-off-by: Louis Chauvet --- Documentation/gpu/vkms.rst | 7 ++++++- drivers/gpu/drm/vkms/vkms_configfs.c | 39 ++++++++++++++++++++++++++++++++= ++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index 99c5cf3dbd78..c762cadac6f4 100644 --- a/Documentation/gpu/vkms.rst +++ b/Documentation/gpu/vkms.rst @@ -138,11 +138,16 @@ Last but not least, create one or more connectors:: =20 sudo mkdir /config/vkms/my-vkms/connectors/connector0 =20 -Connectors have 2 configurable attribute: +Connectors have 3 configurable attribute: =20 - status: Connection status: 1 connected, 2 disconnected, 3 unknown (same = values as those exposed by the "status" property of a connector) - type: Type of connector. Same values as exposed by the "type" field in d= rm_connector. +- supported_colorspaces: Supported colorspaces values for HDMI, DP and eDP= connectors. + If supported_colorspaces is not 0, the HDR_OUTPUT_METADATA will also be = created. + Value is a bitfield, 0x1 =3D NO_DATA, 0x2 =3D SMPTE_170M_YCC... see enum= drm_colorspace + for full list. + =20 To finish the configuration, link the different pipeline items:: =20 diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vk= ms_configfs.c index b03e9af569b6..a7f4589403ce 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -1223,12 +1223,51 @@ static ssize_t connector_type_store(struct config_i= tem *item, return count; } =20 +static ssize_t connector_supported_colorspaces_show(struct config_item *it= em, char *page) +{ + struct vkms_configfs_connector *connector; + int type; + + connector =3D connector_item_to_vkms_configfs_connector(item); + + scoped_guard(mutex, &connector->dev->lock) + type =3D vkms_config_connector_get_supported_colorspaces(connector->conf= ig); + + return sprintf(page, "%u", type); +} + +static ssize_t connector_supported_colorspaces_store(struct config_item *i= tem, + const char *page, size_t count) +{ + struct vkms_configfs_connector *connector; + int val, ret; + + connector =3D connector_item_to_vkms_configfs_connector(item); + + ret =3D kstrtouint(page, 10, &val); + if (ret) + return ret; + + if ((val & -BIT(DRM_MODE_COLORIMETRY_COUNT)) !=3D 0) + return -EINVAL; + + scoped_guard(mutex, &connector->dev->lock) { + if (connector->dev->enabled) + return -EBUSY; + vkms_config_connector_set_supported_colorspaces(connector->config, val); + } + + return count; +} + CONFIGFS_ATTR(connector_, status); CONFIGFS_ATTR(connector_, type); +CONFIGFS_ATTR(connector_, supported_colorspaces); =20 static struct configfs_attribute *connector_item_attrs[] =3D { &connector_attr_status, &connector_attr_type, + &connector_attr_supported_colorspaces, NULL, }; =20 --=20 2.51.0 From nobody Sun Feb 8 19:55:55 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 B7F5B2BD5AD; Wed, 29 Oct 2025 13:31:11 +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=1761744673; cv=none; b=PBjpJwlhV7AOencmNbVT3H92Sng6mCoWTivDRMHI6IO1Q1NYBDauqQhmKGv2nTTYpxmsj9P+nXpyZ5gf7AsPHcrPbzUGEDotJY/SgwcU3v4BqQPXAKZlIcPc/ZzfB/E4oZ5qlw3DZSAta3zOLUQwYPWjr3ry1YsDom1K71IfYG8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761744673; c=relaxed/simple; bh=fQn1DhxGfYNX8VU/HCeunjh+etuTG9Na/6C5gWSAOrE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=VgWqV0i1BeEQ6Z4nCOMdYv6DovG6RXmiC4fgxcJ/XixCxR4PX/jHZGRkDrfYPLnBMYcUsoSGmWCR2TQytJ+C7VvjocgcNJEQfNa/zdNe2yNHS/M4H3vK4xF2X8ZinpozT40lgWs9GSfGoX6b98jr3/gLZI6B6ZH4n5wSWot98cI= 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=Ow2AleIw; 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="Ow2AleIw" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 370D84E413CF; Wed, 29 Oct 2025 13:31:10 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 0DDDB606E8; Wed, 29 Oct 2025 13:31:10 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id CDCF1117F8098; Wed, 29 Oct 2025 14:31:07 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761744669; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=PdR/lV4Aq38fLSZTr2GyyE929TgZeBjpNA3qwiY4csA=; b=Ow2AleIwdzFOLp2hZxjM8dOpRvqo7ucB1mdGA+f+T+jwkO4YmpSvRKyKL7xV9T9+k0dnxY 71xqxpRzTFOPhYtRaUXLEMG41WnwNVjD/l+6UNlEAUvbfouKfmWWlpuW+20VSLYZJBzlsC Tq94RR/2Gl4QrKLfxSoGaiypzpOoL7pA6GCwZk/eCbA/jZKcs9HDwcJerK5xQQ6OEqlLGt oH9sJvHFfPYP1rJciL9SDgfoLlmDB3PmcccEizNlhlOZ5qdi8xZ64do5E2OzogCwzI081k fsRgMWbfhOHh94g1N6LoNuDdTyxVDfV0vRCbb5nzzKD4bvvYz8pvlAJl+MTWLQ== From: Louis Chauvet Date: Wed, 29 Oct 2025 14:30:36 +0100 Subject: [PATCH v2 26/32] drm/vkms: Introduce config for connector EDID Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251029-vkms-all-config-v2-26-be20b9bf146e@bootlin.com> References: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=8011; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=fQn1DhxGfYNX8VU/HCeunjh+etuTG9Na/6C5gWSAOrE=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAhbsFpMXZG7mLChCzgyUCcgiQgUM6ing0kd5p LfFnQGakl+JAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQIW7AAKCRAgrS7GWxAs 4nDtD/oCJNgcalywB6jdGF5no7mui8w085dkF7lLWV8gfQd6+eKECSvE9SiV4jafGZRMkLUy4lw dTaVtD6gd14V4kZ8HetZzR5ng1EJz4I//Ao/kEe8HOpJ8eaLhT/Xs0scAxDn0bQME7MROuwrGrn 7pLVD9cTOB43HlY9MadaPQ0gVcow0d9qTxt2jZxAt50PuaImNnQTEx8J4z/k1X6709Nuapt60CL cBzGGEe4y0/idSxZjXs4ThyI0iTXhGKWVg8OC7AFy8BXBs9/GeXwRRSbEIxUwEtJC++uZiiqXnb c9iPqhcywZiIpMxbHu9YkQoAnsQqQhtvg2GJgCtSjzwrgwwGeY+T/lTl091ON7cKxtH7E98Su8z pWcDAfW2XKuvCplbq2s+8GUjx7vHWH0hrJstVcoQS/pkD+huh8eur+r6HVmlE0sWMOEGCzvXB2i itgdqtDqFMn+8Hm76ljn73SD2L5gcYrJcB54eOXg25/Qy72oMSq8bFGcUODXARVJ+9lBcMHU7ri 09BdT/gK86k0up8ZWl4adYSkTbaz2eXaM5PkfIZvopC80tsetUqjvt9hEWAKOPnmReQ/8Wi/2pq eNvAEGiQyGFOUDeMAubMEQ7JE1Q6urttwt6nOE2pwk2BQzEXHHFKkmhacFYC+/YsvC7y8Z19dkJ AGP2gO7GB/ay/PQ== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Allows configuration of EDID for each connector. Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/tests/vkms_config_test.c | 2 + drivers/gpu/drm/vkms/vkms_config.c | 6 +++ drivers/gpu/drm/vkms/vkms_config.h | 75 +++++++++++++++++++++++= ++++ drivers/gpu/drm/vkms/vkms_connector.c | 48 +++++++++++++++-- 4 files changed, 127 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/vkms/tests/vkms_config_test.c b/drivers/gpu/dr= m/vkms/tests/vkms_config_test.c index e0ceecf2e2dd..531c3b76b58d 100644 --- a/drivers/gpu/drm/vkms/tests/vkms_config_test.c +++ b/drivers/gpu/drm/vkms/tests/vkms_config_test.c @@ -205,6 +205,8 @@ static void vkms_config_test_default_config(struct kuni= t *test) KUNIT_EXPECT_EQ(test, vkms_config_connector_get_supported_colorspaces(connector_cfg), 0); + KUNIT_EXPECT_EQ(test, vkms_config_connector_get_edid_enabled(connector_c= fg), + false); } =20 KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index 6f939b82c33f..02c0e944adf8 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -525,6 +525,7 @@ static int vkms_config_show(struct seq_file *m, void *d= ata) struct drm_device *dev =3D entry->dev; struct vkms_device *vkmsdev =3D drm_device_to_vkms_device(dev); const char *dev_name; + int edid_len; struct vkms_config_plane *plane_cfg; struct vkms_config_crtc *crtc_cfg; struct vkms_config_encoder *encoder_cfg; @@ -594,6 +595,11 @@ static int vkms_config_show(struct seq_file *m, void *= data) show_bitfield(m, vkms_config_connector_get_supported_colorspaces(connect= or_cfg), drm_get_colorspace_name); seq_puts(m, "\n"); + vkms_config_connector_get_edid(connector_cfg, &edid_len); + seq_printf(m, "\tEDID=3D%s (len=3D%d)\n", + str_enabled_disabled(vkms_config_connector_get_edid_enabled(connecto= r_cfg)), + edid_len + ); } =20 return 0; diff --git a/drivers/gpu/drm/vkms/vkms_config.h b/drivers/gpu/drm/vkms/vkms= _config.h index d68133723444..42f5b5edaf1d 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -135,6 +135,9 @@ struct vkms_config_encoder { * are the sames as ones accepted by * drm_mode_create_hdmi_colorspace_property() and * drm_mode_create_dp_colorspace_property() + * @edid_enabled: If true, create the EDID property + * @edid: Stores the current EDID. The value will be ignored if @edid_enab= led is false + * @edid_len: Current EDID length. The value will be ignored if @edid_enab= led is false * @possible_encoders: Array of encoders that can be used with this connec= tor * @connector: Internal usage. This pointer should never be considered as = valid. * It can be used to store a temporary reference to a VKMS con= nector @@ -148,6 +151,9 @@ struct vkms_config_connector { int type; enum drm_connector_status status; u32 supported_colorspaces; + bool edid_enabled; + u8 *edid; + unsigned int edid_len; struct xarray possible_encoders; =20 /* Internal usage */ @@ -271,6 +277,75 @@ vkms_config_connector_get_supported_colorspaces(const = struct vkms_config_connect return connector_cfg->supported_colorspaces; } =20 +/** + * vkms_config_connector_get_edid_enabled() - Check if EDID is enabled for= a connector + * @connector_cfg: Connector configuration to check + * + * Returns: + * True if EDID is enabled for this connector, false otherwise. + */ +static inline bool +vkms_config_connector_get_edid_enabled(const struct vkms_config_connector = *connector_cfg) +{ + return connector_cfg->edid_enabled; +} + +/** + * vkms_config_connector_set_edid_enabled() - Enable or disable EDID for a= connector + * @connector_cfg: Connector configuration to modify + * @enabled: Whether to enable EDID for this connector + */ +static inline void +vkms_config_connector_set_edid_enabled(struct vkms_config_connector *conne= ctor_cfg, + bool enabled) +{ + connector_cfg->edid_enabled =3D enabled; +} + +/** + * vkms_config_connector_get_edid() - Get the EDID data for a connector + * @connector_cfg: Connector configuration to get the EDID from + * @len: Pointer to store the length of the EDID data + * + * Returns: + * Pointer to the EDID data buffer, or NULL if no EDID is set. + * The length of the EDID data is stored in @len. + */ +static inline const u8 * +vkms_config_connector_get_edid(const struct vkms_config_connector *connect= or_cfg, int *len) +{ + *len =3D connector_cfg->edid_len; + return connector_cfg->edid; +} + +/** + * vkms_config_connector_set_edid() - Set the EDID data for a connector + * @connector_cfg: Connector configuration to modify + * @edid: Pointer to the EDID data buffer + * @len: Length of the EDID data + * + * If @len is 0, the EDID data will be cleared. If memory allocation fails, + * the existing EDID data will be preserved. + */ +static inline void +vkms_config_connector_set_edid(struct vkms_config_connector *connector_cfg, + const u8 *edid, unsigned int len) +{ + if (len) { + void *edid_tmp =3D krealloc(connector_cfg->edid, len, GFP_KERNEL); + + if (edid_tmp) { + connector_cfg->edid =3D edid_tmp; + memcpy(connector_cfg->edid, edid, len); + connector_cfg->edid_len =3D len; + } + } else { + kfree(connector_cfg->edid); + connector_cfg->edid =3D NULL; + connector_cfg->edid_len =3D len; + } +} + /** * vkms_config_get_device_name() - Return the name of the device * @config: Configuration to get the device name from diff --git a/drivers/gpu/drm/vkms/vkms_connector.c b/drivers/gpu/drm/vkms/v= kms_connector.c index cc59d13c2d22..339d747e729e 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.c +++ b/drivers/gpu/drm/vkms/vkms_connector.c @@ -42,13 +42,53 @@ static const struct drm_connector_funcs vkms_connector_= funcs =3D { .atomic_destroy_state =3D drm_atomic_helper_connector_destroy_state, }; =20 +static int vkms_connector_read_block(void *context, u8 *buf, unsigned int = block, size_t len) +{ + struct vkms_config_connector *config =3D context; + unsigned int edid_len; + const u8 *edid =3D vkms_config_connector_get_edid(config, &edid_len); + + if (block * len + len > edid_len) + return 1; + memcpy(buf, &edid[block * len], len); + return 0; +} + static int vkms_conn_get_modes(struct drm_connector *connector) { - int count; + struct vkms_connector *vkms_connector =3D drm_connector_to_vkms_connector= (connector); + const struct drm_edid *drm_edid =3D NULL; + int count =3D 0; + struct vkms_config_connector *context =3D NULL; + struct drm_device *dev =3D connector->dev; + struct vkms_device *vkmsdev =3D drm_device_to_vkms_device(dev); + struct vkms_config_connector *connector_cfg; =20 - /* Use the default modes list from DRM */ - count =3D drm_add_modes_noedid(connector, XRES_MAX, YRES_MAX); - drm_set_preferred_mode(connector, XRES_DEF, YRES_DEF); + vkms_config_for_each_connector(vkmsdev->config, connector_cfg) { + if (connector_cfg->connector =3D=3D vkms_connector) + context =3D connector_cfg; + } + if (context) { + if (vkms_config_connector_get_edid_enabled(context)) { + drm_edid =3D drm_edid_read_custom(connector, + vkms_connector_read_block, context); + + /* + * Unconditionally update the connector. If the EDID was read + * successfully, fill in the connector information derived from the + * EDID. Otherwise, if the EDID is NULL, clear the connector + * information. + */ + drm_edid_connector_update(connector, drm_edid); + + count =3D drm_edid_connector_add_modes(connector); + + drm_edid_free(drm_edid); + } else { + count =3D drm_add_modes_noedid(connector, XRES_MAX, YRES_MAX); + drm_set_preferred_mode(connector, XRES_DEF, YRES_DEF); + } + } =20 return count; } --=20 2.51.0 From nobody Sun Feb 8 19:55:55 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 647CE350A34; Wed, 29 Oct 2025 13:31:13 +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=1761744675; cv=none; b=mBRwcvKwGBInervxRyXWYFjxs/FpOz8NxIkY2JuooMeUFbEgSgLY6ixu7kLBtVHQJCO15yqbkcMIHQ8jVndoBS9py50fGXaU1F2bI9NevCIm9wSa722DoWEKJXg7XDYnoCWsGWOE9D21neMjhuyuoxr9SxP+tlCKK2xIcrL21WU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761744675; c=relaxed/simple; bh=cfHMITCkhuA9xDg6rR5Pf2S96MFpLvOh5N7v63PxojQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=EIirqWxvDaPp16Axc2arGb/rOimwrV6Si1xE9QzEc/D3HYtYHxro8XC/77uPVc4CJWvBRYnfXTfbZV4ZwmwkheF9+2SsQKD6zGtWkZdjmN6swT0VJ3vGekYacdacHak5iGXVCsLXv7Su5AMdO/zMF5RkPIbjhf0SR4vOt8jz1gc= 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=Tc4Ckwgw; 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="Tc4Ckwgw" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 630D0C0DB01; Wed, 29 Oct 2025 13:30:51 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id B9A71606E8; Wed, 29 Oct 2025 13:31:11 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 8AA1F117F809A; Wed, 29 Oct 2025 14:31:09 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761744670; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=Zs7cFfDnZhyAxSYFH45RdpuYGVq+BUPOPTG7RxnjHZc=; b=Tc4CkwgwOlr5qnKvcniqzIXc3OcSYP3MXAWryIKLsyoC4IdcokIckFkjpT5j3Bn+VImeW0 rxg8GXyOl5C6J2C0P0qQ9uqL2njU+a1ONr1aagUOuHO2KQfrv8QWiPrDuCFQdN9taDs7sH PO/jMsZKIkpjikRyq44iCJmjZFzkyq5x8g84hMYdBPCY3qxD1tPdngfVYaEVVH42jlBGLE 5hiY8uDaFBqf863ODT1HN36jdhF45TyfvGrLpMfnIF794KgfeqmGFt3fKF68SS+AZ6RbKb AUoC/5e59FqzupDIrda9UaygkjO6dn+Ty4Rkp+7HlxrHReVpc3ZSG/aAwNmXig== From: Louis Chauvet Date: Wed, 29 Oct 2025 14:30:37 +0100 Subject: [PATCH v2 27/32] drm/vkms: Introduce configfs for connector EDID Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251029-vkms-all-config-v2-27-be20b9bf146e@bootlin.com> References: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=5286; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=cfHMITCkhuA9xDg6rR5Pf2S96MFpLvOh5N7v63PxojQ=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAhbsh0HPuDufJv/gUgLtQvOv2SdN/v1M2Tpue bJQ7dfWa3SJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQIW7AAKCRAgrS7GWxAs 4jVmD/9CYGR3BZu6d9UBIEyctto9HZIBajWjuQ/miv6ESZOphSSoxWGUOEZXrWEtsgRtYB0j1kA D0YqcCDQQx27r+L4Fw0M4eGqklgrvatxzeg5pq8ZZWDLKU0fxXGkTDfUwEzuPgxfgTKNITl7VvZ EDioZcnd4aHcWISv8a5XfBBDvlNixWoMl0ygIqiONtzjCEczCs7YR3j+sFedrv7+DP4o+Cs7Wkd fFNf9mXIe7o0vi2HxmHpsu3kARK4gbMYVmstOCax/hRYV4k3bLZkOmpLTvLc4dgpBk/r22882EB 1J2lO3ZK8aMJpFFQD0elw5LmMiBX18Gcn5FVhj/9OJrg+DfTTUQH/r3MLqED9fR0BpE4COKDx55 XoiEIju6BCTls2cV2JZ4NWTZkzqtLsM8JQXmGwgTzy6/D6CM7oHIDrgWfjRwYtnrqYUt7ZjweBU Ik9d0zcqn3D94kcmNSozuEKeQWswPmzKQejvnzuoBW/dOKpxPnPVKcQ1YXcZqHHMIfNjEW75DFo KbkdLLHI4mNHWEOU//mBrSfOsxM7siEjI1mEEMXXYFEbPonNXqYv5ra91n5ohQ6VbrfdI5Ii77e k2PTOQXMzhGusQ5V5ohBFYrIKPXKKCSwrFg0UcX3BQEu3X7b1NQmAWjV9dcyslcF35tkvFXzQ7W YfwyraNsHYmPLVQ== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Introduce new attributes to configure EDID of a connector: - edid_enable - chose if the connector will have an EDD or not - edid - raw edid content Due to limitation of ConfigFS, the max len of EDID is PAGE_SIZE (4kB on x86), it should be sufficient for many tests. One possible evolution is using a ConfigFS blob to allow bigger EDID. Signed-off-by: Louis Chauvet --- Documentation/gpu/vkms.rst | 5 ++- drivers/gpu/drm/vkms/vkms_configfs.c | 80 +++++++++++++++++++++++++++++++= ++++ drivers/gpu/drm/vkms/vkms_connector.c | 3 ++ 3 files changed, 87 insertions(+), 1 deletion(-) diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index c762cadac6f4..0cc7897d7b83 100644 --- a/Documentation/gpu/vkms.rst +++ b/Documentation/gpu/vkms.rst @@ -138,7 +138,7 @@ Last but not least, create one or more connectors:: =20 sudo mkdir /config/vkms/my-vkms/connectors/connector0 =20 -Connectors have 3 configurable attribute: +Connectors have 5 configurable attribute: =20 - status: Connection status: 1 connected, 2 disconnected, 3 unknown (same = values as those exposed by the "status" property of a connector) @@ -147,6 +147,9 @@ Connectors have 3 configurable attribute: If supported_colorspaces is not 0, the HDR_OUTPUT_METADATA will also be = created. Value is a bitfield, 0x1 =3D NO_DATA, 0x2 =3D SMPTE_170M_YCC... see enum= drm_colorspace for full list. +- edid_enabled: Enable or not EDID for this connector. Some connectors may= not have an + EDID but just a list of modes, this attribute allows to disable EDID pro= perty. +- edid: Content of the EDID. Ignored if edid_enabled is not set =20 =20 To finish the configuration, link the different pipeline items:: diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vk= ms_configfs.c index a7f4589403ce..1843e5d9e1e1 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -1260,14 +1260,94 @@ static ssize_t connector_supported_colorspaces_stor= e(struct config_item *item, return count; } =20 +static ssize_t connector_edid_enabled_show(struct config_item *item, char = *page) +{ + struct vkms_configfs_connector *connector; + bool enabled; + + connector =3D connector_item_to_vkms_configfs_connector(item); + + scoped_guard(mutex, &connector->dev->lock) + enabled =3D vkms_config_connector_get_edid_enabled(connector->config); + + return sprintf(page, "%d\n", enabled); +} + +static ssize_t connector_edid_enabled_store(struct config_item *item, + const char *page, size_t count) +{ + struct vkms_configfs_connector *connector; + struct vkms_config_connector *connector_cfg; + bool enabled; + + connector =3D connector_item_to_vkms_configfs_connector(item); + connector_cfg =3D connector->config; + + if (kstrtobool(page, &enabled)) + return -EINVAL; + + scoped_guard(mutex, &connector->dev->lock) + { + vkms_config_connector_set_edid_enabled(connector_cfg, enabled); + + if (connector->dev->enabled && + vkms_config_connector_get_status(connector_cfg) !=3D + connector_status_disconnected) + vkms_trigger_connector_hotplug(connector->dev->config->dev); + } + return count; +} + +static ssize_t connector_edid_show(struct config_item *item, char *page) +{ + struct vkms_configfs_connector *connector; + + connector =3D connector_item_to_vkms_configfs_connector(item); + + scoped_guard(mutex, &connector->dev->lock) + { + unsigned int len =3D 0; + const u8 *edid =3D vkms_config_connector_get_edid(connector->config, &le= n); + + memcpy(page, edid, min(len, PAGE_SIZE)); + return min(len, PAGE_SIZE); + } + + return -EINVAL; +} + +static ssize_t connector_edid_store(struct config_item *item, + const char *page, size_t count) +{ + struct vkms_configfs_connector *connector; + + connector =3D connector_item_to_vkms_configfs_connector(item); + + scoped_guard(mutex, &connector->dev->lock) + { + vkms_config_connector_set_edid(connector->config, page, count); + + if (connector->dev->enabled && + vkms_config_connector_get_status(connector->config) !=3D + connector_status_disconnected) + vkms_trigger_connector_hotplug(connector->dev->config->dev); + } + + return count; +} + CONFIGFS_ATTR(connector_, status); CONFIGFS_ATTR(connector_, type); CONFIGFS_ATTR(connector_, supported_colorspaces); +CONFIGFS_ATTR(connector_, edid_enabled); +CONFIGFS_ATTR(connector_, edid); =20 static struct configfs_attribute *connector_item_attrs[] =3D { &connector_attr_status, &connector_attr_type, &connector_attr_supported_colorspaces, + &connector_attr_edid_enabled, + &connector_attr_edid, NULL, }; =20 diff --git a/drivers/gpu/drm/vkms/vkms_connector.c b/drivers/gpu/drm/vkms/v= kms_connector.c index 339d747e729e..699b6779a46c 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.c +++ b/drivers/gpu/drm/vkms/vkms_connector.c @@ -141,6 +141,9 @@ struct vkms_connector *vkms_connector_init(struct vkms_= device *vkmsdev, =20 drm_connector_helper_add(&connector->base, &vkms_conn_helper_funcs); =20 + if (vkms_config_connector_get_edid_enabled(connector_cfg)) + drm_connector_attach_edid_property(&connector->base); + return connector; } =20 --=20 2.51.0 From nobody Sun Feb 8 19:55:55 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 2A057350D5E; Wed, 29 Oct 2025 13:31: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=1761744677; cv=none; b=ojSqU3zzwh93Xo51Nm6oc9/IrzUC5Gyeo6OmOax7UMbepwwGA4XI3p1AWpWTfpx3vaN3Ewio0LWMECD/a4TNAuLa4dwiAFmTCzDqXb+LwNxmdulwjMKdN8JJxtAVYnaooJVBl9jG4UpsnwmWY2UNZXf2SP+5c2Km1UfkFyCAy7A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761744677; c=relaxed/simple; bh=SxSapH92H7+R0YRpp8ZbmLEJQdfxderXgSB2dmTAdXE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ba+uGC0AFrbu8qETsMcyG0t7TBJkqXqz5B4I0ElOYSS69u2gO7w+BWT+T+4GFO5cVqyHrk9wKx2FQ0a8bcqVmR+UbgiGyAbf6mQxBM3jvJwLQbz9H0EIOx+cBQwK0+JJazydam9c4zA4WEMkv/0O43fUFTlbCfLThvOQA4V5yI8= 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=dODOcM/z; 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="dODOcM/z" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id B5F4C4E413D0; Wed, 29 Oct 2025 13:31:13 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 8BE45606E8; Wed, 29 Oct 2025 13:31:13 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 3F09B117F8047; Wed, 29 Oct 2025 14:31:11 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761744672; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=BHhX5HD+lytwOesCtdB6a6t4OMHVoG/mXwydRLC0kYA=; b=dODOcM/zPlrR30s/2e2B2C5OJy/6HGZhD7iWgaRWsICUoXC9BTMUTZnZKu6QEiPg3A+PEA ljHH1uHzIA0c8Qbb6gbWF++h62Za+qLHQLI5W9X+qV+k8RxTQeigynwzb7A5i8MLEKHFxS 3BjmWWAFsZMqrcBKebQ9pKFy4XwyGm1315/vTf6AVbktauJe3CJZF4ope8IdQXjpTPMAzR O7npByt4NLW0PfFNKXkHmJOWIF1VIpjSo+BNYVQJuCm//SpDvf4z7x8F00ml3bPNub2b9y bNrzRAVWCX+ucnq9dzednqZi26VNCUtDCfHXioYNMzEVXxJ1v5DU1P74D2UhVw== From: Louis Chauvet Date: Wed, 29 Oct 2025 14:30:38 +0100 Subject: [PATCH v2 28/32] drm/vkms: Store the enabled/disabled status for connector Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251029-vkms-all-config-v2-28-be20b9bf146e@bootlin.com> References: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=6498; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=SxSapH92H7+R0YRpp8ZbmLEJQdfxderXgSB2dmTAdXE=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAhbskt/94KLcVLFddwwI9yyx3VfGw0+NrlKDG ufqUiiRaKuJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQIW7AAKCRAgrS7GWxAs 4qmrEADPFDDZln01Ox+7Hruexgv2Isy+Rr5arhNUHLZ7ygeCfj04Pao21PoV8kMoHyqSo5eoQ5Y BzikIo51t6mSQxXmdGWuQRjmBiaqAqD7y64Rl1zUlzDGIpWNczOCujennR85j7OHRttrlDSkHRx xz+ITfgJC/fdHCkSQGf5K8EgMjh454WekmJxQ9Oi9RUFpqJyx5kOCp+13PvSQvlW+gAU0azMIMM 2FvkR6aLGciYCPnrhUBe07H7TM/z+BrKgDQ8xiO+stBjB22SXnyJ8DFAsesMtEMkLCZ8QxF6gQe FsKByR6pdHhfVwQJT8fsZK+OjFK50ypCCDCgmtPyfHfyZvMQBd/tgmp099wMYD9Ikw9xkzLjJJh K+ft9X4ZDKcndkQyTuefvKpK8xf5Dy3A2hah/c6PEQwu9Exw87BWacggex9itvUEFtj/fxLAqD6 +qQS2E2IM/a46C5wz9hcUJKb4IraXwcbZy2KTSY0xNqzrd7BnyYCgnSjreHbOYMGHEvh4q403gK iR1fcN9FfMr+E2ZQpzntYbfQrLeI9YwJQLBztBeNX1rsRnCWmLIMCqgPdVrASLY5LwzxuRvIIF+ DFgtM628gHZwhv2maOgmgevAZcMPq7eAmZ2tUU8DlXnoBtO4luWeLnd0GDd6nNEQRehGUTuwMZJ dwbM8cBaAICXmSg== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 In order to prepare for dynamic connector configuration, we need to store if a connector is dynamic and if it is enabled. The two new vkms_config_connector fields will helps for that. Co-developed-by: Jos=C3=A9 Exp=C3=B3sito Signed-off-by: Jos=C3=A9 Exp=C3=B3sito Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/tests/vkms_config_test.c | 4 ++ drivers/gpu/drm/vkms/vkms_config.c | 6 +++ drivers/gpu/drm/vkms/vkms_config.h | 66 +++++++++++++++++++++++= ++++ 3 files changed, 76 insertions(+) diff --git a/drivers/gpu/drm/vkms/tests/vkms_config_test.c b/drivers/gpu/dr= m/vkms/tests/vkms_config_test.c index 531c3b76b58d..b1d95385263f 100644 --- a/drivers/gpu/drm/vkms/tests/vkms_config_test.c +++ b/drivers/gpu/drm/vkms/tests/vkms_config_test.c @@ -207,6 +207,10 @@ static void vkms_config_test_default_config(struct kun= it *test) 0); KUNIT_EXPECT_EQ(test, vkms_config_connector_get_edid_enabled(connector_c= fg), false); + KUNIT_EXPECT_EQ(test, vkms_config_connector_is_enabled(connector_cfg), + true); + KUNIT_EXPECT_EQ(test, vkms_config_connector_is_dynamic(connector_cfg), + false); } =20 KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index 02c0e944adf8..e86173ad61a6 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -587,6 +587,8 @@ static int vkms_config_show(struct seq_file *m, void *d= ata) =20 vkms_config_for_each_connector(vkmsdev->config, connector_cfg) { seq_puts(m, "connector:\n"); + seq_printf(m, "\t%s\n", + str_enabled_disabled(vkms_config_connector_is_enabled(connector_cfg)= )); seq_printf(m, "\tstatus=3D%s\n", drm_get_connector_status_name(vkms_config_connector_get_status(conne= ctor_cfg))); seq_printf(m, "\ttype=3D%s\n", @@ -600,6 +602,8 @@ static int vkms_config_show(struct seq_file *m, void *d= ata) str_enabled_disabled(vkms_config_connector_get_edid_enabled(connecto= r_cfg)), edid_len ); + seq_printf(m, "\tdynamic=3D%s\n", + str_true_false(vkms_config_connector_is_dynamic(connector_cfg))); } =20 return 0; @@ -907,6 +911,8 @@ struct vkms_config_connector *vkms_config_create_connec= tor(struct vkms_config *c connector_cfg->status =3D connector_status_connected; vkms_config_connector_set_type(connector_cfg, DRM_MODE_CONNECTOR_VIRTUAL); vkms_config_connector_set_supported_colorspaces(connector_cfg, 0); + vkms_config_connector_set_dynamic(connector_cfg, false); + vkms_config_connector_set_enabled(connector_cfg, true); xa_init_flags(&connector_cfg->possible_encoders, XA_FLAGS_ALLOC); =20 list_add_tail(&connector_cfg->link, &config->connectors); diff --git a/drivers/gpu/drm/vkms/vkms_config.h b/drivers/gpu/drm/vkms/vkms= _config.h index 42f5b5edaf1d..a4aa7ad7be71 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -130,6 +130,8 @@ struct vkms_config_encoder { * @link: Link to the others connector in vkms_config * @type: Store the type of connector using DRM_MODE_CONNECTOR_* values * @config: The vkms_config this connector belongs to + * @dynamic: Store if a connector should be created with drm_connector_dyn= amic_init + * @enabled: If @dynamic, this means that the correct is currently registe= red in drm * @status: Status (connected, disconnected...) of the connector * @supported_colorspaces: Bitmask of all the supported colorspaces. Values * are the sames as ones accepted by @@ -149,6 +151,8 @@ struct vkms_config_connector { struct vkms_config *config; =20 int type; + bool enabled; + bool dynamic; enum drm_connector_status status; u32 supported_colorspaces; bool edid_enabled; @@ -192,6 +196,24 @@ struct vkms_config_connector { #define vkms_config_for_each_connector(config, connector_cfg) \ list_for_each_entry((connector_cfg), &(config)->connectors, link) =20 +/** + * vkms_config_for_each_connector_static - Iterate over the static vkms_co= nfig connectors + * @config: &struct vkms_config pointer + * @connector_cfg: &struct vkms_config_connector pointer used as cursor + */ +#define vkms_config_for_each_connector_static(config, connector_cfg) \ + vkms_config_for_each_connector((config), (connector_cfg)) \ + if (!(connector_cfg)->dynamic) + +/** + * vkms_config_for_each_connector_dynamic - Iterate over the dynamic vkms_= config connectors + * @config: &struct vkms_config pointer + * @connector_cfg: &struct vkms_config_connector pointer used as cursor + */ +#define vkms_config_for_each_connector_dynamic(config, connector_cfg) \ + vkms_config_for_each_connector((config), (connector_cfg)) \ + if ((connector_cfg)->dynamic) + /** * vkms_config_plane_for_each_possible_crtc - Iterate over the vkms_config= _plane * possible CRTCs @@ -445,6 +467,50 @@ vkms_config_connector_set_type(struct vkms_config_conn= ector *connector_cfg, connector_cfg->type =3D type; } =20 +/** + * vkms_config_connector_set_enabled() - If the connector is part of the d= evice + * @crtc_cfg: Target connector + * @enabled: Add or remove the connector + */ +static inline void +vkms_config_connector_set_enabled(struct vkms_config_connector *connector_= cfg, + bool enabled) +{ + connector_cfg->enabled =3D enabled; +} + +/** + * vkms_config_connector_is_enabled() - If the connector is part of the de= vice + * @connector_cfg: The connector + */ +static inline bool +vkms_config_connector_is_enabled(const struct vkms_config_connector *conne= ctor_cfg) +{ + return connector_cfg->enabled; +} + +/** + * vkms_config_connector_set_dynamic() - If the connector is dynamic + * @crtc_cfg: Target connector + * @enabled: Enable or disable the dynamic status + */ +static inline void +vkms_config_connector_set_dynamic(struct vkms_config_connector *connector_= cfg, + bool dynamic) +{ + connector_cfg->dynamic =3D dynamic; +} + +/** + * vkms_config_connector_is_enabled() - If the connector is dynamic + * @connector_cfg: The connector + */ +static inline bool +vkms_config_connector_is_dynamic(struct vkms_config_connector *connector_c= fg) +{ + return connector_cfg->dynamic; +} + /* * vkms_config_plane_get_default_rotation() - Get the default rotation for= a plane * @plane_cfg: Plane to get the default rotation from --=20 2.51.0 From nobody Sun Feb 8 19:55:55 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 B581E351FA1 for ; Wed, 29 Oct 2025 13:31:16 +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=1761744678; cv=none; b=mbbywHnVjSyGlVjgXAHE8nm6KbeP9KITa4MY8Ue11ErL118EXTqw90SWvZKan/pur5DArEe/OmEqjb0iAIMDwnX5ki8tlRug6eiZdpuE1IFztHRxh0/XLiRGHcZI/4kjiUpGTTkKWHYvvx1E952k6LBRGlObQPKtPulNUqr9EUo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761744678; c=relaxed/simple; bh=GNdCT1aWfEW/qQlyX1iY1PDslsm0v0L9+mabaSCFgjo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=XFhHwTM2DliK3sg+hQ9RQYfNKTvqobHeCtdFznqzkGhvQQQPxXxVhpijK5mwyUjpTFikAxYbiDjlp5l/8joPTbwY7ZVQ/zkKi1rzNuWAi1Z8HBM152tMFgPNsfXPJrBrftfXpphfc27o6anoI/nQZHUnLTZvKq/oZdvoGZpHKtw= 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=PRVKiN4s; 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="PRVKiN4s" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 3F09F1A1748; Wed, 29 Oct 2025 13:31:15 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 15B6B606E8; Wed, 29 Oct 2025 13:31:15 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 0C232117F809B; Wed, 29 Oct 2025 14:31:12 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761744674; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=1ieovVEGpwnQqb90fB7Ngr7zVzD1mSM9AkeaTdc+irk=; b=PRVKiN4sYjGGj+/vc8VbR43izW7xNzU+hii72kVDVm8BAwPuOl8G+ajGFot0RPNXKyO6fX yzhC64ef9rBB6sPdftIdANX5cB/zeR7ecoGqGtruTacc3p/o36z5oaMOs+biHQR+GSOUkQ xEkVOvEHQCAAmQi0CzF6nQVsbm8QB0LPcZsdFjprHC3PvKJEFqRR4J+K+1dd/bF6ypQ6Hy oRuMHu/VBiO2w49Crww9bVGABrS0+inIQhDT9ZyHGGVEd8Xj6ob62w23HDcf2VvTlzi69Q RPAyaFU1hnonSKGclEQhsTsietqjtd/4JHLiBBUshC0gRzmrVbi7/i/FBTNK8g== From: Louis Chauvet Date: Wed, 29 Oct 2025 14:30:39 +0100 Subject: [PATCH v2 29/32] drm/vkms: Rename vkms_connector_init to vkms_connector_init_static Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251029-vkms-all-config-v2-29-be20b9bf146e@bootlin.com> References: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=3042; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=GNdCT1aWfEW/qQlyX1iY1PDslsm0v0L9+mabaSCFgjo=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAhbs5NWJ3H/klU5NCpNmrHDhXpnph0/9+Ic6u DiEN3R00MWJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQIW7AAKCRAgrS7GWxAs 4gfuD/9t1FOb5+ixWdur4XrQ3eEmeXmDInJf/sPhw3STC57hL7aTiD0/XqZUjBbp3rstUKJxTQj 8ESDgHo0Cr+G62tM+/d0XzLuvWFeyHSgu1Tvz8kxOTKHxlQcxR0kWhNWYKwhc6aEaIS3HdDQFPk A9LDFjWWFjUoY50CFuL29Vp+gJvSCv4pCHg4K/TtXqWy+q7Nm2tKS3t/k8fBACU9WtzmIdv5utU fEoS7dUS7y683ENbgMBt/PbEdHc1P1ArsP6CUQyXu8pVsN0fwZXKGumFgN7mU2Ej4fX1xK/rMBb tYYxhJ92X4xBs4JyfwuQmBUAEA49SX0L0KUhOOV4Kt5aoFDyzBFuzfsd1tpnD+k8TIJsIx73PW1 3olPHGe7pKCJgT3Trv9T/FzV9GB8bJZFwEzC/u3QwORyeS8Q/pRQ8cxR9MxBFrRcjxgRdLIXBwA fKteTwyqfs9p4qSy5FBlAlqXgWlvPQKVc1hd06oDuxXA/P14LJ2xfWz4Jak3Uzor2DyDo/9uqAm Os9Sg1bS4kU11CG7RTTtZ8QdGXXzcZLne6TCpcxc7NZ1203TJhCHuh2B6iRvk44TLwq9O9SywT8 41Av+YroDBQhBXVm8Akw4IRz5GVKstBcxs8vZFpceT8QooA8P83Mtz+TCLoZdM5uUWFLMql3M/Y +JbK4mVmCWnuvvg== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 With the introduction of dynamic connectors we will have two way of initializing a VKMS connector. Rename the current function to clarify the case. Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/vkms_connector.c | 4 ++-- drivers/gpu/drm/vkms/vkms_connector.h | 7 ++++--- drivers/gpu/drm/vkms/vkms_output.c | 4 ++-- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_connector.c b/drivers/gpu/drm/vkms/v= kms_connector.c index 699b6779a46c..1b7ccca2abc0 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.c +++ b/drivers/gpu/drm/vkms/vkms_connector.c @@ -108,8 +108,8 @@ static const struct drm_connector_helper_funcs vkms_con= n_helper_funcs =3D { .best_encoder =3D vkms_conn_best_encoder, }; =20 -struct vkms_connector *vkms_connector_init(struct vkms_device *vkmsdev, - struct vkms_config_connector *connector_cfg) +struct vkms_connector *vkms_connector_init_static(struct vkms_device *vkms= dev, + struct vkms_config_connector *connector_cfg) { struct drm_device *dev =3D &vkmsdev->drm; struct vkms_connector *connector; diff --git a/drivers/gpu/drm/vkms/vkms_connector.h b/drivers/gpu/drm/vkms/v= kms_connector.h index a124c5403697..85f9082c710e 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.h +++ b/drivers/gpu/drm/vkms/vkms_connector.h @@ -4,6 +4,7 @@ #define _VKMS_CONNECTOR_H_ =20 #include "vkms_drv.h" +#include "vkms_config.h" =20 #define drm_connector_to_vkms_connector(target) \ container_of(target, struct vkms_connector, base) @@ -18,14 +19,14 @@ struct vkms_connector { }; =20 /** - * vkms_connector_init() - Initialize a connector + * vkms_connector_init_static() - Initialize a connector * @vkmsdev: VKMS device containing the connector * * Returns: * The connector or an error on failure. */ -struct vkms_connector *vkms_connector_init(struct vkms_device *vkmsdev, - struct vkms_config_connector *connector_cfg); +struct vkms_connector *vkms_connector_init_static(struct vkms_device *vkms= dev, + struct vkms_config_connector *connector_cfg); =20 /** * vkms_trigger_connector_hotplug() - Update the device's connectors status diff --git a/drivers/gpu/drm/vkms/vkms_output.c b/drivers/gpu/drm/vkms/vkms= _output.c index 217f054d9598..44f8f53c9194 100644 --- a/drivers/gpu/drm/vkms/vkms_output.c +++ b/drivers/gpu/drm/vkms/vkms_output.c @@ -92,11 +92,11 @@ int vkms_output_init(struct vkms_device *vkmsdev) } } =20 - vkms_config_for_each_connector(vkmsdev->config, connector_cfg) { + vkms_config_for_each_connector_static(vkmsdev->config, connector_cfg) { struct vkms_config_encoder *possible_encoder; unsigned long idx =3D 0; =20 - connector_cfg->connector =3D vkms_connector_init(vkmsdev, connector_cfg); + connector_cfg->connector =3D vkms_connector_init_static(vkmsdev, connect= or_cfg); if (IS_ERR(connector_cfg->connector)) { DRM_ERROR("Failed to init connector\n"); return PTR_ERR(connector_cfg->connector); --=20 2.51.0 From nobody Sun Feb 8 19:55:55 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 0E28D350A34; Wed, 29 Oct 2025 13:31:19 +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=1761744681; cv=none; b=Dj64jCoMQEHyPNT9EDM60C3j/ZGV++Rl5FW0FK1d4D8V5vdq8kSTpPVfFjLJrI6PPxlwPHz/AcB+mi/orVCEsiui9zH7yodPssulep0K/Ju7yENeng2Mb+4j8XQNEryq9wUbLYri8fspYbXxLdzgdKHOvocqjGjUlpZ0WEz+PJA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761744681; c=relaxed/simple; bh=vHE+KXN44+uY83YhKjAEjkHqNWJmb39F47iujVDrYRg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=LrbaCYm3qv4MUS2oBs4OUcBq2s6ixPfrGgjO6AIzjknUtfd1HrJM2gZ7u1XcuNP8Kqyv3Jm2sfYSEL+vCzoFbcp1JdSK4Kt1ChzD89GbWm91oW4nu3Pyq93dFUikVTtrkfmLiP8C68Ui366wAkQZSd44yqk1Oyop07DZr/VRpwo= 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=krZNDUu8; 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="krZNDUu8" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id D31574E413CE; Wed, 29 Oct 2025 13:31:16 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id A91A6606E8; Wed, 29 Oct 2025 13:31:16 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 9404F117F809C; Wed, 29 Oct 2025 14:31:14 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761744676; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=g6EoLHIVrvJ3bH8/8VH0gkiHKWy94ZpuwGW0qU4+WeE=; b=krZNDUu8TLo1N01nEfcEx4RUysrOrM1G6mWBS+pX7Tf0lqswG7Be8SaCFYQxFSXQ26xhKT 1XLjOOadfHPVloZ88ByPFezDPVvvpvdDVLa51veNAHNtSlHVrjYuuwUqjslgNzvU3oKphY AqlQqwupQl0EK2fuElhYMkJD8n7YBgJo3ifF61SeCsdXmAzEaIZND+OSoYNGrkHZA6rU2b WyKf0Hj+xG59Leblx0k8MXuWnIAlXC6oviAuCP2miXnNN7DqIxLEuo+N6KfXBiTF5S3okE zxP2TO8HRmO21FTODJQJsqX1zyGTNRiwE8S3sJhJXoIluoqDcphZfhzScSWUgg== From: Louis Chauvet Date: Wed, 29 Oct 2025 14:30:40 +0100 Subject: [PATCH v2 30/32] drm/vkms: Extract common code for connector initialization Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251029-vkms-all-config-v2-30-be20b9bf146e@bootlin.com> References: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=2773; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=vHE+KXN44+uY83YhKjAEjkHqNWJmb39F47iujVDrYRg=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAhbsWl+W2r/EunJZp/5j3i+vTGWzu/KgcZjO3 bcgPIpXi/CJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQIW7AAKCRAgrS7GWxAs 4oT4D/44VpPqqvbDLykiOSd2QAiMSlRNzlF7o9FeEL+EnpWRQRyyP/2uqTSWhYnogbzmrGNc0l4 Bf0aRPY3VhhK9DoNhj3V+1nf0VgRjYogLajzsOGREYgFEWvpO9qYlinmaogceO8jUXrMpTj/Tec kXzjQjJMsz3l9mUZCoUmCsJc5O+u6AtZV087hck7U0LEwGtujfEcDnuD8xBIS9biOm0SBgBBBRh d2TGASxLSV9J1bJxIRUZAUv2yyA0YU58ZZ4IJWlkdH3F85NVFfu/iaSsG2/lg2kOvUlWGw6GSO1 T1NC9VH8njwQ1Q2d8r4YqQWNUvgM1Tfs5rPaox5oC1Jvyi9nHb9Y16PC23zpQBU/EAP3HQurWD1 0gq8ESNNsEK7w3PfLdX+W73b5v2ch2DallRemkWVUvOLTzh3n7VurnHcWUiO0BcXcybswwcl6q+ CzPGcNNnXf/AcoI9LveIy4NxSQ+RaBxPpaf4gY8xiLMbDTAK7pwFFmZtgCTZdLh63SVi+2osoYJ zIK6SEDlQFcFAjE+lg6tuhEPkNfVpGlYVOeC/5bup+zYGzM/UjgMth2cXmIEobxzjS1dJB1FnAE ap/uEIjGAj2N/u5RN9qV3SlybvFRgY5uWRlahHutzZL7Hm4zxnsQikr/c8GOXR7UGxT805VXbj1 26l6Ad/u2R/ihyA== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 With the introduction of dynamic connector, some code will be shared between dynamic and static connectors. Extract this part to avoid code duplication Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/vkms_connector.c | 44 +++++++++++++++++++++++--------= ---- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_connector.c b/drivers/gpu/drm/vkms/v= kms_connector.c index 1b7ccca2abc0..2c5f04af8784 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.c +++ b/drivers/gpu/drm/vkms/vkms_connector.c @@ -108,22 +108,17 @@ static const struct drm_connector_helper_funcs vkms_c= onn_helper_funcs =3D { .best_encoder =3D vkms_conn_best_encoder, }; =20 -struct vkms_connector *vkms_connector_init_static(struct vkms_device *vkms= dev, - struct vkms_config_connector *connector_cfg) +/** + * vkms_connector_init() - Common initialization of vkms connector + * @vkmsdev: VKMS device containing the device + * @connector: VKMS connector to init. @connector->base must be + * already initialized by DRM core. + * @connector_cfg: Connector configuration to apply + */ +static void vkms_connector_init(struct vkms_device *vkmsdev, + struct vkms_connector *connector, + const struct vkms_config_connector *connector_cfg) { - struct drm_device *dev =3D &vkmsdev->drm; - struct vkms_connector *connector; - int ret; - - connector =3D drmm_kzalloc(dev, sizeof(*connector), GFP_KERNEL); - if (!connector) - return ERR_PTR(-ENOMEM); - - ret =3D drmm_connector_init(dev, &connector->base, &vkms_connector_funcs, - vkms_config_connector_get_type(connector_cfg), NULL); - if (ret) - return ERR_PTR(ret); - if (vkms_config_connector_get_supported_colorspaces(connector_cfg)) { if (connector_cfg->type =3D=3D DRM_MODE_CONNECTOR_HDMIA) { drm_mode_create_hdmi_colorspace_property(&connector->base, @@ -143,6 +138,25 @@ struct vkms_connector *vkms_connector_init_static(stru= ct vkms_device *vkmsdev, =20 if (vkms_config_connector_get_edid_enabled(connector_cfg)) drm_connector_attach_edid_property(&connector->base); +} + +struct vkms_connector *vkms_connector_init_static(struct vkms_device *vkms= dev, + struct vkms_config_connector *connector_cfg) +{ + struct drm_device *dev =3D &vkmsdev->drm; + struct vkms_connector *connector; + int ret; + + connector =3D drmm_kzalloc(dev, sizeof(*connector), GFP_KERNEL); + if (!connector) + return ERR_PTR(-ENOMEM); + + ret =3D drmm_connector_init(dev, &connector->base, &vkms_connector_funcs, + vkms_config_connector_get_type(connector_cfg), NULL); + if (ret) + return ERR_PTR(ret); + + vkms_connector_init(vkmsdev, connector, connector_cfg); =20 return connector; } --=20 2.51.0 From nobody Sun Feb 8 19:55:55 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 0E334354AC1 for ; Wed, 29 Oct 2025 13:31:19 +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=1761744683; cv=none; b=TawioCTH/ut2RX6yNwsmrRZaer1c4lUElsuM8qnh3c8S8yQL5Bda679Hd6Fcth6OpX5NgZ0wD8eYIxo0zhsUhyML/mq3iiNxfrR5P+YvZjkvQ8WRIWBL7qpfDoFqUK3bROhPUi9CvtC2gi0LbfQgC7e65mC+Gtqf8Yb/DxJA2G0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761744683; c=relaxed/simple; bh=xrzdaraOFExxLukUGdDstkMZ2KqagA/b+HcZMmpJXPU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=OuushLKl0N2geNc/TBAI/KMcn5SmZf0Atcjlw7V6k/Y127Lzh+dp+OPNYjzkRFvPLj0jw87enw1kzbBxCPs9STMu5/oyeXJ+/G5YG7CLVtisk7nE7yXpxd+skH9r6YJPjE085yQPypAcUc1G5IZYuKD+AtBBz60Q2/jql8U8bOY= 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=q8E4WCfe; 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="q8E4WCfe" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 8780D4E413CF; Wed, 29 Oct 2025 13:31:18 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 5CF3E606E8; Wed, 29 Oct 2025 13:31:18 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 37F19117F809D; Wed, 29 Oct 2025 14:31:16 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761744677; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=z9Dd9IU6DX4wrDs84ZKPS92OQlwhgVAYGOu5dRcVDJU=; b=q8E4WCfe3uYydDzydauG5K9/7tUeQXsLEL/ZCO0mnoTyHbLr/SD8j9bDFzCl7GvjdcXL4E SVK4c12maJhuxYhFFN9s9EIaq4QSnC/qIw/4xv2IDR1eKrl1IbiYHEYPkRMNKYkEXXMYlR u4Ae6pPjvKxXU7gINfdipkuIupgfrIm82xGGNIgBexTyegb5lRxFcdzs+GciT7EFERehwF Jvbq0YHyq+P5lcZJ2iV75f3xH3m/T7b3npZNEBYBN2aGdV7xSaQdnwe1Tx59FRK4cENcq7 B5SKZswcUOEpMDSYkQWX6/ijrL2fgGr0kNaPpavuyemTXMVr1RV94ZjvD/uc8Q== From: Louis Chauvet Date: Wed, 29 Oct 2025 14:30:41 +0100 Subject: [PATCH v2 31/32] drm/vkms: Allow to hot-add connectors Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251029-vkms-all-config-v2-31-be20b9bf146e@bootlin.com> References: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=5808; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=xrzdaraOFExxLukUGdDstkMZ2KqagA/b+HcZMmpJXPU=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAhbsWoDlB9kliDkPzNj8WixbIE2ATtL00itUo BQKubLgvkOJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQIW7AAKCRAgrS7GWxAs 4m33D/9V40p3piBhYNkkZ/F25ATVTfq/IheJ6RNp9zmjb3B6GzVG5isxP1DXDlgHVDB4oMXIaeC UEQkOqhg2rQoF2/crSGVZTbgft8PMBXCH2+kHfNVGffHOAtv5uqRzeF1zGensP5NhfKldhYrOjs TuqieaVZT1Dhphci5GHdCFmJqjnTx0ohzbCxmkQNaCcRJZLuTaVQGdPflNLz8bn+7O0rbpfti42 aIOW8vNYGo6ukc/CdInoQaVTRVt/BpU2YLPi2wgoKhXmSwPPm2FCQnb4fRYI7v/jtkEyUFVujR0 vHHaO9THzorH7pzNMT64R++2g98/dbNpKktx/vtpp45PU82p2+de8bi9WYmAJHpNA177PgIkFPx p+TMlMFpNxn4pmAcREaJx6mZxKnAfTBGAl0etqpgMy9Go6FPgyHzEjmN27XvUYWTT12pt5HLRFZ vWtUEYafwx4h+VpWCdnFW0gzdtzkpygzHGt/clfq13jAvztnLJLN2NUvnThfGOMZqdAiWPknt1j 8J+Anza9hrHFv0Pze1TQAGljg23v3odQXjXGx8dwD3vjmvijFyogEtuoDKmbr+mOpGLGhP6S9ZW TmjU9WrWSBlU2VZHonXnfC79GPYqfUdVtjDWpJ9sEg1i9XUlW7mhUxjASE6cbHIS/Mpw3qlqICq ML1YpriCiWxwQOg== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 In order to allow creating dynamic connector, add the required infrastructure in vkms_connector. Co-developed-by: Jos=C3=A9 Exp=C3=B3sito Signed-off-by: Jos=C3=A9 Exp=C3=B3sito [Louis Chauvet: use drm_atomic_helper_connector_reset instead of drm_mode_config_reset because connector is not yet registered] Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/vkms_connector.c | 81 +++++++++++++++++++++++++++++++= ++++ drivers/gpu/drm/vkms/vkms_connector.h | 32 ++++++++++++++ drivers/gpu/drm/vkms/vkms_output.c | 9 ++++ 3 files changed, 122 insertions(+) diff --git a/drivers/gpu/drm/vkms/vkms_connector.c b/drivers/gpu/drm/vkms/v= kms_connector.c index 2c5f04af8784..bd0e368d5598 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.c +++ b/drivers/gpu/drm/vkms/vkms_connector.c @@ -161,9 +161,90 @@ struct vkms_connector *vkms_connector_init_static(stru= ct vkms_device *vkmsdev, return connector; } =20 +static void vkms_connector_dynamic_destroy(struct drm_connector *connector) +{ + struct drm_device *dev =3D connector->dev; + struct vkms_connector *vkms_connector; + + drm_connector_cleanup(connector); + + vkms_connector =3D drm_connector_to_vkms_connector(connector); + drmm_kfree(dev, vkms_connector); +} + +static const struct drm_connector_funcs vkms_dynamic_connector_funcs =3D { + .fill_modes =3D drm_helper_probe_single_connector_modes, + .reset =3D drm_atomic_helper_connector_reset, + .atomic_duplicate_state =3D drm_atomic_helper_connector_duplicate_state, + .atomic_destroy_state =3D drm_atomic_helper_connector_destroy_state, + .destroy =3D vkms_connector_dynamic_destroy, + .detect =3D vkms_connector_detect, +}; + void vkms_trigger_connector_hotplug(struct vkms_device *vkmsdev) { struct drm_device *dev =3D &vkmsdev->drm; =20 drm_kms_helper_hotplug_event(dev); } + +struct vkms_connector *vkms_connector_hot_add(struct vkms_device *vkmsdev, + struct vkms_config_connector *connector_cfg) +{ + struct vkms_config_encoder *encoder_cfg; + struct vkms_connector *connector; + int ret; + unsigned long idx =3D 0; + + connector =3D drmm_kzalloc(&vkmsdev->drm, sizeof(*connector), GFP_KERNEL); + if (IS_ERR(connector)) + return connector; + ret =3D drm_connector_dynamic_init(&vkmsdev->drm, + &connector->base, + &vkms_dynamic_connector_funcs, + connector_cfg->type, + NULL); + if (ret) + return ERR_PTR(ret); + drm_connector_helper_add(&connector->base, &vkms_conn_helper_funcs); + + vkms_config_connector_for_each_possible_encoder(connector_cfg, idx, encod= er_cfg) { + ret =3D drm_connector_attach_encoder(&connector->base, + encoder_cfg->encoder); + if (ret) + return ERR_PTR(ret); + } + + drm_atomic_helper_connector_reset(&connector->base); + + vkms_connector_init(vkmsdev, connector, connector_cfg); + + ret =3D drm_connector_dynamic_register(&connector->base); + if (ret) + return ERR_PTR(ret); + + return connector; +} + +void vkms_connector_hot_remove(struct vkms_device *vkmsdev, + struct vkms_connector *connector) +{ + drm_connector_unregister(&connector->base); + drm_mode_config_reset(&vkmsdev->drm); + drm_connector_put(&connector->base); +} + +int vkms_connector_hot_attach_encoder(struct vkms_device *vkmsdev, + struct vkms_connector *connector, + struct drm_encoder *encoder) +{ + int ret; + + ret =3D drm_connector_attach_encoder(&connector->base, encoder); + if (ret) + return ret; + + drm_mode_config_reset(&vkmsdev->drm); + + return ret; +} diff --git a/drivers/gpu/drm/vkms/vkms_connector.h b/drivers/gpu/drm/vkms/v= kms_connector.h index 85f9082c710e..f53e3f85c684 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.h +++ b/drivers/gpu/drm/vkms/vkms_connector.h @@ -34,4 +34,36 @@ struct vkms_connector *vkms_connector_init_static(struct= vkms_device *vkmsdev, */ void vkms_trigger_connector_hotplug(struct vkms_device *vkmsdev); =20 +/** + * vkms_connector_hot_add() - Create a connector after the device is creat= ed + * @vkmsdev: Device to hot-add the connector to + * @connector_cfg: Connector's configuration + * + * Returns: + * The connector or an error on failure. + */ +struct vkms_connector *vkms_connector_hot_add(struct vkms_device *vkmsdev, + struct vkms_config_connector *connector_cfg); + +/** + * vkms_connector_hot_remove() - Remove a connector after a device is crea= ted + * @connector: The connector to hot-remove + */ +void vkms_connector_hot_remove(struct vkms_device *vkmsdev, + struct vkms_connector *connector); + +/** + * vkms_connector_hot_attach_encoder() - Attach a connector to a encoder a= fter + * the device is created. + * @vkmsdev: Device containing the connector and the encoder + * @connector: Connector to attach to @encoder + * @encoder: Target encoder + * + * Returns: + * 0 on success or an error on failure. + */ +int vkms_connector_hot_attach_encoder(struct vkms_device *vkmsdev, + struct vkms_connector *connector, + struct drm_encoder *encoder); + #endif /* _VKMS_CONNECTOR_H_ */ diff --git a/drivers/gpu/drm/vkms/vkms_output.c b/drivers/gpu/drm/vkms/vkms= _output.c index 44f8f53c9194..56c9c0b56151 100644 --- a/drivers/gpu/drm/vkms/vkms_output.c +++ b/drivers/gpu/drm/vkms/vkms_output.c @@ -116,5 +116,14 @@ int vkms_output_init(struct vkms_device *vkmsdev) =20 drm_mode_config_reset(dev); =20 + vkms_config_for_each_connector_dynamic(vkmsdev->config, connector_cfg) { + if (connector_cfg->enabled) { + connector_cfg->connector =3D vkms_connector_hot_add(vkmsdev, connector_= cfg); + + if (IS_ERR(connector_cfg->connector)) + return PTR_ERR(connector_cfg->connector); + } + } + return 0; } --=20 2.51.0 From nobody Sun Feb 8 19:55:55 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 7FC0F354AEC; Wed, 29 Oct 2025 13:31: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=1761744684; cv=none; b=Bian9L3gNQEihNnWEQBbq/GNM+qxlj9drGcp9WEQ78OZxcyqvznRW6zHkxLF7/LlJCPPRDGxlO4ZBIIlYcIYelHwXfncCF7Joq9iOyrfCeeM/8EeGp3hMqGjDKGeBWHBx3nms201XZ6aZil6w9fUxKBLfSVKbnPoVYtoesOgY+Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761744684; c=relaxed/simple; bh=0c54fSmOm2l+K0LbPt9pg/s8Cgsdy0XFWVvsXyQZpVs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=kVlFfeN1e2KY9aTeo9SLlpGHDLu7nWR5nlZVomVQAQ6fTVhjC0dQruimRPdKGPI4TeLNF/axDdNDrnUgIJcG1fni1JvnSJtXZ60/7B2B4sk8Bh8/RfcfRer6fVo2vZKJFxNd3FhwxexFcYeCSkgGMZxyEpc4tucGcyVQpdQ/O2g= 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=gsXeB90T; 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="gsXeB90T" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id B89D8C0DB01; Wed, 29 Oct 2025 13:30:59 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 1C933606E8; Wed, 29 Oct 2025 13:31:20 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id DE770117F809E; Wed, 29 Oct 2025 14:31:17 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1761744679; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=SpkB+O9TsCu/AbXZ5AMtN1pcUFMsRO/D92Oon6XNGNc=; b=gsXeB90TW4MFEkUcr/Q9xeBIcxsOm+Rb92bzdWDsde2Z9bqy18mdT5zYXe/d17Vvt2QHGV cYVghI/e3lKi2tcQjP+WdB+QditORMGMiu/RGlqJsCjzNl/sF/VnO1UgM53ZkKobk80ImV VL0o6eQgMk94YyslJct1M2t8hGRAgbszI3pOJWlYW9TWgy6Jla/NhFQZSMrh0FnpVFuYC3 43d8VUubtH7cgG0P2MXxNsGZzkevWPGT+oMe/2i7CXeuLlNPeIX/og1D16QMW1zpSKMBMS rf0PZfbXj4bHwzhn5vHnFSfeLkqY98h/EyIx7VWou94nM53LaWnSu7vjICVZtw== From: Louis Chauvet Date: Wed, 29 Oct 2025 14:30:42 +0100 Subject: [PATCH v2 32/32] drm/vkms: Introduce configfs for dynamic connector creation Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251029-vkms-all-config-v2-32-be20b9bf146e@bootlin.com> References: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> In-Reply-To: <20251029-vkms-all-config-v2-0-be20b9bf146e@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=10022; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=0c54fSmOm2l+K0LbPt9pg/s8Cgsdy0XFWVvsXyQZpVs=; b=owEBbQKS/ZANAwAKASCtLsZbECziAcsmYgBpAhbs7JkS7/65uQ2RhYBbB92eyBeYurpxDw6xx r+IRE8dy+iJAjMEAAEKAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaQIW7AAKCRAgrS7GWxAs 4gQfEACqyG2bsUnE+q6UxmOYg/EqOEyZVzhMZPnEweXrZ9y2YnXB+eZLHW39kN1m16RRT+C0aR9 eQD2FO5UsP3a7yGChzYnN5OF3qqFdAhky8DWrbGZoLcNOaUR6S/xW+XrbLTAftAaAmrVy77dna0 mmoJXX2ug6+QvujkgiGVDYenDqvfae/g+zaCCGuhWqiqaWwNuaUfl+ADM0hm4lD+ZjeXqb5e14p bGFjI+TW1lOKUKmli1En3Ongzz3HVhOftLAe4Wzeo6+Lth7wf1pFBAtoFgfGgjwMF1JTotAcZJj pwOucLBMtuqqw/mUhXvIVHryBI89Ce8xW6JQ3vou1HpkMBq2nCnvLCptGYo8MOGksB4ri0Ontf2 h6TnpP2KYM+Iymoz6zdz3XkPniJivfxLbVf+sgGXQFa5mwe5EdTc0KSt/jDO8vxD0kC809DSvUF X77kfbM551CakdXTmPtRNf05HUJUDFOPHd4JJdvekf7EUBxMJ46YBUA/T0h6W403HOM2S7qVkno HwSbR0Gyz0IVM39NPIG7OirJWMqPIJPRGP4zABchgl6zgtkL02sW7eVaIVaxkL+I6grE57/tjH0 ZuhjA9dvjsaT4iTqJL4jAjIQ2uhdjbNri1QOzpdoFSVFT1QAVTlSQkDFxpr8Yx9JEqDjK2llGBe Hpr6AZC2Dvub6Tw== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 DRM allows the connector to be created after the device. To allows emulating this, add two configfs attributes to connector to allows this. Using the dynamic attribute you can set if a connector will be dynamic or not. Using the enabled attribute, you can set at runtime if a dynamic connector is present or not. Co-developed-by: Jos=C3=A9 Exp=C3=B3sito Signed-off-by: Jos=C3=A9 Exp=C3=B3sito Signed-off-by: Louis Chauvet --- Documentation/gpu/vkms.rst | 6 +- drivers/gpu/drm/vkms/vkms_configfs.c | 153 +++++++++++++++++++++++++++++++= +--- 2 files changed, 146 insertions(+), 13 deletions(-) diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index 0cc7897d7b83..afed12132ae7 100644 --- a/Documentation/gpu/vkms.rst +++ b/Documentation/gpu/vkms.rst @@ -138,7 +138,7 @@ Last but not least, create one or more connectors:: =20 sudo mkdir /config/vkms/my-vkms/connectors/connector0 =20 -Connectors have 5 configurable attribute: +Connectors have 7 configurable attribute: =20 - status: Connection status: 1 connected, 2 disconnected, 3 unknown (same = values as those exposed by the "status" property of a connector) @@ -150,7 +150,9 @@ Connectors have 5 configurable attribute: - edid_enabled: Enable or not EDID for this connector. Some connectors may= not have an EDID but just a list of modes, this attribute allows to disable EDID pro= perty. - edid: Content of the EDID. Ignored if edid_enabled is not set - +- dynamic: Set to 1 while configuring the device to create a dynamic conne= ctor. A dynamic + connector can be used to emulate DP MST connectors. +- enabled: For dynamic connector, set it to 1 to create the connector, 0 t= o remove it. =20 To finish the configuration, link the different pipeline items:: =20 diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vk= ms_configfs.c index 1843e5d9e1e1..b4315c6cb25c 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -1135,6 +1135,12 @@ static ssize_t connector_status_show(struct config_i= tem *item, char *page) return sprintf(page, "%u", status); } =20 +static bool connector_is_enabled(struct vkms_config_connector *connector_c= fg) +{ + return !connector_cfg->dynamic || + (connector_cfg->dynamic && connector_cfg->enabled); +} + static ssize_t connector_status_store(struct config_item *item, const char *page, size_t count) { @@ -1154,8 +1160,10 @@ static ssize_t connector_status_store(struct config_= item *item, scoped_guard(mutex, &connector->dev->lock) { vkms_config_connector_set_status(connector->config, status); =20 - if (connector->dev->enabled) - vkms_trigger_connector_hotplug(connector->dev->config->dev); + if (connector->dev->enabled) { + if (connector_is_enabled(connector->config)) + vkms_trigger_connector_hotplug(connector->dev->config->dev); + } } =20 return (ssize_t)count; @@ -1215,8 +1223,10 @@ static ssize_t connector_type_store(struct config_it= em *item, } =20 scoped_guard(mutex, &connector->dev->lock) { - if (connector->dev->enabled) - return -EINVAL; + if (connector->dev->enabled) { + if (connector_is_enabled(connector->config)) + return -EBUSY; + } vkms_config_connector_set_type(connector->config, val); } =20 @@ -1332,6 +1342,107 @@ static ssize_t connector_edid_store(struct config_i= tem *item, connector_status_disconnected) vkms_trigger_connector_hotplug(connector->dev->config->dev); } + return count; +} + +static ssize_t connector_enabled_show(struct config_item *item, char *page) +{ + struct vkms_configfs_connector *connector; + bool enabled; + + connector =3D connector_item_to_vkms_configfs_connector(item); + + scoped_guard(mutex, &connector->dev->lock) + enabled =3D vkms_config_connector_is_enabled(connector->config); + + return sprintf(page, "%d\n", enabled); +} + +static ssize_t connector_enabled_store(struct config_item *item, + const char *page, size_t count) +{ + struct vkms_configfs_connector *connector; + struct vkms_config_connector *connector_cfg; + bool enabled, was_enabled; + + connector =3D connector_item_to_vkms_configfs_connector(item); + connector_cfg =3D connector->config; + + if (kstrtobool(page, &enabled)) + return -EINVAL; + scoped_guard(mutex, &connector->dev->lock) { + if (!connector->dev->enabled) { + vkms_config_connector_set_enabled(connector_cfg, enabled); + } else { + // Only dynamic connector can be enabled/disabled at runtime + if (!connector_cfg->dynamic) + return -EBUSY; + + was_enabled =3D vkms_config_connector_is_enabled(connector_cfg); + vkms_config_connector_set_enabled(connector_cfg, enabled); + + // Resulting configuration is invalid (missing encoder for example) + // Early return to avoid drm core issue + if (!vkms_config_is_valid(connector->dev->config)) { + count =3D -EINVAL; + goto rollback; + } + + if (!was_enabled && enabled) { + // Adding the connector + connector_cfg->connector =3D vkms_connector_hot_add(connector->dev->co= nfig->dev, + connector_cfg); + if (IS_ERR(connector_cfg->connector)) { + count =3D PTR_ERR(connector_cfg->connector); + goto rollback; + } + } else if (was_enabled && !enabled) { + vkms_connector_hot_remove(connector->dev->config->dev, + connector_cfg->connector); + } + } + } + return count; + +rollback: + vkms_config_connector_set_enabled(connector_cfg, was_enabled); + return count; +} + +static ssize_t connector_dynamic_show(struct config_item *item, char *page) +{ + struct vkms_configfs_connector *connector; + bool enabled; + + connector =3D connector_item_to_vkms_configfs_connector(item); + + scoped_guard(mutex, &connector->dev->lock) { + enabled =3D vkms_config_connector_is_dynamic(connector->config); + } + + return sprintf(page, "%d\n", enabled); +} + +static ssize_t connector_dynamic_store(struct config_item *item, + const char *page, size_t count) +{ + struct vkms_configfs_connector *connector; + struct vkms_config_connector *connector_cfg; + bool dynamic; + + connector =3D connector_item_to_vkms_configfs_connector(item); + connector_cfg =3D connector->config; + + if (kstrtobool(page, &dynamic)) + return -EINVAL; + + scoped_guard(mutex, &connector->dev->lock) { + // Can't change the dynamic status when the device is activated + if (connector->dev->enabled) + return -EBUSY; + + vkms_config_connector_set_dynamic(connector_cfg, dynamic); + } =20 return count; } @@ -1341,6 +1452,8 @@ CONFIGFS_ATTR(connector_, type); CONFIGFS_ATTR(connector_, supported_colorspaces); CONFIGFS_ATTR(connector_, edid_enabled); CONFIGFS_ATTR(connector_, edid); +CONFIGFS_ATTR(connector_, dynamic); +CONFIGFS_ATTR(connector_, enabled); =20 static struct configfs_attribute *connector_item_attrs[] =3D { &connector_attr_status, @@ -1348,19 +1461,28 @@ static struct configfs_attribute *connector_item_at= trs[] =3D { &connector_attr_supported_colorspaces, &connector_attr_edid_enabled, &connector_attr_edid, + &connector_attr_dynamic, + &connector_attr_enabled, NULL, }; =20 static void connector_release(struct config_item *item) { struct vkms_configfs_connector *connector; + struct vkms_config_connector *connector_cfg; struct mutex *lock; =20 connector =3D connector_item_to_vkms_configfs_connector(item); + connector_cfg =3D connector->config; lock =3D &connector->dev->lock; =20 scoped_guard(mutex, lock) { + if (connector->dev->enabled && connector_cfg->dynamic && connector_cfg->= enabled) + vkms_connector_hot_remove(connector->dev->config->dev, + connector_cfg->connector); + vkms_config_destroy_connector(connector->config); + kfree(connector); } } @@ -1379,6 +1501,7 @@ static int connector_possible_encoders_allow_link(str= uct config_item *src, struct config_item *target) { struct vkms_configfs_connector *connector; + struct vkms_config_connector *connector_cfg; struct vkms_configfs_encoder *encoder; int ret; =20 @@ -1386,16 +1509,25 @@ static int connector_possible_encoders_allow_link(s= truct config_item *src, return -EINVAL; =20 connector =3D connector_possible_encoders_item_to_vkms_configfs_connector= (src); + connector_cfg =3D connector->config; encoder =3D encoder_item_to_vkms_configfs_encoder(target); =20 scoped_guard(mutex, &connector->dev->lock) { - if (connector->dev->enabled) - return -EBUSY; + if (connector->dev->enabled && connector_cfg->enabled) { + if (!connector_cfg->dynamic) + return -EBUSY; + ret =3D vkms_connector_hot_attach_encoder(connector->dev->config->dev, + connector->config->connector, + encoder->config->encoder); + if (ret) + return ret; + } =20 ret =3D vkms_config_connector_attach_encoder(connector->config, encoder->config); + if (ret) + return ret; } - return ret; } =20 @@ -1433,9 +1565,6 @@ static struct config_group *make_connector_group(stru= ct config_group *group, dev =3D child_group_to_vkms_configfs_device(group); =20 scoped_guard(mutex, &dev->lock) { - if (dev->enabled) - return ERR_PTR(-EBUSY); - connector =3D kzalloc(sizeof(*connector), GFP_KERNEL); if (!connector) return ERR_PTR(-ENOMEM); @@ -1448,9 +1577,11 @@ static struct config_group *make_connector_group(str= uct config_group *group, return ERR_CAST(connector->config); } =20 + vkms_config_connector_set_dynamic(connector->config, connector->dev->ena= bled); + vkms_config_connector_set_enabled(connector->config, !connector->dev->en= abled); + config_group_init_type_name(&connector->group, name, &connector_item_type); - config_group_init_type_name(&connector->possible_encoders_group, "possible_encoders", &connector_possible_encoders_group_type); --=20 2.51.0