From nobody Sat Jun 27 22:18:04 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 C05D81632DD for ; Sat, 27 Jun 2026 03:30:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.85.4 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531056; cv=none; b=mzzDkYbOBFrODqeoOKY2YAz6ptZ/K54liapw5GE0lKYhB8SiAjRQ8B7Cv68k6hSadXLj7ROlMG5mB4w/GuI0FWQ8vB14C9st5ff7edUBqPTCYeV/KbzVyBWHktcRybp260yRD1TwiA9gbetbPMDCYxxPiVhCN0GAfTjEN0hqf10= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531056; c=relaxed/simple; bh=/Gr6kiSSgqJgP+KQhT9pYb203dueGUnbTDf8JiXzBVo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=a5jYlZ5cuZWTilSieEjN6YpSjzgulANFpQ9pp1rMtXQm0sd07Rwe59bHSIMigoTX91zhNmAx5ktYTURAXa4H7zPzgOpAKq56ILam4gNnPSYzpA+b6D/L6cVtbZQ+aORnPAa4G5j0vX5RcZncdGZHhx7afWulvBnDnkr2/uAHpAg= 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=OPkn56K/; 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="OPkn56K/" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 835FC4E409DF; Sat, 27 Jun 2026 03:30:53 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 4F69F60233; Sat, 27 Jun 2026 03:30:53 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id A6AB9106F1167; Sat, 27 Jun 2026 05:30:49 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1782531051; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=x90JzqH1BoHc2vBkdAptzZT2i9xIFGN7kfo+uujLNZc=; b=OPkn56K/Hn9l95VhCfCwjmlPuBSMOhmB1rd8V/mv8+R+tnEk5gZ/k24rjnFyO27AHqkCM9 jrj/ZTLO1oDfHOOpxMHw3eDij6CJe+LaKTwycWIBis+WezE/l4kPxhXaD76Ne1Vxrnzv+o yhbNQ31hSak/Y1Q81cUl6/YnlnCPiRaZL+vaN8OH9wgugyxLWDspiUGfMf/C0pyCqvgPuI OMXFbyq7JIHPTqTainMwzl8wBgXLsz4OaFAix4nWOHXhKad861fJCNBJo1dI7Vw4PukBnn TBnG0JDz4+vNADhohlwYYXqYlH6FbljvWLXpX2x1kSJiRuoA5eEcBsGWqUnNUg== From: Louis Chauvet Date: Sat, 27 Jun 2026 05:30:18 +0200 Subject: [PATCH v5 01/38] 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: <20260627-vkms-all-config-v5-1-854aa0840926@bootlin.com> References: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> In-Reply-To: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet , Shuah Khan , Miguel Ojeda , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt Cc: Luca Ceresoli , Kory Maincent , 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 , llvm@lists.linux.dev, =?utf-8?q?Jos=C3=A9_Exp=C3=B3sito?= X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1973; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=/Gr6kiSSgqJgP+KQhT9pYb203dueGUnbTDf8JiXzBVo=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBqP0Pc9iBNPzZZeBSQdnQm+kC9erh9QbfgZw2IE AlkbhLWIDmJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaj9D3BsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDIACgkQIK0uxlsQLOKnUhAAyqtsEOQFcBERdhlPMGW3eckjREkiTpZ 5AvCtXp8hIWKiRXL9Sx0Ko+P68W+8/U8V1pAZ8kCnwKfdTrFOlr4zs41XwWW7XIv/tq6A32o49Z KONDSPIdEzfxFY5Bzbfnuz3PhauJ0gFwGBEkr/NkGP/qovrV3efXxUyi8mPQ2rI/DzpAMDYOgku IR+BTbdGC75ic/wunNEBARebL8f7bRSZWEa3YnO4fRIsBhf+wEUC2x3sQ8EcPSw2HIaAIJYjPdR 1jeGktGd5VdnHgoK600sRsOXl+xz1dtQq0MQcYMO82uxJftqCbbvfP0/YE1QKp0iy+MVnxoRUtf 43z0uV+Mn5UkYWUrFlZUXXYVouUfUIoq+yQ4dn2DzsiFM+qJT+IulgaxEosT4pMCKdHnmM6aovs Z2UzOwG0rsO+56WciRoaV4MED7ykacd+HNoDi5d3w8JA1UZybOOUTNM7lSknZeQ1lW5y/081AGD ioU6KcjR2De7gae24otVTgUbeYddGosIOS+GMyQcsAoFaxU8lnxxdA7B7YMEGEbKx+ioH1krD/U 4461ew3bsJ7vbUdfDtb9VfiHati8ra/TdnoDTjA//MdxhNHNvNRDEjh3yntVWH/OoguCOL6/pFa 6oiqo3ERLOoGOhhyI5uR7TvFx7KkZfTlIDh1nvUWvQOfFkPKDD1Q= X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Create and export an helper to display plane type using the property string. This could be used to display debug information in VKMS. Reviewed-by: Jos=C3=A9 Exp=C3=B3sito Signed-off-by: Louis Chauvet --- drivers/gpu/drm/drm_mode_config.c | 16 ++++++++++++++++ include/drm/drm_mode_config.h | 3 +++ 2 files changed, 19 insertions(+) diff --git a/drivers/gpu/drm/drm_mode_config.c b/drivers/gpu/drm/drm_mode_c= onfig.c index f432f485a914..6f8a363ec6a1 100644 --- a/drivers/gpu/drm/drm_mode_config.c +++ b/drivers/gpu/drm/drm_mode_config.c @@ -414,6 +414,22 @@ static const struct drm_prop_enum_list drm_plane_type_= enum_list[] =3D { { DRM_PLANE_TYPE_CURSOR, "Cursor" }, }; =20 +/** + * drm_get_plane_type_name - return a string for plane name + * @type: plane type to compute name of + * + * Returns: The name of the plane type. "(unknown)" if type is not a known + * plane type. + */ +const char *drm_get_plane_type_name(enum drm_plane_type type) +{ + if (type >=3D 0 && type < ARRAY_SIZE(drm_plane_type_enum_list)) + return drm_plane_type_enum_list[type].name; + else + return "(unknown)"; +} +EXPORT_SYMBOL(drm_get_plane_type_name); + static int drm_mode_create_standard_properties(struct drm_device *dev) { struct drm_property *prop; diff --git a/include/drm/drm_mode_config.h b/include/drm/drm_mode_config.h index d8f5b7e9673e..20aed1ae2985 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; @@ -1011,4 +1012,6 @@ int drm_mode_config_create_initial_state(struct drm_d= evice *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.54.0 From nobody Sat Jun 27 22:18:04 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 711FE2459DD; Sat, 27 Jun 2026 03:30:57 +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=1782531059; cv=none; b=WZyAXQTzw4O12faTQczNOS64WPeqh2Za2pSABMk8Q7/N3abVdokPhpzlOasKRdONUEZO+YqStrN4FAmmbCoEMsQwhQTJ6UENNqvArrjFTwH+xu6kQPT8Q9tCRyvoe5u/O5JdwqK+Rv0iIqllODbvuNQIAfk8kUuouQUyTwdg/Oo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531059; c=relaxed/simple; bh=F6c91uycHO4sbmoHLTpP20OekCyoqwScqtNxrwrFaJQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=pG7Gq3fpDdim5OamFn7CeFNiEFW5wqN1W28QtWXdmmRuGotGJhnxWzPtl8hok5DKmrrt05UVJ7N7qkQH8EEC3ax7ZcNU2AFN+VVf7ucKqi9E2hjaGrNzr3S2cTqsONFksngQ5FZb5vJjuyiLPGBTSjZdw5AihA3tvYFAm2c7Hm4= 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=u1Th9DmB; 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="u1Th9DmB" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 274F41A0A08; Sat, 27 Jun 2026 03: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 EE8F260233; Sat, 27 Jun 2026 03:30:55 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 40CC2106F116D; Sat, 27 Jun 2026 05:30:52 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1782531054; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=hwerMsivh8BfM/hhBYmrds/bzmWbDr4E5XoWMr8kQAE=; b=u1Th9DmBrt3zo1GI6umZnXL3sswsbRzfVO5oesXcJotdxB7tc52CeRaMgnXjPQdP8g9llV fHGyNwdj+gkol2e5WEI7XQvQTZ4KbTVo39rnidQpqwcp+CXq5uIRDQKEhc5FhBeCP+8FaO 0F5QOBMEEZE/MYAnjiGTFa+5+h6rEGuFCyEdmyLKgM9OTJ8M6Qgfw60S7McQtAaMFsFcYT PB0PnEJlIkWTdvqyWtszHUGfUYpoyDvkk4jYT65Z9NQKRommdSzSOM9r+8lp/tA7/eYVbL EK2B7Ua8U70R4mSjLlfBYUZ/KXdZuBto0KSc7ZMRGDWs7IoJi6NZUgn+ggElXA== From: Louis Chauvet Date: Sat, 27 Jun 2026 05:30:19 +0200 Subject: [PATCH v5 02/38] 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: <20260627-vkms-all-config-v5-2-854aa0840926@bootlin.com> References: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> In-Reply-To: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet , Shuah Khan , Miguel Ojeda , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt Cc: Luca Ceresoli , Kory Maincent , 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 , llvm@lists.linux.dev X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=4088; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=F6c91uycHO4sbmoHLTpP20OekCyoqwScqtNxrwrFaJQ=; b=kA0DAAgBIK0uxlsQLOIByyZiAGo/Q9ygNRBu7unbMAVsZyP6+ktUTkJUdEtgeAK7vDgvAgzMb okCTwQAAQgAORYhBE+PuD++eDwxDFBZBCCtLsZbECziBQJqP0PcGxSAAAAAAAQADm1hbnUyLDIu NSsxLjEyLDIsMgAKCRAgrS7GWxAs4qpRD/wItq+9q91ODjrAgkGBLjyte6dw6f9MHI4Q43XXWdN 5x8BmmSvhjuPyabFrR8f3JlOHD66ZGPOOb1Yn7T25FobO88OG8FTWm8arp2twMqbDjshi5IZiWe 8D4xpr0e6R5+NCx+DJ/FEzeyJPLbiVi/vFVG6R+ajdEZXqc169zoU9litKxS2B8qOa6Zw3VJYg9 qTBXCs9E/HRzjyRF8/KSeOEJJeiY8wFwbHEH2R6jXkZ1GTUgOBV4oqpsZiUAfa6Uo4+6fTU8g1P OGG6MNRLfXjR9dTB633JtZ7KnJTtJR7GNPo1KiNO+xx4ZaDcAolrTuyN/i3gFUfIHWYnOIaR6Sl vO+LNViSENG9ryXwIRegfbkbfcHtpMQMbdUeBE241sVtT/SU5aC2+vYegIJSGYFpEXAqPt6TzE0 n7D0NZAd8hVADQH6au0LImDDwwuO1NnDN0Crcr2FSxEBakj/ULJGXicP9aIY20yfG3QnaSosfHy b9OI/X123RaTjMrJNS9OKqQhvEDMXqh+xNDsmXYFvCse9XnNMRSaq7IRPwKQriLVHErW/GbQzV/ bq2aqqU/tJfa3x31k15BflrXiF58HwfOmiPJ8bPNH4tPLNXKBv12hj/t1VMETm6N4RKbLaJNyIL tSP7Xr0TX3wX88HTvm3OxcpStG5DifJdDaI+xDhpUCQ== 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 | 17 +++++++++++++++++ 2 files changed, 43 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/drm/drm_blend.c b/drivers/gpu/drm/drm_blend.c index 2f0d1ba285be..eecdaf623c1e 100644 --- a/drivers/gpu/drm/drm_blend.c +++ b/drivers/gpu/drm/drm_blend.c @@ -256,6 +256,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 @@ -294,14 +319,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); @@ -309,7 +326,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 bebbb77a8f21..33329170aafe 100644 --- a/include/drm/drm_blend.h +++ b/include/drm/drm_blend.h @@ -43,6 +43,23 @@ static inline bool drm_rotation_90_or_270(unsigned int r= otation) =20 #define DRM_BLEND_ALPHA_OPAQUE 0xffff =20 +const char *drm_get_rotation_name(unsigned int rotation); + +#define DRM_ROTATION_FMT "%s%s%s%s%s%s%s%s%s%s%s%s" +#define DRM_ROTATION_FMT_ARGS(rot) \ + (rot) & DRM_MODE_ROTATE_0 ? drm_get_rotation_name(0) : "", \ + (rot) & DRM_MODE_ROTATE_0 ? " " : "", \ + (rot) & DRM_MODE_ROTATE_90 ? drm_get_rotation_name(1) : "", \ + (rot) & DRM_MODE_ROTATE_90 ? " " : "", \ + (rot) & DRM_MODE_ROTATE_180 ? drm_get_rotation_name(2) : "", \ + (rot) & DRM_MODE_ROTATE_180 ? " " : "", \ + (rot) & DRM_MODE_ROTATE_270 ? drm_get_rotation_name(3) : "", \ + (rot) & DRM_MODE_ROTATE_270 ? " " : "", \ + (rot) & DRM_MODE_REFLECT_X ? drm_get_rotation_name(4) : "", \ + (rot) & DRM_MODE_REFLECT_X ? " " : "", \ + (rot) & DRM_MODE_REFLECT_Y ? drm_get_rotation_name(5) : "", \ + (rot) & DRM_MODE_REFLECT_Y ? " " : "" + 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.54.0 From nobody Sat Jun 27 22:18:04 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 9F4B02882CD for ; Sat, 27 Jun 2026 03:30:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531061; cv=none; b=r/K2cqPK5/CgCJpiLvT72rrczSuLJhSEJiarCrvxUauaDRT5cjDlNWfHLyscEDTm11STBGliXzBeG24+lkLgl0GtJUMmvNhxB1ocPkM6dbMQ3p0u1rwBjNXO/ePdIi5aE3ww7zawzK/hY6dRixTR0dD02+gn079aZFUWdcqjuec= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531061; c=relaxed/simple; bh=TBKH35H5KkoXrlkkTPUu8sQoW4QI8QE2VLMTYp9em/U=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=qLbxIndSBqEJfPoaubA9HYJDrKutDzpExjN4qk70Lzyh407GsThLdwd8+BO24f8w8MGEAk0okzNoyQbARk8yLt3TWNXC+AGEO7yroj2tDO8RkrAnSGdKa8/WRIXh3TGlsWz8QZ2rpjzjlFiAdW44B9TwCmw76wUrYSuT5JfjLxA= 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=Ic2hegNg; 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="Ic2hegNg" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 694221A0A06; Sat, 27 Jun 2026 03:30:58 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 36F5660233; Sat, 27 Jun 2026 03:30:58 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id BDC4D106F1165; Sat, 27 Jun 2026 05:30:54 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1782531056; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=4rYEpdGc2l1H4Q3WE2kVlS4ZSJvLBdS6Or7RDAFqOWQ=; b=Ic2hegNgUCuMXDurAhiR3n5RMqJDFALwsL/jiMiDMv8KZYM9n9z6ASdbCbcDCzvU38jnd4 iq1+RZ0EEw65CAS1YOUM+TSUeyoUTx1IHpoYF47WdRa61sS+n2kfWFdbB5yHSVepdPiWYg QLad18aBDvvz9Lp4pYYFi3QkgXkv7VYuoBgw8jWKbsjNrXZCbRlVh0KLbt7W6jtbd1zWFA 46QqKLNQ/KKer9rp6ECv+BZw60zjaQ6OyOHk2jaBGfufs5hw2ukCOCercT2kEHMdpTDnQN 2fz4HcMtUoYzsGxpazmqcMzISvBf/7WtjCJHNYlhnLG6OpULHQNJ30yzMlikLA== From: Louis Chauvet Date: Sat, 27 Jun 2026 05:30:20 +0200 Subject: [PATCH v5 03/38] 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: <20260627-vkms-all-config-v5-3-854aa0840926@bootlin.com> References: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> In-Reply-To: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet , Shuah Khan , Miguel Ojeda , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt Cc: Luca Ceresoli , Kory Maincent , 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 , llvm@lists.linux.dev X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=2160; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=TBKH35H5KkoXrlkkTPUu8sQoW4QI8QE2VLMTYp9em/U=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBqP0PcAT4RFTJfCFacpdlv7IITIY8ZozYsEYBi0 m5r0x8L5GeJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaj9D3BsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDIACgkQIK0uxlsQLOKDXxAAvGYuZar3rPVvbwi8jFnIHeIqkVwiMIv ArS1jHz8ckBpsRYXBnZkUzC6QcyQF9d+o+6XwClgCaMBHGHHzVBA4IIdUbP6iQbjUI7JQDRCqM+ 4/eEV0NHCtRY0VwS03TGnWLYPwuYVIdrI+JLjLL6WnU6XSkk5v377HnRs5Ilr4uE2EKljZykcCf 2dJcucC7YHAW8LjaigcOAD3UiG7880iJGgr0TEZxrQSrziUYT2bBitriYFotih9k3Ewb5fY9w1G IbLjyclGv0UlsBP3pEP7wsfog7OxWnQcKlO82Pbc48h9NiXIV5nwMmVLc/AwO9tyxOvRIL7PXvo ET9m14YJ8psW/P+acpy4XuAA84/jLWoYKKyouqrOikryUZ50O9+oZyoKBth0VRCRRJUR0H8KpK9 gLdHiS2xTUSBv4vVFAl2arc+Bs1p/8imCmRYrcIdGnIfhKk1wXznFI5nTM5IimGN8c41l7vkiNh 1HcMDaPKtL4jyIlpyZR4atCJI6X3V2gMz0FyQgfP4tj4ygcXwLWi++jN52PWRGeNdwbPtmMmZTu P2Usy2lysK6fhdXLIW5NcPWsIAjbvn1UoDc+6Hh8Lb1YHgpi04A0rkYnqsEBOJGSF3tyTkNWPxR 3g/oIMrUGUD5Q7vWrHJd2IQXyYZ5ijxoMm/pvWoB3DfvbEiTcjg0= X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 drm_get_color_encoding_name can be useful to display debug information outside drm core. Export it so it could be used for VKMS Reviewed-by: Luca Ceresoli Signed-off-by: Louis Chauvet --- drivers/gpu/drm/drm_color_mgmt.c | 2 +- drivers/gpu/drm/drm_crtc_internal.h | 2 -- include/drm/drm_color_mgmt.h | 2 ++ 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/drm_color_mgmt.c b/drivers/gpu/drm/drm_color_m= gmt.c index 3bcf82cf61a7..b5635862dc91 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 83146ffef00c..bcd23eb0e531 100644 --- a/drivers/gpu/drm/drm_crtc_internal.h +++ b/drivers/gpu/drm/drm_crtc_internal.h @@ -38,7 +38,6 @@ #include #include =20 -enum drm_color_encoding; enum drm_color_range; enum drm_connector_force; enum drm_mode_status; @@ -121,7 +120,6 @@ int drm_mode_destroy_dumb_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv); =20 /* drm_color_mgmt.c */ -const char *drm_get_color_encoding_name(enum drm_color_encoding encoding); const char *drm_get_color_range_name(enum drm_color_range range); =20 /* IOCTLs */ diff --git a/include/drm/drm_color_mgmt.h b/include/drm/drm_color_mgmt.h index 5140691f476a..133ca77d91c7 100644 --- a/include/drm/drm_color_mgmt.h +++ b/include/drm/drm_color_mgmt.h @@ -113,6 +113,8 @@ enum drm_color_range { DRM_COLOR_RANGE_MAX, }; =20 +const char *drm_get_color_encoding_name(enum drm_color_encoding encoding); + int drm_plane_create_color_properties(struct drm_plane *plane, u32 supported_encodings, u32 supported_ranges, --=20 2.54.0 From nobody Sat Jun 27 22:18:04 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 C05FD277818 for ; Sat, 27 Jun 2026 03:31:01 +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=1782531070; cv=none; b=AujdAF/TOJDrRP0UGOd5uf+PQ6LVM+ZhJEt+xsmLim083+FSKkKQbq0aEB/mp/gfBiW3yd/KbLFsZGopLP0Qh1X6dA1jXwvdQuwQ72Ua5RyccTZ0zulhYewRJRQWuNfXCh9DvM7YMezBuHojUMi2/gxTutA2ijS+pbbKQBBO0YQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531070; c=relaxed/simple; bh=VvRVYwMiTJsuiQCHjBp397SgToWhiUwd1PayCIWe6sM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=GYzsDSlq+fLfLvMCe0xK4bzcAWGn7wRCqHioXm2NTaMp++Rl7G0ayavv7CKxYJOL8PLRvnZJmC8RjicalE6iBrC+iUj9jXziYGe8xaVQPui0gtTFCIfGojSzGDHPZTSXVr5Vf7MJVoJd+zfQDUTzYEk4hArSJdK2oX8YvSA0GJ4= 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=pX3F8thD; 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="pX3F8thD" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 836411A0A08; Sat, 27 Jun 2026 03:31:00 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 4F97A60233; Sat, 27 Jun 2026 03:31:00 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 2981D106F1167; Sat, 27 Jun 2026 05:30:57 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1782531059; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=LkKO+cSK/Ye05XIzMVJHZ3qVH0PlvYUH5JWHtBpBEuI=; b=pX3F8thDgWlixVnc0GtX9C887o7ALjgWZe8heGIZ45eh+ox/ibJA0BNbkXDWtBkwlgEl94 sRDl2s25o5ZIsFwC8fJN1WKt19y0bafYatbIPRfR5FKMfaBH4YYC/UBx1geQ84Qd3N70Zg 93Wk9H++T2NcTIEQGdx1FPFcXJAwEq3GKeTLlBY0M/1mSSqVWWjzqSz47Y2gfoTfYI+6iI CyBXJTHt73bVP7Yp+lGRMUSqcoCEMBqy1m0U4Ei9xWUx+k6WTgweUVHmr03fb6qI6NzdCF BMUswJJo9BcKuBGA/szEUF8qnSztJA01789bkscyGlonV5npddBuCJa3TlofJw== From: Louis Chauvet Date: Sat, 27 Jun 2026 05:30:21 +0200 Subject: [PATCH v5 04/38] 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: <20260627-vkms-all-config-v5-4-854aa0840926@bootlin.com> References: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> In-Reply-To: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet , Shuah Khan , Miguel Ojeda , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt Cc: Luca Ceresoli , Kory Maincent , 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 , llvm@lists.linux.dev X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=2211; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=VvRVYwMiTJsuiQCHjBp397SgToWhiUwd1PayCIWe6sM=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBqP0PdujJqeEY3EqPRbTz7xSCUiTYnxeklYJmQ1 L20YyC2ydGJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaj9D3RsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDIACgkQIK0uxlsQLOLw0g/+JlcimzuVri+AhRx4HDkljurIN6TtZ1q jfuOu1Jfb53vagQQBoxIz3e0JMF7xKVdqt7nuxhJ5qppL/jZDyJ0iuRg2qv6vTyQ4IrUjn/yVg+ u7ESkRKNKRNhqYvi/QZVBxB7w8+ITLQOkIpu4wpMBWXQ0XTcOUH1Smkjf4DyVXCJmJIvRdGqO5R ABYZZivS2hRCNHQuvJsaxJi3782McmH2oJeINFYcx5ePQXfLGIyQx6LIPzEBcHBoCUlVU8mhYAw qXGhWQUxsRh94KBRPVQHE3cgLHVdfuqj5QpfqNtCMAkOvBQP62/t9SYe24Veq4oIvWouiGQG5Zj U6lT1/JuUEOZr9SIi8KeZ4pNFIW8qc6oIH9pFFt5417c4w5J1A46e594L4G03XHSXeSPNof+ixS evZD2uTFcAVLEFe7V6nmKrHUMMMjditfqxlubc3yjyqy3cxt5IYiGobZcXe1Soewq7IDVLsPJtu 5JjDKZZJ2TIScNLDFEkDGU3sAlLlFzqKtI1lDLrbkgnIRMmC9a55oQFUF253Ja84nVO3LQsYXVl Q61lcSppsKAnW+saLjPEQiiWPBFbe/rxVEBfHHlPenAlatoCPs4ZU+MA71TOT6MEdsmjGE8atTS DVnfVkYUV/AF8xmbfa0UT2I0DxZnkHnkgcM3mZtaxCJBojHnq0rY= X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 drm_get_color_range_name can be useful to print debugging information. Export it so it could be used from VKMS. Reviewed-by: Luca Ceresoli Signed-off-by: Louis Chauvet --- drivers/gpu/drm/drm_color_mgmt.c | 2 +- drivers/gpu/drm/drm_crtc_internal.h | 4 ---- include/drm/drm_color_mgmt.h | 1 + 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/drm_color_mgmt.c b/drivers/gpu/drm/drm_color_m= gmt.c index b5635862dc91..8ec87d1c7433 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 bcd23eb0e531..4bf6bc0bcb5a 100644 --- a/drivers/gpu/drm/drm_crtc_internal.h +++ b/drivers/gpu/drm/drm_crtc_internal.h @@ -38,7 +38,6 @@ #include #include =20 -enum drm_color_range; enum drm_connector_force; enum drm_mode_status; =20 @@ -119,9 +118,6 @@ int drm_mode_mmap_dumb_ioctl(struct drm_device *dev, int drm_mode_destroy_dumb_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv); =20 -/* drm_color_mgmt.c */ -const char *drm_get_color_range_name(enum drm_color_range range); - /* IOCTLs */ int drm_mode_gamma_get_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv); diff --git a/include/drm/drm_color_mgmt.h b/include/drm/drm_color_mgmt.h index 133ca77d91c7..e91f494e5a63 100644 --- a/include/drm/drm_color_mgmt.h +++ b/include/drm/drm_color_mgmt.h @@ -114,6 +114,7 @@ enum drm_color_range { }; =20 const char *drm_get_color_encoding_name(enum drm_color_encoding encoding); +const char *drm_get_color_range_name(enum drm_color_range range); =20 int drm_plane_create_color_properties(struct drm_plane *plane, u32 supported_encodings, --=20 2.54.0 From nobody Sat Jun 27 22:18:04 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 D4DB321E097 for ; Sat, 27 Jun 2026 03:31:03 +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=1782531070; cv=none; b=ExwxMM8uVwbB/MyopLm2NDUHNmZszscnnBszsHTbXsl4taF/yMWQyjuSc/xTXda4S8XejuREc4HdmVe+KAj+m5bp5e4ycB003mqmqgdwYxopCzy1dtzwqPZ3EJ6kzpOL0rW4rxLx7jY3/vg6UONLrjFhVR3lauj9lcL4nm0cpMk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531070; c=relaxed/simple; bh=CoH2QFykQYAmJn0tr7ysysk8Njb0yaSHRh3FWL0Wc/k=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Q3AeOCa59IKJNbCXahhHf4n6UYBz1Kr/cZp/Fab4tejK/qbg2xnIGDhZgb9De8uDTaeH4cZgAnUL7yRi+sQLA4c12f9yhEWI33doRGK2cMcHZ5rxMxX6UGKbwb2Rk4RiKmWS+MhUzrcoO0SiHYuTT89fmAKj3udN0YnR0XwAb8o= 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=Q4yWbgPA; 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="Q4yWbgPA" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 9FF68C5CD79; Sat, 27 Jun 2026 03:31:11 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 8CF5960233; Sat, 27 Jun 2026 03:31:02 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 40EAD106F116E; Sat, 27 Jun 2026 05:30:59 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1782531061; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=EK9ch49e9tGiCBU1t83Zf9bvOJuUEdiFckjtuI4mqag=; b=Q4yWbgPAGLMnCzJpFK0tDfBIOYk0cLcsBKhUo/oIK3HzpUVL1sB/O8ks8kLaKR0h/N+m++ Bxf+DDU6x4W7xI0uW4WaWHsy7xfYd4GfiYBGL/JAezuw/a6ZEIBfj8/DkSu5WlvPxxuns4 Y3gBTk8WyxuHJW5ZEd99LEmg2uLe5vP/RBlbO8yk+1xh6Ly3/9UGIgu0G3wblxfGdlWRZo SuxFDbs5qNzwPIz5VHQwDdtCuGdvK7MQdtXq63igCSZAdDCWkrC2dinh9744tdETGIUMsi 4fLwSOJv2ZYVTLxiUA5wVVXIiGiBSHku+BbxXg7ArZBDWKJQKWGxz43dwED/jA== From: Louis Chauvet Date: Sat, 27 Jun 2026 05:30:22 +0200 Subject: [PATCH v5 05/38] 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: <20260627-vkms-all-config-v5-5-854aa0840926@bootlin.com> References: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> In-Reply-To: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet , Shuah Khan , Miguel Ojeda , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt Cc: Luca Ceresoli , Kory Maincent , 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 , llvm@lists.linux.dev X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=723; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=CoH2QFykQYAmJn0tr7ysysk8Njb0yaSHRh3FWL0Wc/k=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBqP0PdhwzlzL/Edd1r96Nr5w9zaxAzln5zPoDwf On2i3QwUm6JAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaj9D3RsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDIACgkQIK0uxlsQLOIM0RAAic/X/hPHJu99c0F7dRUsONIkhqIWc6j gCd/u/m+IVdnmHHxp0HPv91a7UQAg+xGL7cNzwxJ3PaeT3rHmyFURtQuxl7Mww/NJPm8sex07+K 7efG0FAzTXN6mi231K7ZSp9kVGs19y7CpU7CJp6kFI65rjCU+vjeYPcBVGagw0fB4IEyIEuuVYX 4HyB58r5ZxqU9eWJ7eBECLfdUVBq/VzmA4G+kjm4zUUwecpHUfqfmcLdVSky1KWI1abpbY2CZOR pcn+0XBt4n592wJoqz7GwkSDq3byWHobjQqmU9+1yhIg9Nm8zigGL5DKaU0zbrkmdvPiQtQbvY+ 7WX2WXBsrX3Dv1l013qYN/RznTG6+MCDfihQAi6dMg0NZCW8lWbX9/pD6WSCwqk0e7ykDwMAutR t6ycREAOkPoQriaalZtAlt7+ObA/XC0J1epbtOEBY4vQ/7j7+p98SSWJDiEnB7o/QpBs15HeoYU XC/yvKMZZd3URzB8RJwBEFRcwJwIaAvX1UXGD+d1pWqnXH9H3XDY2y/xirOI5Lvol1kHNy5avXp sQn+KUMxEHPjh2aKHe5BvP025mvGppijIOPtfiriNRZiKK5OdJdcvyy7rd3rVa27yMYcTFvBXQK 3DsBSbYs9xMFjeOSlS4NrqQNqjUXpKAzllWIW2AqEpYvf44EePBI= X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Export drm_get_colorspace_name so it could be used by VKMS Reviewed-by: Luca Ceresoli Signed-off-by: Louis Chauvet --- drivers/gpu/drm/drm_connector.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connecto= r.c index cbb067d02cb9..4b2c7c09ba69 100644 --- a/drivers/gpu/drm/drm_connector.c +++ b/drivers/gpu/drm/drm_connector.c @@ -1386,6 +1386,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.54.0 From nobody Sat Jun 27 22:18:04 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 1A147158DCF for ; Sat, 27 Jun 2026 03:31:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531072; cv=none; b=WlpiX7G9roSsk3g8OGYMQE0s+goNNsrEByZNlMr3QChfBVwh4tJbZwYBm2Z23dfSBlsG8gWDLbX5jNteajIyljacGUlqPx20t4NzXN/dTKEQoJq9uBP9TPVFR6r0/4xQPHuYul1wkRBS1mJdQ+0NkvD8Lrr01YN4Bq68odr9+7o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531072; c=relaxed/simple; bh=tbNblOwZZzE1Y64mp73eAM5o2mppDB/MrH/5NXGp3ZY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=mYaY8rtA5CVn6kKV7gjTsvi2KXqYpWE0v3iv6MRUtK5SQIcZu/07C8wRx0mxdud7qvOfIYQTvUQufSwCDR6+vOOFWsKq1mTQ/yO1S1DegqLEYwtS1Qd7HO3N/ps8mu6Xkw0UxIg/aUcuQUOlEJNFKhU688GzXi9cNTVHwM4/Pjw= 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=GYbU6YRm; 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="GYbU6YRm" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 16A69C5CD76; Sat, 27 Jun 2026 03:31:14 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 0424160233; Sat, 27 Jun 2026 03:31:05 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id B0A90106F116F; Sat, 27 Jun 2026 05:31:01 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1782531063; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=bfHiIvddr7Ju7wHJmkuXmzPCw5MJavyMHiE/+sY4NCQ=; b=GYbU6YRmdiKAvOVx+SPWpf7asTWBeHNL43OLV0hzwWIc0YeGpTZHDHxpOdWmvv9UCpRa1Q K2KRJGgDSc3Rftmvcnu8e9294XFGpn82cv0qAUMXBQ9Zmt9lTl1JJqSG+x96z622zorPIN zfBjq4su/YQqyOU7FKyWnF2WxzjnOdKCMpqVlJXiXS8cug7VhoDk2ETHi5eiKMva2l7z5X g0GKiBBR6GjneH2UVgAxgep1+gGhp5rDRKe1e4i7GerSkDGXv7/FvSBC5QU9R6Xb1LmAWl 2hO8syANEQl2eX7SlJ7Mgoi6oySaBEpy1Vl6vdgPSoIY4Kg2pVjywQ3ryCugjA== From: Louis Chauvet Date: Sat, 27 Jun 2026 05:30:23 +0200 Subject: [PATCH v5 06/38] drm/drm_atomic_state_helper: Properly load default value for 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: <20260627-vkms-all-config-v5-6-854aa0840926@bootlin.com> References: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> In-Reply-To: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet , Shuah Khan , Miguel Ojeda , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt Cc: Luca Ceresoli , Kory Maincent , 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 , llvm@lists.linux.dev X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1534; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=tbNblOwZZzE1Y64mp73eAM5o2mppDB/MrH/5NXGp3ZY=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBqP0PdBX1qs+QMZjo+7F8jVzOTpYFtq6nyNFaoY vdjMpCS49SJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaj9D3RsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDIACgkQIK0uxlsQLOL6NQ/9Gi6+yRgbhFV/JzJUE3AYNmrzz/TFvXs 7Ek4sbTwkDgvrYEn5OUeumn44ZEec2IvXu9wDltv6tdFOEYMWLBUdf6IGCGMI03/D7Zz2lvDhOd goDUVKOyYBglZPs1f0zs/tdllgL8COFiEDet1HU/O+bjmwbXRdk1De2wkEcZ7h4GrPHFvqDhgMg Q1bK53YUl7rM+KC6lpHzDkS3pnskwomyUZz6J0QG4Kj7YbyLz3YPnfHMEPsaNYIM9pBG1Y3R8x5 L6Qes0Tw1VIi6KkEbxJkbkN0gg5zSU291CrCsg75pyNiBZRVC8hbLrn+TNFhRQmbbcBQUi5cBCU Sqb54TSOm5+5hraC5HBvF27BaoG4l/AmkvInT8osQSOpsHcMkBZOOjzFX5Yh632qPG/48aWoWWk OSVV+aNAkca8p5ZQO2ApCGcq7D6d/icKJ3Ay9m59ZzsXh0/xq60qeVPRiKlsNuLv46F04PdTLxY xqCSxBRZ5+ZdvIgqP6efxGDyG1iB02Rhj5zTh9wV5g4HF35zks34AP3xKtt3E26cQ3huKh2m9ey W+T90RDYOtbXJmX4LxwM2KA3XefuR0iWUJ3a2CDpefxo+2qwTfvG3bdIjUJ2zkhh+ANCcX/VmzI WRXcDO8BizZC/BS3F/U17kp0PM4aiuyuR3it0jl1ww4Z+VnQAb8Y= X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Currently, the default rotation is always DRM_MODE_ROTATE_0 for all planes. Some planes may have a rotation property, and the property may specify a different default value and supported values. This is not an issue for "fixed" configurations, but with the introduction of VKMS configuration, some plane may only support 90=C2=B0 and 180=C2=B0 rotations, so the reset state of the plane was wrong (forced to 0=C2=B0). Signed-off-by: Louis Chauvet --- drivers/gpu/drm/drm_atomic_state_helper.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/gpu/drm/drm_atomic_state_helper.c b/drivers/gpu/drm/dr= m_atomic_state_helper.c index d90d1d7c9cf9..7fe612c4da83 100644 --- a/drivers/gpu/drm/drm_atomic_state_helper.c +++ b/drivers/gpu/drm/drm_atomic_state_helper.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -276,6 +277,11 @@ void __drm_atomic_helper_plane_state_init(struct drm_p= lane_state *plane_state, =20 plane_state->plane =3D plane; plane_state->rotation =3D DRM_MODE_ROTATE_0; + if (plane->rotation_property && + !drm_object_property_get_default_value(&plane->base, + plane->rotation_property, + &val)) + plane_state->rotation =3D val; =20 plane_state->alpha =3D DRM_BLEND_ALPHA_OPAQUE; plane_state->pixel_blend_mode =3D DRM_MODE_BLEND_PREMULTI; --=20 2.54.0 From nobody Sat Jun 27 22:18:04 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 BF1DA1A6813; Sat, 27 Jun 2026 03:31:08 +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=1782531073; cv=none; b=SuDU61nqsgy428fzr+YWam2/VAvIYsj05MJWsJrnCdvQ5Wf67nx/QADhFdl6oKVWM+8Q9FS+O+IvXFW65jevGLC+oZI/uhSFObZhfWTcl8tKYKNXUSKzISt8JuXsavt2bJgMxXicCuGNSG2NFngmRpsWU2j1+AFW/Xo7N3J4kyw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531073; c=relaxed/simple; bh=M4IKg4jtN2coKi4h2W5OHuSx8L+kOjlkuI6yHVh2tSk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=aysJXlKqZOE/1Ag/v+7k6rf27/gGYXHN0vjukxEELNoNT+zvAd+ydHpqtbJoliBJDHI1XFXhLGLGbqw7AhZWtQrbIQW+A0q9jFh78cQGmpMMHbBIUlNvJ5Gb/WqQTy71z82Ox/4hi2IrL9qawip0SZ25Sb903tfsDB2RLoiv+lE= 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=yTmyt0dj; 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="yTmyt0dj" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 8EE7A1A0A10; Sat, 27 Jun 2026 03:31:07 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 61EFC60233; Sat, 27 Jun 2026 03:31:07 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id C6B8C106F1170; Sat, 27 Jun 2026 05:31:03 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1782531065; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=OZ8EM81DGMlJ9qEgvUE9Mt5KnFr4O4RtbirwspUTjRM=; b=yTmyt0djrIvDz5sia3dlyFo9K+o8tbbwin4Dc8R2c/IlQnUv5irrsKvGzTdiwXbAJ34wKH GM2McjpWG/y/nzI0XxZksRrgNBIO1CD4kQMRtHq2udX8Av0xJORWwQos+3c18aGqDNlzdW HDqZ0gGG40q5PRgEW/7arD3C9gDALolyWcq46HDyEB4DSbLVg8NV6aknl4Uu6uR1C5M9Xr AX3n3FIvM3+GKk1952j07Y3VlB0PLg2edZGqu5Jd0IYTi310d50O11t0biaUlGk7Io+6cf VPs8Daj3QLuno5jxybirPd7cICEKkoV/OyN4SGXGobQHCb+xZpZrzMEsZ5YWXQ== From: Louis Chauvet Date: Sat, 27 Jun 2026 05:30:24 +0200 Subject: [PATCH v5 07/38] Documentation: ABI: vkms: Add current VKMS ABI documentation Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260627-vkms-all-config-v5-7-854aa0840926@bootlin.com> References: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> In-Reply-To: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet , Shuah Khan , Miguel Ojeda , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt Cc: Luca Ceresoli , Kory Maincent , 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 , llvm@lists.linux.dev X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=4411; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=M4IKg4jtN2coKi4h2W5OHuSx8L+kOjlkuI6yHVh2tSk=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBqP0Pd17dPdykH+J1Rl+Mvy3D02QP1ls2Fn3X5O BB88oAgLUWJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaj9D3RsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDIACgkQIK0uxlsQLOLgpxAA1RNVJv+/B95y7Ja7uG6EkQvSfoqGq+l OAI6TQXR1iIfG7eeDfeqpdDWWEXBNfU/L/C7GfIN8Y3Ibr7hrSdvn64cfwctxdnje2nZhUxSu8e ACpBsIm1vj+XzT4rl1gWRGgLilo1xCHedZLgX+24tOxbWaYt0pZht4tIX6fMvMAeEFVPw6qt2cG hrqmtLuQtLxLPlEOi5M3MUKh/y1KqECP1eppSeKAfzWrqvrljHC+RDnpT9+pVh6thVp0ANDq9cf W+sMiJYdBmGwBrOAJ7NagBU9ePlPerphlwJ2mExMELXj0tz+yOoEa4rJcODSRw17lwS4jYczqgG RrZuaEG/8e0nusUiZj1LqtKGQ8cZWZ78dM2vwbEGKKcoK1lIifcO9/HzSZIuH9RR3k4fa5j+e4x STXSwrFDYWbZX5zgvbw+s+sUgcFHkBQP9LwQQ3RU5CbPVGVUoenJm6d8ucR+HQCIA9orszGEE9f DKDByc4QnDEdPOZdZHXzY5nttS55MYyI/z6M6yq5w4+Pyp2BzJBXaMmIUlqtZBWKvhZLhxBYzBb E+xPzZMQzFFJpWNgGiJhOQMuRIwsoabohSsHxNc1nnLBQ4OAHylJpEkIxbzv01fzn9xbm+tio04 xabB6LmUE/Gc7flSfjkuhuTZ0XtHVcrlCmw/KgPaIFkQNweAib1A= X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 VKMS recently introduced a ConfigFS API to configure new devices. Add proper ABI documentation. Signed-off-by: Louis Chauvet --- Documentation/ABI/testing/configfs-vkms | 118 ++++++++++++++++++++++++++++= ++++ 1 file changed, 118 insertions(+) diff --git a/Documentation/ABI/testing/configfs-vkms b/Documentation/ABI/te= sting/configfs-vkms new file mode 100644 index 000000000000..a1a3e186e50a --- /dev/null +++ b/Documentation/ABI/testing/configfs-vkms @@ -0,0 +1,118 @@ +What: /sys/kernel/config/vkms/ +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + This group contains sub-groups corresponding to created + VKMS devices. + +What: /sys/kernel/config/vkms/ +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + This group contains sub-groups corresponding to the VKMS + device . + +What: /sys/kernel/config/vkms//connectors +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + This group contains sub-groups corresponding to the + connectors of the VKMS device . + +What: /sys/kernel/config/vkms//connectors/ +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + This group contains attributes corresponding to the + connector of the VKMS device . + +What: /sys/kernel/config/vkms//connectors//status +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Connection status of the connector. Possible values: + 1 - connected, 2 - disconnected, 3 - unknown. + +What: /sys/kernel/config/vkms//connectors//possible_en= coders +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + This group contains symbolic links to possible encoders + for this connector. + +What: /sys/kernel/config/vkms//crtcs +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + This group contains sub-groups corresponding to the + CRTCs of the VKMS device . + +What: /sys/kernel/config/vkms//crtcs/ +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + This group contains attributes corresponding to the + CRTC of the VKMS device . + +What: /sys/kernel/config/vkms//crtcs//writeback +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Enable or disable writeback connector support for this + CRTC. Value: 1 - enabled, 0 - disabled. + +What: /sys/kernel/config/vkms//encoders +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + This group contains sub-groups corresponding to the + encoders of the VKMS device . + +What: /sys/kernel/config/vkms//encoders/ +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + This group contains attributes corresponding to the + encoder of the VKMS device . + +What: /sys/kernel/config/vkms//encoders//possible_crtcs +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + This group contains symbolic links to possible CRTCs + for this encoder. + +What: /sys/kernel/config/vkms//planes +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + This group contains sub-groups corresponding to the + planes of the VKMS device . + +What: /sys/kernel/config/vkms//planes/ +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + This group contains attributes corresponding to the + plane of the VKMS device . + +What: /sys/kernel/config/vkms//planes//type +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Plane type. Possible values: 0 - overlay, 1 - primary, + 2 - cursor. + +What: /sys/kernel/config/vkms//planes//possible_crtcs +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + This group contains symbolic links to possible CRTCs + for this plane. + +What: /sys/kernel/config/vkms//enabled +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Enable or disable the VKMS device. Value: 1 - enabled, + 0 - disabled. --=20 2.54.0 From nobody Sat Jun 27 22:18:04 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 42595274B3B for ; Sat, 27 Jun 2026 03:31:11 +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=1782531074; cv=none; b=FFn2+3W7YrjLefAW2uszSEOa++DnSVU8lS+Mxateblzin01JxztsjGC1aceEoPv9uWmy+NOw1uebMxagW13pICiFX2dGlqUfubr3s4OyhRWvqJZ88ajG4oYtuTpMVV2LwXoodmTCSbATEj3UZfAL5hDXsSJDyq77XSGUP2I0A0k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531074; c=relaxed/simple; bh=LLCs59HPPrtC3R4f8VpEHvL6MwP8Mnd84ez61GoVGBU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Q1Te7BnAbYRhN5/o0/b46Rulo7AGcUc5+8Yx9SysnghQccCPVNo1HbijxsRsIr8N89b1XxdFehn499YNuQZlVOU1RgCn0dGC9NHp99OL+wVjdujA1bZpwCSBaXgsvLzxEW9VLNeYgkbl0qvMWjlh3qPkvCrFvSkfJrSHZbR/O+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=ppq/X1ip; 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="ppq/X1ip" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id E5338C5CD7B; Sat, 27 Jun 2026 03: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 D441760233; Sat, 27 Jun 2026 03:31:09 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 3EEAA106F1173; Sat, 27 Jun 2026 05:31:06 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1782531068; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=GjZ3Li0hgSFG+5Kg7ETwAe+lLOQj73cG0WZcoLSfcXY=; b=ppq/X1ipGF3iKp+kGv0c25M1V/c1Sq4H91lMH/v1vcf1LWaFhRDClGReSMeDWuoXsQZ0Es ZMVYL+DDVMKy6zjDBU/h5AEJu1EcTszNL/huFGqaakA2w7gAyayJKE+KgB7nNr+DXcVw5J 5UI8eviOQhStoDTxg3xdBgqvjhw/vPyzExOX4tGjWkmDnELlRckS6Oe9DfssC0/V7vF5Mj YrN/WOdR+jC2t1WULAZWlauNFDnoMtbalWzMMgLOboWuaeHKWkbh9mN8p2TzCqKVqgwpxm lWDYj+ebTG00EPW8UqhmX1J9rheqxZirNPhfeBjtImgVsnWB0u2ViZYS9wb2fw== From: Louis Chauvet Date: Sat, 27 Jun 2026 05:30:25 +0200 Subject: [PATCH v5 08/38] drm/vkms: Add error handling in plane config 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: <20260627-vkms-all-config-v5-8-854aa0840926@bootlin.com> References: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> In-Reply-To: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet , Shuah Khan , Miguel Ojeda , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt Cc: Luca Ceresoli , Kory Maincent , 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 , llvm@lists.linux.dev X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1362; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=LLCs59HPPrtC3R4f8VpEHvL6MwP8Mnd84ez61GoVGBU=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBqP0PdDKSWdqTqaUvS8fdk/TcviTi37rTfMk3s/ WyzHb6bB+iJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaj9D3RsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDIACgkQIK0uxlsQLOKTdhAAgHCx9KfVwso11uvcNybor36VUrIRrmh MEH5sxALaswhF5Qjh6L1bPiajNiK1ljYf9HhKQ+kOoTAwi5ONB169d/yu2dzYOdeC52pUSkhU2V z4Hd70Wq9afnJvKflDK61m1CYa+warWiGgwsahNz5XDP0eOa/T7/kJFF7bbQbaqoPaNw7QNEY9s XTGaV71GO4oUc4VzYkwf9jZXUsdVoexIN370cxQVvDEh79FEasAy0K9TgwPgit8D2BW8Pd/OKSL 4HKcz3EHdTFNpGb5DugX4W/j6HsN/fjo7Q8zc1BM2AxSJySwAwuobPLHwMNNJfZFfjzArdBREaU KpUhZfxrkPVn3mq5cn2+mob/SpZTqjhmcVfNiSxnR8TuZC75TJ2Hr63nQYIB3P6NA7HivdVMd7O acpCE8B0ArWd2FhLrYXUtT2lf3GFEf0hb65bq04A+NNuuVrV4ygCMEnG53HMDu2FaGpIzkxWUD6 /dBMXgr3UnEAfqeAHnKp1ldRmUM9cPtOaXHcFGWfECVAX4pCgeAJGuY25AXYH7MWqRhMjdS9ZOB 6fLmPgvnfmwxZfBb9PFDP8XR3dloGC+0N6RkdcUtr7vUC8YQ7YtrlSv3OJ8BAUD07X5TlZnSRhp 0tWVaAjmc7xEIfJJiMjjmq2PQNjt3u/HDJbhfgxzwuit9Sq0SZU0= X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 For future patches, it is useful to properly handle errors in vkms_config_create_plane. Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/vkms_config.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index 5a654d6dead8..1fd2ed1167c5 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -384,13 +384,16 @@ void vkms_config_register_debugfs(struct vkms_device = *vkms_device) ARRAY_SIZE(vkms_config_debugfs_list)); } =20 -struct vkms_config_plane *vkms_config_create_plane(struct vkms_config *con= fig) +struct vkms_config_plane __must_check *vkms_config_create_plane(struct vkm= s_config *config) { struct vkms_config_plane *plane_cfg; + int ret; =20 plane_cfg =3D kzalloc_obj(*plane_cfg); - if (!plane_cfg) - return ERR_PTR(-ENOMEM); + if (!plane_cfg) { + ret =3D -ENOMEM; + goto fail; + } =20 plane_cfg->config =3D config; plane_cfg->default_pipeline =3D false; @@ -400,6 +403,9 @@ struct vkms_config_plane *vkms_config_create_plane(stru= ct vkms_config *config) list_add_tail(&plane_cfg->link, &config->planes); =20 return plane_cfg; + +fail: + return ERR_PTR(ret); } EXPORT_SYMBOL_IF_KUNIT(vkms_config_create_plane); =20 --=20 2.54.0 From nobody Sat Jun 27 22:18:04 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 8315925B0A1 for ; Sat, 27 Jun 2026 03:31:13 +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=1782531075; cv=none; b=Dv3B0PkhA/AfiXrLW+0YTgPQzuS0hrRLqOSUj0VVzc3jPRCjHcn8i4kzqjShQ80Jqsc8Ji/xL3YfojNjzD8f49YOLMCPtAi0tTd/luA3SQ3sKZd67zspvXJdpwRXzh5n2Y9NC4inlC3LjHGRc1hljGRvh2try9qibyxDz296nBI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531075; c=relaxed/simple; bh=PCNURSQ9M9oEzGIIEaJ/g5ssiOcHUDqMsXA3szlQsCQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=LRIzH+4Q3fALl1GSdRuoCYnR5Yu0/yxUXJYBalgSRoxC8MeuhpbuSsYxrkF+vlEZUrd4MaNt5aTbkhZAYO8NvR6HiJYd3J3/19HJsD+ei/ugUao1i7mc9Yrtdc802tfd1xrfXc4gy5DuO2fvWHxVFWaxGpuiSzsSiNV/BvhD5R4= 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=r9ETZTt7; 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="r9ETZTt7" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 309E44E40879; Sat, 27 Jun 2026 03:31:12 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id F27D260233; Sat, 27 Jun 2026 03:31:11 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id A54D8106F1172; Sat, 27 Jun 2026 05:31:08 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1782531070; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=5pP7gDXVS4IrT1SvopOsJfNSDHDebsaZJuiZb3S1cf8=; b=r9ETZTt7SudsrQQVhRgecGfJ7kZObA3GWuDWyPFqgunvL5gmZYW2XDRwPq+8wqrmR4CDB9 MOOLQBdYy5/FSGnmgYmAWHLCYhVJzYNXwR+dB1Imq7CmZVNr/KzjzfhODpMPETyCl6SVgd OV9QxGCtL1skD2x3tGD2zIJ5jSGigEBhAP1g56wOdEsrLX2Rjt04JWRCT2KeYLI+MWJqUM ptWwjAEdk9iHDNOnBcgee5rnnNvgNZSHW+alt/U2PLTMDrIYkNZmcrsRJeszwc9gqNWkqU 1+gNB+6PpGaXwmpZ4NjyvY3dWjszxMg+CQRiWmgvapy9q/Zvy5HJw2KAXILJtQ== From: Louis Chauvet Date: Sat, 27 Jun 2026 05:30:26 +0200 Subject: [PATCH v5 09/38] drm/vkms: Simplify plane_release code 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: <20260627-vkms-all-config-v5-9-854aa0840926@bootlin.com> References: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> In-Reply-To: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet , Shuah Khan , Miguel Ojeda , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt Cc: Luca Ceresoli , Kory Maincent , 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 , llvm@lists.linux.dev X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1014; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=PCNURSQ9M9oEzGIIEaJ/g5ssiOcHUDqMsXA3szlQsCQ=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBqP0PdflV2+zO2tLPFL1+kWYMXXpx4JVWS2ITMT CC5S0J/j3qJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaj9D3RsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDIACgkQIK0uxlsQLOKYdhAAhiMSzJqKUAr/maJwuuGBbh2aQDKXiR4 86PS/C9R2360gzD8tp2xjapD6qPprh7Fz4f3gOUvtSuU8iYbyvN0iqAd3qjaI1JJY/tu3o5Oqlt 7bDJNWeemLX1Jvjr9pH0vEx7xHBw3aEGQg0MZTuabT/c4jGQnPFgqYxdWCoYp1bwvOJyHIiIZde CNqh4cn/E4m4JlHPw1rffcX/CPvHSauqJ4VyUl29Hp3EtjwSISmIZ5ZliLeEH7mZC/Kpv1vB9wP ebdWWE0MbDuZAnHy3PgcQ/x4GXpPeLDcUqiR6PE3Z0RjU/xYZ3oy+/o9aFSiWMJf+fElV4ibvdN lJ5ughbF9zV+/OXAQQSfZ17uAYxtLRyZKXr3fFr6wME70kyl/rtPaWFw2Mur7pOA1zZOd/gFl6w 5K7ebrwAK+/5H7d4hJFTxo/L9NpSVukEK2FZL8QsB8v89fOH/lPEtZcH+Sn+fdcbVyDQ6rhgmhv FKZsAHwYeGofUUTATI5DMnPj2469ryZThpbbg0KMY70rNkqXzeJVOID9qVb8ZF68sZwUlT/YLbh 2iTXGkdvVg1Fxvf4UMv6u/cTql/+ZgdPNB0udITV5cxUiLvEGoj1p3l8peEUoxcOWsvfNnphW7+ OerIjkBJzgnNeTIL9wXBiAtxXxC7a2hmRM2SDQX7zB3tIU/wrhE0= X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 plane_release code used multiple intermediate variable, remove those in favor of direct access. Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/vkms_configfs.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vk= ms_configfs.c index 7551b8c7766d..97f87a53d202 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -333,13 +333,9 @@ static struct configfs_attribute *plane_item_attrs[] = =3D { =20 static void plane_release(struct config_item *item) { - struct vkms_configfs_plane *plane; - struct mutex *lock; - - plane =3D plane_item_to_vkms_configfs_plane(item); - lock =3D &plane->dev->lock; + struct vkms_configfs_plane *plane =3D plane_item_to_vkms_configfs_plane(i= tem); =20 - scoped_guard(mutex, lock) { + scoped_guard(mutex, &plane->dev->lock) { vkms_config_destroy_plane(plane->config); kfree(plane); } --=20 2.54.0 From nobody Sat Jun 27 22:18:04 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 0298B2E737C; Sat, 27 Jun 2026 03:31:15 +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=1782531077; cv=none; b=FOSu527MeJBHML+hgt8/sFo244OE6wQLyyqxWI5fQW6Bx1mGFGO/Fo0n2saZFCoeDGD+b3XgflzSB3FJ74yp4penTh7YazsXMSjPyFkAlm+ZitGNo5r3P+FuGyWfUCSfhlnOY3D7lDomI+uaGFfowJZ+6WC7b4djCUfDZfEUaFA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531077; c=relaxed/simple; bh=QatXxbwayl7ekIDPzWMFO8AtbyZH8hv2oADcMdSEKVg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ZTiJ05mzkmozeF1j0X9242lFP5Ov7sTo9lAAlOKa1Qi1e0GgIkM+qZA+7SaoE6jzwmVnVEl+1MBm+RP4I3HBraVnTmDO6Oh71Ffgyl7McyCDMBwQiDljbJTQnw9/mVdnDTZSY2glkIBRiktq+cXSWZwxnSp5tO3c49kHsxvXFOg= 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=YB+KBu30; 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="YB+KBu30" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 9F9221A0A10; Sat, 27 Jun 2026 03:31:14 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 6DE4960233; Sat, 27 Jun 2026 03:31:14 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id E3937106F1176; Sat, 27 Jun 2026 05:31:10 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1782531073; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=ODS/KcKkaJlG9a45UpwMB6wA5ib5OPfBDYu35wZafPw=; b=YB+KBu30ZPq3ZtHw8VeMofiuEZIoVi/2X+Nuh7jiy+PaGre0DdmG0FQAvQ40kKvSIA0vD5 GaNXUmlKY7s0j+tvAuh15LXqLXvnW1zTiP3QeYqWggOXPg1dXvDzqFFYsmOKnfsJ1bs+yP n/s8oJ57SN7zLbGWy4HxTiM9N3OKQ3adTi3ReDFA2oFHsSKfgq5x1ELF8kD5CbxRKs93ib zn0q/TU3rawkhtSoGigkHqeaygvjooQFJi/ZCc8oh0AnAQK265dJdFbYJFWOFPvIQPwWkh pQI7VZF2YPmvb87SBHg4uwBuzBUQ1rgQVyHRaWXX4deFg4Neg/RtHcimBs/zdQ== From: Louis Chauvet Date: Sat, 27 Jun 2026 05:30:27 +0200 Subject: [PATCH v5 10/38] 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: <20260627-vkms-all-config-v5-10-854aa0840926@bootlin.com> References: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> In-Reply-To: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet , Shuah Khan , Miguel Ojeda , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt Cc: Luca Ceresoli , Kory Maincent , 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 , llvm@lists.linux.dev, =?utf-8?q?Jos=C3=A9_Exp=C3=B3sito?= X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1010; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=QatXxbwayl7ekIDPzWMFO8AtbyZH8hv2oADcMdSEKVg=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBqP0PdNyCKzo5+Pqv7awnU62rGPxflbvcYSPcpC BsXxW6u5qKJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaj9D3RsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDIACgkQIK0uxlsQLOJhrw/9HN97IeB1bHNm6RJCKgwALzDcvVJy8jn P18clTb8ozTwcU1qvq0ovPhgYNXpMkRKcMclyvaRY83BY8V9/XdaM4ROJIrF/S4ws6rl8OTukEP dE8x0NKUKe52SsuWV+BXymPVGwIpWCmiTVykMsO6moqBQVzkNB70N8u0X7tTDCqn4Sh2jWNlFi2 J5N8v3o8TZr+xpxEcMBXR+IXPwpZXgxyk8RlwSzYZUPziAgBc30nc3I+Jj2TmLtnphdzl/HmHot mtEbeAXkMzCZMP0ot7/dYVC7WLRUlJVJ+Bmjnsz9tWA8M1CQz0+eIFnDLu8tXch/aEZv9ekueca XnhnaMM3fLem+fmFdggYSRXrmQkIMCP8bwdFr3QxwLER7SJPVgo4vReqB2EkJZ8oQkO6VJkNO1q o5eN+4hOnTrXqv3vPQm1+Q5bV1PuTMpeEr+iQInFCmXKI97mTbh4n+hELQ7/X7fFU9eksPpvzK5 Q0jFshlgtgwqSh1mPX41LIaZH4QG8SqiBSyMTtxx9J6kB1etTYewjavGwzBB4ejqlkJeacFdNtU IDqHIWqrwZf1Xe19RlmxMBXtA0BAEZDowcsrdG03xE952tDuL0QMx2hLlEtk7kFA2pC3Bp6NDD3 z3o8ekI6MA85AkoaX9JDz+IgcDs5ZwyFhY9OXFNrSXcU3p8MJeaA= X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Debug information are mainly read by human, so use full name instead of values. Reviewed-by: Jos=C3=A9 Exp=C3=B3sito Reviewed-by: Luca Ceresoli Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/vkms_config.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index 1fd2ed1167c5..469c57c6d1e8 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -352,8 +352,8 @@ static int vkms_config_show(struct seq_file *m, void *d= ata) =20 vkms_config_for_each_plane(vkmsdev->config, plane_cfg) { seq_puts(m, "plane:\n"); - seq_printf(m, "\ttype=3D%d\n", - vkms_config_plane_get_type(plane_cfg)); + seq_printf(m, "\ttype=3D%s\n", + drm_get_plane_type_name(vkms_config_plane_get_type(plane_cfg))); } =20 vkms_config_for_each_crtc(vkmsdev->config, crtc_cfg) { --=20 2.54.0 From nobody Sat Jun 27 22:18:04 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 761B01ACED5; Sat, 27 Jun 2026 03:31:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531079; cv=none; b=qqQs75fpWnrZ2NIiEZWU79IgoggEso0qGK7SsDgnUAYb+ekHHiHlupN+IvbVqcq1b4lYxVY0nRi9tvQBv3+A8NDqhe8qR2P0RagyRya433xELysP3WouWpyUVjiMRsiWLDgJ7w5HLMJoOVpJGusBX51EbyeRVwGickd2q7/5u4c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531079; c=relaxed/simple; bh=IPPO/N5KzxecIhN7sCv6ZygxjxmYOy9rXkt7EwU9Nd0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=eNCGgblsj5XEtE+BdYvXBcqYF8RaBOh3jzcOh5ZmGQjXrGmTK94PLxvE+yNbRkMPXfO3b0yICK/VyBwvIOHqalnR2I/vvH6nLPS7/Vu+LixNUFtw9ct2TJ6l7UfmSSQf3+zW88FQ5zvGnnLaYVC5ri8ooeKDQUC/l6cjMMVtbos= 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=nK/TaRkR; 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="nK/TaRkR" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 4616CC5CD79; Sat, 27 Jun 2026 03:31:26 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 3328460233; Sat, 27 Jun 2026 03:31:17 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 544C4106F1171; Sat, 27 Jun 2026 05:31:13 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1782531075; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=ny8jovS05Cy6acIMNd4HSb4i/Bq9Nh8qF6KY1lLItU0=; b=nK/TaRkRBR4iHTyxBMNWCYJ4T4wYBJiZ6oxhWaqyKa+JsJzKvUlCxHRT0H3GtDaI+8qsy1 Gq4W52Myn/x1C0cxsE8x+Eyu1dpzs7hOlB9bSBso9seiIeJSMDExKTkzjw3yz/ct5kFYsE nYwX+dHMymwqHwHdJgG0kenPmwlwTcYgrVIJNw6HWaLV/qMxbdfdbNUOqoKhVnqnwWQ0mG 4ieZlcpNmIc6bi6Too946ntl3dO18rdMpal6CYpDjMuLeTQI8SnoeH5tt7Dcd03rTSaFd5 gFcVI29aKYtsOwbRK1dxjRwX0O72FZdirw8uWrGj+LdE1WfyE3apNryDlHnRyw== From: Louis Chauvet Date: Sat, 27 Jun 2026 05:30:28 +0200 Subject: [PATCH v5 11/38] 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: <20260627-vkms-all-config-v5-11-854aa0840926@bootlin.com> References: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> In-Reply-To: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet , Shuah Khan , Miguel Ojeda , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt Cc: Luca Ceresoli , Kory Maincent , 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 , llvm@lists.linux.dev, =?utf-8?q?Jos=C3=A9_Exp=C3=B3sito?= X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1207; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=IPPO/N5KzxecIhN7sCv6ZygxjxmYOy9rXkt7EwU9Nd0=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBqP0PeYbFNR/zDAOgcy6qf+LVqKQj2Ych5s1YSA J+rWbfD3K6JAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaj9D3hsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDIACgkQIK0uxlsQLOJGjA//flEtStMdS9irHvAdw1FQN5JOQrLHfIe Yd7Y+jYRXU2QrzjWnFQrnuaIWI6EY3GKaP6mZ4eYfkgpkTGD/GFZRUpEKoQSSg0jhwxvWL7Thss X0d7ar+wsCtXmlHa0ejgFOZcZWevu6mNpRpMyv0CdxjzRlp+O1/yyL/CG9gQZ1xYwuEiNG9vqGx 6fhhvlSgVMEBTB0pXQUEvDheBWKashnwrmRInTLpMQo7XybZwfmi7UvK6TEVbTcgWsFnIe4y2AX BvhWp3YQcleNjD7/GHr66xy38y5d/DxAI4S+79m9v2j632cHT3QXLq9y9CnKEHE3hM2evLYEWgS VlRCBiSpyNZRPuWLIN2lTfhu8TNj49jg/8MyRdnpom7lMMiy6hLQ3TRqxKie4wgMd4LFQCBoZYB ErkIgh/vKX1phNa5i9i0LgQ3Af2XC8+ogtiX0/QK2kh5ey86Uu4XZGBHQBsAwh4p7gU07USel4D /03nltywZu/roLt9RKqls4lTiVw0tVcsuvC+GAay02lZ+8x5GZiUAz042+VngKKiG3xDU713Vh5 BYo/oeg+GH611Fi+yAaYpioBBSke0IJ3jgdKvkq31UqsIiY5dLZlh3uXfL8juboGXf7gUxYCtdb 1HPmRABPQLuAfYxkpxqHwuSgdA+s9xDHQ4Ox7QzuGbtxEgENN2VY= X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Debug information are mainly read by human, so display human readable values. Reviewed-by: Jos=C3=A9 Exp=C3=B3sito Reviewed-by: Luca Ceresoli Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/vkms_config.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index 469c57c6d1e8..4c6f3ead51d7 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-2.0+ =20 #include +#include =20 #include #include @@ -358,8 +359,8 @@ static int vkms_config_show(struct seq_file *m, void *d= ata) =20 vkms_config_for_each_crtc(vkmsdev->config, crtc_cfg) { seq_puts(m, "crtc:\n"); - seq_printf(m, "\twriteback=3D%d\n", - vkms_config_crtc_get_writeback(crtc_cfg)); + seq_printf(m, "\twriteback=3D%s\n", + str_enabled_disabled(vkms_config_crtc_get_writeback(crtc_cfg))); } =20 vkms_config_for_each_encoder(vkmsdev->config, encoder_cfg) --=20 2.54.0 From nobody Sat Jun 27 22:18:04 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 E7469317170 for ; Sat, 27 Jun 2026 03:31:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531082; cv=none; b=m9XnYkOhGVKGjIvEffU+BJ6MZav1qozvDOcDg/0LKND6dSmCuJuUVYMWP9/9TQJFzH0PYVli4g3l5t911iwizNbEEFqfQ1CktG4ENpErhSQAPnwp/XJqILHYA4IeTozV5y0xZdV+B/aiiNj8/NGA/8ypwmGivG4vpWAc0D0d1Hg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531082; c=relaxed/simple; bh=oxr/CF0EOleBJpYQ0o3XQ1eFlhGpl9bHjVK5vcH/zUw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=RYmWi7iVLMLtEE7aNNubl5ktnJLWdeKmCorwO+qcKeqygQLo9hIt8v9x4KgkaS/txXcCu4VfWrBM3U4t6nOenia0CP73J3HIClumU+QuZBV5LWc1TfZHlMjfbDtSLmmc3ULyxA0wIZbGb/15QaOx8NyCbzryHI2jqsRKYPVKrPE= 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=mgWfATN0; 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="mgWfATN0" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id BFC16C5CD7B; Sat, 27 Jun 2026 03:31:28 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id AE35D60233; Sat, 27 Jun 2026 03:31:19 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id EFDB3106F1174; Sat, 27 Jun 2026 05:31:15 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1782531078; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=7t4wxccSVE+8YpNtCCYNB6F0KQiLmWtDWy0z8sUDzNs=; b=mgWfATN05p3uSCk5D3rXBj6g9bD4yIVBqfuItCRyvbI6KDsvC2fv1WWPSdfDIE9lOuelxk 6M5fTRm134YoTK8EI195rhSbrE58n0mFbm6B34X8hm6H63IPLSDiNkVozzs7KKaYeQ8c7Q NM6PxmnDoN3KSjZRGp6DO574Acr4cG3x4NunZibheX3PF/7ixFUrbl5xuCt+VU5Z1XEalE kVCv1g/zl/Y8RfRpia+81QBgNy/LlupUqQqB3BNoqtPXwiuoicpNT/7ayocTbKjrHaned5 e/8q+m4aEEBYKd1S3v3IEtFBTc5B6aKp5neatpwGDkvDJAzqbUW7Z3eEP+xb1Q== From: Louis Chauvet Date: Sat, 27 Jun 2026 05:30:29 +0200 Subject: [PATCH v5 12/38] 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: <20260627-vkms-all-config-v5-12-854aa0840926@bootlin.com> References: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> In-Reply-To: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet , Shuah Khan , Miguel Ojeda , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt Cc: Luca Ceresoli , Kory Maincent , 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 , llvm@lists.linux.dev, =?utf-8?q?Jos=C3=A9_Exp=C3=B3sito?= X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1240; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=oxr/CF0EOleBJpYQ0o3XQ1eFlhGpl9bHjVK5vcH/zUw=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBqP0Pe03kOlBSLeLny4z2YzohoyX0ZyfDtpYSnn eu936/sl3iJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaj9D3hsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDIACgkQIK0uxlsQLOKHmg/7BakTXcTMLBqo/YspJqXwtq3VhskmGJx cDXjP+hdjJZiCCfZC8exAZqDyk2BOPqq1MyHjCDkNfGR7dVvfAf5HLu6V9G30CvjiKDLmyuBQAh 4O3zD+2J4Bm9VIIBsGTQAeQkzFlrUMhU6SksHh7ZjgflyQMwLtrU4rqko0GNkP8JiycImGRB3BZ t56vZfAdO7lln+YLwgCZor5DJOKgSkOINUqtvKZUa43bhlWTCG4HWTLPvFMLd2pVKweqaMINb5n vs1FYS38teJqemDVRqz5kPd99kopiq3MsqdLRtgJdORRFkSwOKWv8gQxRCkuvZ4unCg2w8+GeMd 3Yn/l/bxxAKsYZHuUFSKIcwyAK/Xe1skcMAE76fw60xqIPhiLNGmltfp8cniXF8VQw87xNsFIs2 uK+eHvKILuQaNngeRTBmy2D5eqb62z/O0RSiz1aHEVqcL7cNpdqev5fA71zrpLPTvQAiDmXkWnU rJdQkWXSZSiY4uSfg9PttW4hJ0LTYTTXma3jH0MZoGqQIep+lJ2ZBconXZs+ZYAcMczF6/uq5MP +BPmMol12Vgq8fWZks2/1wo8MjyPy2H2E6ahRhYQl1QkMRuYuh1R6KPJcSu2pN6i1Xh1vEDFsQQ OmmkkiOEC1tG1tNvtcY4R55Joeb1Mc0TA0PBgL3z7MUc20IQdOcs= X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Debug information are mainly read by human, so use full name instead of raw values for connector status. Reviewed-by: Jos=C3=A9 Exp=C3=B3sito Reviewed-by: Luca Ceresoli Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/vkms_config.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index 4c6f3ead51d7..9071d6864d52 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -3,6 +3,7 @@ #include #include =20 +#include #include #include #include @@ -368,8 +369,8 @@ static int vkms_config_show(struct seq_file *m, void *d= ata) =20 vkms_config_for_each_connector(vkmsdev->config, connector_cfg) { seq_puts(m, "connector:\n"); - seq_printf(m, "\tstatus=3D%d\n", - vkms_config_connector_get_status(connector_cfg)); + seq_printf(m, "\tstatus=3D%s\n", + drm_get_connector_status_name(vkms_config_connector_get_status(conne= ctor_cfg))); } =20 return 0; --=20 2.54.0 From nobody Sat Jun 27 22:18:04 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 7D8182DE70D for ; Sat, 27 Jun 2026 03:31:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531085; cv=none; b=Gq367BMDy4+FlI9wCiR/kry5mbDcG578nbRq7BztNSAs5+7ptYOFtEm0L6HGxCyhLhBvTGrtHftU4NwPwPTSo5g988pVHnbKAdRajrt7PDuWpuDV3zDBFJeuqarSeuFEBLF5dqijHbRfqKQPewVvEc9hI670gBk/DghryAmHpDc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531085; c=relaxed/simple; bh=OrK0S1Whky5ucJT5nD88CmquKyvy6s4uqJRwRqrFlDw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=cr8uAfaByKjuohLNVcGFIerPxAR7PkP3a0qgXwTN2ZWP++W6oMMVrjE0B/bbQEzc8w3NvK+Bhfs5nmSY+h7fOUdRwea/sTicxPqt1RSfnITr8SkluXyepMd/msLcLymd+bb1jtTaCa6JOp6E4aX3TfSvDFwIp3F8KajdodCjx/k= 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=jUAV4GAr; 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="jUAV4GAr" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 2C9671A0A17; Sat, 27 Jun 2026 03:31:22 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id F36E160233; Sat, 27 Jun 2026 03:31:21 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 5ACFB106F1165; Sat, 27 Jun 2026 05:31:18 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1782531080; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=KCMs2RMoADPaxjHq/4ARjDIv6HVXkjxZfynU+B9MuJI=; b=jUAV4GAreC6ZCebdohvdyZcY4n7ja8dzNW5IQ/I3PFHPj9hgSSSNL/ZvCsOtl77DXKfz0v s04kK7EkJBIjHdf/beUIdLY4DkcI7gwpjkWYa/s1d25orj8EZ64xe+xMp0DqGT6beZjx9d vd5qFGuYVECLV95GD2QDLgZFT/so3dBrU+Go6vnnhB31lsNRPedEK5QIEYWvLKs/OryGCB 3f8VQk/zC9j3QgWZcpojuJMrZgCbjKyLirLgcr4ehx6rxuTG1/RatbezTH6ceJciweW1Y+ BzZsux68hVlQ7S9XB7aXM4agyOe0AqsR5pNZKy5mJ5WFYwg9igK4wgfgJeoVvg== From: Louis Chauvet Date: Sat, 27 Jun 2026 05:30:30 +0200 Subject: [PATCH v5 13/38] 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: <20260627-vkms-all-config-v5-13-854aa0840926@bootlin.com> References: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> In-Reply-To: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet , Shuah Khan , Miguel Ojeda , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt Cc: Luca Ceresoli , Kory Maincent , 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 , llvm@lists.linux.dev X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=4628; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=OrK0S1Whky5ucJT5nD88CmquKyvy6s4uqJRwRqrFlDw=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBqP0PeM9Cd8OH5YTOhNOl2t9WP1l1CWKtkaqn5I Wa4zpjecSuJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaj9D3hsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDIACgkQIK0uxlsQLOLrUA/+Pd5/W6B9l8YE/gPm5fTdse47pbt+q+s 08aaV/yyCmIT6sSDajsDPkUZm4RVyyPbcIMbOV2g0fTSSQeLrHxvp5C/xzsqiFxuDcWRMJZZRFr GKUxHfq52gO6yu3AhpLcf8t3vo9VKXadoV5z9CknUhEiWMQ039x3T13Y/QMegvXUP0HHDJepGsv fV6fEt74q4Y9s7TRx6z3DZDhRifNNQ4sFJUL+wbLHzigyhsfZ9stWNpSfKAsd7U5HwEUK945lrp xh/AJyntzj5rNUcTLCR7eC0Ho+qozYmVDoXcp4cHlEVMF1cVJpK2C+1HK/UauPlgz8AWPNUNWCi +JnGTX6QxDVqYpI19v/ZrAANqdhpS0HYJHkuF6sr4HVH0aQbgmIuemgbDL1d4ucUqjEjHKWD8HY 4bYABPwinRXYvwwM1BUPKJC6eOd/Ljf7kPJew0rHeK77u2lcUa3/DMlnlPFZUWd99Aftu7+5oA+ Qit/Ebb2Ovx9E0OdJ/uRZecofOw6IIDG5w2+ZDRuMIhKzj7aKPfQUXClvoasb6WCQd9kQt2PWpz ltwV73wQDTzOWeB7QFjSOpphaz8/bq5mNMeQld056yGw4xgEyyB/5OYkrOBeo5/JLKxliW5Ju89 kbq3cGIqJhpwoJT5DCQ5ZpP5AudoXWamWYTh3YJ+ru+pLeaJOiiY= 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 | 11 +++++++++++ drivers/gpu/drm/vkms/vkms_config.h | 34 ++++++++++++++++++++++++++++++++++ drivers/gpu/drm/vkms/vkms_plane.c | 3 ++- 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index 9071d6864d52..54994f3c8e14 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -356,6 +356,9 @@ static int vkms_config_show(struct seq_file *m, void *d= ata) seq_puts(m, "plane:\n"); seq_printf(m, "\ttype=3D%s\n", drm_get_plane_type_name(vkms_config_plane_get_type(plane_cfg))); + seq_printf(m, "\tname=3D%s\n", + vkms_config_plane_get_name(plane_cfg) ? + vkms_config_plane_get_name(plane_cfg) : "(null)"); } =20 vkms_config_for_each_crtc(vkmsdev->config, crtc_cfg) { @@ -400,12 +403,19 @@ struct vkms_config_plane __must_check *vkms_config_cr= eate_plane(struct vkms_conf plane_cfg->config =3D config; plane_cfg->default_pipeline =3D false; vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_OVERLAY); + + ret =3D vkms_config_plane_set_name(plane_cfg, NULL, 0); + if (ret) + goto cleanup_plane_cfg; + xa_init_flags(&plane_cfg->possible_crtcs, XA_FLAGS_ALLOC); =20 list_add_tail(&plane_cfg->link, &config->planes); =20 return plane_cfg; =20 +cleanup_plane_cfg: + kfree(plane_cfg); fail: return ERR_PTR(ret); } @@ -415,6 +425,7 @@ void vkms_config_destroy_plane(struct vkms_config_plane= *plane_cfg) { xa_destroy(&plane_cfg->possible_crtcs); list_del(&plane_cfg->link); + kfree(plane_cfg->name); kfree(plane_cfg); } EXPORT_SYMBOL_IF_KUNIT(vkms_config_destroy_plane); diff --git a/drivers/gpu/drm/vkms/vkms_config.h b/drivers/gpu/drm/vkms/vkms= _config.h index 8f7f286a4bdd..e34f4cbfe8b8 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -3,6 +3,7 @@ #ifndef _VKMS_CONFIG_H_ #define _VKMS_CONFIG_H_ =20 +#include #include #include #include @@ -35,6 +36,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 +49,7 @@ struct vkms_config_plane { struct list_head link; struct vkms_config *config; =20 + const char *name; enum drm_plane_type type; struct xarray possible_crtcs; bool default_pipeline; @@ -314,6 +317,37 @@ vkms_config_plane_set_default_pipeline(struct vkms_con= fig_plane *plane_cfg, plane_cfg->default_pipeline =3D default_pipeline; } =20 +/** + * vkms_config_plane_set_name() - Set the plane name + * @plane_cfg: Plane to set the name to + * @name: New plane name. The name is copied. + * + * Returns: -ENOMEM if the memory allocation failed, 0 in case of success + */ +static inline int __must_check +vkms_config_plane_set_name(struct vkms_config_plane *plane_cfg, + const char *name, size_t name_len) +{ + kfree(plane_cfg->name); + + plane_cfg->name =3D kmemdup_nul(name, name_len, GFP_KERNEL); + + if (name && !plane_cfg->name) + return -ENOMEM; + + return 0; +} + +/** + * vkms_config_plane_get_name - Get the plane name + * @plane_cfg: Plane to get the name from + */ +static inline const char * +vkms_config_plane_get_name(const struct vkms_config_plane *plane_cfg) +{ + return plane_cfg->name; +} + /** * vkms_config_plane_attach_crtc - Attach a plane to a CRTC * @plane_cfg: Plane to attach diff --git a/drivers/gpu/drm/vkms/vkms_plane.c b/drivers/gpu/drm/vkms/vkms_= plane.c index 68cb2a3335e6..f35120203124 100644 --- a/drivers/gpu/drm/vkms/vkms_plane.c +++ b/drivers/gpu/drm/vkms/vkms_plane.c @@ -11,6 +11,7 @@ #include #include =20 +#include "vkms_config.h" #include "vkms_drv.h" #include "vkms_formats.h" =20 @@ -228,7 +229,7 @@ struct vkms_plane *vkms_plane_init(struct vkms_device *= vkmsdev, &vkms_plane_funcs, vkms_formats, ARRAY_SIZE(vkms_formats), NULL, vkms_config_plane_get_type(plane_cfg), - NULL); + vkms_config_plane_get_name(plane_cfg)); if (IS_ERR(plane)) return plane; =20 --=20 2.54.0 From nobody Sat Jun 27 22:18:04 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 E3D383264DF for ; Sat, 27 Jun 2026 03:31:25 +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=1782531087; cv=none; b=WxQKgsLt5jve6qoIFO/qEc9Opwzw6S5JdYKdKG+eYVh1yAxeBT3ghpAfJWOXTbNLjLIkA6Ofq6vuNoOQZffBo8eaCmhQDDDLyE22a9ssfxIOizc36jjIviDerH421UmZW1zWjmj0cswOMUFWjI39LCMUQR45/Wm3D+uWBE1N6DI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531087; c=relaxed/simple; bh=XiKwAPRa/+NQm3DU+qGiwJ/34hsXkmvGjxyX2KcisQ4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ZWoPSVqDaq75Gnv/XrvefCbY3z/9mysZFaJRg5va8cOLAzv+YA+KeAxnnaik8YL0IGZoEucsKmGsZ3wALZF9rmK9PTZ+oTTyCbVoYd2P2iYJXhDGWfXQuGWgEalLvpYPRSPlVZFmFP7sWIB1qu1WAOW33TOjdAjXw/g0MVijk9g= 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=ULXNSJzH; 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="ULXNSJzH" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id ABA524E409ED; Sat, 27 Jun 2026 03:31:24 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 7F94360233; Sat, 27 Jun 2026 03:31:24 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id AF6A7106F1170; Sat, 27 Jun 2026 05:31:20 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1782531083; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=enjP3ecSS4QzsDh23km0Yhkh9WtnM49/1mdnYB1P4Io=; b=ULXNSJzHOLol9rJxXzejdSV18o4ococAqqOi8hr0ijk8s1vJFavK5KKH3uDHtl9DVX70xY Tls02ebaj06ZXvEqdPjVdPD8hNfZ3dwim4tn/oWjD2SN8QEqKQQAGiZsva6sylDMp+l860 A5+JjpHbc+Gsn6ElckCFG1gO+gbzVyr4/y/hIM48GFvC57Z4EqSi+rwLct2oRuhcPo2hM8 NqREB7zQ85Ajdv+Mha9qd98w7tMcJPdZsZ9Lpc0Svyy7DYVkFpPXx3qIH7ajdaVEvpcpyl 4jlQDlr6Ez8Ua2gNx4OUJG5v7B/HMrH6OuhZ47fnYNxzhMt30eDHNV+kdmwHpQ== From: Louis Chauvet Date: Sat, 27 Jun 2026 05:30:31 +0200 Subject: [PATCH v5 14/38] drm/vkms: Use plane folder name as 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: <20260627-vkms-all-config-v5-14-854aa0840926@bootlin.com> References: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> In-Reply-To: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet , Shuah Khan , Miguel Ojeda , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt Cc: Luca Ceresoli , Kory Maincent , 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 , llvm@lists.linux.dev X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1013; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=XiKwAPRa/+NQm3DU+qGiwJ/34hsXkmvGjxyX2KcisQ4=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBqP0PeBSZa/Q5LZrxCv8vC3cSZ+TH2Lb88ejFEz 9FxZtUMnUCJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaj9D3hsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDIACgkQIK0uxlsQLOJGLRAAg/uGvBHH9KsgxvsyhNZ8WI2nL1GeuCJ 1m+Qv668EUWQuRK7GWAigdDVfTA5e4z8M65EZ1ZgLta/3RQkcDzzGIm2cLAmkHTLyuDbJz8Sxaz dxXtydRBA1S9aCWr0aiMmfbyanc2n+eiS2Io1QZnf/CCUJJQt7HY2cTYkdhlgoP41kvHhbDh/88 hdDCJ7ogtdtlZq63ZqEXBnnMi8HsSrimjJkG3vsXW5iupgG8ife77VkiQJ8sKOYl+ZbDdXPJOwN 5zVGwSH7cGAgwiFA8oC9xgMEW7n9BDXEiL02FwyLCZ+tlAedn2NWWtRFsyKfswuSZml+YPtQ6U8 CvEeG3RK/c6c8kKk1ql9xUiaUmHIDAGUDm/htKVALSNw85c8vTZ6n7ho6MNlG5TsltcdsYF2rMJ 6vj2S1JA8h8xK93dO0yjzI4ce4hSvcKuxx5Mcxp1mTpne6cb9+xuvhlOiQhRSk9zYkEf5Nqf2vf ojBYmW7RE54B1KE7vhxEN9hUVs0EI1fxb8fDijZwWjpW6g9O7204kzyqDhyN9U6IkW0MposN/JX kryBJX9RgveTXrtC4NQJwb8t/idyWStkW4Uta6mXzp+E4LZ/uKYj8ODew/zOrCdzUO93wriojiw /pSz7v3G1aF4Ih8oyejo2w/ZiVmKablzHw0l+ka81ZxfwykoSA3g= X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 The plane name is now directly derived from the configfs folder name. When a plane directory is created under /config/vkms//planes/, the folder name is used as the plane name via vkms_config_plane_set_name. Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/vkms_configfs.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vk= ms_configfs.c index 97f87a53d202..0744ac40814d 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -377,6 +377,12 @@ static struct config_group *make_plane_group(struct co= nfig_group *group, return ERR_PTR(ret); } =20 + ret =3D vkms_config_plane_set_name(plane->config, name, strlen(name)); + if (ret) { + kfree(plane); + return ERR_PTR(ret); + } + config_group_init_type_name(&plane->group, name, &plane_item_type); =20 config_group_init_type_name(&plane->possible_crtcs_group, --=20 2.54.0 From nobody Sat Jun 27 22:18:04 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 E2D6432E121 for ; Sat, 27 Jun 2026 03:31:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.85.4 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531091; cv=none; b=Jumuwz93QL6D5174FwyutexVlZtcGLWoK3oaEdL0z2f1Vvx3QWSJGpW5k0mzz3ksZr+iPONo6C75p/Y5kj29lT5fwVNM0JeKS8LXDUNi3shMLNxclSKHRBinsyr/3RlF8M+5BtZydcyjrCDsl0csv0fAJARkWqWnc+h8CDcPBys= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531091; c=relaxed/simple; bh=NarIrCRkwgiYb1oHyqPXSucjITVVxh28lMl41rAyZCM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=WExXqOkC2yEgwvCCvkYx3N2GSI4qHDZQU5erJcWI2PlmWtd/SJ/Q0u8WK8ApCnDFwJgpHD3LJq1EME0Zcd9n1gTbXSAJFt1ergEPK9j5PWcHH07dzZvHHcdu6rTMBQNEPPZBImmvy+8MzcGSGaNA8rNsH1X+sLpQHWT8Ui3nobk= 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=JFo/uQY+; 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="JFo/uQY+" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id BF6474E409F1; Sat, 27 Jun 2026 03:31:26 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 92BF660233; Sat, 27 Jun 2026 03:31:26 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 44049106F116E; Sat, 27 Jun 2026 05:31:23 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1782531085; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=RDpHnbA/70W+3EHwzzJOTDtDqCF04SI9ZqeQbcosOaY=; b=JFo/uQY+Og2LM3gXpx0lm8iDP1+oMj/i0DbEo321OVhU7dRO2//nYq5QPnFuWyPqZEnkkD ZHY49Ed2sKQTAEOIclx/iM3ahyQ8m10w1NuXz25zmpFyh23g4nhovbFXD+tGkUljO4rHmP t/GIRcqiX3v2hpm/9EY+qstdxmpLJg3+U41SOoics/M8OOKozys/8xTt9GxG6LJNhWHO5u 1pl8bCf7YHXLsAZr8hE1DNkx4w2b5n9mhtQ6n8xphjHSbOJ9GsSVDckjIfVAgSxpvZxes/ JejK/MOhPh6wzZjj8/lZkcLIPQFe3KCDWPzCp/V1SgZ+qWPpqtwTnpVsc02e6A== From: Louis Chauvet Date: Sat, 27 Jun 2026 05:30:32 +0200 Subject: [PATCH v5 15/38] 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: <20260627-vkms-all-config-v5-15-854aa0840926@bootlin.com> References: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> In-Reply-To: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet , Shuah Khan , Miguel Ojeda , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt Cc: Luca Ceresoli , Kory Maincent , 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 , llvm@lists.linux.dev X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=10486; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=NarIrCRkwgiYb1oHyqPXSucjITVVxh28lMl41rAyZCM=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBqP0PeQDbAwRVleLesCgxiNVpzHYN3lsu0P8bhQ Bh56yvT1Y6JAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaj9D3hsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDIACgkQIK0uxlsQLOIbBhAAnmBBOjPKtf4AqbZrhsoaRUdu/ZsPS3i oHEkWKGQPGTcbAYdHF3XN/6Pl5urGrOS5U/Z9utRlm4tRppxu7SHO55mHaUKIUdabliMZ7zJ7bz /YT/tJ93eWPZdxwHq3RkNYG876GnLZwRt9hZrKmZlNhTPPOvXS2O52YFfaoqc67DZCnhdFnZvbd iCzfVOE5jEAWvpdL8AzFWk1bwOUWfE2IjVkyR724umzslVw9oNRPZcmeEpjB4cjwLI8u9fvT82u uskySlnvpD1r4X4tnSZBvS8ZdP3puFb9wRkRtIQw0U2+ZQ0AOqdk3iaxhEjgbvb5Nx6/m2M0IDG H7qyN2mo8BH4zbVw9c4OO1uUO8xOOocYSNjKtXq3oXMgLojTvm4Fln83QB01w6T9nYhBRtCI+4p 6zcQ4/VjlatTUfWjllTfp9PgnOX1gfSQXJXxRmuMxPnyv9D6UUPBuLcVPlTKQyISGOCAc6i03g5 hTbaU0D+lFiy1qTnAHkoO26iiFDO+pgoXc6aa9Pm/QDw5oxGUXObZwuxGgzjONVl56FTXbdaerw KktCcU+JR4YA+TB0WjhiBU6tTc3mTUMnkaLTztVRSIZPJ8zyAkMSx6rlISSXU4SLz/ZMcUQbVFi aOwGRDVCzcX+P8FZHC9N+eKdHAl2qac4os8DYhJVULBw1D+G7YXE= X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 VKMS driver supports all the rotation on planes, but for testing it can be useful to only advertise few of them. This new configuration interface will allow configuring the rotation per planes. Reviewed-by: Luca Ceresoli Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/tests/vkms_config_test.c | 46 +++++++++++++++++++++ drivers/gpu/drm/vkms/vkms_config.c | 38 +++++++++++++++++ drivers/gpu/drm/vkms/vkms_config.h | 59 +++++++++++++++++++++++= ++++ drivers/gpu/drm/vkms/vkms_plane.c | 5 ++- 4 files changed, 146 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/vkms/tests/vkms_config_test.c b/drivers/gpu/dr= m/vkms/tests/vkms_config_test.c index 1e4ea1863420..c33fe737678f 100644 --- a/drivers/gpu/drm/vkms/tests/vkms_config_test.c +++ b/drivers/gpu/drm/vkms/tests/vkms_config_test.c @@ -1,5 +1,6 @@ // SPDX-License-Identifier: GPL-2.0+ =20 +#include #include =20 #include "../vkms_config.h" @@ -185,6 +186,12 @@ static void vkms_config_test_default_config(struct kun= it *test) n_possible_crtcs++; } KUNIT_EXPECT_EQ(test, n_possible_crtcs, 1); + KUNIT_EXPECT_EQ(test, + vkms_config_plane_get_supported_rotations(plane_cfg), + DRM_MODE_ROTATE_MASK | DRM_MODE_REFLECT_MASK); + KUNIT_EXPECT_EQ(test, + vkms_config_plane_get_default_rotation(plane_cfg), + DRM_MODE_ROTATE_0); } =20 /* Encoders */ @@ -481,6 +488,44 @@ static void vkms_config_test_valid_plane_type(struct k= unit *test) vkms_config_destroy(config); } =20 +static void vkms_config_test_valid_plane_rotations(struct kunit *test) +{ + struct vkms_config *config; + struct vkms_config_plane *plane_cfg; + + config =3D vkms_config_default_create(false, false, false, false); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); + + plane_cfg =3D get_first_plane(config); + + /* Valid, no rotation, no reflection */ + vkms_config_plane_set_supported_rotations(plane_cfg, DRM_MODE_ROTATE_0); + vkms_config_plane_set_default_rotation(plane_cfg, DRM_MODE_ROTATE_0); + KUNIT_EXPECT_TRUE(test, vkms_config_valid_plane_rotation(config, plane_cf= g)); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Invalid, default rotation is not supported */ + vkms_config_plane_set_supported_rotations(plane_cfg, DRM_MODE_ROTATE_0); + vkms_config_plane_set_default_rotation(plane_cfg, DRM_MODE_ROTATE_90); + KUNIT_EXPECT_FALSE(test, vkms_config_valid_plane_rotation(config, plane_c= fg)); + KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); + + /* Invalid, supported rotations must contains at least one rotation */ + vkms_config_plane_set_supported_rotations(plane_cfg, DRM_MODE_REFLECT_MAS= K); + vkms_config_plane_set_default_rotation(plane_cfg, DRM_MODE_REFLECT_X | DR= M_MODE_ROTATE_0); + KUNIT_EXPECT_FALSE(test, vkms_config_valid_plane_rotation(config, plane_c= fg)); + KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); + + /* Invalid, default rotation must contains at least one rotation */ + vkms_config_plane_set_supported_rotations(plane_cfg, + DRM_MODE_REFLECT_MASK | DRM_MODE_ROTATE_0); + vkms_config_plane_set_default_rotation(plane_cfg, DRM_MODE_REFLECT_X); + KUNIT_EXPECT_FALSE(test, vkms_config_valid_plane_rotation(config, plane_c= fg)); + KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); + + vkms_config_destroy(config); +} + static void vkms_config_test_valid_plane_possible_crtcs(struct kunit *test) { struct vkms_config *config; @@ -1003,6 +1048,7 @@ static struct kunit_case vkms_config_test_cases[] =3D= { KUNIT_CASE(vkms_config_test_get_connectors), KUNIT_CASE(vkms_config_test_invalid_plane_number), KUNIT_CASE(vkms_config_test_valid_plane_type), + KUNIT_CASE(vkms_config_test_valid_plane_rotations), KUNIT_CASE(vkms_config_test_valid_plane_possible_crtcs), KUNIT_CASE(vkms_config_test_invalid_crtc_number), KUNIT_CASE(vkms_config_test_invalid_encoder_number), diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index 54994f3c8e14..5c86eb24fedf 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -4,6 +4,7 @@ #include =20 #include +#include #include #include #include @@ -150,6 +151,33 @@ static bool valid_plane_number(const struct vkms_confi= g *config) return true; } =20 +VISIBLE_IF_KUNIT +bool vkms_config_valid_plane_rotation(const struct vkms_config *config, + const struct vkms_config_plane *plane_cfg) +{ + struct drm_device *dev =3D config->dev ? &config->dev->drm : NULL; + + if ((vkms_config_plane_get_default_rotation(plane_cfg) & + vkms_config_plane_get_supported_rotations(plane_cfg)) !=3D + vkms_config_plane_get_default_rotation(plane_cfg)) { + drm_info(dev, "Configured default rotation is not supported by the plane= \n"); + return false; + } + + if ((vkms_config_plane_get_default_rotation(plane_cfg) & DRM_MODE_ROTATE_= MASK) =3D=3D 0) { + drm_info(dev, "Configured default rotation must contains at least one po= ssible rotation\n"); + return false; + } + + if ((vkms_config_plane_get_supported_rotations(plane_cfg) & DRM_MODE_ROTA= TE_MASK) =3D=3D 0) { + drm_info(dev, "Configured supported rotations must contains at least one= possible rotation\n"); + return false; + } + + return true; +} +EXPORT_SYMBOL_IF_KUNIT(vkms_config_valid_plane_rotation); + static bool valid_planes_for_crtc(const struct vkms_config *config, struct vkms_config_crtc *crtc_cfg) { @@ -307,6 +335,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; @@ -408,6 +442,10 @@ struct vkms_config_plane __must_check *vkms_config_cre= ate_plane(struct vkms_conf if (ret) goto cleanup_plane_cfg; =20 + 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 e34f4cbfe8b8..b5884ac0f42f 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -40,6 +40,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 @@ -51,6 +53,8 @@ struct vkms_config_plane { =20 const char *name; enum drm_plane_type type; + unsigned int default_rotation; + unsigned int supported_rotations; struct xarray possible_crtcs; bool default_pipeline; =20 @@ -317,6 +321,61 @@ vkms_config_plane_set_default_pipeline(struct vkms_con= fig_plane *plane_cfg, plane_cfg->default_pipeline =3D default_pipeline; } =20 +/** + * vkms_config_plane_get_default_rotation() - Get the default rotation for= a plane + * @plane_cfg: Plane to get the default rotation from + * + * Returns: + * The default rotation for the plane. + */ +static inline unsigned int +vkms_config_plane_get_default_rotation(const struct vkms_config_plane *pla= ne_cfg) +{ + return plane_cfg->default_rotation; +} + +/** + * vkms_config_plane_set_default_rotation() - Set the default rotation for= a plane + * @plane_cfg: Plane to set the default rotation to + * @default_rotation: New default rotation for the plane + */ +static inline void +vkms_config_plane_set_default_rotation(struct vkms_config_plane *plane_cfg, + unsigned int default_rotation) +{ + plane_cfg->default_rotation =3D default_rotation; +} + +/** + * vkms_config_plane_get_supported_rotations() - Get the supported rotatio= ns for a plane + * @plane_cfg: Plane to get the supported rotations from + * + * Returns: + * The supported rotations for the plane. + */ +static inline unsigned int +vkms_config_plane_get_supported_rotations(const struct vkms_config_plane *= plane_cfg) +{ + return plane_cfg->supported_rotations; +} + +/** + * vkms_config_plane_set_supported_rotations() - Set the supported rotatio= ns for a plane + * @plane_cfg: Plane to set the supported rotations to + * @supported_rotations: New supported rotations for the plane + */ +static inline void +vkms_config_plane_set_supported_rotations(struct vkms_config_plane *plane_= cfg, + unsigned int supported_rotations) +{ + plane_cfg->supported_rotations =3D supported_rotations; +} + +#if IS_ENABLED(CONFIG_KUNIT) +bool vkms_config_valid_plane_rotation(const struct vkms_config *config, + const struct vkms_config_plane *plane_cfg); +#endif + /** * vkms_config_plane_set_name() - Set the plane name * @plane_cfg: Plane to set the name to diff --git a/drivers/gpu/drm/vkms/vkms_plane.c b/drivers/gpu/drm/vkms/vkms_= plane.c index f35120203124..8a64ea41734b 100644 --- a/drivers/gpu/drm/vkms/vkms_plane.c +++ b/drivers/gpu/drm/vkms/vkms_plane.c @@ -235,8 +235,9 @@ struct vkms_plane *vkms_plane_init(struct vkms_device *= vkmsdev, =20 drm_plane_helper_add(&plane->base, &vkms_plane_helper_funcs); =20 - drm_plane_create_rotation_property(&plane->base, DRM_MODE_ROTATE_0, - DRM_MODE_ROTATE_MASK | DRM_MODE_REFLECT_MASK); + drm_plane_create_rotation_property(&plane->base, + vkms_config_plane_get_default_rotation(plane_cfg), + vkms_config_plane_get_supported_rotations(plane_cfg)); =20 drm_plane_create_color_properties(&plane->base, BIT(DRM_COLOR_YCBCR_BT601) | --=20 2.54.0 From nobody Sat Jun 27 22:18:04 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 055A333067F; Sat, 27 Jun 2026 03:31:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531092; cv=none; b=Szpcbc6rJ9KIr3b922tx85itkAARGbiO9bYOP6OAsArIHy7AD6w52kV+fXBr/OnEdLtGjOaEP6xqBJ+JXNLBS4I//hghLCF//55vY7z+a8P8neDG+1atMKZ0RDNCBXBVIsFlQuuL0bs0ngEFJaG1nv7iJVcvxUkOYkItR/HiZTU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531092; c=relaxed/simple; bh=mRSqoUGmy2p732uiUceNdBnrTLFMu66qquxwXRZoWz0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=YyIDiUq19dIjxNOAer+L6Nd2lPtNr3wFf2tmMbxnOBhIwnkrW02dEkqu9HIS/SPfamIg0aPCxOVcVvphaz+SVdXHEGnuvb1xzTkGQLvY301NEGvmxR3N/tq9+Rt2P6J7CVShlpPPIqQ3ruGGaEdN4cG0Z8iklm1+W3N+8mXNhsE= 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=etS9hEFo; 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="etS9hEFo" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id E59FAC5CD7D; Sat, 27 Jun 2026 03:31:37 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id D536F60233; Sat, 27 Jun 2026 03:31:28 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 8D491106F1167; Sat, 27 Jun 2026 05:31:25 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1782531087; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=cW7Vp+Ww0BHKeSJTjS4TB9rMtbkv5BfsUgPd2jn2qL4=; b=etS9hEFo8FXg8crsFqFPG5PHd2LHyzwxfAEuX+xDrIJlTwkrtJ42bKNk1OKPHF+bp52j6s SGEHufuYaNrmJVBYM7fk35RrMZD7OU9vyiqqWbTeEDOY4hmsZAB5QJzB3RQ6ZwXVFnCSlf pfz0eC63UDmiv2Ai0/YqJ4EbcGHqRhdp5vpSvh97oXc/3MeJYVhqBIFhcuDB8yLRmQgIO0 AG9UUHSq7pNRQurkOVbTSizVqfvcBkNtrzaTFn71mylkK8ndFVrSz4UoLB5br26BGCmS/w BTCZYUgGJgHvA/XkZZgVH9iwX1Qir4nqwo6QA3SPLbiTxHP3pGZ+oHPjD6r68g== From: Louis Chauvet Date: Sat, 27 Jun 2026 05:30:33 +0200 Subject: [PATCH v5 16/38] drm/vkms: Use DRM_ROTATION_FMT macros for rotation display 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: <20260627-vkms-all-config-v5-16-854aa0840926@bootlin.com> References: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> In-Reply-To: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet , Shuah Khan , Miguel Ojeda , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt Cc: Luca Ceresoli , Kory Maincent , 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 , llvm@lists.linux.dev X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1294; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=mRSqoUGmy2p732uiUceNdBnrTLFMu66qquxwXRZoWz0=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBqP0Pea+CRmukZQmcQ579p36VF8zMX6xh0xQoML vWGaM9sWGuJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaj9D3hsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDIACgkQIK0uxlsQLOI4jw/8Ccevri0r8ORDusswYP69rhtCM5CPILO N/72cm0g319PruVZOoTj/1NiRlE7c/4nIKqtJLN4mFFB8I3VNvVglR0agy5U4N+77Z0qTbiJchO nNXmQtTGbIC9uAXiEnGshf6DtnimHaZcVyRo5sTMVpt7EioXg+h57nNS3uMG/MMSUFEqkJBW0r1 cqZFmm/qCRY25TBdR3D+HHogxA3NKUqt+OAsrXmX8aTsXPOJCwMV88HNJrL92iIwznha4D+T5vZ WAQMfYQecIrmacsPFhBkitUlwJIF+xGLWtrbRE8b8MSn7RL/9FoKqiuUrmME3IJljJVeRDA3jRL QYKw68nyHXzIohljol3xkW0f8SY8sk6vtcVxcniShPB91lvO9/0noiLDAqhPy4FhYB1dzKXBjVw eS8BDEEBeJ+2MZ4ARoZ3aD90qhq9ScevwUdJyEgU9V49sCtxNwWy5l4QOJzTkry06ebr3kC2sAy PxIcYFeWd/M+XSU2jHuF/q0zo88M+vNY9PAnUWkVkukRjH2EWxk6Sx78VfZyqxbn4rjoC/U0pgR RDM6qQEdGrytpla1fEOfearZc8opA5NfQwsfcFtnPM0LNxiVQPQvr0WkSGuI1y3fESuCHCsQLog wn9U8pPQrzxR9hrfvtijY7cJfCxK5izPG2Sqdb+JZCIHhNPjKZYg= X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Replace show_bitfield calls for rotation/reflection with the new DRM_ROTATION_FMT / DRM_ROTATION_FMT_ARGS macros for cleaner code. Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/vkms_config.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index 5c86eb24fedf..ca3ee3aa2c41 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 @@ -393,6 +394,10 @@ static int vkms_config_show(struct seq_file *m, void *= data) seq_printf(m, "\tname=3D%s\n", vkms_config_plane_get_name(plane_cfg) ? vkms_config_plane_get_name(plane_cfg) : "(null)"); + seq_printf(m, "\tsupported rotations=3D" DRM_ROTATION_FMT "\n", + DRM_ROTATION_FMT_ARGS(vkms_config_plane_get_supported_rotations(plan= e_cfg))); + seq_printf(m, "\tdefault rotation=3D" DRM_ROTATION_FMT "\n", + DRM_ROTATION_FMT_ARGS(vkms_config_plane_get_default_rotation(plane_c= fg))); } =20 vkms_config_for_each_crtc(vkmsdev->config, crtc_cfg) { --=20 2.54.0 From nobody Sat Jun 27 22:18:04 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 7793F331EC7 for ; Sat, 27 Jun 2026 03:31:32 +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=1782531094; cv=none; b=UsgQTU+9y2kMLTZh5Jk7djaqndQnt5szvaoTWd8gfndYoYd0dU/+N43NxZGAax5YBsydPIuC1dMFswiVhXCD/oXRwzjGV5oKIbtsEMC+pIMs6iSa5PYDrgh1m2P8TRTsfIMWTr4J2KpGKC4rm/TZdWuHrP1kMgZajZWZe+jM1vs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531094; c=relaxed/simple; bh=tiBEbL/cEHj9K2EzjS6vr29yI7czHvaqFN6BvczPkKo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Tp1gV0Y5z9nH/vwdFvabb5Ez9z9vEE0U6F4edzLrGbmDR3xRfX0Cod405NhJ4Ej/mHDiT/N+yTbaGj4Zj/dh7HPU2AH8cH21xEnptwsWLi+YFqRAaiBzliojl56aUhL4lT7+bUHR0lauxsTADt43PInJb/U0UMx57Mq/j4wpu0I= 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=MVA5GU6S; 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="MVA5GU6S" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 5B612C5CD7C; Sat, 27 Jun 2026 03:31:40 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 4B83660233; Sat, 27 Jun 2026 03:31:31 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id C061A106F116D; Sat, 27 Jun 2026 05:31:27 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1782531090; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=FoeeUjn16g+ewrkXP5ZPPtstz5F9GpDjJEaSyOefypU=; b=MVA5GU6SkRee2iC1z6UdluaW7g3LuW2MmonVUK6hQB8Vih3i5/bq0u82W13U5hLvWn7YFU Qk29Q9aqrMBOwSzvNkVVCwzFV2XbAQja0KvtMY2L0Jydr9eZLcLhcTYpO9c1AYnQoQDXAy H1XFPAVkStEA/IeJDsZbpnygiBDDv7yqXa23TVlAUmVi+H6xqGiYAL+ikYnoBbQQhOaeuH uy/ItqvF6ZWlPJHO8LoXi8yOi3Gwvd9+GGQsOY7qbWVUwE//Gi5JeuSKaCgnA7c8ObASau Rwv2p+1od/d2PNeyocBi/02ntytM52RdsO3yd3olVXmJE1Yn8fvD1Itx1hY1Jg== From: Louis Chauvet Date: Sat, 27 Jun 2026 05:30:34 +0200 Subject: [PATCH v5 17/38] 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: <20260627-vkms-all-config-v5-17-854aa0840926@bootlin.com> References: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> In-Reply-To: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet , Shuah Khan , Miguel Ojeda , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt Cc: Luca Ceresoli , Kory Maincent , 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 , llvm@lists.linux.dev X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=5601; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=tiBEbL/cEHj9K2EzjS6vr29yI7czHvaqFN6BvczPkKo=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBqP0Pf5grHGeeV8KYT7GlBlhZgud/xD36bSXLeS tmGJafuEpiJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaj9D3xsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDIACgkQIK0uxlsQLOKflxAAjWJvntAmZjwzCqQfxB+eDvVWqz3NeHt C25SFwo8eb5dlv54C/96Yjf28GK6g1rbHoe5+Id0Gk4TFCwALhz6YF2iuCc/JCmEY2oALEJXCzX sqiHzDFiUyD47A6H4WJavSTYtUqQoDlTU0DZ+EshCMGhN3g10Ku+955pgSrCDwaeoGKtJ4dKWAj hh2IXRQent9TdUO5AguFnKw6TrVHqUcaBUb5j/A8vVIhGGX+oV7kQiVC0Is56s6jsfoWzRpyIa5 97VCJ9NxUZBjTKyedPGxjjLgkUaHDEbv4BWCruSe8blmINieXNCJIAsSlBkwNAuZ8s+6x9DBG3w 4Y9zhRms6Jmj8gX0DZA/E+qijmmOg4ssS5o4BELQWkXY5cuJ+iG3eJgKpx3vpO/oFcKodOXxF9F P0FHM2ESqB8siVZLsohL4S2f9Z8Qr5WqQ1G+fomaghw9XxM81QJn34AjjYpxejU5IMWh1siLw2L 01Xy6Zpk3MhRM2tEx41Q+D21sM/qjy/0nB5gkg8uHR3ogjpVLCfmVUKLu0/HjKZksG94OTEeIZM pAGWMmu5Ww5GeK9Z8qxrskTiG2MhaQjq97uA/sE5YvqN0+Ul5XTNzuQJ3y5K6LDo2DMkV0B7T5+ z4jqfl3+scLbSqFTkrx0ohJW90R4yn/qZehhz9xb3ueMFDRrt5k8= X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 To allows the userspace to test many hardware configurations, introduce a new interface to configure the available rotation per planes. VKMS supports any rotation and reflection, so the userspace can choose any combination. The supported rotations are configured by writing a rotation bitmask to the file `supported_rotations` and the default rotation is chosen by writing a rotation bitmask to `default_rotation`. Signed-off-by: Louis Chauvet --- Documentation/ABI/testing/configfs-vkms | 15 ++++++ Documentation/gpu/vkms.rst | 7 ++- drivers/gpu/drm/vkms/vkms_configfs.c | 82 +++++++++++++++++++++++++++++= ++++ 3 files changed, 103 insertions(+), 1 deletion(-) diff --git a/Documentation/ABI/testing/configfs-vkms b/Documentation/ABI/te= sting/configfs-vkms index a1a3e186e50a..7820da8505ef 100644 --- a/Documentation/ABI/testing/configfs-vkms +++ b/Documentation/ABI/testing/configfs-vkms @@ -103,6 +103,21 @@ Description: Plane type. Possible values: 0 - overlay, 1 - primary, 2 - cursor. =20 +What: /sys/kernel/config/vkms//planes//supported_rotations +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Available rotations for the plane, as a bitmask: + 0x01 - no rotation, 0x02 - rotate 90=C2=B0, 0x04 - rotate 180=C2=B0, + 0x08 - rotate 270=C2=B0, 0x10 - reflect x, 0x20 - reflect y. + +What: /sys/kernel/config/vkms//planes//default_rotation +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Default rotation presented to userspace, same values as + possible_rotations. + What: /sys/kernel/config/vkms//planes//possible_crtcs Date: Nov 2025 Contact: dri-devel@lists.freedesktop.org diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index 1e79e62a6bc4..610305483716 100644 --- a/Documentation/gpu/vkms.rst +++ b/Documentation/gpu/vkms.rst @@ -87,10 +87,15 @@ Start by creating one or more planes:: =20 sudo mkdir /config/vkms/my-vkms/planes/plane0 =20 -Planes have 1 configurable attribute: +Planes have 3 configurable attributes: =20 - type: Plane type: 0 overlay, 1 primary, 2 cursor (same values as those exposed by the "type" property of a plane) +- supported_rotations: Available rotation for a plane, as a bitmask: 0x01 = no rotation, + 0x02 rotate 90=C2=B0, 0x04 rotate 180=C2=B0, 0x08 rotate 270=C2=B0, 0x10= reflect x, 0x20 reflect y + (same values as those exposed by the "rotation" property of a plane) +- default_rotation: Default rotation presented to the userspace, same valu= es as + supported_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 0744ac40814d..47b3a4aeee8d 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -324,10 +324,92 @@ static ssize_t plane_type_store(struct config_item *i= tem, 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 =3D plane_item_to_vkms_configfs_plane(i= tem); + unsigned int plane_supported_rotations; + + scoped_guard(mutex, &plane->dev->lock) + plane_supported_rotations =3D vkms_config_plane_get_supported_rotations(= plane->config); + + return sprintf(page, "%u", plane_supported_rotations); +} + +static ssize_t plane_supported_rotations_store(struct config_item *item, + const char *page, size_t count) +{ + struct vkms_configfs_plane *plane =3D plane_item_to_vkms_configfs_plane(i= tem); + int ret, val =3D 0; + + ret =3D kstrtouint(page, 0, &val); + if (ret) + return ret; + + /* Should be a supported value */ + if (val & ~(DRM_MODE_ROTATE_MASK | DRM_MODE_REFLECT_MASK)) + return -EINVAL; + /* Should at least provide one rotation */ + if (!(val & DRM_MODE_ROTATE_MASK)) + return -EINVAL; + + scoped_guard(mutex, &plane->dev->lock) { + if (plane->dev->enabled) + return -EBUSY; + + vkms_config_plane_set_supported_rotations(plane->config, val); + } + + return count; +} + +static ssize_t plane_default_rotation_show(struct config_item *item, char = *page) +{ + struct vkms_configfs_plane *plane =3D plane_item_to_vkms_configfs_plane(i= tem); + unsigned int plane_default_rotation; + + scoped_guard(mutex, &plane->dev->lock) { + plane_default_rotation =3D vkms_config_plane_get_default_rotation(plane-= >config); + } + + return sprintf(page, "%u", plane_default_rotation); +} + +static ssize_t plane_default_rotation_store(struct config_item *item, + const char *page, size_t count) +{ + struct vkms_configfs_plane *plane =3D plane_item_to_vkms_configfs_plane(i= tem); + int ret, val =3D 0; + + ret =3D kstrtouint(page, 10, &val); + if (ret) + return ret; + + /* Should be a supported value */ + if (val & ~(DRM_MODE_ROTATE_MASK | DRM_MODE_REFLECT_MASK)) + return -EINVAL; + + /* Should contain exactly one rotation */ + if (!is_power_of_2(val & DRM_MODE_ROTATE_MASK)) + return -EINVAL; + + scoped_guard(mutex, &plane->dev->lock) { + if (plane->dev->enabled) + return -EBUSY; + + vkms_config_plane_set_default_rotation(plane->config, val); + } + + return count; +} + CONFIGFS_ATTR(plane_, type); +CONFIGFS_ATTR(plane_, supported_rotations); +CONFIGFS_ATTR(plane_, default_rotation); =20 static struct configfs_attribute *plane_item_attrs[] =3D { &plane_attr_type, + &plane_attr_supported_rotations, + &plane_attr_default_rotation, NULL, }; =20 --=20 2.54.0 From nobody Sat Jun 27 22:18:04 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 CD40B33A03A for ; Sat, 27 Jun 2026 03:31:34 +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=1782531096; cv=none; b=kGs1hTt6jXXSekOQWwbTD1XrRqzbvWjL54Wsp7klS3akl81esvYWMIJhl+dEM5YjdSDcUFZ2bdE9zctrwYgFxWXvP9RJxP+UzFfgHUoxuENI095XjIIJi1qHiWntGMCjGIL5OTzq0BY1Z7S0c5lwobMs/t7csueOWwTGwb0Kflg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531096; c=relaxed/simple; bh=xTGnxuR1UT3OkjaxMo3v7pCbGaPFAW+4oxjj9M1RJTU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=S8of8oiYb2LGX9wZ7m5Ph9XPHw/uMZNyxNPCRmB14mgMXl1tMNU5tseRwxMurDsNp4WKQA0Rx9SUdKJBi842uS+XoSXkJjG3RUDqo2FtI8z5ZnP/gBkSnc1sbme2ag8fMIGSu8g8rc8cz3hse6lafHgj/UBvVF9o7zqSb+OU+Ao= 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=g9+OTtEb; 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="g9+OTtEb" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id A1900C5CD7D; Sat, 27 Jun 2026 03:31:42 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 91D3960233; Sat, 27 Jun 2026 03:31:33 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 444C9106F116F; Sat, 27 Jun 2026 05:31:30 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1782531092; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=TyNYLizTfig+nL86keBoqBgbkICwYqdWla4FKgIoFTU=; b=g9+OTtEbI2QJq7boUJskpcjx5Nnbk1eypm364rCQt4+6xtVI1gueDVAGpbgdhE0+u49VPL yfu2yvaq+iPJd4y6cy1zKA3+9MLEPCj/59G91jyksbr6aIz/k7WODoGAH6N89LwfsYsBef XML70oRGIJPzlyLLPwwbLZMThqiitA9isJsX0xp8sbUiWY6mlIFubk6BRdEu3Em4viscDQ iboTFHDcyYvXbJstF65i7ZLZUloTEUnF7Thxq3nB5sK1jrFmXotVKZUazSX2/KL2947IVg fe8w98D7LVOXpOqlrr6qAs7jdt4r4idYoB9v+jbIknLE5vYKEhjSyFyFbVZkNA== From: Louis Chauvet Date: Sat, 27 Jun 2026 05:30:35 +0200 Subject: [PATCH v5 18/38] 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: <20260627-vkms-all-config-v5-18-854aa0840926@bootlin.com> References: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> In-Reply-To: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet , Shuah Khan , Miguel Ojeda , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt Cc: Luca Ceresoli , Kory Maincent , 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 , llvm@lists.linux.dev X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=12555; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=xTGnxuR1UT3OkjaxMo3v7pCbGaPFAW+4oxjj9M1RJTU=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBqP0Pf7+9Twp9yaMHA0jV6me4klyRK4ehYactsU 2BDoMkwInKJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaj9D3xsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDIACgkQIK0uxlsQLOKCjxAAjQLIX5YKqmTNr5TzfYS7GO8OEhrAYu7 0DjOha7F62YKEZyj6V+UQoY/Om6Ye20waUd50mirAM+nQnzgyDw/HPZRHeznAgJ8/CA2FRjSV60 RvgTxtnCmOlpdHKO6EDZ9eARRhcqJSx3UVEX9J7QWvw5eZuH76hXOo7987HcqqDcvy9YZ+EY8Zu RRVkI+99lhoEgFjltUNk32TAwEOS4gc6zP3CKWi4i4sMYvORHcBkNhsA1Jv8GEo09xKwfXGWCDe gVJ+6+5tnHon+frQ4xEoO7ytakjKk4mkVC30JTMOF+hWX9O2vLMI77C9dVKSB7Rb9itoUlGBJKw ZIhSSCOQ/D6uP2RpICXBUR+dAnR7+Zdh0kf7LqI0wZGmPtPtgEEKEycYaL8dkWzv1V64W7w0U/V vcIp25a8gH8BF0hFwCEDWK9w6b92QmlFzX+RWLFvdap2iyIuzt5K0FgviITYg12wrdzAox+6aAG KIb696AhNjLTt618+LhPJVTqVJrbAvMOI2nmjyMGqyLO3HdAOIR1vqQDQEP/U3KXS/Bnm2GiP5z iqPhUxqB9qD9LzwpZIIwhftr1CMJ9A5K3yKkQTCL2MRpI4iurS6M1Xcy+/YDz6BiIf6cNgkLBG0 NwO435DnRR4Kl+cbGZvp4tiwkXPI2+OZxYEVCpgwmiDdYgaP2nRE= 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 | 48 ++++++++++++++++++++ drivers/gpu/drm/vkms/vkms_config.h | 64 +++++++++++++++++++++++= ++++ drivers/gpu/drm/vkms/vkms_plane.c | 15 +++---- 4 files changed, 170 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/vkms/tests/vkms_config_test.c b/drivers/gpu/dr= m/vkms/tests/vkms_config_test.c index c33fe737678f..a2a3f1a106a3 100644 --- a/drivers/gpu/drm/vkms/tests/vkms_config_test.c +++ b/drivers/gpu/drm/vkms/tests/vkms_config_test.c @@ -192,6 +192,14 @@ static void vkms_config_test_default_config(struct kun= it *test) KUNIT_EXPECT_EQ(test, vkms_config_plane_get_default_rotation(plane_cfg), DRM_MODE_ROTATE_0); + KUNIT_EXPECT_EQ(test, + vkms_config_plane_get_supported_color_encodings(plane_cfg), + BIT(DRM_COLOR_YCBCR_BT601) | + BIT(DRM_COLOR_YCBCR_BT709) | + BIT(DRM_COLOR_YCBCR_BT2020)); + KUNIT_EXPECT_EQ(test, + vkms_config_plane_get_default_color_encoding(plane_cfg), + DRM_COLOR_YCBCR_BT601); } =20 /* Encoders */ @@ -526,6 +534,48 @@ static void vkms_config_test_valid_plane_rotations(str= uct kunit *test) vkms_config_destroy(config); } =20 +static void vkms_config_test_valid_plane_color_encoding(struct kunit *test) +{ + struct vkms_config *config; + struct vkms_config_plane *plane_cfg; + + config =3D vkms_config_default_create(false, false, false, false); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); + + plane_cfg =3D get_first_plane(config); + + /* Valid, all color encoding supported */ + vkms_config_plane_set_supported_color_encodings(plane_cfg, + BIT(DRM_COLOR_YCBCR_BT601) | + BIT(DRM_COLOR_YCBCR_BT709) | + BIT(DRM_COLOR_YCBCR_BT2020)); + vkms_config_plane_set_default_color_encoding(plane_cfg, DRM_COLOR_YCBCR_B= T601); + KUNIT_EXPECT_TRUE(test, vkms_config_valid_plane_color_encoding(config, pl= ane_cfg)); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Invalid, default color encoding is not supported */ + vkms_config_plane_set_supported_color_encodings(plane_cfg, + BIT(DRM_COLOR_YCBCR_BT601) | + BIT(DRM_COLOR_YCBCR_BT2020)); + vkms_config_plane_set_default_color_encoding(plane_cfg, DRM_COLOR_YCBCR_B= T709); + KUNIT_EXPECT_FALSE(test, vkms_config_valid_plane_color_encoding(config, p= lane_cfg)); + KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); + + /* Valid, no supported or color encoding */ + vkms_config_plane_set_supported_color_encodings(plane_cfg, 0); + vkms_config_plane_set_default_color_encoding(plane_cfg, 0); + KUNIT_EXPECT_TRUE(test, vkms_config_valid_plane_color_encoding(config, pl= ane_cfg)); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Valid, if no supported color encoding, default is ignored */ + vkms_config_plane_set_supported_color_encodings(plane_cfg, 0); + vkms_config_plane_set_default_color_encoding(plane_cfg, DRM_COLOR_YCBCR_B= T601); + KUNIT_EXPECT_TRUE(test, vkms_config_valid_plane_color_encoding(config, pl= ane_cfg)); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + vkms_config_destroy(config); +} + static void vkms_config_test_valid_plane_possible_crtcs(struct kunit *test) { struct vkms_config *config; @@ -1049,6 +1099,7 @@ static struct kunit_case vkms_config_test_cases[] =3D= { KUNIT_CASE(vkms_config_test_invalid_plane_number), KUNIT_CASE(vkms_config_test_valid_plane_type), KUNIT_CASE(vkms_config_test_valid_plane_rotations), + KUNIT_CASE(vkms_config_test_valid_plane_color_encoding), KUNIT_CASE(vkms_config_test_valid_plane_possible_crtcs), KUNIT_CASE(vkms_config_test_invalid_crtc_number), KUNIT_CASE(vkms_config_test_invalid_encoder_number), diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index ca3ee3aa2c41..2fa467f5e17e 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -179,6 +179,25 @@ bool vkms_config_valid_plane_rotation(const struct vkm= s_config *config, } EXPORT_SYMBOL_IF_KUNIT(vkms_config_valid_plane_rotation); =20 +VISIBLE_IF_KUNIT +bool vkms_config_valid_plane_color_encoding(const struct vkms_config *conf= ig, + const struct vkms_config_plane *plane_cfg) +{ + struct drm_device *dev =3D config->dev ? &config->dev->drm : NULL; + + if (vkms_config_plane_get_supported_color_encodings(plane_cfg)) { + if ((BIT(vkms_config_plane_get_default_color_encoding(plane_cfg)) & + vkms_config_plane_get_supported_color_encodings(plane_cfg)) !=3D + BIT(vkms_config_plane_get_default_color_encoding(plane_cfg))) { + drm_info(dev, "Configured default color encoding is not supported by th= e plane\n"); + return false; + } + } + + return true; +} +EXPORT_SYMBOL_IF_KUNIT(vkms_config_valid_plane_color_encoding); + static bool valid_planes_for_crtc(const struct vkms_config *config, struct vkms_config_crtc *crtc_cfg) { @@ -341,6 +360,9 @@ bool vkms_config_is_valid(const struct vkms_config *con= fig) vkms_config_for_each_plane(config, plane_cfg) { if (!vkms_config_valid_plane_rotation(config, plane_cfg)) return false; + + if (!vkms_config_valid_plane_color_encoding(config, plane_cfg)) + return false; } =20 if (!valid_plane_number(config)) @@ -373,6 +395,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; @@ -398,6 +436,12 @@ static int vkms_config_show(struct seq_file *m, void *= data) DRM_ROTATION_FMT_ARGS(vkms_config_plane_get_supported_rotations(plan= e_cfg))); seq_printf(m, "\tdefault rotation=3D" DRM_ROTATION_FMT "\n", DRM_ROTATION_FMT_ARGS(vkms_config_plane_get_default_rotation(plane_c= fg))); + 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) { @@ -450,6 +494,10 @@ struct vkms_config_plane __must_check *vkms_config_cre= ate_plane(struct vkms_conf 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 b5884ac0f42f..31c1598ff866 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -46,6 +46,8 @@ struct vkms_config { * It can be used to store a temporary reference to a VKMS plane d= uring * device creation. This pointer is not managed by the configurati= on and * must be managed by other means. + * @default_color_encoding: Default color encoding that should be used by = this plane + * @supported_color_encodings: Color encodings that this plane will support */ struct vkms_config_plane { struct list_head link; @@ -55,6 +57,8 @@ struct vkms_config_plane { enum drm_plane_type type; unsigned int default_rotation; unsigned int supported_rotations; + enum drm_color_encoding default_color_encoding; + unsigned int supported_color_encodings; struct xarray possible_crtcs; bool default_pipeline; =20 @@ -376,6 +380,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 8a64ea41734b..8d3953667f21 100644 --- a/drivers/gpu/drm/vkms/vkms_plane.c +++ b/drivers/gpu/drm/vkms/vkms_plane.c @@ -239,14 +239,13 @@ struct vkms_plane *vkms_plane_init(struct vkms_device= *vkmsdev, vkms_config_plane_get_default_rotation(plane_cfg), vkms_config_plane_get_supported_rotations(plane_cfg)); =20 - drm_plane_create_color_properties(&plane->base, - BIT(DRM_COLOR_YCBCR_BT601) | - BIT(DRM_COLOR_YCBCR_BT709) | - BIT(DRM_COLOR_YCBCR_BT2020), - BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) | - BIT(DRM_COLOR_YCBCR_FULL_RANGE), - DRM_COLOR_YCBCR_BT601, - DRM_COLOR_YCBCR_FULL_RANGE); + if (vkms_config_plane_get_supported_color_encodings(plane_cfg) !=3D 0) + drm_plane_create_color_properties(&plane->base, + vkms_config_plane_get_supported_color_encodings(plane_cfg), + BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) | + BIT(DRM_COLOR_YCBCR_FULL_RANGE), + vkms_config_plane_get_default_color_encoding(plane_cfg), + DRM_COLOR_YCBCR_FULL_RANGE); =20 if (vkms_config_plane_get_default_pipeline(plane_cfg)) vkms_initialize_colorops(&plane->base); --=20 2.54.0 From nobody Sat Jun 27 22:18:04 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 5552A31282F for ; Sat, 27 Jun 2026 03:31:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531098; cv=none; b=hFAp6xbVUhcYKa1yLtl/MQkOyaGQRS5oivTw0NsHIrxWV7FtCusPfg5T3m69BlXZFAyJtHF5nRcx7E3/nWV9VBSfdzfT3Cv540F/GtjUoLrBltQNm9DmGbz9IsHRbgtHMpAWYmFD5jjnHwBJPxxj3ORPMysSj/oo/EdhI/gcfg8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531098; c=relaxed/simple; bh=QxtkbLtOuqD/8Tr9XrtQOv7lZ9IVnfRDzZjEd1wrhR8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=RpJrU6EhPUtOujie70AIx3fZ2TGkssUlKP/oD/UwaLdKX0jkPxfUl9kiJNkLxCIB+/Q82EoesDLmI0+tpl17ThPi2GBK65puqrdgS7o9BG8WRT9XzV8TZw/9sXcWvjBXBccQWvCIahRR1R1gVgZmQO6s2TZPHRlf9RTbktGbhwE= 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=U3DOTmap; 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="U3DOTmap" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 2FD34C5CD7C; Sat, 27 Jun 2026 03:31:45 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 1EB5760233; Sat, 27 Jun 2026 03:31:36 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id AA4E7106F1175; Sat, 27 Jun 2026 05:31:32 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1782531094; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=N6E5ww/MPyZisEPU9Lijrr/bZjYPcXQmEGjHBhPPG/k=; b=U3DOTmap7x5rAyWQ0bkMXMsvWxjuKGwhSSjgFbfiV2bW2xdS4qfdTcWGm4PYgSKHlTdLZ7 BmVK2Ue8YOsW3j1GiI6sNtlPYId9II8iHvF2EzGq3nEYn5AAzADXfQpVZsAgv+hnfgG9OF AIjwDtqv9wVks4YDcO+0HrLnY4TDB9Eyhk2YRAhuP4GETQWYt3EOItUG76FPj40sT/97bI 3VbIM9sibR2kJ13dDnclZk2BGuWsJawhrpf57dN7zOWykqoZSfe1qFnKicJ8pLw8TLvdAZ SPq07lQphEdFoi+nbpMMquxPuDKtfrt4qlEi+qAS9B+u9d8SSSnEdInlxI1e6g== From: Louis Chauvet Date: Sat, 27 Jun 2026 05:30:36 +0200 Subject: [PATCH v5 19/38] 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: <20260627-vkms-all-config-v5-19-854aa0840926@bootlin.com> References: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> In-Reply-To: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet , Shuah Khan , Miguel Ojeda , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt Cc: Luca Ceresoli , Kory Maincent , 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 , llvm@lists.linux.dev X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=6618; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=QxtkbLtOuqD/8Tr9XrtQOv7lZ9IVnfRDzZjEd1wrhR8=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBqP0PfxIU7vU/mxQGaEPtzGeOqN0taXxVWCGWdE hOte8ebSdaJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaj9D3xsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDIACgkQIK0uxlsQLOLXIQ/+NNl56DYvWjlElng/LAs1mIOF7jgZ5xw CTbm+oSkOmk+/BP0fHDt/bX8dE5jySdDQwtf9kkwMyXKfZmiwn1rgRtt8bR4fnCl3sOBEHWeOVB t5cgbbAKq3w2Tzn4m45FOOCo/Pq89SlHq3RVo2oGpgeRB3WWWojL/Mr+NOUXv9d/R8YDNojWSmd gvDHgzXvSbAW9ejJRW004BNWs0TQFQzHjhhz84UVmP3f1zrsNDNWPKvWRx/839s75fQFH5Xv1mP GxbsIWRZ9HpoOBiJjDPfHYTMLn9ec9wrWQnh+9vK/HylJN1F+VAi257MsYNudHrLh9XSIHyg2WE QiKcWjvAt4TzdSf3PrV8Birmu1sR/GPSaRoHC2EwEr3WXZEP4NGBMovEQrUL6tombS3Yo8xKHBz LhG6X18BMRogAMc6JNw8LTsYCloIQfHuswk7GapUflyChACUB0XPLOHwPoZdXQ9cok5Cyfg8p6l 5U7p/3JJD69mQZV4jPkPRW+hwYfv35FQrcQw/Zm6CY0F3S6Q8fdM0zol70rOQALfcuPku1xw6yE 69UB2Mc7n1+QEXbrVCp55NbpYhhV4hQV9bsd07iUQTZWaQoK079u+9z1XBeKMarbJJppgZH87Yd /RgCuBIuks8tAPnCND1pqbQHhaeM3sLyWlkXORe2rYJ76wqbNWZA= X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 To allows the userspace to test many hardware configuration, introduce a new interface to configure the available color encoding per planes. VKMS supports multiple color encoding, so the userspace can choose any combination. The supported color encoding are configured by writing a color encoding bitmask to the file `supported_color_encoding` and the default color encoding is chosen by writing a color encoding bitmask to `default_color_encoding`. Signed-off-by: Louis Chauvet --- Documentation/ABI/testing/configfs-vkms | 14 +++++ Documentation/gpu/vkms.rst | 8 ++- drivers/gpu/drm/vkms/vkms_configfs.c | 92 +++++++++++++++++++++++++++++= ++++ 3 files changed, 113 insertions(+), 1 deletion(-) diff --git a/Documentation/ABI/testing/configfs-vkms b/Documentation/ABI/te= sting/configfs-vkms index 7820da8505ef..a9ee05fe0c66 100644 --- a/Documentation/ABI/testing/configfs-vkms +++ b/Documentation/ABI/testing/configfs-vkms @@ -118,6 +118,20 @@ Description: Default rotation presented to userspace, same values as possible_rotations. =20 +What: /sys/kernel/config/vkms//planes//supported_color_enc= odings +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Available color encodings for the plane, as a bitmask: + 0x01 - YCBCR_BT601, 0x02 - YCBCR_BT709, 0x04 - YCBCR_BT2020. + +What: /sys/kernel/config/vkms//planes//default_color_encod= ing +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Default color encoding presented to userspace, same + values as supported_color_encoding. + What: /sys/kernel/config/vkms//planes//possible_crtcs Date: Nov 2025 Contact: dri-devel@lists.freedesktop.org diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index 610305483716..7206cd2b231a 100644 --- a/Documentation/gpu/vkms.rst +++ b/Documentation/gpu/vkms.rst @@ -87,7 +87,7 @@ Start by creating one or more planes:: =20 sudo mkdir /config/vkms/my-vkms/planes/plane0 =20 -Planes have 3 configurable attributes: +Planes have 5 configurable attributes: =20 - type: Plane type: 0 overlay, 1 primary, 2 cursor (same values as those exposed by the "type" property of a plane) @@ -96,6 +96,12 @@ Planes have 3 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 supported_rotations. +- supported_color_encodings: Available encodings for a plane, as a bitmask: + 0x01 YCBCR_BT601, 0x02 YCBCR_BT709, 0x04 YCBCR_BT2020 (same values as th= ose exposed + by the COLOR_ENCODING property of a plane). If set, supported_color_range + must be set too. +- default_color_encoding: Default color encoding presented to the userspac= e, same + values as supported_color_encodings =20 Continue by creating one or more CRTCs:: =20 diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vk= ms_configfs.c index 47b3a4aeee8d..c1d1841b2c5a 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -9,6 +9,14 @@ #include "vkms_configfs.h" #include "vkms_connector.h" =20 +/** + * VKMS_SUPPORTED_COLOR_ENCODINGS - Bitmask of all supported color encodin= gs in VKMS + */ +#define VKMS_SUPPORTED_COLOR_ENCODINGS ( \ + BIT(DRM_COLOR_YCBCR_BT601) | \ + BIT(DRM_COLOR_YCBCR_BT709) | \ + BIT(DRM_COLOR_YCBCR_BT2020)) + /* To avoid registering configfs more than once or unregistering on error = */ static bool is_configfs_registered; =20 @@ -402,14 +410,98 @@ static ssize_t plane_default_rotation_store(struct co= nfig_item *item, return count; } =20 +static ssize_t plane_supported_color_encodings_show(struct config_item *it= em, char *page) +{ + struct vkms_configfs_plane *plane =3D plane_item_to_vkms_configfs_plane(i= tem); + unsigned int supported_color_encodings; + + scoped_guard(mutex, &plane->dev->lock) + supported_color_encodings =3D vkms_config_plane_get_supported_color_enco= dings(plane->config); + + return sprintf(page, "%u", supported_color_encodings); +} + +static ssize_t plane_supported_color_encodings_store(struct config_item *i= tem, + const char *page, size_t count) +{ + struct vkms_configfs_plane *plane =3D plane_item_to_vkms_configfs_plane(i= tem); + int ret, val =3D 0; + + ret =3D kstrtouint(page, 10, &val); + if (ret) + return ret; + + /* Should be a supported value */ + if (val & ~(VKMS_SUPPORTED_COLOR_ENCODINGS)) + return -EINVAL; + /* Should at least provide one color encoding */ + if ((val & (VKMS_SUPPORTED_COLOR_ENCODINGS)) =3D=3D 0) + return -EINVAL; + + scoped_guard(mutex, &plane->dev->lock) { + if (plane->dev->enabled) + return -EBUSY; + + vkms_config_plane_set_supported_color_encodings(plane->config, val); + } + + return count; +} + +static ssize_t plane_default_color_encoding_show(struct config_item *item,= char *page) +{ + struct vkms_configfs_plane *plane =3D plane =3D plane_item_to_vkms_config= fs_plane(item); + unsigned int default_color_encoding; + + scoped_guard(mutex, &plane->dev->lock) + default_color_encoding =3D BIT(vkms_config_plane_get_default_color_encod= ing(plane->config)); + + return sprintf(page, "%u", default_color_encoding); +} + +static ssize_t plane_default_color_encoding_store(struct config_item *item, + const char *page, size_t count) +{ + struct vkms_configfs_plane *plane =3D plane_item_to_vkms_configfs_plane(i= tem); + int ret, val =3D 0; + + ret =3D kstrtouint(page, 10, &val); + if (ret) + return ret; + + /* Should be a supported value */ + if (val & ~VKMS_SUPPORTED_COLOR_ENCODINGS) + return -EINVAL; + + /* Ensure val is a single bit set */ + if (!is_power_of_2(val)) + return -EINVAL; + + /* Convert bit position to the proper enum value */ + val =3D __ffs(val) + DRM_COLOR_YCBCR_BT601; + + scoped_guard(mutex, &plane->dev->lock) { + if (plane->dev->enabled) + return -EBUSY; + + vkms_config_plane_set_default_color_encoding(plane->config, val); + } + + return count; +} + CONFIGFS_ATTR(plane_, type); CONFIGFS_ATTR(plane_, 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_supported_rotations, &plane_attr_default_rotation, + &plane_attr_supported_color_encodings, + &plane_attr_default_color_encoding, NULL, }; =20 --=20 2.54.0 From nobody Sat Jun 27 22:18:04 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 79BEC342CB2 for ; Sat, 27 Jun 2026 03:31:40 +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=1782531102; cv=none; b=Rm7ZHhHQYTX7ynxCxSxXHT/4z3ylrX4pPfyKWEfydEG3zDFPn9RGsR29AFtVvqyyy8XzFsboxuXp9+GvMQZfPoIggL38NLlPKuonYAw2W02tL40vUQCP240m/ytVVNqyO8Av2b5z4DKs5THVOHBzFVK5cgLj8YH9BiaSDc+U5/w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531102; c=relaxed/simple; bh=4VdJkVztOdp5GOjunqQ6hm6Z8YBlbAM832uNsWsaxus=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gS3+DIaHN2RnkzUNHH20hUg+x0rjX27w4ZOpgPmHj115B8POvnBDCYbENmGgPN+UwlHyW8eiL+Mg7lxzcK26ULTncfP30K6yto/a1+7EaLztqlOix+sCbB0MFv7Pf4to/rzlrDwUTeZIFb2gPtjlVZJtluVZ1vYn9OUrkRS5ACI= 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=rnUTg1ul; 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="rnUTg1ul" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 33D9A4E409FC; Sat, 27 Jun 2026 03:31:39 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 078DB60233; Sat, 27 Jun 2026 03:31:39 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 04A25106F1177; Sat, 27 Jun 2026 05:31:34 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1782531097; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=EgWvJtWn+krvVpgj46yZE/IDDK8TIZNT15rlAZs/5gQ=; b=rnUTg1ulN1kRGluiHH+shvmRgkWwWV5zaaUl7nsptBqj6MW74lfpO74Uu3jTmUJ8Gccbjq 8UDlAc/kcpnx+qPwuy8zSN9Bh3ZwqtjLQVItSIwMDY0ixTIzSZyZMVTK6TScrRdmgcY+Uj x0kRa0NmtfWBmcKRnh1/UbzP+CZaDyjRi0KeGpBb9Og4rXn8caqrAFxnHWlCyfQpSblCru Cly8tnxaQlMyFvE0KoB8M316AIaOzS5pmqT04is7D2qdZR9LjTjdOwTbI/ZU3Xu94dZkud /ugi7H8YIhgjkzjq9cAiCU45ZYmBXFzw0fCeks5XJDk2yP9ce8jl0iYlaD1XOw== From: Louis Chauvet Date: Sat, 27 Jun 2026 05:30:37 +0200 Subject: [PATCH v5 20/38] 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: <20260627-vkms-all-config-v5-20-854aa0840926@bootlin.com> References: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> In-Reply-To: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet , Shuah Khan , Miguel Ojeda , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt Cc: Luca Ceresoli , Kory Maincent , 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 , llvm@lists.linux.dev X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=10886; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=4VdJkVztOdp5GOjunqQ6hm6Z8YBlbAM832uNsWsaxus=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBqP0PfbwWQTnr6sB5hZ4AqYcQcRIKGPtb2II9Kb rg9zVSIw7mJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaj9D3xsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDIACgkQIK0uxlsQLOKpVxAAo50kWE0Ieqsdoqbm3mTuvgEDRJ5T6Rv LnnwsexKb6p9P3J8k5YglotTu8JsLO90Vg3S7b2p3VW5sYsof3exKgivXC6IxrxmLHG36zp/POk IobYgueGPvWva4xhAXJB2GZLSOvDnvXiBE7Yx78ltU8sWM/xePJvPMlnm8yan5qzF68UmmSEgO+ WIZfIG7zua9P4DVAWIJ6HqGxnHE7pjuVgABUZwZEIJXAdWvZFHHdKRNSBf+/18bjqllRAnBhb7X RVW3M/dspLwIUbN0F6em7uisDwyE1glesD0JANQ6j6UXOpN4PVuDeGN2J05qtosMxj2t09vNtyr jHoeR5e85ZW+Vhvws5Wb23RfzaxMGAkUzve/n/Me/cB0jb55X3C2cte5HpKCeqQxKv0Z5Za2O8y HvIBCLAW62tMbjmTNJMwJdG5MDqTO5AnxTUO83+i7aqixxOnMGuNzhQMKiO20DFL+X71l/X6Gkg y8VoZRhyQYd8TVx4FmoRD5IQe7OX2sJUPFeq5z0Ea7HzVYkTPTP5aHr4b33Uc14i8gkytRVv/XD BlFS0/Z6HIxkuRJtrGMjn6Q07MRNvRZpTwstmQwSyAAmV2Cymojc3QaOPXH8mDhJWH0GKIXnqB5 f6yrtvD4M1mb95wPFs6NCXdWzKls7vgVE1g+V+oylAzhJcJ9/s8I= 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 a2a3f1a106a3..a88d8b4a969e 100644 --- a/drivers/gpu/drm/vkms/tests/vkms_config_test.c +++ b/drivers/gpu/drm/vkms/tests/vkms_config_test.c @@ -1,5 +1,6 @@ // SPDX-License-Identifier: GPL-2.0+ =20 +#include #include #include =20 @@ -562,6 +563,7 @@ static void vkms_config_test_valid_plane_color_encoding= (struct kunit *test) KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); =20 /* Valid, no supported or color encoding */ + vkms_config_plane_set_supported_color_ranges(plane_cfg, 0); vkms_config_plane_set_supported_color_encodings(plane_cfg, 0); vkms_config_plane_set_default_color_encoding(plane_cfg, 0); KUNIT_EXPECT_TRUE(test, vkms_config_valid_plane_color_encoding(config, pl= ane_cfg)); @@ -576,6 +578,47 @@ static void vkms_config_test_valid_plane_color_encodin= g(struct kunit *test) vkms_config_destroy(config); } =20 +static void vkms_config_test_valid_plane_color_range(struct kunit *test) +{ + struct vkms_config *config; + struct vkms_config_plane *plane_cfg; + + config =3D vkms_config_default_create(false, false, false, false); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); + + plane_cfg =3D get_first_plane(config); + + /* Valid, all color range supported */ + vkms_config_plane_set_supported_color_ranges(plane_cfg, + BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) | + BIT(DRM_COLOR_YCBCR_FULL_RANGE)); + vkms_config_plane_set_default_color_range(plane_cfg, DRM_COLOR_YCBCR_FULL= _RANGE); + KUNIT_EXPECT_TRUE(test, vkms_config_valid_plane_color_range(config, plane= _cfg)); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Invalid, default color range is not supported */ + vkms_config_plane_set_supported_color_ranges(plane_cfg, + BIT(DRM_COLOR_YCBCR_FULL_RANGE)); + vkms_config_plane_set_default_color_range(plane_cfg, DRM_COLOR_YCBCR_LIMI= TED_RANGE); + KUNIT_EXPECT_FALSE(test, vkms_config_valid_plane_color_range(config, plan= e_cfg)); + KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); + + /* Valid, no supported or color range */ + vkms_config_plane_set_supported_color_encodings(plane_cfg, 0); + vkms_config_plane_set_supported_color_ranges(plane_cfg, 0); + vkms_config_plane_set_default_color_range(plane_cfg, 0); + KUNIT_EXPECT_TRUE(test, vkms_config_valid_plane_color_range(config, plane= _cfg)); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Valid, if no supported color range, default is ignored */ + vkms_config_plane_set_supported_color_ranges(plane_cfg, 0); + vkms_config_plane_set_default_color_range(plane_cfg, DRM_COLOR_YCBCR_LIMI= TED_RANGE); + KUNIT_EXPECT_TRUE(test, vkms_config_valid_plane_color_range(config, plane= _cfg)); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + vkms_config_destroy(config); +} + static void vkms_config_test_valid_plane_possible_crtcs(struct kunit *test) { struct vkms_config *config; @@ -1100,6 +1143,7 @@ static struct kunit_case vkms_config_test_cases[] =3D= { KUNIT_CASE(vkms_config_test_valid_plane_type), KUNIT_CASE(vkms_config_test_valid_plane_rotations), KUNIT_CASE(vkms_config_test_valid_plane_color_encoding), + KUNIT_CASE(vkms_config_test_valid_plane_color_range), KUNIT_CASE(vkms_config_test_valid_plane_possible_crtcs), KUNIT_CASE(vkms_config_test_invalid_crtc_number), KUNIT_CASE(vkms_config_test_invalid_encoder_number), diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index 2fa467f5e17e..553871646761 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -198,6 +198,25 @@ bool vkms_config_valid_plane_color_encoding(const stru= ct vkms_config *config, } EXPORT_SYMBOL_IF_KUNIT(vkms_config_valid_plane_color_encoding); =20 +VISIBLE_IF_KUNIT +bool vkms_config_valid_plane_color_range(const struct vkms_config *config, + const struct vkms_config_plane *plane_cfg) +{ + struct drm_device *dev =3D config->dev ? &config->dev->drm : NULL; + + if (vkms_config_plane_get_supported_color_ranges(plane_cfg)) { + if ((BIT(vkms_config_plane_get_default_color_range(plane_cfg)) & + vkms_config_plane_get_supported_color_ranges(plane_cfg)) !=3D + BIT(vkms_config_plane_get_default_color_range(plane_cfg))) { + drm_info(dev, "Configured default color range is not supported by the p= lane\n"); + return false; + } + } + + return true; +} +EXPORT_SYMBOL_IF_KUNIT(vkms_config_valid_plane_color_range); + static bool valid_planes_for_crtc(const struct vkms_config *config, struct vkms_config_crtc *crtc_cfg) { @@ -354,6 +373,7 @@ static bool valid_connector_possible_encoders(const str= uct vkms_config *config) =20 bool vkms_config_is_valid(const struct vkms_config *config) { + struct drm_device *dev =3D config->dev ? &config->dev->drm : NULL; struct vkms_config_crtc *crtc_cfg; struct vkms_config_plane *plane_cfg; =20 @@ -363,6 +383,16 @@ bool vkms_config_is_valid(const struct vkms_config *co= nfig) =20 if (!vkms_config_valid_plane_color_encoding(config, plane_cfg)) return false; + + if (!vkms_config_valid_plane_color_range(config, plane_cfg)) + return false; + + if ((vkms_config_plane_get_supported_color_encodings(plane_cfg) =3D=3D 0= ) !=3D + (vkms_config_plane_get_supported_color_ranges(plane_cfg) =3D=3D 0)) { + drm_info(dev, + "Both supported color encodings and color ranges must be set, or none= \n"); + return false; + } } =20 if (!valid_plane_number(config)) @@ -442,6 +472,12 @@ static int vkms_config_show(struct seq_file *m, void *= data) seq_puts(m, "\n"); seq_printf(m, "\tdefault color encoding=3D%s\n", drm_get_color_encoding_name(vkms_config_plane_get_default_color_enco= ding(plane_cfg))); + seq_puts(m, "\tsupported color ranges=3D"); + show_bitfield(m, vkms_config_plane_get_supported_color_ranges(plane_cfg), + drm_get_color_range_name); + seq_puts(m, "\n"); + seq_printf(m, "\tdefault color range=3D%s\n", + drm_get_color_range_name(vkms_config_plane_get_default_color_range(p= lane_cfg))); } =20 vkms_config_for_each_crtc(vkmsdev->config, crtc_cfg) { @@ -498,6 +534,9 @@ struct vkms_config_plane __must_check *vkms_config_crea= te_plane(struct vkms_conf 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 31c1598ff866..60cadb7bea5b 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -48,6 +48,8 @@ struct vkms_config { * must be managed by other means. * @default_color_encoding: Default color encoding that should be used by = this plane * @supported_color_encodings: Color encodings that this plane will support + * @default_color_range: Default color range that should be used by this p= lane + * @supported_color_ranges: Color ranges that this plane will support */ struct vkms_config_plane { struct list_head link; @@ -59,6 +61,8 @@ struct vkms_config_plane { unsigned int supported_rotations; enum drm_color_encoding default_color_encoding; unsigned int supported_color_encodings; + enum drm_color_range default_color_range; + unsigned int supported_color_ranges; struct xarray possible_crtcs; bool default_pipeline; =20 @@ -440,6 +444,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 8d3953667f21..d4ccf418198e 100644 --- a/drivers/gpu/drm/vkms/vkms_plane.c +++ b/drivers/gpu/drm/vkms/vkms_plane.c @@ -239,13 +239,13 @@ struct vkms_plane *vkms_plane_init(struct vkms_device= *vkmsdev, vkms_config_plane_get_default_rotation(plane_cfg), vkms_config_plane_get_supported_rotations(plane_cfg)); =20 - if (vkms_config_plane_get_supported_color_encodings(plane_cfg) !=3D 0) + if (vkms_config_plane_get_supported_color_encodings(plane_cfg) !=3D 0 && + vkms_config_plane_get_supported_color_ranges(plane_cfg) !=3D 0) drm_plane_create_color_properties(&plane->base, vkms_config_plane_get_supported_color_encodings(plane_cfg), - BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) | - BIT(DRM_COLOR_YCBCR_FULL_RANGE), + vkms_config_plane_get_supported_color_ranges(plane_cfg), vkms_config_plane_get_default_color_encoding(plane_cfg), - DRM_COLOR_YCBCR_FULL_RANGE); + vkms_config_plane_get_default_color_range(plane_cfg)); =20 if (vkms_config_plane_get_default_pipeline(plane_cfg)) vkms_initialize_colorops(&plane->base); --=20 2.54.0 From nobody Sat Jun 27 22:18:04 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 748343446CA for ; Sat, 27 Jun 2026 03:31: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=1782531104; cv=none; b=DpgZj0DK5ANccst5X8g8rQzs0mUDOPntejRNNEvUur0KkpktjcJMGAimNuD2+WvrIgTDm1AjlzueSNS6Gu03tlrsd+21PEUEvlTEDRs/Jzth+U0fhmk25UikjvbB9fwQ5ugvanR4n7/BYic27/YsQUURe/azDFoFiYyeQYXkdiE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531104; c=relaxed/simple; bh=zagsHqlP7cu1CD1HZJ/8w6YqkI/47gVjz6qtccSZpsk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=acyhY0WPzXBgSlCCBJFZl3gHwxPpc0ztVyNi05bND53FQ7x9MSoWw5GgxFjFox9Uu6s4KdsPpJWofZeDTiS3ckQJAEDQi8U840PjobfH9J7a2KwMRR0G9igco9UT7XezxD4Hq5GHB+yOZLSgbUyZ+dx0zGoqg7TDJN0jMnq3TZ4= 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=WaUmPBnw; 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="WaUmPBnw" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 525F44E409FE; Sat, 27 Jun 2026 03:31:41 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 1F8A760233; Sat, 27 Jun 2026 03:31:41 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 9CA79106F1178; Sat, 27 Jun 2026 05:31:37 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1782531099; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=Z7/GhxWuPHfZ+W2ec4f1aPqowYz5dofm49yRd+HfCf0=; b=WaUmPBnwgTPft8YtPvU7pMlzDWrbaovCoXOq0S24r0w5d/+U2ZjdoojzdCDUJjC2uVKfPX XEEf76VIjbTwg++VpBEkKft7Fv7GSw5CTsV1qz5GBxoFZ4djOiCNHrFrrij3x7FAdyIj8x 54CdEDOEWzGRDjC2gGZUnOcH+O94Ym5OVF9SSXho/dqs3iOsdNKAyVgBBrg20jLu9zPaC5 LYEMqUXymQpcivbeU5k5qPcPuNEWcWk1xnxSLQZQcQoEO6hcAm48YsjjSc2fLtwiKkCnmE DqggQqC8t+q603X7YqKjZiNxN41IuZdq+HbQMWBRK+ClCkQVYTWWb7Ro3OJuPw== From: Louis Chauvet Date: Sat, 27 Jun 2026 05:30:38 +0200 Subject: [PATCH v5 21/38] 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: <20260627-vkms-all-config-v5-21-854aa0840926@bootlin.com> References: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> In-Reply-To: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet , Shuah Khan , Miguel Ojeda , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt Cc: Luca Ceresoli , Kory Maincent , 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 , llvm@lists.linux.dev X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=7267; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=zagsHqlP7cu1CD1HZJ/8w6YqkI/47gVjz6qtccSZpsk=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBqP0PfIFq9zFBdsiHlT1idpm6Kz/dsXYIm3at9I TfkxCTNWyaJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaj9D3xsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDIACgkQIK0uxlsQLOIlog//cQMKjveaaw2Knn4NNLDSkPz5LsKmkd5 lZTaRXRKkRxXww9nwYbBdGdxk2Cf49P7MOIoN2ZryP9ykAzuP6VMUzf4Gt8UkbVKr+xjLnFbQzi UFA+NxuXpTiCQIw/gVmRqgcXggyFUIHLdKJK5iiWAUek5kYHcrn4MtxCav9eBwqHpnxNCU8181h bStBtR4axc2CY8af2TR8reS4GaDMB+BRbvwMYVWqtnJtLc/7vAwTgRQ9gA8cT6RS0enkjvNknhQ B7dIcPms+ZCK43XW/T4Wd2EVFFbqkH9Xf8GOMsPFPDWorkK49Tpu8RwHly2Xwt+qMxiKSAs1Cr7 fZNlawwWjwu0aRU1QVtdn3HmoxRBwXoRv5toks8PAEAuu+ODIe+zqbKCYmo6f/1pN+39JoUHGF5 qjIYemQg+JqtCaSFlpWgduOUERz8IR3OdEp1YyBRqzxtJS5yrUopJCDCvVdDB4EnxfKUwrCdOzd xC27HHRUArHmIIUEUpeC1QG7ivbhbWYgtpj9VoHlNIHjZzhKQrigxvHIhsusE5kq2wo5rXqdam6 LezAWlrC+m8rwf66k0ZdSXQzzNdDIlCladsW/LurnLc/5UpL0ehqnNhES0zzHL8t6HmhhfC4Bf8 d/PlCxjGQL5xciSKxAO2FH9xyLeqkgJD7lYZuMRurQT1VBsM3T4g= X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 To allows the userspace to test many hardware configuration, introduce a new interface to configure the available color ranges per planes. VKMS supports multiple color ranges, so the userspace can choose any combination. The supported color ranges are configured by writing a color range bitmask to the file `supported_color_ranges` and the default color range is chosen by writing a color encoding bitmask to `default_color_range`. Signed-off-by: Louis Chauvet --- Documentation/ABI/testing/configfs-vkms | 15 ++++++ Documentation/gpu/vkms.rst | 10 +++- drivers/gpu/drm/vkms/vkms_configfs.c | 90 +++++++++++++++++++++++++++++= ++++ 3 files changed, 113 insertions(+), 2 deletions(-) diff --git a/Documentation/ABI/testing/configfs-vkms b/Documentation/ABI/te= sting/configfs-vkms index a9ee05fe0c66..ef0c3da6b3ca 100644 --- a/Documentation/ABI/testing/configfs-vkms +++ b/Documentation/ABI/testing/configfs-vkms @@ -132,6 +132,21 @@ Description: Default color encoding presented to userspace, same values as supported_color_encoding. =20 +What: /sys/kernel/config/vkms//planes//supported_color_ran= ges +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Available color ranges for the plane, as a bitmask: + 0x1 - DRM_COLOR_YCBCR_LIMITED_RANGE, + 0x2 - DRM_COLOR_YCBCR_FULL_RANGE. + +What: /sys/kernel/config/vkms//planes//default_color_range +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Default color range presented to userspace, same + values as supported_color_ranges. + What: /sys/kernel/config/vkms//planes//possible_crtcs Date: Nov 2025 Contact: dri-devel@lists.freedesktop.org diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index 7206cd2b231a..7e8f4fe3b392 100644 --- a/Documentation/gpu/vkms.rst +++ b/Documentation/gpu/vkms.rst @@ -87,7 +87,7 @@ Start by creating one or more planes:: =20 sudo mkdir /config/vkms/my-vkms/planes/plane0 =20 -Planes have 5 configurable attributes: +Planes have 7 configurable attributes: =20 - type: Plane type: 0 overlay, 1 primary, 2 cursor (same values as those exposed by the "type" property of a plane) @@ -98,10 +98,16 @@ Planes have 5 configurable attributes: supported_rotations. - supported_color_encodings: Available encodings for a plane, as a bitmask: 0x01 YCBCR_BT601, 0x02 YCBCR_BT709, 0x04 YCBCR_BT2020 (same values as th= ose exposed - by the COLOR_ENCODING property of a plane). If set, supported_color_range + by the COLOR_ENCODING property of a plane). If set, supported_color_rang= es must be set too. - default_color_encoding: Default color encoding presented to the userspac= e, same values as supported_color_encodings +- supported_color_ranges: Available color range for a plane, as a bitmask: + 0x1 DRM_COLOR_YCBCR_LIMITED_RANGE, 0x2 DRM_COLOR_YCBCR_FULL_RANGE (same = values as + those exposed by the COLOR_RANGE property of a plane). If set, supported= _color_encoding + must be set too. +- default_color_range: Default color range presented to the userspace, same + values as supported_color_ranges =20 Continue by creating one or more CRTCs:: =20 diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vk= ms_configfs.c index c1d1841b2c5a..56a0c542a143 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -17,6 +17,13 @@ BIT(DRM_COLOR_YCBCR_BT709) | \ BIT(DRM_COLOR_YCBCR_BT2020)) =20 +/** + * VKMS_SUPPORTED_COLOR_RANGES - Bitmask of all supported color ranges in = VKMS + */ +#define VKMS_SUPPORTED_COLOR_RANGES ( \ + BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) | \ + BIT(DRM_COLOR_YCBCR_FULL_RANGE)) + /* To avoid registering configfs more than once or unregistering on error = */ static bool is_configfs_registered; =20 @@ -410,6 +417,85 @@ static ssize_t plane_default_rotation_store(struct con= fig_item *item, return count; } =20 +static ssize_t plane_supported_color_ranges_show(struct config_item *item,= char *page) +{ + struct vkms_configfs_plane *plane =3D plane_item_to_vkms_configfs_plane(i= tem); + unsigned int supported_color_ranges; + + scoped_guard(mutex, &plane->dev->lock) + supported_color_ranges =3D vkms_config_plane_get_supported_color_ranges(= plane->config); + + return sprintf(page, "%u", supported_color_ranges); +} + +static ssize_t plane_supported_color_ranges_store(struct config_item *item, + const char *page, size_t count) +{ + struct vkms_configfs_plane *plane =3D plane_item_to_vkms_configfs_plane(i= tem); + int ret, val =3D 0; + + ret =3D kstrtouint(page, 10, &val); + if (ret) + return ret; + + /* Should be a supported value */ + if (val & ~VKMS_SUPPORTED_COLOR_RANGES) + return -EINVAL; + /* Should at least provide one color range */ + if ((val & VKMS_SUPPORTED_COLOR_RANGES) =3D=3D 0) + return -EINVAL; + + scoped_guard(mutex, &plane->dev->lock) { + if (plane->dev->enabled) + return -EBUSY; + + vkms_config_plane_set_supported_color_ranges(plane->config, val); + } + + return count; +} + +static ssize_t plane_default_color_range_show(struct config_item *item, ch= ar *page) +{ + struct vkms_configfs_plane *plane =3D plane_item_to_vkms_configfs_plane(i= tem); + unsigned int default_color_range; + + scoped_guard(mutex, &plane->dev->lock) + default_color_range =3D vkms_config_plane_get_default_color_range(plane-= >config); + + return sprintf(page, "%lu", BIT(default_color_range)); +} + +static ssize_t plane_default_color_range_store(struct config_item *item, + const char *page, size_t count) +{ + struct vkms_configfs_plane *plane =3D plane_item_to_vkms_configfs_plane(i= tem); + int ret, val =3D 0; + + ret =3D kstrtouint(page, 10, &val); + if (ret) + return ret; + + /* Should be a supported value */ + if (val & ~VKMS_SUPPORTED_COLOR_RANGES) + return -EINVAL; + + if (!is_power_of_2(val)) + return -EINVAL; + + /* Convert bit position to the proper enum value */ + val =3D ffs(val) + DRM_COLOR_YCBCR_LIMITED_RANGE - 1; + + scoped_guard(mutex, &plane->dev->lock) { + if (plane->dev->enabled) + return -EBUSY; + + vkms_config_plane_set_default_color_range(plane->config, val); + } + + return count; +} + static ssize_t plane_supported_color_encodings_show(struct config_item *it= em, char *page) { struct vkms_configfs_plane *plane =3D plane_item_to_vkms_configfs_plane(i= tem); @@ -493,6 +579,8 @@ static ssize_t plane_default_color_encoding_store(struc= t config_item *item, CONFIGFS_ATTR(plane_, type); CONFIGFS_ATTR(plane_, supported_rotations); CONFIGFS_ATTR(plane_, default_rotation); +CONFIGFS_ATTR(plane_, supported_color_ranges); +CONFIGFS_ATTR(plane_, default_color_range); CONFIGFS_ATTR(plane_, supported_color_encodings); CONFIGFS_ATTR(plane_, default_color_encoding); =20 @@ -500,6 +588,8 @@ static struct configfs_attribute *plane_item_attrs[] = =3D { &plane_attr_type, &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.54.0 From nobody Sat Jun 27 22:18:04 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 18E7B347FFE; Sat, 27 Jun 2026 03:31:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531106; cv=none; b=HmA3lGCDhTn4UghBVO6R+uuVMRl0g1C3qj/G1qt76bh549yvROuXqCST4O/TqarxI2/BSQCYaS8sERPvPmoBIy13l0rZ0Moe/wc6FVkSooeUazFFIg8NFvxAStF5SoxthFstPXuFHu4SKtmTAbEyVAj6TVEQasaTvlOfqZdFePI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531106; c=relaxed/simple; bh=LKzzhjbixxXm0+lGyv+SESE0W4Ij2TVdWKWB3Vq5+VQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=jHhkUtIiPpj+wtNCR+4krjO+Fu+tS/SpXAiollbpJDp2s5I6qMA9SCu3IYBBEzOmcOx9kirsfjhZSjLsLARe4z1qsqykHdw5SDb11lSt4kM9hweO8qSWcRRdFyQE9HKUluQ3pR5E40YGBqJR2O9Vj872LmvM80Jga16XV0tN8aQ= 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=ScIxeFuO; 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="ScIxeFuO" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id E3BF01A0A23; Sat, 27 Jun 2026 03:31:43 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id AF55F60233; Sat, 27 Jun 2026 03:31:43 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id E7A35106F1165; Sat, 27 Jun 2026 05:31:39 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1782531102; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=ejybZnAJF1y1GC4mxapDyQXQroQbtInYDQ/OXPSfOeU=; b=ScIxeFuOpue0Biit57RIz1EE17sllQDuKYgSiJa1U4f+O0MaI6cPYAgYLwLLqbLvBw8lu/ jKTgXZQy4i8g92Pb9CX2lxXylVQuR2AcvQwIhR63XGQnPR5nRh4BS0m57ZT+oLtjLFSXsi 8ZD/eJL5g5X5aimfv5ETCo8N8OwikX1UEp8uJHFOXqqgbGCX9ejJIMk/rRiU+f52M+mUY/ MhfNOfeEmYlEHp1/FhcR1Avj523IzRoqxYM+lvWo6FBflZt4ubj49el8kDihebMDsfjvdT Ix8EIeBOd4zIA3OYulk26cDeEoaTDHfH6Q4HxSXasl6eyOQjuCJh5D7oTrzdJg== From: Louis Chauvet Date: Sat, 27 Jun 2026 05:30:39 +0200 Subject: [PATCH v5 22/38] 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: <20260627-vkms-all-config-v5-22-854aa0840926@bootlin.com> References: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> In-Reply-To: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet , Shuah Khan , Miguel Ojeda , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt Cc: Luca Ceresoli , Kory Maincent , 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 , llvm@lists.linux.dev X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=10560; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=LKzzhjbixxXm0+lGyv+SESE0W4Ij2TVdWKWB3Vq5+VQ=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBqP0Pf0g+nIGAJFBUTYw80d4Uu8d79b2l6IJ+6t WiTV8c/rLWJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaj9D3xsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDIACgkQIK0uxlsQLOKzBhAAtkbPuaz672WEmLVln3u9siQZGWg9OIz JhP0lTxAdnjcLPDiatgF97DjVCKUryFbEA10gFdN4xqYEF38ULS3gzYkBeEQWfIM8pv6JhE++gV EDDBojR81Wesz803yHQqZeZpEtzX8SWBIesMFpdkD3jiQjeMkg5w6B09dq6q626Kq/YRVfzuqXe xheK7KpZU9NDvY7gnvEmN+5sxVQ/mdZGlMI0DJuus0JdNnLZPW1tdwvLo1etnQk5EG+vuMGJ3sh X/86dZ94XFxhnfkR3pkwC2Dnoqyipsg5cYSRN15pBu4XdWrmTqENZu4/Hv5EbCtp+5gytYy+1Go u3VYIAWLK8LKTCJ/3VLSXgnREyX9vfBjsKTG3FWISD+6XGF3ak+rrV4upQNlnnGUFGRxyyH81iH oKsXzRX0kCju/iH9o1e43yOTRI+7Fb4129zAi2MLujBiaDDnp6pH+m+1uC7xfybNv9WglKenif3 vyq4OD+XC+X/AclpHUDeVmIikuuWepu2O7v5ZVHjoIWvXPmtapGcqQY2Ee7QkgWkKvs14Jt2OLq G2ZC7gYc27HybnJW0bLkMaCyeXITKluBp6s9erP28DXJqCeni9NzRuy/sBhTH3buYGJT5ckYKL5 rQIYGNzgI6xywemqhSZE2Y/jbRwFQoJg8sKBmtHJk3bsfac1frgA= 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 | 128 +++++++++++++++++++++++++++++++++= ++++ drivers/gpu/drm/vkms/vkms_config.h | 51 +++++++++++++++ drivers/gpu/drm/vkms/vkms_plane.c | 39 +---------- 3 files changed, 181 insertions(+), 37 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index 553871646761..c7de3e307367 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -12,6 +12,42 @@ =20 #include "vkms_config.h" =20 +static const u32 vkms_supported_plane_formats[] =3D { + DRM_FORMAT_ARGB8888, + DRM_FORMAT_ABGR8888, + DRM_FORMAT_BGRA8888, + DRM_FORMAT_RGBA8888, + DRM_FORMAT_XRGB8888, + DRM_FORMAT_XBGR8888, + DRM_FORMAT_RGB888, + DRM_FORMAT_BGR888, + DRM_FORMAT_XRGB16161616, + DRM_FORMAT_XBGR16161616, + DRM_FORMAT_ARGB16161616, + DRM_FORMAT_ABGR16161616, + DRM_FORMAT_RGB565, + DRM_FORMAT_BGR565, + DRM_FORMAT_NV12, + DRM_FORMAT_NV16, + DRM_FORMAT_NV24, + DRM_FORMAT_NV21, + DRM_FORMAT_NV61, + DRM_FORMAT_NV42, + DRM_FORMAT_YUV420, + DRM_FORMAT_YUV422, + DRM_FORMAT_YUV444, + DRM_FORMAT_YVU420, + DRM_FORMAT_YVU422, + DRM_FORMAT_YVU444, + DRM_FORMAT_P010, + DRM_FORMAT_P012, + DRM_FORMAT_P016, + DRM_FORMAT_R1, + DRM_FORMAT_R2, + DRM_FORMAT_R4, + DRM_FORMAT_R8, +}; + struct vkms_config *vkms_config_create(const char *dev_name) { struct vkms_config *config; @@ -441,6 +477,15 @@ static void show_bitfield(struct seq_file *m, uint32_t= value, const char *callba } } =20 +static void show_formats(struct seq_file *m, u32 *formats, size_t formats_= count) +{ + for (int i =3D 0; i < formats_count; i++) { + seq_printf(m, "%p4cc", &formats[i]); + if (i !=3D formats_count - 1) + seq_puts(m, ", "); + } +} + static int vkms_config_show(struct seq_file *m, void *data) { struct drm_debugfs_entry *entry =3D m->private; @@ -478,6 +523,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) { @@ -527,6 +576,10 @@ struct vkms_config_plane __must_check *vkms_config_cre= ate_plane(struct vkms_conf if (ret) goto cleanup_plane_cfg; =20 + ret =3D vkms_config_plane_add_all_formats(plane_cfg); + if (ret) + goto cleanup_plane_cfg; + 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); @@ -554,6 +607,7 @@ EXPORT_SYMBOL_IF_KUNIT(vkms_config_create_plane); void vkms_config_destroy_plane(struct vkms_config_plane *plane_cfg) { xa_destroy(&plane_cfg->possible_crtcs); + kfree(plane_cfg->supported_formats); list_del(&plane_cfg->link); kfree(plane_cfg->name); kfree(plane_cfg); @@ -658,6 +712,80 @@ static struct vkms_config_plane *vkms_config_crtc_get_= plane(const struct vkms_co return NULL; } =20 +int __must_check vkms_config_plane_add_all_formats(struct vkms_config_plan= e *plane_cfg) +{ + u32 *ret =3D krealloc_array(plane_cfg->supported_formats, + ARRAY_SIZE(vkms_supported_plane_formats), + sizeof(uint32_t), GFP_KERNEL); + if (!ret) + return -ENOMEM; + plane_cfg->supported_formats =3D ret; + + memcpy(plane_cfg->supported_formats, vkms_supported_plane_formats, + sizeof(vkms_supported_plane_formats)); + plane_cfg->supported_formats_count =3D ARRAY_SIZE(vkms_supported_plane_fo= rmats); + return 0; +} + +static bool is_supported_format(u32 drm_format) +{ + for (int i =3D 0; i < ARRAY_SIZE(vkms_supported_plane_formats); i++) { + if (vkms_supported_plane_formats[i] =3D=3D drm_format) + return true; + } + + return false; +} + +static bool vkms_config_plane_has_format(struct vkms_config_plane *plane_c= fg, u32 drm_format) +{ + for (unsigned int i =3D 0; i < plane_cfg->supported_formats_count; i++) { + if (plane_cfg->supported_formats[i] =3D=3D drm_format) + return true; + } + return false; +} + +int __must_check vkms_config_plane_add_format(struct vkms_config_plane *pl= ane_cfg, u32 drm_format) +{ + if (!is_supported_format(drm_format)) + return -EINVAL; + + if (vkms_config_plane_has_format(plane_cfg, drm_format)) + return 0; + + u32 *new_ptr =3D krealloc_array(plane_cfg->supported_formats, + plane_cfg->supported_formats_count + 1, + sizeof(*plane_cfg->supported_formats), GFP_KERNEL); + if (!new_ptr) + return -ENOMEM; + + plane_cfg->supported_formats =3D new_ptr; + plane_cfg->supported_formats[plane_cfg->supported_formats_count] =3D drm_= format; + plane_cfg->supported_formats_count++; + + return 0; +} + +void vkms_config_plane_remove_all_formats(struct vkms_config_plane *plane_= cfg) +{ + plane_cfg->supported_formats_count =3D 0; + kfree(plane_cfg->supported_formats); + plane_cfg->supported_formats =3D NULL; +} + +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 60cadb7bea5b..3de4a92af9c5 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -50,6 +50,8 @@ struct vkms_config { * @supported_color_encodings: Color encodings that this plane will support * @default_color_range: Default color range that should be used by this p= lane * @supported_color_ranges: Color ranges that this plane will support + * @supported_formats: List of supported formats + * @supported_formats_count: Length of @supported_formats */ struct vkms_config_plane { struct list_head link; @@ -63,6 +65,8 @@ struct vkms_config_plane { unsigned int supported_color_encodings; enum drm_color_range default_color_range; unsigned int supported_color_ranges; + u32 *supported_formats; + unsigned int supported_formats_count; struct xarray possible_crtcs; bool default_pipeline; =20 @@ -475,6 +479,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 + * 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 from + * @drm_format: Format to remove + */ +void vkms_config_plane_remove_format(struct vkms_config_plane *plane_cfg, = u32 drm_format); + +/** + * vkms_config_plane_remove_all_formats - Remove all formats from a plane + * @plane_cfg: Plane to remove the formats from + */ +void vkms_config_plane_remove_all_formats(struct vkms_config_plane *plane_= cfg); + /** * vkms_config_plane_set_name() - Set the plane name * @plane_cfg: Plane to set the name to diff --git a/drivers/gpu/drm/vkms/vkms_plane.c b/drivers/gpu/drm/vkms/vkms_= plane.c index d4ccf418198e..6e767cdf8194 100644 --- a/drivers/gpu/drm/vkms/vkms_plane.c +++ b/drivers/gpu/drm/vkms/vkms_plane.c @@ -15,42 +15,6 @@ #include "vkms_drv.h" #include "vkms_formats.h" =20 -static const u32 vkms_formats[] =3D { - DRM_FORMAT_ARGB8888, - DRM_FORMAT_ABGR8888, - DRM_FORMAT_BGRA8888, - DRM_FORMAT_RGBA8888, - DRM_FORMAT_XRGB8888, - DRM_FORMAT_XBGR8888, - DRM_FORMAT_RGB888, - DRM_FORMAT_BGR888, - DRM_FORMAT_XRGB16161616, - DRM_FORMAT_XBGR16161616, - DRM_FORMAT_ARGB16161616, - DRM_FORMAT_ABGR16161616, - DRM_FORMAT_RGB565, - DRM_FORMAT_BGR565, - DRM_FORMAT_NV12, - DRM_FORMAT_NV16, - DRM_FORMAT_NV24, - DRM_FORMAT_NV21, - DRM_FORMAT_NV61, - DRM_FORMAT_NV42, - DRM_FORMAT_YUV420, - DRM_FORMAT_YUV422, - DRM_FORMAT_YUV444, - DRM_FORMAT_YVU420, - DRM_FORMAT_YVU422, - DRM_FORMAT_YVU444, - DRM_FORMAT_P010, - DRM_FORMAT_P012, - DRM_FORMAT_P016, - DRM_FORMAT_R1, - DRM_FORMAT_R2, - DRM_FORMAT_R4, - DRM_FORMAT_R8, -}; - static struct drm_plane_state * vkms_plane_duplicate_state(struct drm_plane *plane) { @@ -227,7 +191,8 @@ struct vkms_plane *vkms_plane_init(struct vkms_device *= vkmsdev, =20 plane =3D drmm_universal_plane_alloc(dev, struct vkms_plane, base, 0, &vkms_plane_funcs, - vkms_formats, ARRAY_SIZE(vkms_formats), + vkms_config_plane_get_supported_formats(plane_cfg), + vkms_config_plane_get_supported_formats_count(plane_cfg), NULL, vkms_config_plane_get_type(plane_cfg), vkms_config_plane_get_name(plane_cfg)); if (IS_ERR(plane)) --=20 2.54.0 From nobody Sat Jun 27 22:18:04 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 730303446CA for ; Sat, 27 Jun 2026 03:31:48 +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=1782531110; cv=none; b=hjlV8jJJ94V4Gu2WHwwC9u4kYwjQJlMPeVD/7nB4j9XvsIVwKK707uywbZORUh0bkPur+tlaZJO/hsDoQWVzakuN6GWK/CnpdThWmuMOBBJi4XcnG2C90SwO8DEF6mP1nEgVBFAMD8JaAUr8YbmFW21rEibWx7v6/KYY3zePfZs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531110; c=relaxed/simple; bh=gRy1bSB46PGpZU8CBgEC2GGeRPhG+dN+lEnn2TmDBOo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=dz3INZVFAy+lI4hzkAP/mFQiHW3MBb1PqRmlElcI6CV38EYIBHjywTqVhVel2UnjCloE2GEKpepi2YmjPXv0NWpABgn+GmXODuiL4KQ8zrsK4+5E7WyBhq1nHHTd74ws+81g5ZYODb6SByyfx6slVczTpyUYuno7ZDc8VCyWuFQ= 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=nC5ajQ3U; 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="nC5ajQ3U" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 2D3331A0A22; Sat, 27 Jun 2026 03:31:47 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id EEAFE60233; Sat, 27 Jun 2026 03:31:46 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 99BFC106F1171; Sat, 27 Jun 2026 05:31:42 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1782531105; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=2PVxc3f7q+TwjmunPIwT/G1YrbhRzEI7yNPLDNnhiL4=; b=nC5ajQ3UH3FhfcEjpmuvKzHPn0ETtIL59LrMWOZpq2fhh6gt2M07/O9da2kgMSDgWjJckl eBRG1oHRngjU/2HVHxZq+AuBbyljDAXKHWG5Zr/346snJCMbghh8AVyws619oi9Wkju1cS oNo9ehO8ZRibUqLnxVq08Ssh9U1+vLOKvjetaUjwPenCftNCWUg5sgzDCqj/wyfLsj+iKS AQwD4UbiF8lpyiR6d6qDCTQfGAQAAmLkiRlQZRTX5jfpcl+wFaE0ga+SaDuiDeEHUXVTRf W0oK67jj3Z4Y7xfGac3l4ofbb0iu5IkH6S/NoLNAMiP9qcXCd7tJgAvC/0z9qw== From: Louis Chauvet Date: Sat, 27 Jun 2026 05:30:40 +0200 Subject: [PATCH v5 23/38] 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: <20260627-vkms-all-config-v5-23-854aa0840926@bootlin.com> References: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> In-Reply-To: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet , Shuah Khan , Miguel Ojeda , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt Cc: Luca Ceresoli , Kory Maincent , 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 , llvm@lists.linux.dev X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=11133; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=gRy1bSB46PGpZU8CBgEC2GGeRPhG+dN+lEnn2TmDBOo=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBqP0Pg1y3Z4jqxgp+5cXV4fj/A/GB6KSDpfo7qp X4/d0DoSLKJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaj9D4BsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDIACgkQIK0uxlsQLOIoyRAAvWrV6/OGvsq5mkBN635pvGjM05cDXoc YgZjm7WymmWTjrQH6wyPUSLAB3nBrE7vtiQiLlCESOnLByrMcy2xrKbU9kvaAY6chX9xnrMwDqV GSgkR5K+4OKOt7NH9G8S7mnC6/7qg/TXIdp2GgQrJrr3QMBOr5857GTokryqOvEaLWlL68fMkpu oElFW5dgVdU7qG6kk857ol83Q7ELJWCODwY9R/MkdGsapIhbq8RbkYxkfg6shVIwcY6rbmBgAah xIt11idjczsNW9FAYsCJfkpzgP7orjHma+xjvfYzMf2mSFmnyWWXB5qoGhIsuAotqEUBDAPCqP/ vv+W79BMpiVZ3hKYa402gQ8uWA+CF4rYspWWMElhxU0zSrWAUlGdEIyLOueKUvrkgGEym7ULLNo /D/H7yzMiaqc0WzU6g9+r/T4ZLO6ZV1Ltr8WfX7YYNxXMgqnawbK6CV7pB7nN5tIB6KhmKKx47+ 1fp5rY34DLp+mt5vk3lkYwCu5g9zIZw7hpA1Jk2xkbQqXQHVzw3dILhLTtn+2y6ocJ4IZIXwB+o +Iih6/AfuV2H2qabNQ9ZoIj1iY9Bqa44gGmt9rW1vbtaEE/PFW+JOioSk/6DTQ14vMEQRPjfttb +nptIqF79gDn23AWQRpZZxlA9K3Dy888SaqQeV+DrLHgYu6IvNXk= X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 To allow the userspace to test many hardware configuration, introduce a new interface to configure the available formats per planes. VKMS supports multiple formats, so the userspace can choose any combination. The supported formats are configured by writing the fourcc code in supported_formats: # enable AR24 format echo '+AR24' > /config/vkms/DEVICE_1/planes/PLANE_1/supported_formats # disable AR24 format echo '-AR24' > /config/vkms/DEVICE_1/planes/PLANE_1/supported_formats # enable all format supported by VKMS echo '+*' > /config/vkms/DEVICE_1/planes/PLANE_1/supported_formats # disable all formats echo '-*' > /config/vkms/DEVICE_1/planes/PLANE_1/supported_formats Signed-off-by: Louis Chauvet --- Documentation/ABI/testing/configfs-vkms | 9 ++ Documentation/gpu/vkms.rst | 7 +- drivers/gpu/drm/vkms/tests/Makefile | 3 +- drivers/gpu/drm/vkms/tests/vkms_configfs_test.c | 102 +++++++++++++++++++++ drivers/gpu/drm/vkms/vkms_configfs.c | 113 ++++++++++++++++++++= ++++ drivers/gpu/drm/vkms/vkms_configfs.h | 4 + 6 files changed, 236 insertions(+), 2 deletions(-) diff --git a/Documentation/ABI/testing/configfs-vkms b/Documentation/ABI/te= sting/configfs-vkms index ef0c3da6b3ca..de901ce36b2e 100644 --- a/Documentation/ABI/testing/configfs-vkms +++ b/Documentation/ABI/testing/configfs-vkms @@ -147,6 +147,15 @@ Description: Default color range presented to userspace, same values as supported_color_ranges. =20 +What: /sys/kernel/config/vkms//planes//supported_formats +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + List of supported formats for this plane. To add a new + item, write its fourcc code prefixed with '+'. To remove, + use '-' prefix. Use '+*' to add all formats, '-*' to + remove all. + What: /sys/kernel/config/vkms//planes//possible_crtcs Date: Nov 2025 Contact: dri-devel@lists.freedesktop.org diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index 7e8f4fe3b392..e5280a99eee8 100644 --- a/Documentation/gpu/vkms.rst +++ b/Documentation/gpu/vkms.rst @@ -87,7 +87,7 @@ Start by creating one or more planes:: =20 sudo mkdir /config/vkms/my-vkms/planes/plane0 =20 -Planes have 7 configurable 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) @@ -108,6 +108,11 @@ Planes have 7 configurable attributes: must be set too. - default_color_range: Default color range presented to the userspace, same values as supported_color_ranges +- supported_formats: List of supported formats for this plane. To add a ne= w item in the + list, write it using a plus and fourcc code: +XR24 + To remove a format, use a minus and its fourcc: -XR24 + To add all formats use +* + To remove all formats, use -* =20 Continue by creating one or more CRTCs:: =20 diff --git a/drivers/gpu/drm/vkms/tests/Makefile b/drivers/gpu/drm/vkms/tes= ts/Makefile index d4d9ba8d4c54..92cfa7262ba4 100644 --- a/drivers/gpu/drm/vkms/tests/Makefile +++ b/drivers/gpu/drm/vkms/tests/Makefile @@ -3,6 +3,7 @@ vkms-kunit-tests-y :=3D \ vkms_config_test.o \ vkms_format_test.o \ - vkms_color_test.o + vkms_color_test.o \ + vkms_configfs_test.o \ =20 obj-$(CONFIG_DRM_VKMS_KUNIT_TEST) +=3D vkms-kunit-tests.o diff --git a/drivers/gpu/drm/vkms/tests/vkms_configfs_test.c b/drivers/gpu/= drm/vkms/tests/vkms_configfs_test.c new file mode 100644 index 000000000000..8d02c2c459d9 --- /dev/null +++ b/drivers/gpu/drm/vkms/tests/vkms_configfs_test.c @@ -0,0 +1,102 @@ +// SPDX-License-Identifier: GPL-2.0+ + +#include "linux/printk.h" +#include + +#include "../vkms_configfs.h" + +MODULE_IMPORT_NS("EXPORTED_FOR_KUNIT_TESTING"); + +/** + * struct vkms_configfs_parse_format_case - Store test case for format par= sing + * @str: Contains the string to parse + * @str_len: str len + * @expected_len: expected len of the matched format + * @expected_offset: expected offset in the string for the parsed format + */ +struct vkms_configfs_parse_format_case { + const char *str; + int str_len; + int expected_len; + int expected_offset; +}; + +struct vkms_configfs_parse_format_case vkms_configfs_parse_format_test_cas= es[] =3D { + { + .str =3D "+RG24", + .str_len =3D 6, + .expected_len =3D 5, + .expected_offset =3D 0, + }, { + .str =3D "-RG24", + .str_len =3D 6, + .expected_len =3D 5, + .expected_offset =3D 0 + }, { + .str =3D " -RG24", + .str_len =3D 8, + .expected_len =3D 5, + .expected_offset =3D 2 + }, { + .str =3D "+*", + .str_len =3D 3, + .expected_len =3D 2, + .expected_offset =3D 0 + }, { + .str =3D "-RG24+RG24", + .str_len =3D 11, + .expected_len =3D 5, + .expected_offset =3D 0 + }, { + .str =3D "-R1+RG24", + .str_len =3D 9, + .expected_len =3D 3, + .expected_offset =3D 0 + }, { + .str =3D "\n-R1", + .str_len =3D 5, + .expected_len =3D 3, + .expected_offset =3D 1 + }, { + .str =3D "-R1111", + .str_len =3D 3, + .expected_len =3D 3, + .expected_offset =3D 0 + } +}; + +static void vkms_configfs_test_parse_format(struct kunit *test) +{ + const struct vkms_configfs_parse_format_case *param =3D test->param_value; + char *out; + int len =3D vkms_configfs_parse_next_format(param->str, param->str + para= m->str_len, &out); + + KUNIT_EXPECT_EQ(test, len, param->expected_len); + KUNIT_EXPECT_PTR_EQ(test, out, param->str + param->expected_offset); +} + +static void vkms_configfs_test_parse_format_get_desc(struct vkms_configfs_= parse_format_case *t, + char *desc) +{ + snprintf(desc, KUNIT_PARAM_DESC_SIZE, "%s", t->str); +} + +KUNIT_ARRAY_PARAM(vkms_configfs_test_parse_format, vkms_configfs_parse_for= mat_test_cases, + vkms_configfs_test_parse_format_get_desc +); + +static struct kunit_case vkms_configfs_test_cases[] =3D { + KUNIT_CASE_PARAM(vkms_configfs_test_parse_format, + vkms_configfs_test_parse_format_gen_params), + {} +}; + +static struct kunit_suite vkms_configfs_test_suite =3D { + .name =3D "vkms-configfs", + .test_cases =3D vkms_configfs_test_cases, +}; + +kunit_test_suite(vkms_configfs_test_suite); + +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Kunit test for vkms configfs utility"); diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vk= ms_configfs.c index 56a0c542a143..e6cb245b8582 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -3,6 +3,8 @@ #include #include #include +#include +#include =20 #include "vkms_drv.h" #include "vkms_config.h" @@ -576,6 +578,115 @@ 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); +} + +/** + * vkms_configfs_parse_next_format() - Parse the next format in page, + * skipping all non fourcc-related characters + * @page: page to search into + * @page_end: last character of the page + * @out: Output pointer, will point inside page + * + * Returns: size of the matched format, @out will point to the + or - + */ +VISIBLE_IF_KUNIT +int vkms_configfs_parse_next_format(const char *page, const char *page_end= , char **out) +{ + int count =3D page - page_end; + char *tmp_plus =3D strnchr(page, count, '+'); + char *tmp_minus =3D strnchr(page, count, '-'); + + if (!tmp_plus && !tmp_minus) + return 0; + if (!tmp_plus) + *out =3D tmp_minus; + else if (!tmp_minus) + *out =3D tmp_plus; + else + *out =3D min(tmp_plus, tmp_minus); + + char *end =3D *out + 1; + + while (end < page_end) { + if (!isalnum(*end) && *end !=3D '*') + break; + end++; + } + + return end - *out; +} +EXPORT_SYMBOL_IF_KUNIT(vkms_configfs_parse_next_format); + +static ssize_t plane_supported_formats_store(struct config_item *item, + const char *page, size_t count) +{ + struct vkms_configfs_plane *plane; + + plane =3D plane_item_to_vkms_configfs_plane(item); + int ret =3D 0; + + if (count < 2 || count > 5) + return -EINVAL; + + if (page[0] !=3D '+' && page[0] !=3D '-') + return -EINVAL; + + if (page[1] =3D=3D '*' && count !=3D 2) + return -EINVAL; + + scoped_guard(mutex, &plane->dev->lock) { + char fmt[4] =3D {' ', ' ', ' ', ' '}; + + memcpy(fmt, &page[1], min(count - 1, 4)); + + if (page[0] =3D=3D '+' && page[1] =3D=3D '*') + ret =3D vkms_config_plane_add_all_formats(plane->config); + else if (page[0] =3D=3D '-' && page[1] =3D=3D '*') + vkms_config_plane_remove_all_formats(plane->config); + else if (page[0] =3D=3D '+') + ret =3D vkms_config_plane_add_format(plane->config, *(int *)fmt); + else if (page[0] =3D=3D '-') + vkms_config_plane_remove_format(plane->config, *(int *)fmt); + + if (ret) + return ret; + } + + return count; +} + CONFIGFS_ATTR(plane_, type); CONFIGFS_ATTR(plane_, supported_rotations); CONFIGFS_ATTR(plane_, default_rotation); @@ -583,6 +694,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, @@ -592,6 +704,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..73be660412ca 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.h +++ b/drivers/gpu/drm/vkms/vkms_configfs.h @@ -5,4 +5,8 @@ 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.54.0 From nobody Sat Jun 27 22:18:04 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 82B1734EF04 for ; Sat, 27 Jun 2026 03:31:50 +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=1782531111; cv=none; b=VDFE/ntBucUgNI5QhLgGau8JDrIn6ZUsp16+uf1xtw0OhQCZct2sxsxxhwj/zzT6GAT8SMzpnS9j4S+g2IMTvFdu9vBMS6w9qRDH1+hI+OhiyLsR2fxt4KqunczkA1Rwa1iYqQTfMVl3jtJRxmWz8124tl78dJiP0bLPOiGHn08= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531111; c=relaxed/simple; bh=dbnNOCVyuHgzODjpkXH7tcpHCmDfL0zKsDiaeIAlbdo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=TLZJiLnCmplxOHj/e55Q6AJrkuiU4PaVqbslBHw5cQu0V2W9waJzsXEGRlVXQVYrXN+6qyEfA1HxI3S+ogs3Jm8E+n4XXuRoWNLXA1q1/baJZWP4R7NB5mQkZxcioZzbV4q5nwU5078QZjBRKpfaK8xkMv2zlUJG49ME7m1NICo= 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=ZqI3IJ0v; 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="ZqI3IJ0v" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 426374E40A00; Sat, 27 Jun 2026 03:31:49 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 15DB660233; Sat, 27 Jun 2026 03:31:49 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id ADD53106F1172; Sat, 27 Jun 2026 05:31:45 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1782531107; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=aqUeAdfRMUeJoGH0Dv/QpauOpWa/cRF5WcCXvZnC8v8=; b=ZqI3IJ0vwrzlR4jB4ZtrMwKoV3omPPKEC8WoO1DRgMChk7Xmbdh+VB7+7fzCo0seMTFqHV QeKzII9LZzxujEqFn5iQyL7cQ2S4ivCnTl6Ua0FTJILVvVVBj/rfxXUDOy08X3r4jGRxYu 1flKfQ4OFjTHqBY0TnH60jG4XhVGVMJ694dV77WAueNpmMtgPIfnTXORgeT+3UR8IrSAJx FrXNzS3wl2hx0v9MjSwiybi2maVyygPqZT2KQmXG+0AfhnKJ4+bap1cZYxaxZzZrvThnGj +HNk8g9dLY8lqzmywDRIqrQbFD1JsPelydASxeDUsPg36QU9RSMKxjHopqwgKw== From: Louis Chauvet Date: Sat, 27 Jun 2026 05:30:41 +0200 Subject: [PATCH v5 24/38] 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: <20260627-vkms-all-config-v5-24-854aa0840926@bootlin.com> References: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> In-Reply-To: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet , Shuah Khan , Miguel Ojeda , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt Cc: Luca Ceresoli , Kory Maincent , 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 , llvm@lists.linux.dev X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1363; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=dbnNOCVyuHgzODjpkXH7tcpHCmDfL0zKsDiaeIAlbdo=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBqP0PgRY3eCdENGmpYDgYmhS4LQKZBvVCrsK1W4 tuXi3q7uACJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaj9D4BsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDIACgkQIK0uxlsQLOKavA/9EWZ8uaE5oglEpSJxLEisWcQU8IdCW0U ImAKTuFH4kdMVHFG4r/OFj1N8x/MZfbThX0ZCHWzOjuQBbuShDvE/7t1nJ31KMZssC+IcX3ki1o 4OJYJ0tXmcAADWqJP8Q3Sq1L3VQlzbmpXm9/eBKh1YGcz1wAL71Uw2DX0GQ5tWpvv5RUB12nPf2 QzIBRCFh/7pKZUZwcPZLcAwGouoLpzFZd6YFMlS5+y7B79on49XqbU5+wj14SD0E5f9dZvqv54/ IKyS1QkVkt0ZhCm/cEiepdYXAa/uSrDNXR3YMc7XFuO6u9tkBPV7otzpDycXycVyp0lfDkEyCgk L97s6IkarOl1qMrrXoJkckWEohXhD5YXeF+ECyp8zhF+p09DVSkUXX4Gq28uWGa/tepZJ5d9UAd EeaO3MJfQc938hnDAg4A9XJCxXrgXYA1LYqmYd/Puc+demIFhlSRTRNClIlJWZpyd4hpnKmeCP2 Drc8TaXJLiWWyTyN1UHACrZpR8pysWj9jW48nLtp0Y/cTBQFaAUti4xCBqU/apocpviYTnL7Ccg WOeHcz9fXVMCIFmVJLP1sXq+hZDCc+WDL3nwP7s0Fh/LJcG/G3Iy4B8qTtrkpu/K78c//s1R1Qv 7xoOc8tsbCzPo49zHgrEXXDTqxbQfO+kQcRYHdFDmKwMoXGpZkhM= X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Currently planes are rendered in creation order. This is not an issue, but with the introduction of new zpos configuration, it is required to properly render planes. Reviewed-by: Luca Ceresoli Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/vkms_crtc.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c b/drivers/gpu/drm/vkms/vkms_c= rtc.c index 079abfba427d..b9428de2d4aa 100644 --- a/drivers/gpu/drm/vkms/vkms_crtc.c +++ b/drivers/gpu/drm/vkms/vkms_crtc.c @@ -142,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.54.0 From nobody Sat Jun 27 22:18:04 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 1D2FD2C11F1 for ; Sat, 27 Jun 2026 03:31: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=1782531115; cv=none; b=aKXxxzOfESUuRiiZw4DrhE89b9L4LBeYdzx13i+Jk5OaNxxKQte3PRBOfKC+F2MmTaI24UsntQKDgD8Q3Qz0aP/QVHGdcqFyQB1/HYzsMYKu/R7WNkgplks77HSouT+TN+3u0LCey64lwOb4aex57CmqHgTMo29U2ueaHzB3bb0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531115; c=relaxed/simple; bh=R0M7JhyGN0B5deB+PFHZy1j907nVeLWVE0cQc3ZcK6o=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=mLyBaNHxhuHHShDvaqQ2dG6kD5FCOo2/kQ/rLpqA6hB3KGskJHlD3n1Ci36sCzawPuLM67vk0oAfyKLA9sHheaGL2KZxYmlAtYXqp6vT1GZmRghudpJ0KJqu+wNzmFsLRSwYgBBGbM74OeNJbkJEaogty6dmLmoiog8aor9OyeM= 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=kQCFFh6S; 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="kQCFFh6S" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id C91114E409FC; Sat, 27 Jun 2026 03:31:51 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 9C73E60233; Sat, 27 Jun 2026 03:31:51 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id E56AC106F116E; Sat, 27 Jun 2026 05:31:47 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1782531110; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=UHKkfLn7F6B+2UmWgmVb8YG02lcBtp0rabwOajLTgr0=; b=kQCFFh6S9A6Nvs9TA8S+tSErhytF2F8GsnfRNAJ6qUrh0XcIlgRWUKE837qUkJEtYPiJqc /HY5ZOgfcNM0gxgniYOCJM7FhSDb6fG1saHxpv8Bsnj6LmHm+aeX533gM7ZD8E9j+5Nvrh fTFjgL409z9cbkvMidy/xPuvEYweneH86XrEx8XlT+sBPYVkGyloDlh6w5nH2wqSDQl+yw 9DfNYV5cRVN6t9GPNt6cfoRyx/6612qwcE2+dPlNp1RrJSeUtKy2/xamxSdlLWUo906sYm Y342U0FyVmYfUKRRAnN4XRRTjOp15WX2GPFfMuQTiV8vq2zxq0oOMF08d/0RBA== From: Louis Chauvet Date: Sat, 27 Jun 2026 05:30:42 +0200 Subject: [PATCH v5 25/38] 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: <20260627-vkms-all-config-v5-25-854aa0840926@bootlin.com> References: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> In-Reply-To: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet , Shuah Khan , Miguel Ojeda , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt Cc: Luca Ceresoli , Kory Maincent , 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 , llvm@lists.linux.dev X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=16102; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=R0M7JhyGN0B5deB+PFHZy1j907nVeLWVE0cQc3ZcK6o=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBqP0PgidoZRWRuMaFVjMZFftd3+QWv7EWlpqWHu 8kMLRJFAmmJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaj9D4BsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDIACgkQIK0uxlsQLOIqMA//cxcLstDRGAYKl3qp7k7p9Q2Lw2+zQkb +rSQFeVfNj6oKBr9tThFOaoq83aF/BZwO/BvWKu+G9KgWd3xUpoIqwhpAIpp4iyOUGvksLPM89V 7t8iYyOKmmRvRddbYV9xab8dZ/OyJQotpqTu2W3QfnZQ1juy7iHS74PGA1jBawLABnIBXDZIQzf fxPFAZWTKrz6iAnbUuhGC9XYBNtB18f1iJ06doi8IgAVRaG8jezea/jPCkpr75OY2EQuHOJsUo5 okxP/izPT5d0xHLKetCodq9G1GGXrRHJxFpWk5gl0oUCYqBdONxuhWn9XNC0OpRKzy6yNQL2FaE gP8f35UhyIdn2W9lYxw8ArFcGyRCl0GbaXAkcew5cFsrJPCjfp5PRm630XfjzzbRF9PBrUedFEh xWy6Zh6Ungs47eMeKC3CdtAZS1OE82HglvB60DvGiHUCwTXiZKz2VwqyOd/1PYCquTSteIorcUK Bf5aaD1PXU9Ij6y5lkKg5u52pDxeTuUn9I7WaTLUOpxdqcEvi0BgL1yLgj8P//cWaCYMmXGYN6A IrWKRXg/RSLjyX94zfwHFyTQQAmTRsOOYHuR2MRAaLKDOy0978vJw5Masj0IxEMVxF9pWuJt00k 8JNRtx/Vpl0JNfz7LS9zHrLdxZ/J878sZ4MV52ZXmZhCx71Gj6bg= X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 VKMS can render plane in any order. Introduce the appropriate configuration. Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/tests/vkms_config_test.c | 89 ++++++++++++++++ drivers/gpu/drm/vkms/vkms_config.c | 56 ++++++++++ drivers/gpu/drm/vkms/vkms_config.h | 143 ++++++++++++++++++++++= ++++ drivers/gpu/drm/vkms/vkms_plane.c | 11 ++ 4 files changed, 299 insertions(+) diff --git a/drivers/gpu/drm/vkms/tests/vkms_config_test.c b/drivers/gpu/dr= m/vkms/tests/vkms_config_test.c index a88d8b4a969e..4a5899b8ccfd 100644 --- a/drivers/gpu/drm/vkms/tests/vkms_config_test.c +++ b/drivers/gpu/drm/vkms/tests/vkms_config_test.c @@ -201,6 +201,9 @@ static void vkms_config_test_default_config(struct kuni= t *test) KUNIT_EXPECT_EQ(test, vkms_config_plane_get_default_color_encoding(plane_cfg), DRM_COLOR_YCBCR_BT601); + KUNIT_EXPECT_EQ(test, vkms_config_plane_get_zpos_enabled(plane_cfg), fal= se); + // No need to test the other zpos configurations as they are discarded if + // the zpos property is not created. } =20 /* Encoders */ @@ -619,6 +622,91 @@ static void vkms_config_test_valid_plane_color_range(s= truct kunit *test) vkms_config_destroy(config); } =20 +static void vkms_config_test_valid_plane_zpos(struct kunit *test) +{ + struct vkms_config *config; + struct vkms_config_plane *plane_cfg; + + config =3D vkms_config_default_create(false, false, false, false); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); + + plane_cfg =3D get_first_plane(config); + + /* Valid, zpos disabled */ + vkms_config_plane_set_zpos_enabled(plane_cfg, false); + vkms_config_plane_set_zpos_mutable(plane_cfg, false); + vkms_config_plane_set_zpos_initial(plane_cfg, 0); + vkms_config_plane_set_zpos_min(plane_cfg, 0); + vkms_config_plane_set_zpos_max(plane_cfg, 0); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Valid, zpos disabled, min/max are ignored */ + vkms_config_plane_set_zpos_enabled(plane_cfg, false); + vkms_config_plane_set_zpos_mutable(plane_cfg, false); + vkms_config_plane_set_zpos_initial(plane_cfg, 8); + vkms_config_plane_set_zpos_min(plane_cfg, 3); + vkms_config_plane_set_zpos_max(plane_cfg, 2); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Valid, zpos enabled but mutable disabled */ + vkms_config_plane_set_zpos_enabled(plane_cfg, true); + vkms_config_plane_set_zpos_mutable(plane_cfg, false); + vkms_config_plane_set_zpos_initial(plane_cfg, 1); + vkms_config_plane_set_zpos_min(plane_cfg, 0); + vkms_config_plane_set_zpos_max(plane_cfg, 0); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Valid, zpos enabled but mutable disabled */ + vkms_config_plane_set_zpos_enabled(plane_cfg, true); + vkms_config_plane_set_zpos_mutable(plane_cfg, false); + vkms_config_plane_set_zpos_initial(plane_cfg, 0); + vkms_config_plane_set_zpos_min(plane_cfg, 0); + vkms_config_plane_set_zpos_max(plane_cfg, 0); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Invalid, zpos enabled with min > max */ + vkms_config_plane_set_zpos_enabled(plane_cfg, true); + vkms_config_plane_set_zpos_mutable(plane_cfg, true); + vkms_config_plane_set_zpos_initial(plane_cfg, 0); + vkms_config_plane_set_zpos_min(plane_cfg, 1); + vkms_config_plane_set_zpos_max(plane_cfg, 0); + KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); + + /* Valid, zpos enabled with min <=3D max */ + vkms_config_plane_set_zpos_enabled(plane_cfg, true); + vkms_config_plane_set_zpos_mutable(plane_cfg, true); + vkms_config_plane_set_zpos_initial(plane_cfg, 0); + vkms_config_plane_set_zpos_min(plane_cfg, 0); + vkms_config_plane_set_zpos_max(plane_cfg, 1); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Invalid, zpos enabled with initial < min */ + vkms_config_plane_set_zpos_enabled(plane_cfg, true); + vkms_config_plane_set_zpos_mutable(plane_cfg, true); + vkms_config_plane_set_zpos_initial(plane_cfg, 0); + vkms_config_plane_set_zpos_min(plane_cfg, 1); + vkms_config_plane_set_zpos_max(plane_cfg, 2); + KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); + + /* Invalid, zpos enabled with initial > max */ + vkms_config_plane_set_zpos_enabled(plane_cfg, true); + vkms_config_plane_set_zpos_mutable(plane_cfg, true); + vkms_config_plane_set_zpos_initial(plane_cfg, 3); + vkms_config_plane_set_zpos_min(plane_cfg, 1); + vkms_config_plane_set_zpos_max(plane_cfg, 2); + KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); + + /* Valid, zpos enabled with initial between min and max */ + vkms_config_plane_set_zpos_enabled(plane_cfg, true); + vkms_config_plane_set_zpos_mutable(plane_cfg, true); + vkms_config_plane_set_zpos_initial(plane_cfg, 1); + vkms_config_plane_set_zpos_min(plane_cfg, 0); + vkms_config_plane_set_zpos_max(plane_cfg, 2); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + vkms_config_destroy(config); +} + static void vkms_config_test_valid_plane_possible_crtcs(struct kunit *test) { struct vkms_config *config; @@ -1144,6 +1232,7 @@ static struct kunit_case vkms_config_test_cases[] =3D= { KUNIT_CASE(vkms_config_test_valid_plane_rotations), KUNIT_CASE(vkms_config_test_valid_plane_color_encoding), KUNIT_CASE(vkms_config_test_valid_plane_color_range), + KUNIT_CASE(vkms_config_test_valid_plane_zpos), KUNIT_CASE(vkms_config_test_valid_plane_possible_crtcs), KUNIT_CASE(vkms_config_test_invalid_crtc_number), KUNIT_CASE(vkms_config_test_invalid_encoder_number), diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index c7de3e307367..5bc8248f9935 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -91,6 +91,7 @@ struct vkms_config *vkms_config_default_create(bool enabl= e_cursor, if (IS_ERR(plane_cfg)) goto err_alloc; vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_PRIMARY); + vkms_config_plane_set_zpos_enabled(plane_cfg, false); =20 crtc_cfg =3D vkms_config_create_crtc(config); if (IS_ERR(crtc_cfg)) @@ -110,6 +111,7 @@ struct vkms_config *vkms_config_default_create(bool ena= ble_cursor, vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_OVERLAY); vkms_config_plane_set_default_pipeline(plane_cfg, enable_plane_pipeline= ); + vkms_config_plane_set_zpos_enabled(plane_cfg, false); =20 if (vkms_config_plane_attach_crtc(plane_cfg, crtc_cfg)) goto err_alloc; @@ -123,6 +125,7 @@ struct vkms_config *vkms_config_default_create(bool ena= ble_cursor, =20 vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_CURSOR); vkms_config_plane_set_default_pipeline(plane_cfg, enable_plane_pipeline); + vkms_config_plane_set_zpos_enabled(plane_cfg, false); =20 if (vkms_config_plane_attach_crtc(plane_cfg, crtc_cfg)) goto err_alloc; @@ -253,6 +256,33 @@ bool vkms_config_valid_plane_color_range(const struct = vkms_config *config, } EXPORT_SYMBOL_IF_KUNIT(vkms_config_valid_plane_color_range); =20 +VISIBLE_IF_KUNIT +bool vkms_config_valid_plane_zpos(const struct vkms_config *config, + const struct vkms_config_plane *plane_cfg) +{ + struct drm_device *dev =3D config->dev ? &config->dev->drm : NULL; + + if (!vkms_config_plane_get_zpos_enabled(plane_cfg) || + !vkms_config_plane_get_zpos_mutable(plane_cfg)) + return true; + + if (vkms_config_plane_get_zpos_initial(plane_cfg) > + vkms_config_plane_get_zpos_max(plane_cfg)) { + drm_info(dev, "Configured initial zpos value bigger than zpos max\n"); + return false; + } + + if (vkms_config_plane_get_zpos_max(plane_cfg) < + vkms_config_plane_get_zpos_min(plane_cfg) || + vkms_config_plane_get_zpos_initial(plane_cfg) < + vkms_config_plane_get_zpos_min(plane_cfg)) { + drm_info(dev, "Configured zpos value outside (zpos min; zpos max)\n"); + return false; + } + + return true; +} + static bool valid_planes_for_crtc(const struct vkms_config *config, struct vkms_config_crtc *crtc_cfg) { @@ -413,6 +443,9 @@ bool vkms_config_is_valid(const struct vkms_config *con= fig) struct vkms_config_crtc *crtc_cfg; struct vkms_config_plane *plane_cfg; =20 + bool has_zpos_enabled =3D false; + bool has_zpos_disabled =3D false; + vkms_config_for_each_plane(config, plane_cfg) { if (!vkms_config_valid_plane_rotation(config, plane_cfg)) return false; @@ -429,6 +462,19 @@ bool vkms_config_is_valid(const struct vkms_config *co= nfig) "Both supported color encodings and color ranges must be set, or none= \n"); return false; } + + if (!vkms_config_valid_plane_zpos(config, plane_cfg)) + return false; + + if (vkms_config_plane_get_zpos_enabled(plane_cfg)) + has_zpos_enabled =3D true; + else + has_zpos_disabled =3D true; + } + + if (has_zpos_enabled && has_zpos_disabled) { + drm_info(dev, "In the same device, all planes must have zpos enabled or = none of them"); + return false; } =20 if (!valid_plane_number(config)) @@ -527,6 +573,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 3de4a92af9c5..7c0c24939a96 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -52,6 +52,11 @@ struct vkms_config { * @supported_color_ranges: Color ranges that this plane will support * @supported_formats: List of supported formats * @supported_formats_count: Length of @supported_formats + * @zpos_enabled: Enable or disable the zpos property + * @zpos_mutable: Make the zpos property mutable or not (ignored if @zpos_= enabled is false) + * @zpos_initial: Initial value for zpos property (ignored if @zpos_enable= d is false) + * @zpos_min: Minimal value for zpos property (ignored if @zpos_enabled is= false) + * @zpos_max: Maximal value for zpos property (ignored if @zpos_enabled is= false) */ struct vkms_config_plane { struct list_head link; @@ -69,6 +74,11 @@ struct vkms_config_plane { unsigned int supported_formats_count; struct xarray possible_crtcs; bool default_pipeline; + bool zpos_enabled; + bool zpos_mutable; + unsigned int zpos_initial; + unsigned int zpos_min; + unsigned int zpos_max; =20 /* Internal usage */ struct vkms_plane *plane; @@ -557,6 +567,139 @@ vkms_config_plane_get_name(const struct vkms_config_p= lane *plane_cfg) return plane_cfg->name; } =20 +/** + * vkms_config_plane_set_zpos_enabled() - Enable or disable zpos property = for a plane + * @plane_cfg: Plane configuration to modify + * @zpos_enabled: Whether to enable the zpos property + */ +static inline +void vkms_config_plane_set_zpos_enabled(struct vkms_config_plane *plane_cf= g, + bool zpos_enabled) +{ + plane_cfg->zpos_enabled =3D zpos_enabled; +} + +/** + * vkms_config_plane_set_zpos_mutable() - Set whether zpos property is mut= able + * @plane_cfg: Plane configuration to modify + * @zpos_mutable: Whether the zpos property should be mutable + */ +static inline +void vkms_config_plane_set_zpos_mutable(struct vkms_config_plane *plane_cf= g, + bool zpos_mutable) +{ + plane_cfg->zpos_mutable =3D zpos_mutable; +} + +/** + * vkms_config_plane_set_zpos_initial() - Set the initial zpos value + * @plane_cfg: Plane configuration to modify + * @zpos_initial: Initial zpos value + */ +static inline +void vkms_config_plane_set_zpos_initial(struct vkms_config_plane *plane_cf= g, + unsigned int zpos_initial) +{ + plane_cfg->zpos_initial =3D zpos_initial; +} + +/** + * vkms_config_plane_set_zpos_min() - Set the minimum zpos value + * @plane_cfg: Plane configuration to modify + * @zpos_min: Minimum zpos value + */ +static inline +void vkms_config_plane_set_zpos_min(struct vkms_config_plane *plane_cfg, + unsigned int zpos_min) +{ + plane_cfg->zpos_min =3D zpos_min; +} + +/** + * vkms_config_plane_set_zpos_max() - Set the maximum zpos value + * @plane_cfg: Plane configuration to modify + * @zpos_max: Maximum zpos value + */ +static inline +void vkms_config_plane_set_zpos_max(struct vkms_config_plane *plane_cfg, + unsigned int zpos_max) +{ + plane_cfg->zpos_max =3D zpos_max; +} + +/** + * vkms_config_plane_get_zpos_enabled() - Check if zpos property is enabled + * @plane_cfg: Plane configuration to check + * + * Returns: + * True if the zpos property is enabled for this plane, false otherwise. + */ +static inline +bool vkms_config_plane_get_zpos_enabled(const struct vkms_config_plane *pl= ane_cfg) +{ + return plane_cfg->zpos_enabled; +} + +/** + * vkms_config_plane_get_zpos_mutable() - Check if zpos property is mutable + * @plane_cfg: Plane configuration to check + * + * Returns: + * True if the zpos property is mutable for this plane, false otherwise. + */ +static inline +bool vkms_config_plane_get_zpos_mutable(const struct vkms_config_plane *pl= ane_cfg) +{ + return plane_cfg->zpos_mutable; +} + +/** + * vkms_config_plane_get_zpos_initial() - Get the initial zpos value + * @plane_cfg: Plane configuration to check + * + * Returns: + * The initial zpos value for this plane. The return value is undefined if + * zpos is disabled. + */ +static inline +unsigned int vkms_config_plane_get_zpos_initial(const struct vkms_config_p= lane *plane_cfg) +{ + return plane_cfg->zpos_initial; +} + +/** + * vkms_config_plane_get_zpos_min() - Get the minimum zpos value + * @plane_cfg: Plane configuration to check + * + * Returns: + * The minimum allowed zpos value for this plane. The return value is unde= fined + * if zpos is disabled. + */ +static inline +unsigned int vkms_config_plane_get_zpos_min(const struct vkms_config_plane= *plane_cfg) +{ + return plane_cfg->zpos_min; +} + +/** + * vkms_config_plane_get_zpos_max() - Get the maximum zpos value + * @plane_cfg: Plane configuration to check + * + * Returns: + * The maximum allowed zpos value for this plane. The return value is unde= fined + * if zpos is disabled. + */ +static inline +unsigned int vkms_config_plane_get_zpos_max(const struct vkms_config_plane= *plane_cfg) +{ + return plane_cfg->zpos_max; +} + +#if IS_ENABLED(CONFIG_KUNIT) +bool vkms_config_valid_plane_zpos(const struct vkms_config *config, + const struct vkms_config_plane *plane_cfg); +#endif + /** * vkms_config_plane_attach_crtc - Attach a plane to a CRTC * @plane_cfg: Plane to attach diff --git a/drivers/gpu/drm/vkms/vkms_plane.c b/drivers/gpu/drm/vkms/vkms_= plane.c index 6e767cdf8194..d600a6167042 100644 --- a/drivers/gpu/drm/vkms/vkms_plane.c +++ b/drivers/gpu/drm/vkms/vkms_plane.c @@ -214,6 +214,17 @@ struct vkms_plane *vkms_plane_init(struct vkms_device = *vkmsdev, =20 if (vkms_config_plane_get_default_pipeline(plane_cfg)) vkms_initialize_colorops(&plane->base); + if (vkms_config_plane_get_zpos_enabled(plane_cfg)) { + if (vkms_config_plane_get_zpos_mutable(plane_cfg)) { + drm_plane_create_zpos_property(&plane->base, + vkms_config_plane_get_zpos_initial(plane_cfg), + vkms_config_plane_get_zpos_min(plane_cfg), + vkms_config_plane_get_zpos_max(plane_cfg)); + } else { + drm_plane_create_zpos_immutable_property(&plane->base, + vkms_config_plane_get_zpos_initial(plane_cfg)); + } + } =20 return plane; } --=20 2.54.0 From nobody Sat Jun 27 22:18:04 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 28358314B9D for ; Sat, 27 Jun 2026 03:31:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531116; cv=none; b=GOH4IPUbCwWpvG+zqwMFspC2Xvc2NNgU8CD6+TwbsI99oQV/JSCTbwXkmtVE3ZVZkHaCLJ3en+sXHyIzMvwI+9x7KjJxZBA2UflZB7SoLK+LbluRxGLqoY3TYw5cg1Jg3PE1q1tgAam/guadSNSpZLWh9wk2QWW0u2zy/CZHQZQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531116; c=relaxed/simple; bh=o+3PVM3hs6TqBxe06OZL6hUjzzOIiCuSF3Ef59l4yug=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gnbglKq19tNngarGhfyeft67MMhoq7zMEsjXa5siAuoWv1xyGZvOW8Rnozm9vNM7La/O8K7K+eVgsBA1eobKEAq9f+ZX3BuXpaiipFt6LJT8x5hZzUsnDA+TQV9php789loa/AL/A887/XoPD2wOzK7HS2LrqbIW6LqKB4Lemfc= 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=VvqaBcjm; 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="VvqaBcjm" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 0C3891A0A23; Sat, 27 Jun 2026 03:31:54 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id CE67560233; Sat, 27 Jun 2026 03:31:53 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 63E6D106F1174; Sat, 27 Jun 2026 05:31:50 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1782531112; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=WtHp2KsQUZkrfh1pFrvPDVyIIkElV2EFOCiE1HWjTiQ=; b=VvqaBcjm+uRjLaFfkJhhbv/52nsERToLExanOVY2D48+2mbqKXi0+bfs1v+BkuMyMd5+/d 0QpMqUGASefrFUmPWHZJB2fCgmwrwOAay3295KW839UtP6VBzi43p48lDIqb9KfBdRvkI5 2cO/q/RhJLAJqg8c1NXiJCChTV4l+hRwuErKDeQf8iOqQRZQt+nkyextIoK6ueUFQ505L2 3kcHfJnMa4fIlMP9hTASRCt9xSK6Sa/J7XQx7pGCinHgkTVAudkKcxr6ngHn1W9Sjh38yH US3Sjt+6UW21jJWMsLNr9b0Xg11BtVefRqX7bEudcW6DDy4xC1iJeiW1e0tpKA== From: Louis Chauvet Date: Sat, 27 Jun 2026 05:30:43 +0200 Subject: [PATCH v5 26/38] 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: <20260627-vkms-all-config-v5-26-854aa0840926@bootlin.com> References: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> In-Reply-To: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet , Shuah Khan , Miguel Ojeda , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt Cc: Luca Ceresoli , Kory Maincent , 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 , llvm@lists.linux.dev X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=9391; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=o+3PVM3hs6TqBxe06OZL6hUjzzOIiCuSF3Ef59l4yug=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBqP0PgmPD9wC3R0HTehfxRItfThyD0oRqHAQjuB Y9OTV3slbGJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaj9D4BsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDIACgkQIK0uxlsQLOK2xhAAlNNnaPT0wopor2nuWiaq1PSvTeywB6J x/Z195pnrm+e4DGPTrb8Aze3/YMEMC5/qd4NqKwOuutvAYZr/zsHvm+RngsLBVrK075pVizT/Dh olRq8v6xcTE4FK62QTjhdVd2uE8bw7+ulXcZwvTFhJl1vK799umlKQYPDN6IE1UdqvINe76f2MV vV+9DN5/r1jgIZRqnCXopigjSRmA9uZ/SYznBFerDO0w0duZpLYTuiZQBB1CO2ncUNjukL8LJ1l CUNlPjmV4qeIPMU6XLQEoZlC7UnLZr+avwXlfzPUvol6+7c282N0DBJYPFH1yBiLl/NBCgXPFEv dN425G/zk5XUf1N2972H2B4CvPxjzNYbIpvrjPmWjsO4QzyvqCVeGZyj6LpeQNQz2kqJC206ICu Wcq206seEM9m/SgQBXX+CDK5jmA1/LvWlPy7wn20AG12ftxmplDeDSnzm8nBUBcsrV3ltakKDjh QcaIA7G2Ma0vdgepCL3RjPwTY4byuse3vgEkdRQtBVWX9FekHrpzFLyxuX3DcdKHmVRif0k2Twi 37sHmhdvN8g6rrLuvQMZHID8ufAjzFrZRyl1XSvbB9Wcez4rB/DV39AHIaXTaV0HhFVLyqsISjv +8Jx9Fa+Y4Len/tARWIXDTfml4W2uUMZLTqZquTr88Mq3n9aMgXQ= X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Modern compositor rely on zpos management to offload some processing to deticated hardware. In order to test multiple configurations, add zpos configuration to configFS. Introduce multiple attributes to configure zpos: - zpos_enabled - Create or not the zpos property. If not created, the zpos is undefined. - zpos_mutable - If the zpos property is created, allow or not the userspace to modify it - zpos_initial - Initial value for zpos property. Must be between zpos_min and zpos_max - zpos_min - Minimum zpos value for this plane. Must be <=3D zpos_max - zpos_max - Maximum zpos value for this plane. Must be >=3D zpos_min Reviewed-by: Luca Ceresoli Signed-off-by: Louis Chauvet --- Documentation/ABI/testing/configfs-vkms | 36 +++++++ Documentation/gpu/vkms.rst | 9 +- drivers/gpu/drm/vkms/vkms_configfs.c | 180 ++++++++++++++++++++++++++++= ++++ 3 files changed, 224 insertions(+), 1 deletion(-) diff --git a/Documentation/ABI/testing/configfs-vkms b/Documentation/ABI/te= sting/configfs-vkms index de901ce36b2e..9bc51b1e682a 100644 --- a/Documentation/ABI/testing/configfs-vkms +++ b/Documentation/ABI/testing/configfs-vkms @@ -156,6 +156,42 @@ Description: use '-' prefix. Use '+*' to add all formats, '-*' to remove all. =20 +What: /sys/kernel/config/vkms//planes//zpos_enabled +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Enable or disable the zpos property. Value: 1 - enabled, + 0 - disabled. + +What: /sys/kernel/config/vkms//planes//zpos_mutable +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Create the zpos property as mutable or immutable. + Value: 1 - mutable, 0 - immutable. No effect if + zpos_enabled is not set. + +What: /sys/kernel/config/vkms//planes//zpos_initial +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Set the initial zpos value. Must be between zpos_min + and zpos_max. No effect if zpos_enabled is not set. + +What: /sys/kernel/config/vkms//planes//zpos_min +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Set the minimal zpos value. No effect if zpos_enabled + is not set. + +What: /sys/kernel/config/vkms//planes//zpos_max +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Set the maximal zpos value. No effect if zpos_enabled + is not set. + What: /sys/kernel/config/vkms//planes//possible_crtcs Date: Nov 2025 Contact: dri-devel@lists.freedesktop.org diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index e5280a99eee8..b58e96a3c273 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 13 configurable attributes: =20 - type: Plane type: 0 overlay, 1 primary, 2 cursor (same values as those exposed by the "type" property of a plane) @@ -113,6 +113,13 @@ Planes have 8 configurable attributes: To remove a format, use a minus and its fourcc: -XR24 To add all formats use +* To remove all formats, use -* +- zpos_enabled: Enable or not the zpos property: 1 enable, 0 disable +- zpos_mutable: Create the zpos property as a mutable or imutable property= : 1 mutable, + 0 immutable. No effect if zpos_enabled is not set. +- zpos_initial: Set the initial zpos value. Must be between zpos_min and z= pos_max. No + effect if zpos_enabled is not set. +- zpos_min: Set the minimum zpos value. No effect if zpos_enabled is not s= et. +- zpos_max: Set the maximum zpos value. No effect if zpos_enabled is not s= et. =20 Continue by creating one or more CRTCs:: =20 diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vk= ms_configfs.c index e6cb245b8582..95f4594fb683 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -687,6 +687,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_, supported_rotations); CONFIGFS_ATTR(plane_, default_rotation); @@ -695,6 +865,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, @@ -705,6 +880,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.54.0 From nobody Sat Jun 27 22:18:04 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 B554234FF79 for ; Sat, 27 Jun 2026 03:31:57 +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=1782531119; cv=none; b=BSxITaV1A+o84OaN8DXoTNQgFYbfh1YU0vfFs20RlVR2O7ylbgUfpLcKuyaF758+Mb58wDFoq3AYdWPiBK/qVGYfvQgDXSDH8RQb+uep0UiSqh1XDn8gc+i9VwfDTU9RVkZwuFFOJUMkxP+3NFxgU0A9Y6foveE79/LEypc1gSk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531119; c=relaxed/simple; bh=sE+tg/3T+5ynY9NqyyBl+Cr80Nn+61gq/OcDkTQN3Us=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=XmKYfHdb319JOuNyD0LH7bJ+hEyIOnkEIbRhH1GEkP8C8Zm1kqZYurX5ySqNetko8lDazaevH+gQ+mLl5mGazDbi4pK1ZCfXhfYx/S9S5DItT9CfNEBNQb3WYtQonLwR1znjZMffsN1lvV8gAPxQjMyFjQC42nKydiS5GrlHrU4= 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=DVnmPbJM; 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="DVnmPbJM" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 98A871A0A32; Sat, 27 Jun 2026 03:31:56 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 6511960233; Sat, 27 Jun 2026 03:31:56 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id EB11D106F1176; Sat, 27 Jun 2026 05:31:52 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1782531114; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=fm4VTCHvUwbhUTtJjVM717r/jvKYGB7pUrXIdJAJQEc=; b=DVnmPbJMl1eqloG5aT0vc38eNPAlPvGSCnJSFuxf+YlOYp1zDvTuIewUgwGo5GmEMJ6P48 vXCJKcjxXbibVO0qGgFN5OCzTyZozpwkaLfUbMopscJCLRRo46Q0/5io6D5t4VudlOWkF2 lwmio7UMhDikjFDK9z3jqZmMPTIe9oXGaidjtSd1O7KEnDw9k4G99/bhfdkiYlJu2t4NPL xx3hIc8we0k7K1YE0OHkzIResDXtwKiztJcy175YofR57ngdW5YkuSBmN3eVTpHbmyBEY7 r2SQ2yQgvu73H2aUIXJMgXXjAFadvGBwvaNlEwVQ2z/AJ8u+UDTIA5aYCcGSZQ== From: Louis Chauvet Date: Sat, 27 Jun 2026 05:30:44 +0200 Subject: [PATCH v5 27/38] 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: <20260627-vkms-all-config-v5-27-854aa0840926@bootlin.com> References: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> In-Reply-To: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet , Shuah Khan , Miguel Ojeda , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt Cc: Luca Ceresoli , Kory Maincent , 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 , llvm@lists.linux.dev X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=6761; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=sE+tg/3T+5ynY9NqyyBl+Cr80Nn+61gq/OcDkTQN3Us=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBqP0PgKSp4VuD0cpcj5ypHSKJhgrcRNF3vvEWnd i/qcdLukB6JAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaj9D4BsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDIACgkQIK0uxlsQLOKZzg//YQFELjtKdqpFlWIAgPp4hHXG/cNTXjl 7tj4AhBoxndB8+5ecCECuAhKoX6OZnRXz1otyDn5Ow9ZMNQBJyXwOwLubp7FhrZPHiRHu4WvcP8 j86/GRJ5g9fD69MlkU72TEjKJo2O9cW/kM6i+GmxCSp6pcfAkYtDSUpKnqGF5YpS7Kz/X9tczBS iN6pPOvCyCeT5NexWXzDNZBIgIYu3zn39qNXF/LNfF8d3ytEGOttbB4+axhN3aFiXiTfiIQwXUX zYOU9PV2FC9FbJsS4LY0A3lRD5GmA8YHyVVRyQdt/eeIRCDN3m4cb536egAXWrWmPF4cw2KKhiM fX+K4zgnLGdkx7wB6O0WHhspClDpo28tfdlXjIJkmUmYo9y4JzHtt7BQ84KZVRSJuhD0T8fSSKm 1j95Zyhxhmc3gNLa9/MMWPbbum9KhkIdQ6gFfFhLP5JuTSceNV5wJn9dX9YiEPH6hRu8DPkDf/9 ju+UlZT5l21svxjg9qw3JCAbHpmdlBrPZ512Ka3kTLwmPT76d93s7L0TFEE8Z9gToNQz1rml1ek nrGSG7qF81iiwsvSdgSWb8Baaaejc1P0Mo4RfvFD9Dc6iXC4B1PdGswDopWrhmH9NxLQGjw/CsN nTb7CTvotF3RLmJ/cIddANRLJI+ejJP5e400jZfRHHJv4yyIFrMI= X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 In order to emulate connector-specific behavior, add connector type configuration. Reviewed-by: Luca Ceresoli Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/tests/vkms_config_test.c | 5 +++++ drivers/gpu/drm/vkms/vkms_config.c | 3 +++ drivers/gpu/drm/vkms/vkms_config.h | 24 ++++++++++++++++++++++++ drivers/gpu/drm/vkms/vkms_connector.c | 5 +++-- drivers/gpu/drm/vkms/vkms_connector.h | 4 +++- drivers/gpu/drm/vkms/vkms_output.c | 2 +- 6 files changed, 39 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/vkms/tests/vkms_config_test.c b/drivers/gpu/dr= m/vkms/tests/vkms_config_test.c index 4a5899b8ccfd..1900cc79db2b 100644 --- a/drivers/gpu/drm/vkms/tests/vkms_config_test.c +++ b/drivers/gpu/drm/vkms/tests/vkms_config_test.c @@ -137,6 +137,7 @@ static void vkms_config_test_default_config(struct kuni= t *test) struct vkms_config *config; struct vkms_config_plane *plane_cfg; struct vkms_config_crtc *crtc_cfg; + struct vkms_config_connector *connector_cfg; int n_primaries =3D 0; int n_cursors =3D 0; int n_overlays =3D 0; @@ -211,6 +212,10 @@ static void vkms_config_test_default_config(struct kun= it *test) =20 /* Connectors */ KUNIT_EXPECT_EQ(test, vkms_config_get_num_connectors(config), 1); + vkms_config_for_each_connector(config, connector_cfg) { + KUNIT_EXPECT_EQ(test, vkms_config_connector_get_type(connector_cfg), + DRM_MODE_CONNECTOR_VIRTUAL); + } =20 KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); =20 diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index 5bc8248f9935..c407aea0bc6a 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -598,6 +598,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; @@ -930,6 +932,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 7c0c24939a96..d6d185b2ccc0 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -130,6 +130,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 @@ -142,6 +143,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 @@ -344,6 +346,28 @@ vkms_config_plane_set_default_pipeline(struct vkms_con= fig_plane *plane_cfg, } =20 /** + * vkms_config_connector_get_type() - Return the connector type + * @connector_cfg: Connector to get the type from + */ +static inline int +vkms_config_connector_get_type(const struct vkms_config_connector *connect= or_cfg) +{ + return connector_cfg->type; +} + +/** + * vkms_config_connector_set_type() - Set the connector type + * @connector_cfg: Connector to set the type to + * @type: New connector type + */ +static inline void +vkms_config_connector_set_type(struct vkms_config_connector *connector_cfg, + int type) +{ + connector_cfg->type =3D type; +} + +/* * vkms_config_plane_get_default_rotation() - Get the default rotation for= a plane * @plane_cfg: Plane to get the default rotation from * diff --git a/drivers/gpu/drm/vkms/vkms_connector.c b/drivers/gpu/drm/vkms/v= kms_connector.c index b0a6b212d3f4..5a87dc2d4c63 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.c +++ b/drivers/gpu/drm/vkms/vkms_connector.c @@ -68,7 +68,8 @@ static const struct drm_connector_helper_funcs vkms_conn_= helper_funcs =3D { .best_encoder =3D vkms_conn_best_encoder, }; =20 -struct vkms_connector *vkms_connector_init(struct vkms_device *vkmsdev) +struct vkms_connector *vkms_connector_init(struct vkms_device *vkmsdev, + struct vkms_config_connector *connector_cfg) { struct drm_device *dev =3D &vkmsdev->drm; struct vkms_connector *connector; @@ -79,7 +80,7 @@ struct vkms_connector *vkms_connector_init(struct vkms_de= vice *vkmsdev) return ERR_PTR(-ENOMEM); =20 ret =3D drmm_connector_init(dev, &connector->base, &vkms_connector_funcs, - DRM_MODE_CONNECTOR_VIRTUAL, NULL); + vkms_config_connector_get_type(connector_cfg), NULL); if (ret) return ERR_PTR(ret); =20 diff --git a/drivers/gpu/drm/vkms/vkms_connector.h b/drivers/gpu/drm/vkms/v= kms_connector.h index ed312f4eff3a..33253d29b1cc 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.h +++ b/drivers/gpu/drm/vkms/vkms_connector.h @@ -4,6 +4,7 @@ #define _VKMS_CONNECTOR_H_ =20 #include "vkms_drv.h" +#include "vkms_config.h" =20 #define drm_connector_to_vkms_connector(target) \ container_of(target, struct vkms_connector, base) @@ -24,7 +25,8 @@ struct vkms_connector { * Returns: * The connector or an error on failure. */ -struct vkms_connector *vkms_connector_init(struct vkms_device *vkmsdev); +struct vkms_connector *vkms_connector_init(struct vkms_device *vkmsdev, + struct vkms_config_connector *connector_cfg); =20 /** * vkms_trigger_connector_hotplug() - Update the device's connectors status diff --git a/drivers/gpu/drm/vkms/vkms_output.c b/drivers/gpu/drm/vkms/vkms= _output.c index 86ce07a617f5..1288c8551bc8 100644 --- a/drivers/gpu/drm/vkms/vkms_output.c +++ b/drivers/gpu/drm/vkms/vkms_output.c @@ -97,7 +97,7 @@ int vkms_output_init(struct vkms_device *vkmsdev) struct vkms_config_encoder *possible_encoder; unsigned long idx =3D 0; =20 - connector_cfg->connector =3D vkms_connector_init(vkmsdev); + connector_cfg->connector =3D vkms_connector_init(vkmsdev, connector_cfg); if (IS_ERR(connector_cfg->connector)) { DRM_ERROR("Failed to init connector\n"); return PTR_ERR(connector_cfg->connector); --=20 2.54.0 From nobody Sat Jun 27 22:18:04 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 3474835A3B9 for ; Sat, 27 Jun 2026 03:32:00 +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=1782531122; cv=none; b=VrlHUlhuNVmVbRKONsBUbIQuV15L5m/Ulav9U7N81ewKw0wKP0t6feKr/rM5lQXoKBwumOaaH5ObANou4SpDUf16vwldNuMcY11VC+sPkgU3PyfAD1beDnB5RBdbnSTeIaHrzAFEkxbzKN0ac242Pp3UbPfBf9jRAG6MqgVYgSs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531122; c=relaxed/simple; bh=vbenv+pQSiNZcDfZE0Pylq/m0+ak/8m5W1XYtB05JGU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=O/LjxpIpDx9zX+O+aSmheYl3zmnDoYF8UO3DjIzJFuLrP0e1gbkVNxeqRDnbn4SF1WSzy5fizH74Q37WMQX/etsVlas5zZqvyCtaFRx/XH97SH6MP9EXT42dpidpkTYTZjWVzPMTQaR8Wh0QuqnEX69dSnuqG0CUl05PK/WTCOY= 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=c0w22a3n; 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="c0w22a3n" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 10F564E40A02; Sat, 27 Jun 2026 03:31:59 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id D240660233; Sat, 27 Jun 2026 03:31:58 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 45799106F1179; Sat, 27 Jun 2026 05:31:55 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1782531117; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=GkxkbljcYLRIXXs5VDtu2PEu7V6pmMfgDmaKHnKfnO8=; b=c0w22a3n8MHl4gyq3waM2HZfGT/Dk2N6893TIgDjM70OVf1/5QQGprZfao5L0a2l2+rOCv 0tsNRx/YU7wz29lRADhkGXcgu3gfcrp1i/8ra8qNWRDR6kUdIWaws9v0+DNNOeOpoDsEsa lxSAnr0nVRfURvoFJRgEN8sfOCZlgJ9sVnIPpmWaOMANFyyglgmw2ZhH/d0CGXyVGJoQmd qvOrRb7PvH3ZlMC/jvhZzVvV9Ol6Cj02osump8cCgKfL+OxS5irKBrQl1bBalCvrfMvTtY O7Alyk5swsAvdpCcKq9Jn+mBvMPJNwIyax86k3DXqiv/vk/zArZCGDSUvmUu+w== From: Louis Chauvet Date: Sat, 27 Jun 2026 05:30:45 +0200 Subject: [PATCH v5 28/38] 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: <20260627-vkms-all-config-v5-28-854aa0840926@bootlin.com> References: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> In-Reply-To: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet , Shuah Khan , Miguel Ojeda , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt Cc: Luca Ceresoli , Kory Maincent , 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 , llvm@lists.linux.dev X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=4162; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=vbenv+pQSiNZcDfZE0Pylq/m0+ak/8m5W1XYtB05JGU=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBqP0PgIgHVSGT5N4uYOsuyVnMJfSZLU964R/iPa RPQje0PZcWJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaj9D4BsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDIACgkQIK0uxlsQLOIOaBAAr2K0xlUwqfX921dLw5NJEtdFxU7j8k6 ohj1Bx5cUGP9bh8Il5GOxz/P7DdpY7FkQT+aGJ2j4mM+wN/J9YJB6xSlnkfZ030FcnhaP4mt8k4 aJ59nNvsFCZ3Y8TQG9X0XN9Q66B4f9+g6E0m7ZJc3pgz20kgE5N0zKLh6om2XWkvv7YvcqyPor6 9cM51k3koheIpFawxrI9mN/cy8MFHp2RiPo3CuqKA8zTGPn62X2IJWH/GS3MxwRkrzkplJvJTrd izTRrzMadKxUjFpqFe35SPV0oODqYigpzTI98AWParpChF5eNtcsIU7yIsbLXv6sPReePsKtob/ yTuNPc1necs+Y1YUPJb/9uzn7U06HOaUe8rU+o/nwxwuwQzeS7BySZyK16WMLtdSdu9sJpw3Jga LiUzkwnpxJA6QPPdfK2nG+vnw1kMfB5YHzxXKsTQZPUke585NSF9kIocAxJgwUOqQQ7lWjrji8L YWOSbdlakbR9RxskwjPm+r0xGAVVR0YmoIyg0+IzD4oobaK9xskDVaR+MkHFuCeTfeMzlOBY/hH ZYaGXAX0a13oXEUXcBXtyYVM+ny4v6I3CgT44WmTe2v+a/XiyAh97OQC9Aa1B+NiukNzY1BbVv2 B3NmWdxwRbL1hD6H0YGIhS05TS0UzIPavTt9VE8gj0AxNuSwzSDc= X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Add a new attribute to connector to change its type. This is mostly cosmetic and don't have direct effect in VKMS behavior. Reviewed-by: Luca Ceresoli Signed-off-by: Louis Chauvet --- Documentation/ABI/testing/configfs-vkms | 7 ++++ Documentation/gpu/vkms.rst | 3 +- drivers/gpu/drm/vkms/vkms_configfs.c | 65 +++++++++++++++++++++++++++++= ++++ 3 files changed, 74 insertions(+), 1 deletion(-) diff --git a/Documentation/ABI/testing/configfs-vkms b/Documentation/ABI/te= sting/configfs-vkms index 9bc51b1e682a..0e588a1145ff 100644 --- a/Documentation/ABI/testing/configfs-vkms +++ b/Documentation/ABI/testing/configfs-vkms @@ -33,6 +33,13 @@ Description: Connection status of the connector. Possible values: 1 - connected, 2 - disconnected, 3 - unknown. =20 +What: /sys/kernel/config/vkms//connectors//type +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Type of the connector. Possible values match those + exposed by the "type" field in drm_connector. + What: /sys/kernel/config/vkms//connectors//possible_en= coders Date: Nov 2025 Contact: dri-devel@lists.freedesktop.org diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index b58e96a3c273..f2622b3fd8af 100644 --- a/Documentation/gpu/vkms.rst +++ b/Documentation/gpu/vkms.rst @@ -137,10 +137,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 95f4594fb683..8b414f1950e8 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -1117,10 +1117,75 @@ static ssize_t connector_status_store(struct config= _item *item, return (ssize_t)count; } =20 +static ssize_t connector_type_show(struct config_item *item, char *page) +{ + struct vkms_configfs_connector *connector; + int type; + + connector =3D connector_item_to_vkms_configfs_connector(item); + + scoped_guard(mutex, &connector->dev->lock) { + type =3D vkms_config_connector_get_type(connector->config); + } + + return sprintf(page, "%u", type); +} + +static ssize_t connector_type_store(struct config_item *item, + const char *page, size_t count) +{ + struct vkms_configfs_connector *connector; + int val, ret; + + connector =3D connector_item_to_vkms_configfs_connector(item); + + ret =3D kstrtouint(page, 10, &val); + + if (ret) + return ret; + + switch (val) { + case DRM_MODE_CONNECTOR_Unknown: + case DRM_MODE_CONNECTOR_VGA: + case DRM_MODE_CONNECTOR_DVII: + case DRM_MODE_CONNECTOR_DVID: + case DRM_MODE_CONNECTOR_DVIA: + case DRM_MODE_CONNECTOR_Composite: + case DRM_MODE_CONNECTOR_SVIDEO: + case DRM_MODE_CONNECTOR_LVDS: + case DRM_MODE_CONNECTOR_Component: + case DRM_MODE_CONNECTOR_9PinDIN: + case DRM_MODE_CONNECTOR_DisplayPort: + case DRM_MODE_CONNECTOR_HDMIA: + case DRM_MODE_CONNECTOR_HDMIB: + case DRM_MODE_CONNECTOR_TV: + case DRM_MODE_CONNECTOR_eDP: + case DRM_MODE_CONNECTOR_VIRTUAL: + case DRM_MODE_CONNECTOR_DSI: + case DRM_MODE_CONNECTOR_DPI: + case DRM_MODE_CONNECTOR_SPI: + case DRM_MODE_CONNECTOR_USB: + break; + default: + return -EINVAL; + } + + scoped_guard(mutex, &connector->dev->lock) { + if (connector->dev->enabled) + return -EBUSY; + + vkms_config_connector_set_type(connector->config, val); + } + + return count; +} + CONFIGFS_ATTR(connector_, status); +CONFIGFS_ATTR(connector_, type); =20 static struct configfs_attribute *connector_item_attrs[] =3D { &connector_attr_status, + &connector_attr_type, NULL, }; =20 --=20 2.54.0 From nobody Sat Jun 27 22:18:04 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 5A338329367 for ; Sat, 27 Jun 2026 03:32:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531123; cv=none; b=WETf+HE5oPkHcL/w/jlxkVHOgr2xSiq4PXZsJYZE4+4vCR3TNyZITh8XajL8P/mQlO5zqPGRx6aS/TuSKMclsl9KYUE2FN81lr85YUP+sDm4pRkigGg7LPHd+tiLaaoCFCkO3M+qolzW6B5+mUcpeUmC4sCd8q41D4Hs6XPJRj4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531123; c=relaxed/simple; bh=UXwwGxaBOqBDjeeLTM/UljPXbDdhrzGfo5KlNYNKbdc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=U0RfyIXGbl7/XsJ/Vyqm2nB/vpJndKG4XSqNE67Goz/YQ8stv6HTpK28xdB4LUx0Nf0j8Q7rktEbjC5DqFioN6RgCSX9Ca5zh2kXEmdIYod13qOPSX2yOLD5Sp9giQiUgocDNyuIEUI/SZDfwENT3AClDZ/id8hAl1q44UPBawc= 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=ALiIgn+L; 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="ALiIgn+L" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 4AD1DC5CD7E; Sat, 27 Jun 2026 03:32:10 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 3AFED60233; Sat, 27 Jun 2026 03:32:01 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id B9DB7106F1167; Sat, 27 Jun 2026 05:31:57 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1782531119; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=Rug1DyPN2ppPnE9qR5l8NP+bC1fynXftShzG6bvk3xI=; b=ALiIgn+LBYqbYewgzYRXkIRWZdhsBjo1JmjcSueIB63zf4rDNL9B21bGeSkfk/jtHBsofy gIdHlNm2ey69z+T9e5p7LCMYxoNxHxpC/N7p6T9eA/+eGhKIEj66vwW0Qd5O1GnFN6afv+ KcXAbNXHkIk4a1/AOBj1bUpPL1GK8M813ewwMYzMKqv78be2KARFgcAqX9hktCUeu5KmTl sjhLHyNxoMsdC1Mzi1PyD9/eU/B3y3y6qOOhUjQYk6vIO/EMD0LDG4m2UjUtKUHC/0D4vX FXncY7bF0tXRJCvEWEuUZmLpt45JxhVlh5ei1xKOUtKJW2JnMviiQcWOe8qQBQ== From: Louis Chauvet Date: Sat, 27 Jun 2026 05:30:46 +0200 Subject: [PATCH v5 29/38] 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: <20260627-vkms-all-config-v5-29-854aa0840926@bootlin.com> References: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> In-Reply-To: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet , Shuah Khan , Miguel Ojeda , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt Cc: Luca Ceresoli , Kory Maincent , 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 , llvm@lists.linux.dev X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=2726; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=UXwwGxaBOqBDjeeLTM/UljPXbDdhrzGfo5KlNYNKbdc=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBqP0PgPMMcK+cjeRP+LQGEicYUQDYRt+NwQvytV Dv6MX1raFmJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaj9D4BsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDIACgkQIK0uxlsQLOKICw/+MoqyL0CGc6vBSquo6Awmgm944Rt2lvP yWHt1M/hlVUe2QY7Xl62jIV8AfppEJWuL+A8xgIoHkcE/NQIRjHCVOppBQ8I34QKNdPe9eHREos 2DGInlS+rZiG1Q0Ynfqcja6CF3OA7lcwMuVlfxkcYG59OAhdXgngi0Gz8jBF5i5C73eWo7HuObv rxNIeGYyYVHcmft2TJk958ovvQ6QbJpNLhQ+21smhgWGJ7U1w/uV4Bz+vfWklsdMzz8q9IJbhgm g84t7K2wOcwtZn/nURleLElmaddygf8cxT2Xr4rszgLn9MmMjNZpGV5KfspMttMLqCDIAwefCtN FjHPjzB6SSmeLoBNHjYvUmOAJaOE64RHfcnIpqTzvz1bxvt723CZjJRXx5SlSbgWGXdHAxQtxMf 11LYw7nKHn+ZCv3McE3d+RTKZs3rU+y7wHlPpVYIl2KTnSgsuqNqhjFIhVprS/tKhFd7eyZ/6XZ q53h9N2SQ6M82bFnGcoqwaBwzUhPIJ+/+7zAzGtsVzFyOlvYPyJqw0aODXAGGZKRQ1Hoxqos79D Jb/jqD9/8TELDgLFn5LSnpVZfjPSv5Lq10NC5HqR+N9D9WNWFu1EyHBI3TcmyfIUfOqQph8nnDU zXZCAw4HnoyqiuznsyzKBK7bZrXDNNso/yMbjVNdBX154CJ1dkgk= X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 With the introduction of dynamic connectors we will have two way of initializing a VKMS connector. Rename the current function to clarify the case. Reviewed-by: Luca Ceresoli Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/vkms_connector.c | 4 ++-- drivers/gpu/drm/vkms/vkms_connector.h | 6 +++--- drivers/gpu/drm/vkms/vkms_output.c | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_connector.c b/drivers/gpu/drm/vkms/v= kms_connector.c index 5a87dc2d4c63..5b29dcade7e1 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.c +++ b/drivers/gpu/drm/vkms/vkms_connector.c @@ -68,8 +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_config_connector *connector_cfg) +struct vkms_connector *vkms_connector_init_static(struct vkms_device *vkms= dev, + struct vkms_config_connector *connector_cfg) { struct drm_device *dev =3D &vkmsdev->drm; struct vkms_connector *connector; diff --git a/drivers/gpu/drm/vkms/vkms_connector.h b/drivers/gpu/drm/vkms/v= kms_connector.h index 33253d29b1cc..85f9082c710e 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.h +++ b/drivers/gpu/drm/vkms/vkms_connector.h @@ -19,14 +19,14 @@ struct vkms_connector { }; =20 /** - * vkms_connector_init() - Initialize a connector + * vkms_connector_init_static() - Initialize a connector * @vkmsdev: VKMS device containing the connector * * Returns: * The connector or an error on failure. */ -struct vkms_connector *vkms_connector_init(struct vkms_device *vkmsdev, - struct vkms_config_connector *connector_cfg); +struct vkms_connector *vkms_connector_init_static(struct vkms_device *vkms= dev, + struct vkms_config_connector *connector_cfg); =20 /** * vkms_trigger_connector_hotplug() - Update the device's connectors status diff --git a/drivers/gpu/drm/vkms/vkms_output.c b/drivers/gpu/drm/vkms/vkms= _output.c index 1288c8551bc8..406a22f1b963 100644 --- a/drivers/gpu/drm/vkms/vkms_output.c +++ b/drivers/gpu/drm/vkms/vkms_output.c @@ -97,7 +97,7 @@ int vkms_output_init(struct vkms_device *vkmsdev) struct vkms_config_encoder *possible_encoder; unsigned long idx =3D 0; =20 - connector_cfg->connector =3D vkms_connector_init(vkmsdev, connector_cfg); + connector_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.54.0 From nobody Sat Jun 27 22:18:04 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 BD00435CB6D for ; Sat, 27 Jun 2026 03:32: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=1782531126; cv=none; b=nf87r8YTh+ZKcnuEaPCypsawjT9x0GGpIYWxXS6eU+QZNhZQMGMAe9mxT6EKp7Nm9+4iSuQImJpkuQJ2wYk/w+kyJcvseBj1Gw1kmFg0Mqo7IIdUZkRZNaZrLDyYeSMsub+v9t0PMAx1R8vEGkO+p1mvPacheRISOqXP3nt1kyA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531126; c=relaxed/simple; bh=VlIri5VAZM1z7SiIburHJX2oSPFigorqkLnap0yrI/o=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=j/5G87HDwkOt0UNojQq5JcJGIGzcobGI/+8EOtIu1qN6j8bPJiBJ6ZTxJ+sT3fp0xnMoYRRo4wNa3u0xb99QAFa2zn13gFALZttn/7AnmcGwfbRKUHi2HHtLRrJOJalcRlDARnUu8GCD8GlvbnbbLX5OkMe6ymuErJv9d9pH+Tc= 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=X2Bembeg; 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="X2Bembeg" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id BB114C58468; Sat, 27 Jun 2026 03:32:12 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id AB3F960233; Sat, 27 Jun 2026 03:32:03 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 049B2106F1165; Sat, 27 Jun 2026 05:31:59 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1782531122; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=HVB6guxOx3qblOEOSQvXPSbLJKx1Rt8x4nla5zOvu1Y=; b=X2BembegfZDJy4Mo9DE4PKY7IaROdWZsxYIvIjZiW4HOu77BS3Enjx9U4dBmC5itgWVGGS sa8UNF7kXUA50pTdRe4ypx10OsB9pkIMT/ETvoV6T/W+L9vKaJHhDHCcyum4zSmkWWY2YK zfsM6+UqWBL3PTtdx8VS+p/EZSvgTAO9obqzqZjjweFifo8DmPXES0owUTXwz11+4iiuqF tXOrJftqNGQ6RkrqMQ3lN5+Wjs1Pkt+0cs13TZF5PxYng3D0aoVKpyq0HU9nH47lHFx7UW e4IHU2q5PBo7YJAsAe6ptREDpBo3Ka3zzu/SbT8+KnxzKPPG5uHQLAPpb7pk2Q== From: Louis Chauvet Date: Sat, 27 Jun 2026 05:30:47 +0200 Subject: [PATCH v5 30/38] 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: <20260627-vkms-all-config-v5-30-854aa0840926@bootlin.com> References: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> In-Reply-To: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet , Shuah Khan , Miguel Ojeda , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt Cc: Luca Ceresoli , Kory Maincent , 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 , llvm@lists.linux.dev X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=7160; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=VlIri5VAZM1z7SiIburHJX2oSPFigorqkLnap0yrI/o=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBqP0PhiSpkKmif86QlFmSA7/3Wu4WpqgqpRw7yu YiO1YRWKEOJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaj9D4RsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDIACgkQIK0uxlsQLOJ6lhAAwdpl/VUeww8NO9Stt9aYvrqU6tHbzic PcAtBctwBFW1+4pyEOdA1GLMceWsFLNF6JcQADSB9RGKUnZ6Ev9IEF4BovvcAKFQgXRkEgfSB6O JGOJBs8fi8jyJm6n0ZyQTrJDCcr+9cFISnknbq+AMbOQGmTzGH2d0oOftWZA2dqDcR6hoNo1DXM XcjMy6aLFuzto0oNozqOYUyS9HmDx36/0sYQz+iVFI21LpfsP3HjmfAsyVKUIglcAKJHB4AUqtq qME/Ah8t0Qk0lAyXC/sOTCxaith1JI4TV+i0iAoHBXLOicE+eZPLujPx2u61vM3Nrf1VkoO9Uh4 N975Br6qXZHAPHAFvQwG0DzNxvmJiFNLrcU7oAly+VmdzKNrQ9vBmxk7tSleGv7F/HpZNesEnT8 xkOK6BGr9twej535zNKt42Knz+iUvVnSzqCoi2IHrMvnNkyt9s9SjwzEbUnQ7lC/1nP+vcDpO0M Xei/lbgTYj5oxEmfxbQyASB3iyNTTPsNM36R22kwfVf2rdsXzPpoGD0R8hAm3CTg9GnTNu0O7Z/ KufDoi8zLGKhaLoSwkjau0mSwF6reTj9SKDcF+fQyhMqT9886TKODwr7BxqDSAl/QHVK9qxP4JS mjLJRw3HARnG5SoHNF1Ybq9ckWfenCsBRWTvh0xQVHS414vZVjhQ= X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 To emulate some HDR features of displays, it is required to expose some properties on HDMI, eDP and DP connectors. Reviewed-by: Luca Ceresoli Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/tests/vkms_config_test.c | 3 ++ drivers/gpu/drm/vkms/vkms_config.c | 5 +++ drivers/gpu/drm/vkms/vkms_config.h | 30 +++++++++++++++++ drivers/gpu/drm/vkms/vkms_connector.c | 47 +++++++++++++++++++++++= ++++ 4 files changed, 85 insertions(+) diff --git a/drivers/gpu/drm/vkms/tests/vkms_config_test.c b/drivers/gpu/dr= m/vkms/tests/vkms_config_test.c index 1900cc79db2b..a31fd230c1d4 100644 --- a/drivers/gpu/drm/vkms/tests/vkms_config_test.c +++ b/drivers/gpu/drm/vkms/tests/vkms_config_test.c @@ -215,6 +215,9 @@ static void vkms_config_test_default_config(struct kuni= t *test) vkms_config_for_each_connector(config, connector_cfg) { KUNIT_EXPECT_EQ(test, vkms_config_connector_get_type(connector_cfg), DRM_MODE_CONNECTOR_VIRTUAL); + KUNIT_EXPECT_EQ(test, + vkms_config_connector_get_supported_colorspaces(connector_cfg), + 0); } =20 KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index c407aea0bc6a..ea9bc5d06be6 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -600,6 +600,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; @@ -933,6 +937,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 d6d185b2ccc0..80bbc13aad79 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -133,6 +133,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 @@ -145,6 +149,7 @@ struct vkms_config_connector { =20 int type; enum drm_connector_status status; + u32 supported_colorspaces; struct xarray possible_encoders; =20 /* Internal usage */ @@ -244,6 +249,31 @@ struct vkms_config *vkms_config_default_create(bool en= able_cursor, */ void vkms_config_destroy(struct vkms_config *config); =20 +/** + * vkms_config_connector_set_supported_colorspaces() - Set the supported c= olorspaces for a connector + * @connector_cfg: Connector configuration to modify + * @supported_colorspaces: Bitmask of supported colorspaces (DRM_MODE_COLO= RIMETRY_*) + */ +static inline void +vkms_config_connector_set_supported_colorspaces(struct vkms_config_connect= or *connector_cfg, + u32 supported_colorspaces) +{ + connector_cfg->supported_colorspaces =3D supported_colorspaces; +} + +/** + * vkms_config_connector_get_supported_colorspaces() - Get the supported c= olorspaces for a connector + * @connector_cfg: Connector configuration to query + * + * Returns: + * Bitmask of supported colorspaces (DRM_MODE_COLORIMETRY_*) + */ +static inline u32 +vkms_config_connector_get_supported_colorspaces(const struct vkms_config_c= onnector *connector_cfg) +{ + return connector_cfg->supported_colorspaces; +} + /** * vkms_config_get_device_name() - Return the name of the device * @config: Configuration to get the device name from diff --git a/drivers/gpu/drm/vkms/vkms_connector.c b/drivers/gpu/drm/vkms/v= kms_connector.c index 5b29dcade7e1..a1f08167def1 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.c +++ b/drivers/gpu/drm/vkms/vkms_connector.c @@ -68,6 +68,49 @@ static const struct drm_connector_helper_funcs vkms_conn= _helper_funcs =3D { .best_encoder =3D vkms_conn_best_encoder, }; =20 + +/** + * vkms_connector_init - Common initialization for all vkms connectors + * + * @connector - Already allocated connector + * @connector_cfg - Configuration to apply + * + * Returns: 0 on success, errno on error; + */ +static int __must_check vkms_connector_init(struct vkms_connector *connect= or, + struct vkms_config_connector *connector_cfg) +{ + int ret =3D 0; + + if (vkms_config_connector_get_supported_colorspaces(connector_cfg)) { + if (connector_cfg->type =3D=3D DRM_MODE_CONNECTOR_HDMIA) { + ret =3D drm_mode_create_hdmi_colorspace_property(&connector->base, + vkms_config_connector_get_supported_colorspaces(connector_c= fg)); + if (ret) + return ret; + } else if (connector_cfg->type =3D=3D DRM_MODE_CONNECTOR_DisplayPort || + connector_cfg->type =3D=3D DRM_MODE_CONNECTOR_eDP) { + ret =3D drm_mode_create_dp_colorspace_property(&connector->base, + vkms_config_connector_get_supported_colorspaces(connector_cfg= )); + if (ret) + return ret; + } + + if (connector_cfg->type =3D=3D DRM_MODE_CONNECTOR_HDMIA || + connector_cfg->type =3D=3D DRM_MODE_CONNECTOR_DisplayPort || + connector_cfg->type =3D=3D DRM_MODE_CONNECTOR_eDP) { + ret =3D drm_connector_attach_colorspace_property(&connector->base); + if (ret) { + drm_property_destroy(connector->base.dev, connector->base.colorspace_p= roperty); + return ret; + } + drm_connector_attach_hdr_output_metadata_property(&connector->base); + } + } + + return 0; +} + struct vkms_connector *vkms_connector_init_static(struct vkms_device *vkms= dev, struct vkms_config_connector *connector_cfg) { @@ -84,6 +127,10 @@ struct vkms_connector *vkms_connector_init_static(struc= t vkms_device *vkmsdev, if (ret) return ERR_PTR(ret); =20 + ret =3D vkms_connector_init(connector, connector_cfg); + if (ret) + return ERR_PTR(ret); + drm_connector_helper_add(&connector->base, &vkms_conn_helper_funcs); =20 return connector; --=20 2.54.0 From nobody Sat Jun 27 22:18:04 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 0804B35E92F; Sat, 27 Jun 2026 03:32:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531128; cv=none; b=K/8wcPMbOL14s/toCLYnY0TKNbgR/xhQ1uQgTTfWgUBA2uSd8zVR1IJDuRo5IHgFDUj4W42t0w+3e9un76oTKUA5YZ0ywyEOqGmGqKgOHWOQzrSYMXLnCiadWTq/Wy1cD8xrTv5DzXxAEVU5jmZosZPGH5homAEPQX20XCuPifA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531128; c=relaxed/simple; bh=4H1fytMYKlfKM5s/cdqJHSkWSFludjgedqgHfpUgeh4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=I3pGl58l9Cf3wGtbCMxYzzAB9NTyQ4ENC8AO56jL7M4RAP/54grkE1LSNwS1WP9JHGtOTRSDSTdgWcXl4BlHQDuYDhqSBrZotGIVjlXU34YLEH+DJ0eCaUi7BxzVCt6mowgNvl1zUJKiSXoACfR1ncAvtXvikQb+buuGVsXMoSg= 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=GMn7YBPa; 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="GMn7YBPa" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id CB465C5CD7E; Sat, 27 Jun 2026 03:32:14 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id BAEA060233; Sat, 27 Jun 2026 03:32:05 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 5CBBC106F116D; Sat, 27 Jun 2026 05:32:02 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1782531124; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=u++HXNyFChQpUGESKUXwZFPSKeCBVxotGGVn26TBxU4=; b=GMn7YBPae2B7/vEB+n958+SmEA5T3CP2q1ushfjIDMXHCzM0gDuT3Lu6KrwI0gt/cCu16o viczLNMZfFuamiLwpRj1cfFdRvU04rlFYGqYQkWLQ391yzHGXpp4Jhq0rxznLLUDlmR3Fz a6xRN93iRBtQJ/DmRsVqXa29AuV9RzNxQHqPF9nbWRkgP18YMZKKVWpUBQzE136hFE7OCU 6b9lZV1sXAWRN+RUmhuy83Rmv+rMzK8uicf5aqEZ15vNaP0yiKgUdqUN/WcxwY0Qc6hsb2 7DjMU8GDwo9JdLK3j30Q4OyLP5m2bJuxfajNKGIkGKKLdW1glq8gkcoZ1hyDBQ== From: Louis Chauvet Date: Sat, 27 Jun 2026 05:30:48 +0200 Subject: [PATCH v5 31/38] 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: <20260627-vkms-all-config-v5-31-854aa0840926@bootlin.com> References: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> In-Reply-To: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet , Shuah Khan , Miguel Ojeda , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt Cc: Luca Ceresoli , Kory Maincent , 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 , llvm@lists.linux.dev X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=4119; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=4H1fytMYKlfKM5s/cdqJHSkWSFludjgedqgHfpUgeh4=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBqP0Phg+/2iMU6vUr5Ix+pfmVu+W2FW69eWzhR9 1894U71CXeJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaj9D4RsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDIACgkQIK0uxlsQLOLEqQ//YIALEHi6J13XnFUiMoSNDEI6yWanMd0 BsYQk6TZ8uSdKA9xEUUtMbZyhujKNlRlV5yK3Y/oih4++hLZpW+yxNgaSg5Qe492kKmtrHIVv+Z zYTJAaEQoLTFURxpmCqjQp6y+ah58ZnnjEhQUBiGBOiunuS0cwgDGpa1BH0Hg6FZbOxgjzSvd6P vNujRbCIyOBOuswI3cx+ksnRbS4Gwm8ltAO8uj4Y+gIfoa5KShEGduDsE9cpfkyGbKezkqp/rAH 8Db/1mmTZo49VBC/uXX/X5zpGgJJ0lu/nczR2eoTo7KPouOl0cWJZpB1U9itqaTt3g4sENaqvzH jlRIwGWbmNatFH99tXb6O03MkZNDNY11Bxv5rK6Duoxn1BLkUSQiXCcaflMGEYILW9qi0H+hnsI sOYIFPjuAnN/2hayUra6PGy/tLjKEjAL8gP68k8JR285WOzrvlIifLtbrxG9FrJfyiGsqTmlyAX TNCDjVgSH9WI1Z+Va02XzaLTJ1A2+OYXxLL1ayk4BeCgZfszgJaiMUMaz0Sw/b5Sgtg5UCnMQru BXRbQbvi6SZisXchTfvzIHH+JhSTptspP1QgE4Xbu6hVSya1QzGK79q9VdlXwBerGPGi7YgAv10 BhX8ctfPxNohH50wy1bdzyxdDI14KQqal78aa2psM62ldXV6oh60= X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Add the attribute supported_colorspaces to configure the supported colorspace of a connector. It will allows emulating some HDR features of displays. This feature is only supported for HDMI, DP and eDP connectors. Reviewed-by: Luca Ceresoli Signed-off-by: Louis Chauvet --- Documentation/ABI/testing/configfs-vkms | 8 +++++++ Documentation/gpu/vkms.rst | 7 +++++- drivers/gpu/drm/vkms/vkms_configfs.c | 40 +++++++++++++++++++++++++++++= ++++ 3 files changed, 54 insertions(+), 1 deletion(-) diff --git a/Documentation/ABI/testing/configfs-vkms b/Documentation/ABI/te= sting/configfs-vkms index 0e588a1145ff..86f5f0beec8d 100644 --- a/Documentation/ABI/testing/configfs-vkms +++ b/Documentation/ABI/testing/configfs-vkms @@ -40,6 +40,14 @@ Description: Type of the connector. Possible values match those exposed by the "type" field in drm_connector. =20 +What: /sys/kernel/config/vkms//connectors//supported_c= olorspaces +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Supported colorspaces for HDMI, DP, and eDP connectors. + Value is a bitfield, where 0x1 =3D NO_DATA, 0x2 =3D SMPTE_170M_YCC, + etc. See enum drm_colorspace for full list. + What: /sys/kernel/config/vkms//connectors//possible_en= coders Date: Nov 2025 Contact: dri-devel@lists.freedesktop.org diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index f2622b3fd8af..11058b6e6250 100644 --- a/Documentation/gpu/vkms.rst +++ b/Documentation/gpu/vkms.rst @@ -137,11 +137,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 8b414f1950e8..e1f6e7817f97 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -1180,12 +1180,52 @@ static ssize_t connector_type_store(struct config_i= tem *item, return count; } =20 +static ssize_t connector_supported_colorspaces_show(struct config_item *it= em, char *page) +{ + struct vkms_configfs_connector *connector; + int colorspaces; + + connector =3D connector_item_to_vkms_configfs_connector(item); + + scoped_guard(mutex, &connector->dev->lock) + colorspaces =3D vkms_config_connector_get_supported_colorspaces(connector= ->config); + + return sprintf(page, "%u", colorspaces); +} + +static ssize_t connector_supported_colorspaces_store(struct config_item *i= tem, + const char *page, size_t count) +{ + struct vkms_configfs_connector *connector; + int val, ret; + + connector =3D connector_item_to_vkms_configfs_connector(item); + + ret =3D kstrtouint(page, 10, &val); + if (ret) + return ret; + + if ((val & -BIT(DRM_MODE_COLORIMETRY_COUNT)) !=3D 0) + return -EINVAL; + + scoped_guard(mutex, &connector->dev->lock) { + if (connector->dev->enabled) + return -EBUSY; + + vkms_config_connector_set_supported_colorspaces(connector->config, val); + } + + return count; +} + CONFIGFS_ATTR(connector_, status); CONFIGFS_ATTR(connector_, type); +CONFIGFS_ATTR(connector_, supported_colorspaces); =20 static struct configfs_attribute *connector_item_attrs[] =3D { &connector_attr_status, &connector_attr_type, + &connector_attr_supported_colorspaces, NULL, }; =20 --=20 2.54.0 From nobody Sat Jun 27 22:18:04 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 9E4D7360EFB for ; Sat, 27 Jun 2026 03:32:09 +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=1782531131; cv=none; b=lkxgGJOyI7VsH/AoAS7OHse1jBnbgJMOrA289NKkoAqHW9xc30eaGsgrXTKgqO9f8gWl4626ZdpYt9bsva/vEYOyoV9p6+NwdIHJQBqoS76p24oC5hBgnsTCg5OmV6XkcNDf0QnbibVmjaw7YsMTY0UfefIC/nED/nfNJ+XAIgo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531131; c=relaxed/simple; bh=W4oXPHd9u+n2+sEaPl/KX2dNXZXuOxb/QQcM3uIJH7g=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=M3VB0bxsxvb9Nv1nWRwPGafbz8s16mzojHsJs9ZWvlv6eImyP7l61uzNoiNIzLvQBAbhYb2yOr2qQLug+oAyOW/CJeV0f5DDxMC69GBQba0Q7if6IUV2SJ4BiZw/ljfq0dD/Wuc0vBCeWwCcE42m5HUOHcPOMjzosphJGfXGuuE= 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=QZNuR4ce; 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="QZNuR4ce" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 7D5044E40A08; Sat, 27 Jun 2026 03:32:08 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 49A6260233; Sat, 27 Jun 2026 03:32:08 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 9AA55106F116E; Sat, 27 Jun 2026 05:32:04 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1782531126; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=U/t3OuHhm+KhQ/USRuPMK5z2hSnEgIEZbf8Llp8CSuE=; b=QZNuR4ceHxC721pk5FQDwU81zIPzLjyaS2wRrfc9eCK/mp+8ltyGemGvRGFcaNEk7yBAjk ZbJq9fc+Xaj1Y1Cf2Oi1Qaslhs32yI8Sgq0nwxh+jJv/LR/mUcY16eQcLpK1dOe+ix7Sww DOGoQXPcQitASRljNWnnyZa7KgheHNgDR7IPviua57fsXuGZ/mhlVDqVQTfBb9oq2NjHwP lU6hx3DniXSTlgwYW1V8h27+/UY96AffUvQaR5CQSyqV2q2Lk7FYfTOI/7uirMzr1KJmlL DZmicPQKCEcyF98SKn9lc+VQbuAOJR7jyi1nqKjbKkw2gZRedZ4lGdihq8uL8Q== From: Louis Chauvet Date: Sat, 27 Jun 2026 05:30:49 +0200 Subject: [PATCH v5 32/38] 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: <20260627-vkms-all-config-v5-32-854aa0840926@bootlin.com> References: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> In-Reply-To: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet , Shuah Khan , Miguel Ojeda , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt Cc: Luca Ceresoli , Kory Maincent , 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 , llvm@lists.linux.dev X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=8106; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=W4oXPHd9u+n2+sEaPl/KX2dNXZXuOxb/QQcM3uIJH7g=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBqP0PhWScKnJ+lj14fgbitf2evRNFAbavdKZx+S OU+vwfWLtOJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaj9D4RsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDIACgkQIK0uxlsQLOJ5BBAAtkJA5SH2Ovd8crd6VNxuGsBfQMtgmXA s9GxqVW9oNUd4N5DoW/kop3TkVAYTVttEazgphme+GOmjP01OydVFwwg356O8R6eIOG9mRvvLnq 9fmJdA2LTW0xiE0SFraR5BFgCoQC/rXfbsgVFmM78jIjDOPT4LQthVuiGI7vvg1wzKmCxDqrJUQ zMsEErqELiItJPQX5eScyjC2EoSJ66hpx5VDgurBRfFS2TDf3BlwDEO0zudNjIzA4EigZSwYaJf /JNyQg2+xZW8p5azVvE5pBX1a4HFXfH9xerbguesIwzCWIBVI2VOeXlNncy8PCxhpZCsqR6+SZm d/U/9N26QjqsfWcvth/eXNM9KWKVfgHD/xlJjXE2obAYo0533AFugOh0oODXDT/a+4tur1wcy2O nb3hF3HQuMRpKdXEUvmFb0J72I1gELKG0l58bJGVHKoMROZlldJgqLsPo0eivBL201yuq+1ifuZ JRBT4cP8mQALS5+b4S9n2UfAcLo3gg2J3CjbLl1W+lymeIlu9qLiwUBgytSum7AY8Hl7dN1Cueg tIuifITSGDezdbdgoLJvoiYe4+fuEyo+Kk/WI9QU4L9b3ifjY+R2/b370ipOqpJtPMJTfDTkQYL Bvt5rSs/1gkpvxbQVZwmHyHXmN+GEFv3X4j2yOAWuwgIgNTqbYXs= X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Allows configuration of EDID for each connector. Reviewed-by: Luca Ceresoli Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/tests/vkms_config_test.c | 2 + drivers/gpu/drm/vkms/vkms_config.c | 6 +++ drivers/gpu/drm/vkms/vkms_config.h | 75 +++++++++++++++++++++++= ++++ drivers/gpu/drm/vkms/vkms_connector.c | 50 ++++++++++++++++-- 4 files changed, 129 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/vkms/tests/vkms_config_test.c b/drivers/gpu/dr= m/vkms/tests/vkms_config_test.c index a31fd230c1d4..2b49745ee026 100644 --- a/drivers/gpu/drm/vkms/tests/vkms_config_test.c +++ b/drivers/gpu/drm/vkms/tests/vkms_config_test.c @@ -218,6 +218,8 @@ static void vkms_config_test_default_config(struct kuni= t *test) KUNIT_EXPECT_EQ(test, vkms_config_connector_get_supported_colorspaces(connector_cfg), 0); + KUNIT_EXPECT_EQ(test, vkms_config_connector_get_edid_enabled(connector_c= fg), + false); } =20 KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index ea9bc5d06be6..1a110b8aa114 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -538,6 +538,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; @@ -604,6 +605,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 80bbc13aad79..7e361b6e45b0 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -137,6 +137,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 @@ -150,6 +153,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 */ @@ -274,6 +280,75 @@ vkms_config_connector_get_supported_colorspaces(const = struct vkms_config_connect return connector_cfg->supported_colorspaces; } =20 +/** + * vkms_config_connector_get_edid_enabled() - Check if EDID is enabled for= a connector + * @connector_cfg: Connector configuration to check + * + * Returns: + * True if EDID is enabled for this connector, false otherwise. + */ +static inline bool +vkms_config_connector_get_edid_enabled(const struct vkms_config_connector = *connector_cfg) +{ + return connector_cfg->edid_enabled; +} + +/** + * vkms_config_connector_set_edid_enabled() - Enable or disable EDID for a= connector + * @connector_cfg: Connector configuration to modify + * @enabled: Whether to enable EDID for this connector + */ +static inline void +vkms_config_connector_set_edid_enabled(struct vkms_config_connector *conne= ctor_cfg, + bool enabled) +{ + connector_cfg->edid_enabled =3D enabled; +} + +/** + * vkms_config_connector_get_edid() - Get the EDID data for a connector + * @connector_cfg: Connector configuration to get the EDID from + * @len: Pointer to store the length of the EDID data + * + * Returns: + * Pointer to the EDID data buffer, or NULL if no EDID is set. + * The length of the EDID data is stored in @len. + */ +static inline const u8 * +vkms_config_connector_get_edid(const struct vkms_config_connector *connect= or_cfg, int *len) +{ + *len =3D connector_cfg->edid_len; + return connector_cfg->edid; +} + +/** + * vkms_config_connector_set_edid() - Set the EDID data for a connector + * @connector_cfg: Connector configuration to modify + * @edid: Pointer to the EDID data buffer + * @len: Length of the EDID data + * + * If @len is 0, the EDID data will be cleared and @edid ignored. If + * memory allocation fails, the existing EDID data will be preserved. + */ +static inline void +vkms_config_connector_set_edid(struct vkms_config_connector *connector_cfg, + const u8 *edid, unsigned int len) +{ + if (len) { + void *edid_tmp =3D krealloc(connector_cfg->edid, len, GFP_KERNEL); + + if (edid_tmp) { + connector_cfg->edid =3D edid_tmp; + memcpy(connector_cfg->edid, edid, len); + connector_cfg->edid_len =3D len; + } + } else { + kfree(connector_cfg->edid); + connector_cfg->edid =3D NULL; + connector_cfg->edid_len =3D len; + } +} + /** * vkms_config_get_device_name() - Return the name of the device * @config: Configuration to get the device name from diff --git a/drivers/gpu/drm/vkms/vkms_connector.c b/drivers/gpu/drm/vkms/v= kms_connector.c index a1f08167def1..fe42ab2ba7b1 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.c +++ b/drivers/gpu/drm/vkms/vkms_connector.c @@ -42,13 +42,55 @@ static const struct drm_connector_funcs vkms_connector_= funcs =3D { .atomic_destroy_state =3D drm_atomic_helper_connector_destroy_state, }; =20 +static int vkms_connector_read_block(void *context, u8 *buf, unsigned int = block, size_t len) +{ + struct vkms_config_connector *config =3D context; + unsigned int edid_len; + const u8 *edid =3D vkms_config_connector_get_edid(config, &edid_len); + + if (block * len + len > edid_len) + return 1; + memcpy(buf, &edid[block * len], len); + return 0; +} + static int vkms_conn_get_modes(struct drm_connector *connector) { - int count; + struct vkms_connector *vkms_connector =3D drm_connector_to_vkms_connector= (connector); + const struct drm_edid *drm_edid =3D NULL; + int count =3D 0; + struct vkms_config_connector *context =3D NULL; + struct drm_device *dev =3D connector->dev; + struct vkms_device *vkmsdev =3D drm_device_to_vkms_device(dev); + struct vkms_config_connector *connector_cfg; =20 - /* Use the default modes list from DRM */ - count =3D drm_add_modes_noedid(connector, XRES_MAX, YRES_MAX); - drm_set_preferred_mode(connector, XRES_DEF, YRES_DEF); + vkms_config_for_each_connector(vkmsdev->config, connector_cfg) { + if (connector_cfg->connector =3D=3D vkms_connector) { + context =3D connector_cfg; + break; + } + } + if (context) { + if (vkms_config_connector_get_edid_enabled(context)) { + drm_edid =3D drm_edid_read_custom(connector, + vkms_connector_read_block, context); + + /* + * Unconditionally update the connector. If the EDID was read + * successfully, fill in the connector information derived from the + * EDID. Otherwise, if the EDID is NULL, clear the connector + * information. + */ + drm_edid_connector_update(connector, drm_edid); + + count =3D drm_edid_connector_add_modes(connector); + + drm_edid_free(drm_edid); + } else { + count =3D drm_add_modes_noedid(connector, XRES_MAX, YRES_MAX); + drm_set_preferred_mode(connector, XRES_DEF, YRES_DEF); + } + } =20 return count; } --=20 2.54.0 From nobody Sat Jun 27 22:18:04 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 132FE361650; Sat, 27 Jun 2026 03:32:11 +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=1782531133; cv=none; b=PRcwKQgycSCMgAHhmascid/Bx4pdLF5fMaCkDk/DR3iiogTS/N5bL5wjpQmyKdRjRRDvKB0UEpYo3ZJLrtkDlzgv3sXi1YF7f+vIug/z7f0fImqG/uxlDhd12GkcKLPR0+3KoCOXle7B20aQEOzTuKSmHDs+s6NekztzogoD00Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531133; c=relaxed/simple; bh=Ao6pZrb2nvH3LB0XUEbR940/GYWcqu6EeHzjUYxq1t0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=h3YemFeenEMW+IWcUEfBBSmdZurG5h8KOSF/fKQMnttGuqqjy5Veoj//0UwsZjO8NVEMnijkUlu0N9XB4EH3enXTxtLNleRYbV4s5QkmQfOQ1lfdWi3vWqm8rQvCjX+mBLyv770yQ0wIUHxRsQic2Ixtwooi8qGu27zTOC09zR4= 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=PlLyt4Ua; 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="PlLyt4Ua" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id E32EAC5CD7E; Sat, 27 Jun 2026 03:32:19 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id D33F460233; Sat, 27 Jun 2026 03:32:10 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 22FC0106F116F; Sat, 27 Jun 2026 05:32:07 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1782531129; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=nkH4VZETKvurYkdud9RJs/kvMCHV1czMfcDjQ4shGTs=; b=PlLyt4UaCuGMYxX4VurQd7WMTgrS9YcYORVjh+5FW3sTUUeb9cb9bYormUNm4GB3n1Wa9x 8hBtMAzSw+nuXA96lCQzYjslkEhcwiWfZMXzEfV/YvYrfLgnWlquRJm/QQphGHpc2dyXc3 V/5O2QLfmDoZN4v+Xf+KD11vsXRWKLd1kaqOGDqOeHLYXKUI7Gw7rmLwHll/Eq2bQuw1z/ s9puuBnq17jNFftfOAJaLE2PlbftwxUu5UMZr2Xr+S4c0Rc5HlVToG6U67bVQAp9LP1Qf4 95rQx/WN9qhxlBmSBcvk4OWCFEt1p/d0O58jus4looOYR3LGTyAjTM6duzeRBw== From: Louis Chauvet Date: Sat, 27 Jun 2026 05:30:50 +0200 Subject: [PATCH v5 33/38] 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: <20260627-vkms-all-config-v5-33-854aa0840926@bootlin.com> References: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> In-Reply-To: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet , Shuah Khan , Miguel Ojeda , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt Cc: Luca Ceresoli , Kory Maincent , 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 , llvm@lists.linux.dev X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=6405; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=Ao6pZrb2nvH3LB0XUEbR940/GYWcqu6EeHzjUYxq1t0=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBqP0PhFYKLJ3WtxrBwSnlAGdLXIjQsmuJ+Owegy TXGPa2YRACJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaj9D4RsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDIACgkQIK0uxlsQLOJNiA//cBvFx97dPS2evltIlSPd6o7N2t/KEUl CMPkQ8mptRMC2F7mU3ay2vyHsgfJm8YwjjHcYE9a5lClPjEkj1DYrYLIrwnoLGrIPhL6MEqrmNc S9uosOzMhwTc9E0ZV1p7Au+nXGw+lMXJYwSOzzTt0VeqpCGZLQVSTxFfFePDpPP9EuC3/Elb2td /Ao5txboO7ZXqU0KlTyDnv5tOywa7ErmxNbPR9GmeZ1ZBJQty/8ErP2CvKuonvSl4Wy2a4C9t5z UGH3HUM2TW98D75SSeS1Mphc6Bx3dVI/3bTKaw5IRACMExMpYPOkW8xQ36VxmHIojV9281BDpa9 5obf5bf9mz/o3gaQQfqmH7A+CJ7eHC5FD/eza0vSBCYpZm6UcTnN4RsAOdSiAnXJp0DZ+gbPeyS l3BTVjRywDNO+TZEH94e5OFW5/m7Wj9IgzO5OE80JkNrvwM2np/8Okf4mWGF39VY/UgD5ROlMag lAK3TnNWnnCNXLP2QaVG9Wks3LLtNDKz+mcUNKWzrVdi7KCr5areJBaGre0LR5vB2qoIORQmW1g SiMlciDUc6X68uVAllcA/aKrXJyfaen/lDZDWrZPB0xqt9oWhTvRUmBVcdSnm0GEnpp0Sb+CjJV y5Z1kfnjXRUze9Q2fsGz7HPF/Fm63fNC49TSoUTiJwIoVb+s0y3U= X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Introduce new attributes to configure EDID of a connector: - edid_enable - chose if the connector will have an EDID or not - edid - raw edid content Due to limitation of ConfigFS, the max len of EDID is PAGE_SIZE (4kB on x86), it should be sufficient for many tests. One possible evolution is using a ConfigFS blob to allow bigger EDID. Reviewed-by: Luca Ceresoli Signed-off-by: Louis Chauvet --- Documentation/ABI/testing/configfs-vkms | 14 ++++++ Documentation/gpu/vkms.rst | 5 ++- drivers/gpu/drm/vkms/vkms_configfs.c | 80 +++++++++++++++++++++++++++++= ++++ drivers/gpu/drm/vkms/vkms_connector.c | 3 ++ 4 files changed, 101 insertions(+), 1 deletion(-) diff --git a/Documentation/ABI/testing/configfs-vkms b/Documentation/ABI/te= sting/configfs-vkms index 86f5f0beec8d..04e2f89e3129 100644 --- a/Documentation/ABI/testing/configfs-vkms +++ b/Documentation/ABI/testing/configfs-vkms @@ -48,6 +48,20 @@ Description: Value is a bitfield, where 0x1 =3D NO_DATA, 0x2 =3D SMPTE_170M_YCC, etc. See enum drm_colorspace for full list. =20 +What: /sys/kernel/config/vkms//connectors//edid_enabled +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Enable or disable EDID for this connector. Value: + 1 - enabled, 0 - disabled. + +What: /sys/kernel/config/vkms//connectors//edid +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Content of the EDID for this connector. Ignored if + edid_enabled is not set. + What: /sys/kernel/config/vkms//connectors//possible_en= coders Date: Nov 2025 Contact: dri-devel@lists.freedesktop.org diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index 11058b6e6250..2a3e175bf67b 100644 --- a/Documentation/gpu/vkms.rst +++ b/Documentation/gpu/vkms.rst @@ -137,7 +137,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) @@ -146,6 +146,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 e1f6e7817f97..f79a796c2017 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -1218,14 +1218,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 fe42ab2ba7b1..f726c7995524 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.c +++ b/drivers/gpu/drm/vkms/vkms_connector.c @@ -175,6 +175,9 @@ struct vkms_connector *vkms_connector_init_static(struc= t 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.54.0 From nobody Sat Jun 27 22:18:04 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 4085D363094; Sat, 27 Jun 2026 03:32:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531135; cv=none; b=QVl04foxlqzRXCCCGrOMr7mmyILywTv98QPRQg3aIbRd0PNRn5iEdoQJ2BpmBsa1CmmBAiWgu8zkjVJVDWt26PcszhkzpADuCoZjoFi//lUEFMX2/lTA6qryziWea5rXnMLQe9zvFOFOxG/qzjZsiYLLIzRZU+HRZirEfHlo3is= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531135; c=relaxed/simple; bh=6OtzeaGRUdWJ+rxoK+BJnq25yaBKEu05fnz7+XvgQs0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=skEVJF3/bvwrDUDfHBhY4SfAHolytGC6as15rfRDuAOD8mZ4wh2z14qpXKyq8P3PB1wFjILxAyvhSvBL8NkQ/S4iE0JQA19HUjgeCksfhyv4L0/8opj7QJ7id8QDPmX5ehOChjU9BRvRZFjcRNfjHUkTx3oO3jIdnxC6WmnS7hU= 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=c2/J/rX7; 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="c2/J/rX7" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 44E05C58468; Sat, 27 Jun 2026 03:32:22 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 3517C60233; Sat, 27 Jun 2026 03:32:13 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 966E4106F1171; Sat, 27 Jun 2026 05:32:09 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1782531131; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=bRFe3ro9aROJrNYFTvq6Jfu57vXZs41ebkay/s919N8=; b=c2/J/rX7v6iXPI0TEnPMp8EsRqDZsuLNuPxdnGk5Wk//ymIw+Yh/xRzL/9qFBXUdtTzYB/ pu9eezoPDuPB/XMtWhxDN7GBx4GgouOfse/QzTCFGeL8IxZtdXfkHe7Yha42Sj0PCrz1Qk oInAYlmBQsX6HM8JM7C6gVyLmBwvZiEEVD0Jy00LhkIPYL4jrE+RBlGHV2mgWJOYrbv8kt fT6yDdy6qp1ot+xh4JORnFgqaUjZuiVkv+97+5DufxwuxXELBMm3YlJgYJyXEO1urt5D/K 9BvYD6gvnvesAd0HF34cR1hRjhKDuPNmvd0FtVjS0Gdd8aMczOxY2PcuDZW/nw== From: Louis Chauvet Date: Sat, 27 Jun 2026 05:30:51 +0200 Subject: [PATCH v5 34/38] 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: <20260627-vkms-all-config-v5-34-854aa0840926@bootlin.com> References: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> In-Reply-To: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet , Shuah Khan , Miguel Ojeda , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt Cc: Luca Ceresoli , Kory Maincent , 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 , llvm@lists.linux.dev X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=7673; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=6OtzeaGRUdWJ+rxoK+BJnq25yaBKEu05fnz7+XvgQs0=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBqP0PhO7FDXVAXdCf9/PvuLc+kT3uUnQ2kXJx9X VeL4GSdDuuJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaj9D4RsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDIACgkQIK0uxlsQLOIN4hAA0mThp/EKpzU9nOkB7+yLRcrvMioX0Wv WPHM/RCv1FfjfczEovUMgUDxcW+4IwhlbuvKJVZXW3sBlM3vbxZTcaBhDB8lxghe+5OYqsm3C++ IeKxl/oYXo8z+q8P1h7Zv1W3Qb14rRU+aj/XRrFM+oZWA580T+7XKHTSwCG9FS8YYaRbCrO27PB RfyAgP4eTytSqSszBw/dGuDovK1qQm3h1sBQVLhJzSlCWpqajm9KFfLegaGsqPGYYur7AJ+XUbc aON1y32ChEB+MVwTknp/YYW/S0jOX0nEMdeBPt7AKld8AFR38b+KLrbx+KC6qXQnrvCh1JJYYqR VPDZZiRtWlLSVtI4lNk8m9w9AeySv9/2P/AyBglC9rkXHl26aX3dj2bJQlo/LQjX5i+yW2ijb8S GJG24ZZgAuL9t7a3Q/uAirfinBHWElZA3bXItKdY6OH9wihtuE21tGlW4W8IUFvPbEcxvzXddhJ GfPGk/jTbAibY+JTzAO5+fptouwmaLUDmKf8wc3cLJnWX3WCf+AuzCXoiQd1VUb+r9LilCyFW9N yJOrUeTUGWd3m1jRpz4Ns1dWE2EWp6F/crl0MUp+7R577y1Zz9xWhASj7ftLQbWPGFfTP/AbkDj vIBzBwC1LzuGcbMzLOvMhXdkJ6Vv5zd7udaZ3Eim43JEWjY4BurE= X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 In order to prepare for dynamic connector configuration, we need to store if a connector is dynamic and if it is enabled. The two new vkms_config_connector fields will helps for that. Co-developed-by: Jos=C3=A9 Exp=C3=B3sito Signed-off-by: Jos=C3=A9 Exp=C3=B3sito Reviewed-by: Luca Ceresoli Signed-off-by: Louis Chauvet --- .clang-format | 2 + 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 +++++++++++++++++++++++= ++++ drivers/gpu/drm/vkms/vkms_output.c | 2 +- 5 files changed, 79 insertions(+), 1 deletion(-) diff --git a/.clang-format b/.clang-format index 1cc151e2adcc..0d985d30efb2 100644 --- a/.clang-format +++ b/.clang-format @@ -724,6 +724,8 @@ ForEachMacros: - 'v4l2_m2m_for_each_src_buf_safe' - 'virtio_device_for_each_vq' - 'vkms_config_for_each_connector' + - 'vkms_config_for_each_connector_static' + - 'vkms_config_for_each_connector_dynamic' - 'vkms_config_for_each_crtc' - 'vkms_config_for_each_encoder' - 'vkms_config_for_each_plane' diff --git a/drivers/gpu/drm/vkms/tests/vkms_config_test.c b/drivers/gpu/dr= m/vkms/tests/vkms_config_test.c index 2b49745ee026..fda23f05a0a5 100644 --- a/drivers/gpu/drm/vkms/tests/vkms_config_test.c +++ b/drivers/gpu/drm/vkms/tests/vkms_config_test.c @@ -220,6 +220,10 @@ static void vkms_config_test_default_config(struct kun= it *test) 0); KUNIT_EXPECT_EQ(test, vkms_config_connector_get_edid_enabled(connector_c= fg), false); + KUNIT_EXPECT_EQ(test, vkms_config_connector_is_enabled(connector_cfg), + true); + KUNIT_EXPECT_EQ(test, vkms_config_connector_is_dynamic(connector_cfg), + false); } =20 KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index 1a110b8aa114..98e40c6a2c5b 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -597,6 +597,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", @@ -610,6 +612,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; @@ -944,6 +948,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 7e361b6e45b0..071887a65380 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -132,6 +132,8 @@ struct vkms_config_encoder { * @link: Link to the others connector in vkms_config * @type: Store the type of connector using DRM_MODE_CONNECTOR_* values * @config: The vkms_config this connector belongs to + * @dynamic: Store if a connector should be created with drm_connector_dyn= amic_init + * @enabled: If @dynamic, this means that the connector is currently regis= tered in drm * @status: Status (connected, disconnected...) of the connector * @supported_colorspaces: Bitmask of all the supported colorspaces. Values * are the sames as ones accepted by @@ -151,6 +153,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; @@ -194,6 +198,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 @@ -472,6 +494,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 diff --git a/drivers/gpu/drm/vkms/vkms_output.c b/drivers/gpu/drm/vkms/vkms= _output.c index 406a22f1b963..13c4ca5fd39d 100644 --- a/drivers/gpu/drm/vkms/vkms_output.c +++ b/drivers/gpu/drm/vkms/vkms_output.c @@ -93,7 +93,7 @@ int vkms_output_init(struct vkms_device *vkmsdev) } } =20 - vkms_config_for_each_connector(vkmsdev->config, connector_cfg) { + vkms_config_for_each_connector_static(vkmsdev->config, connector_cfg) { struct vkms_config_encoder *possible_encoder; unsigned long idx =3D 0; =20 --=20 2.54.0 From nobody Sat Jun 27 22:18:04 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 9DCC9364059 for ; Sat, 27 Jun 2026 03:32:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531138; cv=none; b=oVg3v5uepU4ZFkI084SvHaLPwZ2LHztj0OrmI350uLa0n+zJ4x897XRBnrlnx9sUkoayWnKYn1SIy4ljNZ58igTUgMeKxuAeWF6G9xzIIn2luLRNYl2ldzpLJyPqICCUNZWPhTs45fO8zwyHDyB2XPRszSW/XD1QlAEQy5ycU3M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531138; c=relaxed/simple; bh=xesbCEX8y6GLslcmbN6Z9Yf2aYZOtJdUxJPnVvjTvPE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=qcth/cSF2BD7H/ocOmzi2eBKLqtnRZcO8PHp5sCol8aZMuukpj8dOgq0Qie+Yk73Eh4+l51wtu61Q7KreLqA5+f8TXO5OTkMqTTc8Z2CBAh4yamzAtRWdU6xl4sodXkNvFEQiv5HSxePEzfjBZpMwpwKLh3fbVZx56vgqKXdLbI= 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=NUowejrQ; 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="NUowejrQ" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 99588C5CD7E; Sat, 27 Jun 2026 03:32:24 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 8A08A60233; Sat, 27 Jun 2026 03:32:15 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 064E3106F1170; Sat, 27 Jun 2026 05:32:11 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1782531134; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=QZVcGvUufNYmeDV6o2kpMdHjPPf3F67u9Lux32iDHyA=; b=NUowejrQKlTm31V5ZVQsplnfCkVU8/RbWbZIjXO15DoHERRHayXKKW8btYHm7nHbsjMqx4 TAwpyggTKOrBMmaNgqo4vsvHYaTeguCCHMhNr/YbmFBzBXJYNHNZ4PK6E4Qh8+WPbq+FIg M/VwUijCBehjnpfverI8bqjkJjJnNGsDDoJs4/6x8m8L3daURPZ/swdWG8P16VFcZY8B2G myqMyr6s5lW91LLdyyAml8O2RtxMDltNGlaR+IYQNbRMz4T1DoFEnoaQzwW/LuJNiZKMNI wWtsuwyWJbcqvYSi/APK7/gCQXTrGtif6ysHQl9mknQCwZd1m3SnNzdB1RQhjg== From: Louis Chauvet Date: Sat, 27 Jun 2026 05:30:52 +0200 Subject: [PATCH v5 35/38] 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: <20260627-vkms-all-config-v5-35-854aa0840926@bootlin.com> References: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> In-Reply-To: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet , Shuah Khan , Miguel Ojeda , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt Cc: Luca Ceresoli , Kory Maincent , 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 , llvm@lists.linux.dev X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=6175; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=xesbCEX8y6GLslcmbN6Z9Yf2aYZOtJdUxJPnVvjTvPE=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBqP0PhfL+Pnt/MD4loCw+Vxk9Tcsq9loKtboJ6K CPKYMdZy8GJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaj9D4RsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDIACgkQIK0uxlsQLOI5bhAAkFS5OYnHyAFXe61Kcdy+SXctiEuNkGP P9dxf3BOipPHMAtMnxKtDxhaOM60RNBmpZHhRSze6jF6v+XFx1vARtH572kpaj3638tKw6I+dmd 3eWy9QLjRzfJyLv8rkAjRTF+qpvDsdKbyXM+tT9NkYKFE5NV92SoERl9r9Xop3K7SZ5bUBiXrIL JaI4o3sKgrqyhJcG2OLtTki+js1Iq9VdlZYXy+yb29NS7mPsjBvNzzpSN/jn0bV9Tw+5FrKYScD 2loHmIzL2T0hJ/3GjYPoGe10pH4ejyK8SPciSRQ+FOOLZNr90rTQgoBFNWTW1xfNcHBV5HZYqhS 5JJ9P2dqZXgCZamkihqKan+G6NQy9KYriuLZYBW4B9roogAphtDIOy2BK8mkDV2vVVVaoO5EgzQ nj4tP0k2/BJ/8vXdcuOOk0dEKwHkZSuInni05kHR7J05Qq4Ehz5vkhrzbQ+v/TK/8KEGdlAgSLz YeGQNj7db2FNiCz5Hd8LcsXeKBtVtkjKu1je4/nVxwy3wGt5Y14d4ymGFrjmvD5DuiMx0inRT9K fD7Y6I268QTmRKZIGvdfIUZ+yK0j9RfzUUKF+el+vwHvwsPtwXR+leL6TeAAh4y9OlrtNULGB2V X2X1ettukcIDzMjfDRuG852ATOZrg5zsCCAO1Eu0XVPcVt0d25Ew= X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 In order to allow creating dynamic connector, add the required infrastructure in vkms_connector. [Louis Chauvet: use drm_atomic_helper_connector_reset instead of drm_mode_config_reset because connector is not yet registered] Co-developed-by: Jos=C3=A9 Exp=C3=B3sito Signed-off-by: Jos=C3=A9 Exp=C3=B3sito Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/vkms_connector.c | 89 +++++++++++++++++++++++++++++++= ++++ drivers/gpu/drm/vkms/vkms_connector.h | 33 +++++++++++++ drivers/gpu/drm/vkms/vkms_output.c | 9 ++++ 3 files changed, 131 insertions(+) diff --git a/drivers/gpu/drm/vkms/vkms_connector.c b/drivers/gpu/drm/vkms/v= kms_connector.c index f726c7995524..a013b53bd915 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.c +++ b/drivers/gpu/drm/vkms/vkms_connector.c @@ -181,9 +181,98 @@ 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 vkms_connector *vkms_connector; + + drm_connector_cleanup(connector); + + vkms_connector =3D drm_connector_to_vkms_connector(connector); + kfree(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 __free(kfree) * connector =3D NULL; + int ret; + unsigned long idx =3D 0; + + connector =3D kzalloc_obj(*connector, GFP_KERNEL); + if (IS_ERR(connector)) + return connector; + ret =3D drm_connector_dynamic_init(&vkmsdev->drm, + &connector->base, + &vkms_dynamic_connector_funcs, + connector_cfg->type, + NULL); + if (ret) + return ERR_PTR(ret); + drm_connector_helper_add(&connector->base, &vkms_conn_helper_funcs); + + vkms_config_connector_for_each_possible_encoder(connector_cfg, idx, encod= er_cfg) { + ret =3D drm_connector_attach_encoder(&connector->base, + encoder_cfg->encoder); + if (ret) + return ERR_PTR(ret); + } + + drm_atomic_helper_connector_reset(&connector->base); + + ret =3D vkms_connector_init(connector, connector_cfg); + if (ret) + return ERR_PTR(ret); + + ret =3D drm_connector_dynamic_register(&connector->base); + if (ret) { + if (connector_cfg->type =3D=3D DRM_MODE_CONNECTOR_HDMIA || + connector_cfg->type =3D=3D DRM_MODE_CONNECTOR_DisplayPort || + connector_cfg->type =3D=3D DRM_MODE_CONNECTOR_eDP) { + drm_property_destroy(connector->base.dev, + connector->base.colorspace_property); + } + return ERR_PTR(ret); + } + + return_ptr(connector); +} + +void vkms_connector_hot_remove(struct vkms_device *vkmsdev, + struct vkms_connector *connector) +{ + drm_connector_unregister(&connector->base); + drm_mode_config_reset(&vkmsdev->drm); + drm_connector_put(&connector->base); +} + +int vkms_connector_hot_attach_encoder(struct vkms_device *vkmsdev, + struct vkms_connector *connector, + struct drm_encoder *encoder) +{ + int ret; + + ret =3D drm_connector_attach_encoder(&connector->base, encoder); + if (ret) + return ret; + + drm_mode_config_reset(&vkmsdev->drm); + + return ret; +} diff --git a/drivers/gpu/drm/vkms/vkms_connector.h b/drivers/gpu/drm/vkms/v= kms_connector.h index 85f9082c710e..a235a518d5a0 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.h +++ b/drivers/gpu/drm/vkms/vkms_connector.h @@ -34,4 +34,37 @@ struct vkms_connector *vkms_connector_init_static(struct= vkms_device *vkmsdev, */ void vkms_trigger_connector_hotplug(struct vkms_device *vkmsdev); =20 +/** + * vkms_connector_hot_add() - Create a connector after the device is creat= ed + * @vkmsdev: Device to hot-add the connector to + * @connector_cfg: Connector's configuration + * + * Returns: + * A pointer to the newly created connector or a PTR_ERR on failure. + */ +struct vkms_connector *vkms_connector_hot_add(struct vkms_device *vkmsdev, + struct vkms_config_connector *connector_cfg); + +/** + * vkms_connector_hot_remove() - Remove a connector after a device is crea= ted + * @vkmsdev: Device to containing the connector to be removed + * @connector: The connector to hot-remove + */ +void vkms_connector_hot_remove(struct vkms_device *vkmsdev, + struct vkms_connector *connector); + +/** + * vkms_connector_hot_attach_encoder() - Attach a connector to a encoder a= fter + * the device is created. + * @vkmsdev: Device containing the connector and the encoder + * @connector: Connector to attach to @encoder + * @encoder: Target encoder + * + * Returns: + * 0 on success or an error on failure. + */ +int vkms_connector_hot_attach_encoder(struct vkms_device *vkmsdev, + struct vkms_connector *connector, + struct drm_encoder *encoder); + #endif /* _VKMS_CONNECTOR_H_ */ diff --git a/drivers/gpu/drm/vkms/vkms_output.c b/drivers/gpu/drm/vkms/vkms= _output.c index 13c4ca5fd39d..50f7d88dee8b 100644 --- a/drivers/gpu/drm/vkms/vkms_output.c +++ b/drivers/gpu/drm/vkms/vkms_output.c @@ -117,5 +117,14 @@ int vkms_output_init(struct vkms_device *vkmsdev) =20 drm_mode_config_reset(dev); =20 + vkms_config_for_each_connector_dynamic(vkmsdev->config, connector_cfg) { + if (connector_cfg->enabled) { + connector_cfg->connector =3D vkms_connector_hot_add(vkmsdev, connector_= cfg); + + if (IS_ERR(connector_cfg->connector)) + return PTR_ERR(connector_cfg->connector); + } + } + return 0; } --=20 2.54.0 From nobody Sat Jun 27 22:18:04 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 36BBD3644D1 for ; Sat, 27 Jun 2026 03:32:19 +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=1782531141; cv=none; b=SOpcyu5FjQnd2Owh6N6yWGT22dcUlp2QML9wzWfG61sC7aMVtrImOyuoezomfEGz19cTTn0fsei7t0noH3wXBWyOerCeV6LRfsx1sb5CWnrL3RWeQsZF3mTIGJnoWcBkdUhXCQHIvzdOsdsZvX0QQ6L2eYLDm+2tj8Xcu2/3RiE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531141; c=relaxed/simple; bh=rUkelz8olDDj+nzfUbh7iTwV3qWndTKVfpdkxxxyzRc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=USu7pDjQzXnFLtV/4ETPUlTEPk6qvojUg+RgF14K/wRrY7LPgTn7L2g+JFCiNEjUa/1sVTz9DZPP20VF/+9vTU8dQ2Jq3tor39IcjVeVpD+I3eP3Vhrp0sdO10dIt6SxStUkiO8/l4332l/6md5/AWPSn5IdQixq9Z2qC2CoQkI= 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=jCfKH6Kj; 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="jCfKH6Kj" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 03BAA1A0A23; Sat, 27 Jun 2026 03:32:18 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id CC5C460233; Sat, 27 Jun 2026 03:32:17 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 5BCEC106F1172; Sat, 27 Jun 2026 05:32:14 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1782531136; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=6gnb/UaTe/iqU91lXxm2Q2SXLtYDyf1mjuCvN6WD1Ys=; b=jCfKH6KjCktl2NtwTciOgqnPRQC4KU8yYFAyz9go8nEk49I5tQ3DMBclW9wFyth8KmNv70 VAivmLsAWN9RiO0DkR1Zp808f5poc0RJivs4YAzXkF0RJP04HSSOsOfKJDlJ2LnTNhlx77 YcnL1PBzyn0788ADHLzJCQwpD1FJ9JA7Fqp2+MvS4NancaaaSoqjrXRWfZe83TvFjUgTe2 2oJ00BUg+Jo9ia7tIPncGbrJldW4ULQsTWaviZDBJBC34/b/2gqnLq17IdhVptEARyUzSX pKfnB4MyNLLIvmZ0Jx1W6CPsiC/x64KAtXnC0oy33oD520yH3RXxcBcB/jLVWg== From: Louis Chauvet Date: Sat, 27 Jun 2026 05:30:53 +0200 Subject: [PATCH v5 36/38] 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: <20260627-vkms-all-config-v5-36-854aa0840926@bootlin.com> References: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> In-Reply-To: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet , Shuah Khan , Miguel Ojeda , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt Cc: Luca Ceresoli , Kory Maincent , 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 , llvm@lists.linux.dev X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=10758; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=rUkelz8olDDj+nzfUbh7iTwV3qWndTKVfpdkxxxyzRc=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBqP0PiVMkMAep2XKav6wxLl6NuiGuJjmX6Nu0F0 jux4KOAgN6JAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaj9D4hsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDIACgkQIK0uxlsQLOLrQRAAvn8VHBd+/5P14Vukx20AzDB7T7zzNrY KBEZt7wjDeNgnlgKyHMD3/pE7SSyNd80UTSCOBHIRDug++zyMoJ/wwm9AvgtkLHD5w42Q9JDiB7 txbPkhDiNePYdDu1xxwrh3LqntorLikb3RrllCCWj/dZEG+2DJexTF6Q+ZqW91VYbiy7KSjrO5Z kYnov/4bUU4HR9eMntGFmdDikwni5rNdHbwX/3qUeq/o9WmzSL6r6GbTOXuTooUwE7/FCBdpCKu eG15ne2z0vHL/20Zcz9Cw3Zob7srJ6Z+qYVBnakLDV/YUw4Rpd2cpTJIUgpuOUOYbZ5eHqS4Flb 4ksP0pHKvvljWYoZ+4mRUETx8hpWPKlpisrpUhc1vozQ+sWOyacFu/PixiR22iBPP4TH8UkYD6X StMiKB0Vs+kGUtVYOaxVVeuwq5CrbaOcuNu7XaEIkd0c5prv7jL+GBAYIbK4pS9u2V+W4TGjlM2 h8nw7eW1M0UNIJueENT/esizZowpCucuVLpXz09prLxfoUNFOz9bkSc2p6LUsc9JjBcWIngf69j NeG3VAVfCJTO/lvCxK1ZAkAyFCDdqKuXG9KXbgzx+R3IpXcIuZcvN3qjl5ar+VMzcjavbO50a9m 46Ps5ckbWWCmp7I2u5kgeXzVNo3ITac61GvJMcMV7/igzXRRh6nw= X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 DRM allows the connector to be created after the device. To allows emulating this, add two configfs attributes to connector to allows this. Using the dynamic attribute you can set if a connector will be dynamic or not. Using the enabled attribute, you can set at runtime if a dynamic connector is present or not. Co-developed-by: Jos=C3=A9 Exp=C3=B3sito Signed-off-by: Jos=C3=A9 Exp=C3=B3sito Signed-off-by: Louis Chauvet --- Documentation/ABI/testing/configfs-vkms | 14 ++++ Documentation/gpu/vkms.rst | 6 +- drivers/gpu/drm/vkms/vkms_configfs.c | 144 ++++++++++++++++++++++++++++= ++-- 3 files changed, 155 insertions(+), 9 deletions(-) diff --git a/Documentation/ABI/testing/configfs-vkms b/Documentation/ABI/te= sting/configfs-vkms index 04e2f89e3129..8a5899c52e78 100644 --- a/Documentation/ABI/testing/configfs-vkms +++ b/Documentation/ABI/testing/configfs-vkms @@ -62,6 +62,20 @@ Description: Content of the EDID for this connector. Ignored if edid_enabled is not set. =20 +What: /sys/kernel/config/vkms//connectors//dynamic +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + Set to 1 to create a dynamic connector (emulates DP MST). + Value: 1 - dynamic, 0 - static. + +What: /sys/kernel/config/vkms//connectors//enabled +Date: Nov 2025 +Contact: dri-devel@lists.freedesktop.org +Description: + For dynamic connectors, set to 1 to create the connector, + 0 to remove it. Value: 1 - enabled, 0 - disabled. + What: /sys/kernel/config/vkms//connectors//possible_en= coders Date: Nov 2025 Contact: dri-devel@lists.freedesktop.org diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst index 2a3e175bf67b..31569421d8f5 100644 --- a/Documentation/gpu/vkms.rst +++ b/Documentation/gpu/vkms.rst @@ -137,7 +137,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) @@ -149,7 +149,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 f79a796c2017..f92b172e75cf 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -1091,6 +1091,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) { @@ -1110,7 +1116,7 @@ static ssize_t connector_status_store(struct config_i= tem *item, scoped_guard(mutex, &connector->dev->lock) { vkms_config_connector_set_status(connector->config, status); =20 - if (connector->dev->enabled) + if (connector->dev->enabled && connector_is_enabled(connector->config)) vkms_trigger_connector_hotplug(connector->dev->config->dev); } =20 @@ -1171,7 +1177,7 @@ static ssize_t connector_type_store(struct config_ite= m *item, } =20 scoped_guard(mutex, &connector->dev->lock) { - if (connector->dev->enabled) + if (connector->dev->enabled && connector_is_enabled(connector->config)) return -EBUSY; =20 vkms_config_connector_set_type(connector->config, val); @@ -1290,6 +1296,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; } @@ -1299,6 +1406,8 @@ CONFIGFS_ATTR(connector_, type); CONFIGFS_ATTR(connector_, supported_colorspaces); CONFIGFS_ATTR(connector_, edid_enabled); CONFIGFS_ATTR(connector_, edid); +CONFIGFS_ATTR(connector_, dynamic); +CONFIGFS_ATTR(connector_, enabled); =20 static struct configfs_attribute *connector_item_attrs[] =3D { &connector_attr_status, @@ -1306,19 +1415,28 @@ static struct configfs_attribute *connector_item_at= trs[] =3D { &connector_attr_supported_colorspaces, &connector_attr_edid_enabled, &connector_attr_edid, + &connector_attr_dynamic, + &connector_attr_enabled, NULL, }; =20 static void connector_release(struct config_item *item) { struct vkms_configfs_connector *connector; + struct vkms_config_connector *connector_cfg; struct mutex *lock; =20 connector =3D connector_item_to_vkms_configfs_connector(item); + connector_cfg =3D connector->config; lock =3D &connector->dev->lock; =20 scoped_guard(mutex, lock) { + if (connector->dev->enabled && connector_cfg->dynamic && connector_cfg->= enabled) + vkms_connector_hot_remove(connector->dev->config->dev, + connector_cfg->connector); + vkms_config_destroy_connector(connector->config); + kfree(connector); } } @@ -1337,6 +1455,7 @@ static int connector_possible_encoders_allow_link(str= uct config_item *src, struct config_item *target) { struct vkms_configfs_connector *connector; + struct vkms_config_connector *connector_cfg; struct vkms_configfs_encoder *encoder; int ret; =20 @@ -1344,14 +1463,25 @@ static int connector_possible_encoders_allow_link(s= truct config_item *src, return -EINVAL; =20 connector =3D connector_possible_encoders_item_to_vkms_configfs_connector= (src); + connector_cfg =3D connector->config; encoder =3D encoder_item_to_vkms_configfs_encoder(target); =20 scoped_guard(mutex, &connector->dev->lock) { - if (connector->dev->enabled) - return -EBUSY; + if (connector->dev->enabled && connector_cfg->enabled) { + if (!connector_cfg->dynamic) + return -EBUSY; + + ret =3D vkms_connector_hot_attach_encoder(connector->dev->config->dev, + connector->config->connector, + encoder->config->encoder); + if (ret) + return ret; + } =20 ret =3D vkms_config_connector_attach_encoder(connector->config, encoder->config); + if (ret) + return ret; } =20 return ret; @@ -1392,9 +1522,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); @@ -1408,6 +1535,9 @@ static struct config_group *make_connector_group(stru= ct config_group *group, return ERR_PTR(ret); } =20 + vkms_config_connector_set_dynamic(connector->config, connector->dev->ena= bled); + vkms_config_connector_set_enabled(connector->config, !connector->dev->en= abled); + config_group_init_type_name(&connector->group, name, &connector_item_type); =20 --=20 2.54.0 From nobody Sat Jun 27 22:18:04 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 CE37F339719 for ; Sat, 27 Jun 2026 03:32:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.85.4 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531144; cv=none; b=B48JBC7rt99U7zNnz5+2cRKm80hEEFzbMzfX0U4yampzsZjO2Wm7+Rw0yIK7d4PyyNpQb7YE7VtbmRF22YZg9UkDTdDD5o87fx2ANd4CipU+jh7js9Mpfp5wC7sMhxUf/Qy1896qTVCiQDKTai+CrhxhtSVv5yZSszwjvHt3zrk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531144; c=relaxed/simple; bh=k8oCeZDYpFKVMBx6v5QpBDxqhLtzulGYOkjul9kUb00=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=q4FfHwbI38YM7vKney4RFcOKCssYawnTFsxJlPIyklv3yLgqo1cxtSrWYjGpwvfbZzPocOInevtHl7RgoojrGuZ/67eeIZTQOojxBqQkHchYpXd6nvESObro/igyE0JZXQwxam79G8YRO3L+gpTAXpXiFJlMC5O8nT1mAgk2EcA= 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=rWFd6K0Z; 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="rWFd6K0Z" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 85E154E40A08; Sat, 27 Jun 2026 03:32:20 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 524A560233; Sat, 27 Jun 2026 03:32:20 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 83C55106F1173; Sat, 27 Jun 2026 05:32:16 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1782531138; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=lJhOkLzdiL9CYLEKx34wGu1wb951FJ2IFjutBzAU2+o=; b=rWFd6K0Z4uxqRwN8ApJqrVtc3WTKHYBEErtOxUnu+82CocN+dNnay0wemkBcrD/Y667UpJ WTOqrZCpLMt7EXjTzUVcRDDqLrqWNKvNuTtL8sojou/JXbzqHJw9veiVLFONlqdOtPyTgn 11NvgDivUqdEsZ7sIJofJUiD62BbD6tfI8jyPGvXgClHncH/MjFMK9rwAmN/uMUt+BVakx TiGl0A3WWy8W6E/faw+AD4KUm28zPZCUt7IosfGVHI/lJ03+PKaCE+kZ6jfjOFiwydwTgL D0slbU3a2h5Ffn2TjQnvYFmeKK1O+mu/XAV88utF/Z+I2kxkV3GUy+++jtztRg== From: Louis Chauvet Date: Sat, 27 Jun 2026 05:30:54 +0200 Subject: [PATCH v5 37/38] drm/vkms: Add connector parent configuration in vkms_config 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: <20260627-vkms-all-config-v5-37-854aa0840926@bootlin.com> References: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> In-Reply-To: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet , Shuah Khan , Miguel Ojeda , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt Cc: Luca Ceresoli , Kory Maincent , 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 , llvm@lists.linux.dev X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=24944; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=k8oCeZDYpFKVMBx6v5QpBDxqhLtzulGYOkjul9kUb00=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBqP0PiBmSru2IyZEbZ3s8ah3L0SwOl8SNF9cw56 bTaBDt43cGJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaj9D4hsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDIACgkQIK0uxlsQLOJWEhAAoIvhW3iLyAiD/XiEyGspL3exdiMJUIF wNVNUd+V3KFLabvtk8D5rDS9RE0GVzb+NpC9KTCSrVxCtggkOtpGmcQu+khEkVcH2SpTGJo2XtE sAYekZovHOALTVkvXGrqv0vtaGxiISPGHLWEaG8Rj7Wu+pu4hBGDqpQWHT6EDt60n/ecXwkWDzw RZ37wvc1njTAiystCVCMWjIk2LyjfleGU5YKEjG5+BtGEUla/x3mHIzTi+njzriAoIWfMcg8blF X3vuqwpSau3bqWrQnkUnPqN7H7sKESZWVsxEd5JM7WHmuwik2iFL4p2CZV0ZuoZho50VNM8uLGj iOVIih4ViDuW22XGDykFf0ZfBB2BbfYbAFsYwk5cxDa0HYErKBLcedOTbaRr/NPoPUTLi6/4tUy tyt88EZUjrwT83JMzBVgvohusynSUvbETcQOOXyU2d674lEMzi8glnfrrw16mqT9jgEqXXaTayn U8F6/XO/3bVqZzspOeGnvQ15T3lwUbep5+PvXlmck5zvsFya4enamhTfMN0rn35w8MIfep5dfVe uAIddRzVd//86pVGxINHcyfdhpsFDrpj2loplsRQ39VtDMU2DEx6zwxa3pkEMLIU5otFnV5A9ZF 2sNTQJC8YBQrBTvRTcRik1LOhgIE1+0vnTGFzt5pCMleRfb/2xcE= X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 In order to fully emulate MST connector from the userspace point of view, add a way to configure the PATH property. Add two things: - port_id, to configure the MST port id (used to generate the last - in the PATH property) - parent, to configure the parent connector (used to generate - or -- in the PATH property) In order to properly populate the PATH property, it should be done after all the connector initialization to ensure that the is known. Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/tests/vkms_config_test.c | 269 ++++++++++++++++++++++= +++- drivers/gpu/drm/vkms/vkms_config.c | 50 ++++- drivers/gpu/drm/vkms/vkms_config.h | 60 +++++- drivers/gpu/drm/vkms/vkms_configfs.c | 2 +- drivers/gpu/drm/vkms/vkms_connector.c | 74 +++++++ drivers/gpu/drm/vkms/vkms_connector.h | 9 + drivers/gpu/drm/vkms/vkms_output.c | 2 + 7 files changed, 460 insertions(+), 6 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 fda23f05a0a5..a9700e265d42 100644 --- a/drivers/gpu/drm/vkms/tests/vkms_config_test.c +++ b/drivers/gpu/drm/vkms/tests/vkms_config_test.c @@ -396,7 +396,7 @@ static void vkms_config_test_get_connectors(struct kuni= t *test) KUNIT_ASSERT_EQ(test, n_connectors, 2); n_connectors =3D 0; =20 - vkms_config_destroy_connector(connector_cfg2); + vkms_config_destroy_connector(config, connector_cfg2); vkms_config_for_each_connector(config, connector_cfg) { n_connectors++; if (connector_cfg !=3D connector_cfg1) @@ -845,7 +845,7 @@ static void vkms_config_test_invalid_connector_number(s= truct kunit *test) =20 /* Invalid: No connectors */ connector_cfg =3D get_first_connector(config); - vkms_config_destroy_connector(connector_cfg); + vkms_config_destroy_connector(config, connector_cfg); KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); =20 /* Invalid: Too many connectors */ @@ -1233,6 +1233,267 @@ static void vkms_config_test_connector_status(struc= t kunit *test) vkms_config_destroy(config); } =20 +static void vkms_config_test_connector_dynamic_status(struct kunit *test) +{ + struct vkms_config *config; + struct vkms_config_connector *connector_cfg; + struct vkms_config_encoder *encoder_cfg; + struct vkms_config_crtc *crtc_cfg; + struct vkms_config_plane *plane_cfg; + enum drm_connector_status status; + int err; + + config =3D vkms_config_create("test"); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); + + /* Create a complete pipeline */ + crtc_cfg =3D vkms_config_create_crtc(config); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_cfg); + + encoder_cfg =3D vkms_config_create_encoder(config); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, encoder_cfg); + + connector_cfg =3D vkms_config_create_connector(config); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, connector_cfg); + + plane_cfg =3D vkms_config_create_plane(config); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, plane_cfg); + + vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_PRIMARY); + err =3D vkms_config_plane_attach_crtc(plane_cfg, crtc_cfg); + KUNIT_EXPECT_EQ(test, err, 0); + + err =3D vkms_config_encoder_attach_crtc(encoder_cfg, crtc_cfg); + KUNIT_EXPECT_EQ(test, err, 0); + + err =3D vkms_config_connector_attach_encoder(connector_cfg, encoder_cfg); + KUNIT_EXPECT_EQ(test, err, 0); + + /* Test dynamic status changes */ + status =3D vkms_config_connector_get_status(connector_cfg); + KUNIT_EXPECT_EQ(test, status, connector_status_connected); + + vkms_config_connector_set_status(connector_cfg, connector_status_disconne= cted); + status =3D vkms_config_connector_get_status(connector_cfg); + KUNIT_EXPECT_EQ(test, status, connector_status_disconnected); + + /* Configuration should still be valid regardless of connector status */ + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + vkms_config_connector_set_status(connector_cfg, connector_status_connecte= d); + status =3D vkms_config_connector_get_status(connector_cfg); + KUNIT_EXPECT_EQ(test, status, connector_status_connected); + + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Test with unknown status */ + vkms_config_connector_set_status(connector_cfg, connector_status_unknown); + status =3D vkms_config_connector_get_status(connector_cfg); + KUNIT_EXPECT_EQ(test, status, connector_status_unknown); + + /* Configuration should still be valid */ + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + vkms_config_destroy(config); +} + +static void vkms_config_test_dynamic_connector_validity(struct kunit *test) +{ + struct vkms_config *config; + struct vkms_config_connector *connector_cfg1, *connector_cfg2; + struct vkms_config_encoder *encoder_cfg; + struct vkms_config_crtc *crtc_cfg; + struct vkms_config_plane *plane_cfg; + int err; + + config =3D vkms_config_create("test"); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); + + /* Create a complete pipeline */ + crtc_cfg =3D vkms_config_create_crtc(config); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_cfg); + + encoder_cfg =3D vkms_config_create_encoder(config); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, encoder_cfg); + + connector_cfg1 =3D vkms_config_create_connector(config); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, connector_cfg1); + + plane_cfg =3D vkms_config_create_plane(config); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, plane_cfg); + + vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_PRIMARY); + err =3D vkms_config_plane_attach_crtc(plane_cfg, crtc_cfg); + KUNIT_EXPECT_EQ(test, err, 0); + + err =3D vkms_config_encoder_attach_crtc(encoder_cfg, crtc_cfg); + KUNIT_EXPECT_EQ(test, err, 0); + + err =3D vkms_config_connector_attach_encoder(connector_cfg1, encoder_cfg); + KUNIT_EXPECT_EQ(test, err, 0); + + /* Valid: Non-dynamic connector */ + vkms_config_connector_set_dynamic(connector_cfg1, false); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Valid: Dynamic connector */ + vkms_config_connector_set_dynamic(connector_cfg1, true); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Valid: Multiple dynamic connectors */ + connector_cfg2 =3D vkms_config_create_connector(config); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, connector_cfg2); + vkms_config_connector_set_dynamic(connector_cfg2, true); + err =3D vkms_config_connector_attach_encoder(connector_cfg2, encoder_cfg); + KUNIT_EXPECT_EQ(test, err, 0); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + vkms_config_destroy(config); +} + +static void vkms_config_test_dynamic_connector_parent_validity(struct kuni= t *test) +{ + struct vkms_config *config; + struct vkms_config_connector *connector_cfg1, *connector_cfg2, *connector= _cfg3; + struct vkms_config_encoder *encoder_cfg; + struct vkms_config_crtc *crtc_cfg; + struct vkms_config_plane *plane_cfg; + int err; + + config =3D vkms_config_create("test"); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); + + /* Create a complete pipeline */ + crtc_cfg =3D vkms_config_create_crtc(config); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_cfg); + + encoder_cfg =3D vkms_config_create_encoder(config); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, encoder_cfg); + + connector_cfg1 =3D vkms_config_create_connector(config); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, connector_cfg1); + + plane_cfg =3D vkms_config_create_plane(config); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, plane_cfg); + + vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_PRIMARY); + err =3D vkms_config_plane_attach_crtc(plane_cfg, crtc_cfg); + KUNIT_EXPECT_EQ(test, err, 0); + + err =3D vkms_config_encoder_attach_crtc(encoder_cfg, crtc_cfg); + KUNIT_EXPECT_EQ(test, err, 0); + + err =3D vkms_config_connector_attach_encoder(connector_cfg1, encoder_cfg); + KUNIT_EXPECT_EQ(test, err, 0); + + /* Valid: Non-dynamic connector with no parent */ + vkms_config_connector_set_dynamic(connector_cfg1, false); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Valid: Dynamic connector with no parent */ + vkms_config_connector_set_dynamic(connector_cfg1, true); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Valid: Dynamic connector with dynamic parent */ + connector_cfg2 =3D vkms_config_create_connector(config); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, connector_cfg2); + vkms_config_connector_set_dynamic(connector_cfg2, true); + err =3D vkms_config_connector_attach_encoder(connector_cfg2, encoder_cfg); + KUNIT_EXPECT_EQ(test, err, 0); + vkms_config_connector_attach_parent(connector_cfg2, connector_cfg1); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Valid: Dynamic connector with non-dynamic parent */ + vkms_config_connector_set_dynamic(connector_cfg1, false); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Valid: Non-dynamic connector with no parent */ + vkms_config_connector_attach_parent(connector_cfg2, NULL); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Valid: Multiple levels of dynamic parent-child relationships */ + vkms_config_connector_set_dynamic(connector_cfg1, true); + vkms_config_connector_attach_parent(connector_cfg2, connector_cfg1); + connector_cfg3 =3D vkms_config_create_connector(config); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, connector_cfg3); + vkms_config_connector_set_dynamic(connector_cfg3, true); + err =3D vkms_config_connector_attach_encoder(connector_cfg3, encoder_cfg); + KUNIT_EXPECT_EQ(test, err, 0); + vkms_config_connector_attach_parent(connector_cfg3, connector_cfg2); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + vkms_config_destroy(config); +} + +static void vkms_config_test_dynamic_connector_parent_loop(struct kunit *t= est) +{ + struct vkms_config *config; + struct vkms_config_connector *connector_cfg1, *connector_cfg2, *connector= _cfg3; + struct vkms_config_encoder *encoder_cfg; + struct vkms_config_crtc *crtc_cfg; + struct vkms_config_plane *plane_cfg; + int err; + + config =3D vkms_config_create("test"); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); + + /* Create a complete pipeline */ + crtc_cfg =3D vkms_config_create_crtc(config); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_cfg); + + encoder_cfg =3D vkms_config_create_encoder(config); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, encoder_cfg); + + connector_cfg1 =3D vkms_config_create_connector(config); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, connector_cfg1); + + plane_cfg =3D vkms_config_create_plane(config); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, plane_cfg); + + vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_PRIMARY); + err =3D vkms_config_plane_attach_crtc(plane_cfg, crtc_cfg); + KUNIT_EXPECT_EQ(test, err, 0); + + err =3D vkms_config_encoder_attach_crtc(encoder_cfg, crtc_cfg); + KUNIT_EXPECT_EQ(test, err, 0); + + err =3D vkms_config_connector_attach_encoder(connector_cfg1, encoder_cfg); + KUNIT_EXPECT_EQ(test, err, 0); + + /* Valid: Single dynamic connector with no parent */ + vkms_config_connector_set_dynamic(connector_cfg1, true); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Valid: Two dynamic connectors in a chain */ + connector_cfg2 =3D vkms_config_create_connector(config); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, connector_cfg2); + vkms_config_connector_set_dynamic(connector_cfg2, true); + err =3D vkms_config_connector_attach_encoder(connector_cfg2, encoder_cfg); + KUNIT_EXPECT_EQ(test, err, 0); + vkms_config_connector_attach_parent(connector_cfg2, connector_cfg1); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Invalid: Create a loop - connector2 -> connector1 -> connector2 */ + vkms_config_connector_attach_parent(connector_cfg1, connector_cfg2); + KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); + + /* Fix the loop */ + vkms_config_connector_attach_parent(connector_cfg1, NULL); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Invalid: Create a longer loop - connector1 -> connector2 -> connector3= -> connector1 */ + connector_cfg3 =3D vkms_config_create_connector(config); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, connector_cfg3); + vkms_config_connector_set_dynamic(connector_cfg3, true); + err =3D vkms_config_connector_attach_encoder(connector_cfg3, encoder_cfg); + KUNIT_EXPECT_EQ(test, err, 0); + vkms_config_connector_attach_parent(connector_cfg3, connector_cfg2); + vkms_config_connector_attach_parent(connector_cfg1, connector_cfg3); + KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); + + vkms_config_destroy(config); +} + static struct kunit_case vkms_config_test_cases[] =3D { KUNIT_CASE(vkms_config_test_empty_config), KUNIT_CASE_PARAM(vkms_config_test_default_config, @@ -1259,6 +1520,10 @@ static struct kunit_case vkms_config_test_cases[] = =3D { KUNIT_CASE(vkms_config_test_encoder_get_possible_crtcs), KUNIT_CASE(vkms_config_test_connector_get_possible_encoders), KUNIT_CASE(vkms_config_test_connector_status), + KUNIT_CASE(vkms_config_test_connector_dynamic_status), + KUNIT_CASE(vkms_config_test_dynamic_connector_validity), + KUNIT_CASE(vkms_config_test_dynamic_connector_parent_validity), + KUNIT_CASE(vkms_config_test_dynamic_connector_parent_loop), {} }; =20 diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index 98e40c6a2c5b..b9d5a2e44fd9 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -170,7 +170,7 @@ void vkms_config_destroy(struct vkms_config *config) vkms_config_destroy_encoder(config, encoder_cfg); =20 list_for_each_entry_safe(connector_cfg, connector_tmp, &config->connector= s, link) - vkms_config_destroy_connector(connector_cfg); + vkms_config_destroy_connector(config, connector_cfg); =20 kfree_const(config->dev_name); kfree(config); @@ -437,6 +437,41 @@ static bool valid_connector_possible_encoders(const st= ruct vkms_config *config) return true; } =20 +static bool valid_connector_parents(const struct vkms_config *config) +{ + struct drm_device *dev =3D config->dev ? &config->dev->drm : NULL; + + struct vkms_config_connector *connector_cfg; + struct vkms_config_connector *connector_cfg_parent; + + vkms_config_for_each_connector(config, connector_cfg) { + bool expected_status =3D connector_cfg->enabled; + + vkms_config_for_each_connector(config, connector_cfg_parent) + connector_cfg_parent->visited =3D false; + + connector_cfg_parent =3D connector_cfg; + while (connector_cfg_parent) { + if (connector_cfg_parent->visited) { + drm_info(dev, "Parents of connector should not form a loop\n"); + return false; + } + + if (expected_status && connector_cfg_parent->enabled !=3D expected_stat= us) { + drm_info(dev, "All parents of an enabled connector must be enabled\n"); + return false; + } + + + + connector_cfg_parent->visited =3D true; + connector_cfg_parent =3D connector_cfg_parent->parent; + } + } + + return true; +} + bool vkms_config_is_valid(const struct vkms_config *config) { struct drm_device *dev =3D config->dev ? &config->dev->drm : NULL; @@ -503,6 +538,9 @@ bool vkms_config_is_valid(const struct vkms_config *con= fig) if (!valid_connector_possible_encoders(config)) return false; =20 + if (!valid_connector_parents(config)) + return false; + return true; } EXPORT_SYMBOL_IF_KUNIT(vkms_config_is_valid); @@ -958,8 +996,16 @@ struct vkms_config_connector *vkms_config_create_conne= ctor(struct vkms_config *c } EXPORT_SYMBOL_IF_KUNIT(vkms_config_create_connector); =20 -void vkms_config_destroy_connector(struct vkms_config_connector *connector= _cfg) +void vkms_config_destroy_connector(struct vkms_config *config, + struct vkms_config_connector *connector_cfg) { + struct vkms_config_connector *connector_cfg_tmp; + + vkms_config_for_each_connector(config, connector_cfg_tmp) { + if (connector_cfg_tmp->parent =3D=3D connector_cfg) + connector_cfg_tmp->parent =3D NULL; + } + xa_destroy(&connector_cfg->possible_encoders); list_del(&connector_cfg->link); kfree(connector_cfg); diff --git a/drivers/gpu/drm/vkms/vkms_config.h b/drivers/gpu/drm/vkms/vkms= _config.h index 071887a65380..2e6ddd2922c2 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -143,10 +143,14 @@ struct vkms_config_encoder { * @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 + * @parent: To emulate MST connector, this will contains a pointer to the = parent + * @port_id: To emulate MST connector, this contains the physical port id.= Used to + * generate the PATH property. * @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 * during device creation. This pointer is not managed by the * configuration and must be managed by other means. + * @visited: Internal usage. This boolean is used to do some verification = on the connectors. */ struct vkms_config_connector { struct list_head link; @@ -161,9 +165,12 @@ struct vkms_config_connector { u8 *edid; unsigned int edid_len; struct xarray possible_encoders; + struct vkms_config_connector *parent; + u8 port_id; =20 /* Internal usage */ struct vkms_connector *connector; + bool visited; }; =20 /** @@ -370,6 +377,56 @@ vkms_config_connector_set_edid(struct vkms_config_conn= ector *connector_cfg, connector_cfg->edid_len =3D len; } } +/** + * vkms_config_connector_attach_parent - Attach a connector to a parent co= nnector + * @connector_cfg: Connector to attach + * @parent: Parent connector to attach @connector_cfg to. Can be NULL to d= etach the parent. + */ +static inline void +vkms_config_connector_attach_parent(struct vkms_config_connector *connecto= r_cfg, + struct vkms_config_connector *parent) +{ + connector_cfg->parent =3D parent; +} + +/** + * vkms_config_connector_get_parent - Get the parent connector of a connec= tor + * @connector_cfg: Connector to get the parent from + * + * Returns: + * The parent connector of @connector_cfg or NULL if none is assigned yet. + */ +static inline struct vkms_config_connector* +vkms_config_connector_get_parent(const struct vkms_config_connector *conne= ctor_cfg) +{ + return connector_cfg->parent; +} + +/** + * vkms_config_connector_get_port_id() - Get the port ID for a connector + * @connector_cfg: Connector configuration to query + * + * Returns: + * The port ID for this connector. + */ +static inline u8 +vkms_config_connector_get_port_id(const struct vkms_config_connector *conn= ector_cfg) +{ + return connector_cfg->port_id; +} + +/** + * vkms_config_connector_set_port_id() - Set the port ID for a connector + * @connector_cfg: Connector configuration to modify + * @port_id: New port ID for this connector + */ +static inline void +vkms_config_connector_set_port_id(struct vkms_config_connector *connector_= cfg, + u8 port_id) +{ + connector_cfg->port_id =3D port_id; +} + =20 /** * vkms_config_get_device_name() - Return the name of the device @@ -1027,7 +1084,8 @@ struct vkms_config_connector *vkms_config_create_conn= ector(struct vkms_config *c * vkms_config_destroy_connector() - Remove and free a connector configura= tion * @connector_cfg: Connector configuration to destroy */ -void vkms_config_destroy_connector(struct vkms_config_connector *connector= _cfg); +void vkms_config_destroy_connector(struct vkms_config *config, + struct vkms_config_connector *connector_cfg); =20 /** * vkms_config_connector_attach_encoder - Attach a connector to an encoder diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vk= ms_configfs.c index f92b172e75cf..dd2a9e450150 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -1435,7 +1435,7 @@ static void connector_release(struct config_item *ite= m) vkms_connector_hot_remove(connector->dev->config->dev, connector_cfg->connector); =20 - vkms_config_destroy_connector(connector->config); + vkms_config_destroy_connector(connector->dev->config, connector->config); =20 kfree(connector); } diff --git a/drivers/gpu/drm/vkms/vkms_connector.c b/drivers/gpu/drm/vkms/v= kms_connector.c index a013b53bd915..08e1828a0fb0 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.c +++ b/drivers/gpu/drm/vkms/vkms_connector.c @@ -8,6 +8,76 @@ #include "vkms_config.h" #include "vkms_connector.h" =20 +/** + * vkms_connector_build_path_property() - Build the PATH property string f= or MST connectors + * @connector: The connector to build the PATH property for + * @connector_cfg: The connector configuration + * + * The PATH property format is: + * mst:- + * For nested MST connectors, this builds the full path like mst:45-2-3-4-2 + */ +static void vkms_connector_build_path_property(struct vkms_connector *conn= ector, + const struct vkms_config_connector *connector_cfg) +{ + const struct vkms_config_connector *current_cfg =3D connector_cfg; + const struct vkms_config_connector *root_cfg =3D NULL; + struct vkms_connector *root_connector =3D NULL; + char path[128]; /* Increased size for nested MST paths */ + int len =3D 0; + u8 port_ids[16]; /* Max 16 levels of nesting */ + int port_count =3D 0; + int i; + + if (!vkms_config_connector_get_parent(connector_cfg)) + return; + + while (current_cfg) { + if (port_count < ARRAY_SIZE(port_ids)) + port_ids[port_count++] =3D current_cfg->port_id; + + if (!vkms_config_connector_get_parent(current_cfg)) { + root_cfg =3D current_cfg; + break; + } + + current_cfg =3D vkms_config_connector_get_parent(current_cfg); + } + + if (!root_cfg || !root_cfg->connector) + return; + + root_connector =3D root_cfg->connector; + + len =3D snprintf(path, sizeof(path), "mst:%d", root_connector->base.base.= id); + + for (i =3D port_count - 2; i >=3D 0; i--) { + int added =3D snprintf(path + len, sizeof(path) - len, + "-%u", port_ids[i]); + if (added < 0 || len + added >=3D sizeof(path)) + return; + len +=3D added; + } + + drm_connector_set_path_property(&connector->base, path); +} + +/** + * vkms_connector_update_path_properties() - Update PATH properties for al= l connectors + * @vkmsdev: VKMS device + * + * This should be called after all connectors are created to ensure parent= connectors + * have valid DRM object IDs. + */ +void vkms_connector_update_path_properties(struct vkms_device *vkmsdev) +{ + struct vkms_config_connector *connector_cfg; + + vkms_config_for_each_connector(vkmsdev->config, connector_cfg) + if (connector_cfg->connector) + vkms_connector_build_path_property(connector_cfg->connector, connector_= cfg); +} + static enum drm_connector_status vkms_connector_detect(struct drm_connecto= r *connector, bool force) { @@ -150,6 +220,8 @@ static int __must_check vkms_connector_init(struct vkms= _connector *connector, } } =20 + drm_object_attach_property(&connector->base.base, connector->base.dev->mo= de_config.path_property, 0); + return 0; } =20 @@ -240,6 +312,8 @@ struct vkms_connector *vkms_connector_hot_add(struct vk= ms_device *vkmsdev, if (ret) return ERR_PTR(ret); =20 + vkms_connector_build_path_property(connector, connector_cfg); + ret =3D drm_connector_dynamic_register(&connector->base); if (ret) { if (connector_cfg->type =3D=3D DRM_MODE_CONNECTOR_HDMIA || diff --git a/drivers/gpu/drm/vkms/vkms_connector.h b/drivers/gpu/drm/vkms/v= kms_connector.h index a235a518d5a0..f8219830aaa5 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.h +++ b/drivers/gpu/drm/vkms/vkms_connector.h @@ -67,4 +67,13 @@ int vkms_connector_hot_attach_encoder(struct vkms_device= *vkmsdev, struct vkms_connector *connector, struct drm_encoder *encoder); =20 +/** + * vkms_connector_update_path_properties() - Update PATH properties for al= l connectors + * @vkmsdev: VKMS device + * + * This should be called after all connectors are created to ensure parent= connectors + * have valid DRM object IDs. + */ +void vkms_connector_update_path_properties(struct vkms_device *vkmsdev); + #endif /* _VKMS_CONNECTOR_H_ */ diff --git a/drivers/gpu/drm/vkms/vkms_output.c b/drivers/gpu/drm/vkms/vkms= _output.c index 50f7d88dee8b..ad901340ba7c 100644 --- a/drivers/gpu/drm/vkms/vkms_output.c +++ b/drivers/gpu/drm/vkms/vkms_output.c @@ -126,5 +126,7 @@ int vkms_output_init(struct vkms_device *vkmsdev) } } =20 + vkms_connector_update_path_properties(vkmsdev); + return 0; } --=20 2.54.0 From nobody Sat Jun 27 22:18:04 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 2404036606A; Sat, 27 Jun 2026 03:32:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531146; cv=none; b=buIbWZcEAaH23MelBRue+jJOVO1nEhRsEgH5F5oIQ2N0igQvQCMNBeNxah5SdirFyKWazxpw9wHBmAFuz9qmEz6uSzAJD0BgtipzTrm4K7KlyYKtQKsVACpIVLL5ubg+PSeqAuHg7KYY3UNJOH0Hps+zA4YgQ5mebeCtqGNsgRI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782531146; c=relaxed/simple; bh=EiGhaRVcBrHhG3ZC1o5OwZvxjBRoDMYEi/Wnd/D43UQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=kvFMMcDgjRUab1bihiplCPzJi3FNQ620cCBZVON5y+PVHPDDmIwpE/BZ8e8ClZssq6NhfrMPjLG1YgA4zKModd+YN+k6w8r/Manp9WTinnRd7iMDaYfa2EqZYYlDtjxfNNmD5/qMkOuSe+5vC3ASeihOZ2cXG61gQlR8/ekuLxw= 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=ohsZLMyt; 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="ohsZLMyt" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id E0489C58468; Sat, 27 Jun 2026 03:32:31 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id D06DF60233; Sat, 27 Jun 2026 03:32:22 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 2E833106F1165; Sat, 27 Jun 2026 05:32:19 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1782531141; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=DGT4effFpPmWOM+aXYqsouC87Bp3kHtwAGycmPjcxEs=; b=ohsZLMytWMZBzsQe7gY3ZbjctlxoKgmRqmejFt1q9lEeX/IHv/cRb2/tIPWIbcGee+K3eq pfIOBf+JygjhF9tDGZIj3BxJSCaUEbxaonntKMYK+E0kNI0FdyuIusGA7vAMpDYcKfpfLV qnWfPHpxUE6/Z8iQp53fBxrNRA7oHS5+FsgoNiFy0Pqp5cEKK0s6s9RuNNrk4cKufFCyDb 8b+zyOJIZYmzHtn8MyQTi9Iv9Rkqv6zYNa6YWyP3fxyWSUDKNw+fPpSw2LnjdzOCdmeCXf c/VpvpOtWxA5fMgCKoGR7O7GKMcLbCM4Hdu5uxMDzbWvKO6KaSqEWqsykbEIiw== From: Louis Chauvet Date: Sat, 27 Jun 2026 05:30:55 +0200 Subject: [PATCH v5 38/38] drm/vkms: Add ConfigFS interface for connector parent and port_id 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: <20260627-vkms-all-config-v5-38-854aa0840926@bootlin.com> References: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> In-Reply-To: <20260627-vkms-all-config-v5-0-854aa0840926@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet , Shuah Khan , Miguel Ojeda , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt Cc: Luca Ceresoli , Kory Maincent , 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 , llvm@lists.linux.dev X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=5595; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=EiGhaRVcBrHhG3ZC1o5OwZvxjBRoDMYEi/Wnd/D43UQ=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBqP0PiMoWff0aLZE1ohvIaGwcxn99Z0iBt1F03R rzY5b5+pceJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaj9D4hsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMiwyLDIACgkQIK0uxlsQLOLEoQ//Q5VaBWPpu8uf3hXu+ADvo62FtR/kJFG cLstNH97LeJ/qWyPfke7Sl9BAEDZU8Qn+/2l8KiKZIBzh/8TMOCM01wSAHBWfFi6tyr74gvvXi2 Lu6TyNiwUoKyBd71EatZ03G2YhmB1PbJwipHLMTYm6XaWTjXJluzEonnOJbVQ+LEyX4a8c242tm tZ/Mv5cgU7dxIxO4U5LEOf8BAYiCNQ60efX6YZ5qM8cC0mlWBJKC2AcQ+z1IwvMNF/gmAkbYllu jF7P1pARpuUrzqvxXSXZ3SgFsJ3nfwLX1mYrIlF2MEDUAYblbH2QHY8VHHO9WkYfg8mTheuQhio JaeuA/Uq3/Xuwba0Vr3fY1uxaRoUOsHBrdtKJQvU5LXMNz7JT1i0eeYsHlnz6qFz4b9MJxR6w5e NqJOtr/Vl8LN+O+52jXP4t+CSsFfzv1XCjkqqV+Up5BipUAbZVXVym6Tl6X+F2Ab+YlIP0FYMCa WPgBbYWYqjJ4SZuuNTwBspbKE1zfKWgZAa6gx4+B91aC3/oWtYLOCvMgCFRXuLltjw0+rrGKm2L Be1sdNHi3Mf1JxY3PxwEHdngOMQzWXxPqbR7Bd8zqSbVB1U+Rf2Fc4llhhYvsC/2qbhnvxpbQ9L duEmfzCs6Fj67BOlQUJoSwI94qS0bSEK/pgSRwTi1zEYljson0lA= X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 Add the parent and port_id configuration for a connector. - port_id can contains any u8 value - parent can contain at most one symlink to an other connector. Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/vkms_configfs.c | 104 +++++++++++++++++++++++++++++++= ++++ 1 file changed, 104 insertions(+) diff --git a/drivers/gpu/drm/vkms/vkms_configfs.c b/drivers/gpu/drm/vkms/vk= ms_configfs.c index dd2a9e450150..4f4ec9944804 100644 --- a/drivers/gpu/drm/vkms/vkms_configfs.c +++ b/drivers/gpu/drm/vkms/vkms_configfs.c @@ -114,6 +114,7 @@ struct vkms_configfs_encoder { struct vkms_configfs_connector { struct config_group group; struct config_group possible_encoders_group; + struct config_group parent_group; struct vkms_configfs_device *dev; struct vkms_config_connector *config; }; @@ -151,6 +152,10 @@ struct vkms_configfs_connector { container_of(to_config_group((item)), struct vkms_configfs_connector, \ possible_encoders_group) =20 +#define connector_parent_item_to_vkms_configfs_connector(item) \ + container_of(to_config_group((item)), struct vkms_configfs_connector, \ + parent_group) + static ssize_t crtc_writeback_show(struct config_item *item, char *page) { struct vkms_configfs_crtc *crtc; @@ -1401,6 +1406,42 @@ static ssize_t connector_dynamic_store(struct config= _item *item, return count; } =20 +static ssize_t connector_port_id_show(struct config_item *item, char *page) +{ + struct vkms_configfs_connector *connector; + u8 port_id; + + connector =3D connector_item_to_vkms_configfs_connector(item); + + scoped_guard(mutex, &connector->dev->lock) + port_id =3D vkms_config_connector_get_port_id(connector->config); + + return sprintf(page, "%u\n", port_id); +} + +static ssize_t connector_port_id_store(struct config_item *item, + const char *page, size_t count) +{ + struct vkms_configfs_connector *connector; + u8 port_id; + int ret; + + connector =3D connector_item_to_vkms_configfs_connector(item); + + ret =3D kstrtou8(page, 10, &port_id); + if (ret) + return ret; + + scoped_guard(mutex, &connector->dev->lock) { + if (connector->dev->enabled && connector_is_enabled(connector->config)) + return -EBUSY; + + vkms_config_connector_set_port_id(connector->config, port_id); + } + + return count; +} + CONFIGFS_ATTR(connector_, status); CONFIGFS_ATTR(connector_, type); CONFIGFS_ATTR(connector_, supported_colorspaces); @@ -1408,6 +1449,7 @@ CONFIGFS_ATTR(connector_, edid_enabled); CONFIGFS_ATTR(connector_, edid); CONFIGFS_ATTR(connector_, dynamic); CONFIGFS_ATTR(connector_, enabled); +CONFIGFS_ATTR(connector_, port_id); =20 static struct configfs_attribute *connector_item_attrs[] =3D { &connector_attr_status, @@ -1417,6 +1459,7 @@ static struct configfs_attribute *connector_item_attr= s[] =3D { &connector_attr_edid, &connector_attr_dynamic, &connector_attr_enabled, + &connector_attr_port_id, NULL, }; =20 @@ -1512,6 +1555,63 @@ static const struct config_item_type connector_possi= ble_encoders_group_type =3D { .ct_owner =3D THIS_MODULE, }; =20 +static int connector_parent_connector_allow_link(struct config_item *src, + struct config_item *target) +{ + struct vkms_configfs_connector *connector; + struct vkms_config_connector *connector_cfg; + struct vkms_configfs_connector *parent; + struct vkms_config_connector *parent_cfg; + int ret; + + if (target->ci_type !=3D &connector_item_type) + return -EINVAL; + + connector =3D connector_parent_item_to_vkms_configfs_connector(src); + connector_cfg =3D connector->config; + parent =3D connector_item_to_vkms_configfs_connector(target); + parent_cfg =3D parent->config; + + if (connector->dev !=3D parent->dev) + return -EINVAL; + + scoped_guard(mutex, &connector->dev->lock) { + if (vkms_config_connector_get_parent(connector_cfg)) + return -EMLINK; + + if (connector->dev->enabled && connector_cfg->enabled) + return -EBUSY; + + vkms_config_connector_attach_parent(connector_cfg, + parent_cfg); + } + + return ret; +} + +static void connector_parent_connector_drop_link(struct config_item *src, + struct config_item *target) +{ + struct vkms_configfs_connector *connector; + struct vkms_config_connector *connector_cfg; + + connector =3D connector_parent_item_to_vkms_configfs_connector(src); + connector_cfg =3D connector->config; + + scoped_guard(mutex, &connector->dev->lock) + vkms_config_connector_attach_parent(connector_cfg, NULL); +} + +static struct configfs_item_operations connector_parent_item_operations = =3D { + .allow_link =3D connector_parent_connector_allow_link, + .drop_link =3D connector_parent_connector_drop_link, +}; + +static const struct config_item_type connector_parent_group_type =3D { + .ct_item_ops =3D &connector_parent_item_operations, + .ct_owner =3D THIS_MODULE, +}; + static struct config_group *make_connector_group(struct config_group *grou= p, const char *name) { @@ -1544,6 +1644,10 @@ static struct config_group *make_connector_group(str= uct config_group *group, config_group_init_type_name(&connector->possible_encoders_group, "possible_encoders", &connector_possible_encoders_group_type); + config_group_init_type_name(&connector->parent_group, + "parent", + &connector_parent_group_type); + configfs_add_default_group(&connector->parent_group, &connector->group); configfs_add_default_group(&connector->possible_encoders_group, &connector->group); } --=20 2.54.0