From nobody Mon Feb 9 09:09:14 2026 Received: from smtpout-04.galae.net (smtpout-04.galae.net [185.171.202.116]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 670C93191C2 for ; Mon, 22 Dec 2025 10:12:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766398334; cv=none; b=lcEDT7Zne1KBtU7VyscEdfJCfNYbpn5ENlruM6Vs7TadrBjFZpl/8A1FbiqeCyo/lQiMFc72Pvpa8YJBTb7DMtB6oAPxqhyJVc3RKxxbtWCho5SNMpsk798FqUpCrdYbUMbL9rpO9ZH6NsL/CSS6aGeCynU5OPPN0MCmVT1nRMU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766398334; c=relaxed/simple; bh=G4Tpf8q7Y24uD2l0YnODPcYkZE27G4rAVPhDfLWtGNw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=sDOoBTQ+ipJ7VzIllNz3WERdIxg/KVaSzTsg01JzZf+6aFRQCkOiGFbf9TIip1pDZ97xlrHo04O/FGRJMYhmhC1KaonGqTScvx80dSQ5vRwavhUYsi1tePvJ4a3JI3Bk8efuxvDvBvLjFcmc39KlAAOd0DGhkgTvpvpUEe7Wz00= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=GlGdEGhZ; arc=none smtp.client-ip=185.171.202.116 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="GlGdEGhZ" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 8E62AC1AE08; Mon, 22 Dec 2025 10:11:43 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 8BEAC606C1; Mon, 22 Dec 2025 10:12:08 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 3617910AB01A1; Mon, 22 Dec 2025 11:12:06 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1766398327; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=xvLQd0JOeSSpMev+Jo1w7ypMxeZlz/1ij+dcg9scFG8=; b=GlGdEGhZrYgluEDXC+SyJld2JlkgCYP1rTDb0sUcrG3sXxqPM3ivL7B3KYDKCnqxgoc2z1 N8AofIhz6wwKkSPQKuCKdsWErya6OL87GmM+CAgxoxEqN8ziKpcnkD5F/+ydMCZysABK3h qnzysOCfEqQ0jO45ztqbDJnSmy0DL/dh7vx2S7DUQOzc5sUv3vhzOkzGsOTX5U3sBjF87c pMHtq+wYwpNc99rw/gaMWs7iQEA24+ypu1arWjpR0BiA58sc3uagB5Cl7Mpcsl0KcNO6xu D7fEAr36xYDjBl6aN+Wl/m9xLXTNpHhg8oAC7fqSIcBxwlbZRylplJKYQjxNTQ== From: Louis Chauvet Date: Mon, 22 Dec 2025 11:11:22 +0100 Subject: [PATCH v3 20/33] drm/vkms: Introduce config for plane zpos property Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251222-vkms-all-config-v3-20-ba42dc3fb9ff@bootlin.com> References: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@bootlin.com> In-Reply-To: <20251222-vkms-all-config-v3-0-ba42dc3fb9ff@bootlin.com> To: Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , jose.exposito89@gmail.com, Jonathan Corbet Cc: victoria@system76.com, sebastian.wick@redhat.com, victoria@system76.com, airlied@gmail.com, thomas.petazzoni@bootlin.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Louis Chauvet X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=15427; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=G4Tpf8q7Y24uD2l0YnODPcYkZE27G4rAVPhDfLWtGNw=; b=owEBiQJ2/ZANAwAIASCtLsZbECziAcsmYgBpSRlCMFkvSCJQOpZpU3UYBPwYAjAvZ63674Drk +uOr1FB8YWJAk8EAAEIADkWIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCaUkZQhsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDIACgkQIK0uxlsQLOJpIhAAxloxb1c4H9ydjXG3aPwqOkBNJX8tfzA 2zf1Tz0Liz4rt9hgdKFZP5uNzH+O3BzBE1Y8NYA0gGO8p5HdWG3vcaF6kqmU8R0XDfeSwtKhxFt qdXfQD0/OPdek9rUj9E0jo2KolD38ZEzM0YmsCg98hw93XbMZ4fsBiq/qmszIvvkHeiVp0WZctZ UJfB3YaeZF7WYwkaSrc5ngB1cZOCs13qBhKd/BzoOqGhGnyO8Hm7/h8YfgNaejMwSwLI87GBTEf OldHMkp8iL6IhkJNCJMTw5h0cQBNhoVD4VrIBdLQimxoULe4kBIkxk+6hUBhB4Z4EJKQY/26loI 0OT1VI/mUpWzlowhtpo7rkgdJZ92shoJAjKCXxk3in2xZwowh1kasgWMM9+yjX6nHi9cjoE1Uyz ehY6cSC1KrAVz/LCFu60bw/CW65tIrbdJ02yZ2crfrnU0oxHwGikdnTDC2N1oOHNI1vt6kXh/4A 3j6cpFuET2pjdTE2Oe74C8du2l+qKYUX16aqvNWe0GlDzXIQGQh3PE449Ay2L5Y70yqwb/afFlV kMsA6tUvh428hn3+QAFLFguqKoOaGj2O5CeNgo9JjE/dnwDsKpoPtnz6nPyCw1G9z8xELmVJepD kG3e5m38usB4nVkTAwktDku5VtQfx3ZsdEUzLC47dwABmO2i5Do8= X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-Last-TLS-Session-Version: TLSv1.3 VKMS can render plane in any order. Introduce the appropriate configuration. Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/tests/vkms_config_test.c | 89 ++++++++++++++++ drivers/gpu/drm/vkms/vkms_config.c | 43 ++++++++ drivers/gpu/drm/vkms/vkms_config.h | 143 ++++++++++++++++++++++= ++++ drivers/gpu/drm/vkms/vkms_plane.c | 10 ++ 4 files changed, 285 insertions(+) diff --git a/drivers/gpu/drm/vkms/tests/vkms_config_test.c b/drivers/gpu/dr= m/vkms/tests/vkms_config_test.c index a88d8b4a969e..4a5899b8ccfd 100644 --- a/drivers/gpu/drm/vkms/tests/vkms_config_test.c +++ b/drivers/gpu/drm/vkms/tests/vkms_config_test.c @@ -201,6 +201,9 @@ static void vkms_config_test_default_config(struct kuni= t *test) KUNIT_EXPECT_EQ(test, vkms_config_plane_get_default_color_encoding(plane_cfg), DRM_COLOR_YCBCR_BT601); + KUNIT_EXPECT_EQ(test, vkms_config_plane_get_zpos_enabled(plane_cfg), fal= se); + // No need to test the other zpos configurations as they are discarded if + // the zpos property is not created. } =20 /* Encoders */ @@ -619,6 +622,91 @@ static void vkms_config_test_valid_plane_color_range(s= truct kunit *test) vkms_config_destroy(config); } =20 +static void vkms_config_test_valid_plane_zpos(struct kunit *test) +{ + struct vkms_config *config; + struct vkms_config_plane *plane_cfg; + + config =3D vkms_config_default_create(false, false, false, false); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); + + plane_cfg =3D get_first_plane(config); + + /* Valid, zpos disabled */ + vkms_config_plane_set_zpos_enabled(plane_cfg, false); + vkms_config_plane_set_zpos_mutable(plane_cfg, false); + vkms_config_plane_set_zpos_initial(plane_cfg, 0); + vkms_config_plane_set_zpos_min(plane_cfg, 0); + vkms_config_plane_set_zpos_max(plane_cfg, 0); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Valid, zpos disabled, min/max are ignored */ + vkms_config_plane_set_zpos_enabled(plane_cfg, false); + vkms_config_plane_set_zpos_mutable(plane_cfg, false); + vkms_config_plane_set_zpos_initial(plane_cfg, 8); + vkms_config_plane_set_zpos_min(plane_cfg, 3); + vkms_config_plane_set_zpos_max(plane_cfg, 2); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Valid, zpos enabled but mutable disabled */ + vkms_config_plane_set_zpos_enabled(plane_cfg, true); + vkms_config_plane_set_zpos_mutable(plane_cfg, false); + vkms_config_plane_set_zpos_initial(plane_cfg, 1); + vkms_config_plane_set_zpos_min(plane_cfg, 0); + vkms_config_plane_set_zpos_max(plane_cfg, 0); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Valid, zpos enabled but mutable disabled */ + vkms_config_plane_set_zpos_enabled(plane_cfg, true); + vkms_config_plane_set_zpos_mutable(plane_cfg, false); + vkms_config_plane_set_zpos_initial(plane_cfg, 0); + vkms_config_plane_set_zpos_min(plane_cfg, 0); + vkms_config_plane_set_zpos_max(plane_cfg, 0); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Invalid, zpos enabled with min > max */ + vkms_config_plane_set_zpos_enabled(plane_cfg, true); + vkms_config_plane_set_zpos_mutable(plane_cfg, true); + vkms_config_plane_set_zpos_initial(plane_cfg, 0); + vkms_config_plane_set_zpos_min(plane_cfg, 1); + vkms_config_plane_set_zpos_max(plane_cfg, 0); + KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); + + /* Valid, zpos enabled with min <=3D max */ + vkms_config_plane_set_zpos_enabled(plane_cfg, true); + vkms_config_plane_set_zpos_mutable(plane_cfg, true); + vkms_config_plane_set_zpos_initial(plane_cfg, 0); + vkms_config_plane_set_zpos_min(plane_cfg, 0); + vkms_config_plane_set_zpos_max(plane_cfg, 1); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + /* Invalid, zpos enabled with initial < min */ + vkms_config_plane_set_zpos_enabled(plane_cfg, true); + vkms_config_plane_set_zpos_mutable(plane_cfg, true); + vkms_config_plane_set_zpos_initial(plane_cfg, 0); + vkms_config_plane_set_zpos_min(plane_cfg, 1); + vkms_config_plane_set_zpos_max(plane_cfg, 2); + KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); + + /* Invalid, zpos enabled with initial > max */ + vkms_config_plane_set_zpos_enabled(plane_cfg, true); + vkms_config_plane_set_zpos_mutable(plane_cfg, true); + vkms_config_plane_set_zpos_initial(plane_cfg, 3); + vkms_config_plane_set_zpos_min(plane_cfg, 1); + vkms_config_plane_set_zpos_max(plane_cfg, 2); + KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); + + /* Valid, zpos enabled with initial between min and max */ + vkms_config_plane_set_zpos_enabled(plane_cfg, true); + vkms_config_plane_set_zpos_mutable(plane_cfg, true); + vkms_config_plane_set_zpos_initial(plane_cfg, 1); + vkms_config_plane_set_zpos_min(plane_cfg, 0); + vkms_config_plane_set_zpos_max(plane_cfg, 2); + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + vkms_config_destroy(config); +} + static void vkms_config_test_valid_plane_possible_crtcs(struct kunit *test) { struct vkms_config *config; @@ -1144,6 +1232,7 @@ static struct kunit_case vkms_config_test_cases[] =3D= { KUNIT_CASE(vkms_config_test_valid_plane_rotations), KUNIT_CASE(vkms_config_test_valid_plane_color_encoding), KUNIT_CASE(vkms_config_test_valid_plane_color_range), + KUNIT_CASE(vkms_config_test_valid_plane_zpos), KUNIT_CASE(vkms_config_test_valid_plane_possible_crtcs), KUNIT_CASE(vkms_config_test_invalid_crtc_number), KUNIT_CASE(vkms_config_test_invalid_encoder_number), diff --git a/drivers/gpu/drm/vkms/vkms_config.c b/drivers/gpu/drm/vkms/vkms= _config.c index 1c97f952bf9e..415556952b6f 100644 --- a/drivers/gpu/drm/vkms/vkms_config.c +++ b/drivers/gpu/drm/vkms/vkms_config.c @@ -91,6 +91,7 @@ struct vkms_config *vkms_config_default_create(bool enabl= e_cursor, if (IS_ERR(plane_cfg)) goto err_alloc; vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_PRIMARY); + vkms_config_plane_set_zpos_enabled(plane_cfg, false); =20 crtc_cfg =3D vkms_config_create_crtc(config); if (IS_ERR(crtc_cfg)) @@ -110,6 +111,7 @@ struct vkms_config *vkms_config_default_create(bool ena= ble_cursor, vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_OVERLAY); vkms_config_plane_set_default_pipeline(plane_cfg, enable_plane_pipeline= ); + vkms_config_plane_set_zpos_enabled(plane_cfg, false); =20 if (vkms_config_plane_attach_crtc(plane_cfg, crtc_cfg)) goto err_alloc; @@ -123,6 +125,7 @@ struct vkms_config *vkms_config_default_create(bool ena= ble_cursor, =20 vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_CURSOR); vkms_config_plane_set_default_pipeline(plane_cfg, enable_plane_pipeline); + vkms_config_plane_set_zpos_enabled(plane_cfg, false); =20 if (vkms_config_plane_attach_crtc(plane_cfg, crtc_cfg)) goto err_alloc; @@ -253,6 +256,33 @@ bool vkms_config_valid_plane_color_range(const struct = vkms_config *config, } EXPORT_SYMBOL_IF_KUNIT(vkms_config_valid_plane_color_range); =20 +VISIBLE_IF_KUNIT +bool vkms_config_valid_plane_zpos(const struct vkms_config *config, + const struct vkms_config_plane *plane_cfg) +{ + struct drm_device *dev =3D config->dev ? &config->dev->drm : NULL; + + if (!vkms_config_plane_get_zpos_enabled(plane_cfg) || + !vkms_config_plane_get_zpos_mutable(plane_cfg)) + return true; + + if (vkms_config_plane_get_zpos_initial(plane_cfg) > + vkms_config_plane_get_zpos_max(plane_cfg)) { + drm_info(dev, "Configured initial zpos value bigger than zpos max\n"); + return false; + } + + if (vkms_config_plane_get_zpos_max(plane_cfg) < + vkms_config_plane_get_zpos_min(plane_cfg) || + vkms_config_plane_get_zpos_initial(plane_cfg) < + vkms_config_plane_get_zpos_min(plane_cfg)) { + drm_info(dev, "Configured zpos value outside (zpos min; zpos max)\n"); + return false; + } + + return true; +} + static bool valid_planes_for_crtc(const struct vkms_config *config, struct vkms_config_crtc *crtc_cfg) { @@ -429,6 +459,9 @@ bool vkms_config_is_valid(const struct vkms_config *con= fig) "Both supported color encodings and color ranges must be set, or none= \n"); return false; } + + if (!vkms_config_valid_plane_zpos(config, plane_cfg)) + return false; } =20 if (!valid_plane_number(config)) @@ -531,6 +564,16 @@ static int vkms_config_show(struct seq_file *m, void *= data) show_formats(m, vkms_config_plane_get_supported_formats(plane_cfg), vkms_config_plane_get_supported_formats_count(plane_cfg)); seq_puts(m, "\n"); + seq_printf(m, "\tzpos_enabled=3D%s\n", + str_true_false(vkms_config_plane_get_zpos_enabled(plane_cfg))); + seq_printf(m, "\tzpos_mutable=3D%s\n", + str_true_false(vkms_config_plane_get_zpos_mutable(plane_cfg))); + seq_printf(m, "\tzpos_min=3D%d\n", + vkms_config_plane_get_zpos_min(plane_cfg)); + seq_printf(m, "\tzpos_initial=3D%d\n", + vkms_config_plane_get_zpos_initial(plane_cfg)); + seq_printf(m, "\tzpos_max=3D%d\n", + vkms_config_plane_get_zpos_max(plane_cfg)); } =20 vkms_config_for_each_crtc(vkmsdev->config, crtc_cfg) { diff --git a/drivers/gpu/drm/vkms/vkms_config.h b/drivers/gpu/drm/vkms/vkms= _config.h index f268c3172217..9217097c0296 100644 --- a/drivers/gpu/drm/vkms/vkms_config.h +++ b/drivers/gpu/drm/vkms/vkms_config.h @@ -51,6 +51,11 @@ struct vkms_config { * @supported_color_ranges: Color ranges that this plane will support * @supported_formats: List of supported formats * @supported_formats_count: Length of @supported_formats + * @zpos_enabled: Enable or disable the zpos property + * @zpos_mutable: Make the zpos property mutable or not (ignored if @zpos_= enabled is false) + * @zpos_initial: Initial value for zpos property (ignored if @zpos_enable= d is false) + * @zpos_min: Minimal value for zpos property (ignored if @zpos_enabled is= false) + * @zpos_max: Maximal value for zpos property (ignored if @zpos_enabled is= false) */ struct vkms_config_plane { struct list_head link; @@ -68,6 +73,11 @@ struct vkms_config_plane { unsigned int supported_formats_count; struct xarray possible_crtcs; bool default_pipeline; + bool zpos_enabled; + bool zpos_mutable; + unsigned int zpos_initial; + unsigned int zpos_min; + unsigned int zpos_max; =20 /* Internal usage */ struct vkms_plane *plane; @@ -549,6 +559,139 @@ vkms_config_plane_get_name(const struct vkms_config_p= lane *plane_cfg) return plane_cfg->name; } =20 +/** + * vkms_config_plane_set_zpos_enabled() - Enable or disable zpos property = for a plane + * @plane_cfg: Plane configuration to modify + * @zpos_enabled: Whether to enable the zpos property + */ +static inline +void vkms_config_plane_set_zpos_enabled(struct vkms_config_plane *plane_cf= g, + bool zpos_enabled) +{ + plane_cfg->zpos_enabled =3D zpos_enabled; +} + +/** + * vkms_config_plane_set_zpos_mutable() - Set whether zpos property is mut= able + * @plane_cfg: Plane configuration to modify + * @zpos_mutable: Whether the zpos property should be mutable + */ +static inline +void vkms_config_plane_set_zpos_mutable(struct vkms_config_plane *plane_cf= g, + bool zpos_mutable) +{ + plane_cfg->zpos_mutable =3D zpos_mutable; +} + +/** + * vkms_config_plane_set_zpos_initial() - Set the initial zpos value + * @plane_cfg: Plane configuration to modify + * @zpos_initial: Initial zpos value + */ +static inline +void vkms_config_plane_set_zpos_initial(struct vkms_config_plane *plane_cf= g, + unsigned int zpos_initial) +{ + plane_cfg->zpos_initial =3D zpos_initial; +} + +/** + * vkms_config_plane_set_zpos_min() - Set the minimum zpos value + * @plane_cfg: Plane configuration to modify + * @zpos_min: Minimum zpos value + */ +static inline +void vkms_config_plane_set_zpos_min(struct vkms_config_plane *plane_cfg, + unsigned int zpos_min) +{ + plane_cfg->zpos_min =3D zpos_min; +} + +/** + * vkms_config_plane_set_zpos_max() - Set the maximum zpos value + * @plane_cfg: Plane configuration to modify + * @zpos_max: Maximum zpos value + */ +static inline +void vkms_config_plane_set_zpos_max(struct vkms_config_plane *plane_cfg, + unsigned int zpos_max) +{ + plane_cfg->zpos_max =3D zpos_max; +} + +/** + * vkms_config_plane_get_zpos_enabled() - Check if zpos property is enabled + * @plane_cfg: Plane configuration to check + * + * Returns: + * True if the zpos property is enabled for this plane, false otherwise. + */ +static inline +bool vkms_config_plane_get_zpos_enabled(const struct vkms_config_plane *pl= ane_cfg) +{ + return plane_cfg->zpos_enabled; +} + +/** + * vkms_config_plane_get_zpos_mutable() - Check if zpos property is mutable + * @plane_cfg: Plane configuration to check + * + * Returns: + * True if the zpos property is mutable for this plane, false otherwise. + */ +static inline +bool vkms_config_plane_get_zpos_mutable(const struct vkms_config_plane *pl= ane_cfg) +{ + return plane_cfg->zpos_mutable; +} + +/** + * vkms_config_plane_get_zpos_initial() - Get the initial zpos value + * @plane_cfg: Plane configuration to check + * + * Returns: + * The initial zpos value for this plane. The return value is undefined if + * zpos is disabled. + */ +static inline +unsigned int vkms_config_plane_get_zpos_initial(const struct vkms_config_p= lane *plane_cfg) +{ + return plane_cfg->zpos_initial; +} + +/** + * vkms_config_plane_get_zpos_min() - Get the minimum zpos value + * @plane_cfg: Plane configuration to check + * + * Returns: + * The minimum allowed zpos value for this plane. The return value is unde= fined + * if zpos is disabled. + */ +static inline +unsigned int vkms_config_plane_get_zpos_min(const struct vkms_config_plane= *plane_cfg) +{ + return plane_cfg->zpos_min; +} + +/** + * vkms_config_plane_get_zpos_max() - Get the maximum zpos value + * @plane_cfg: Plane configuration to check + * + * Returns: + * The maximum allowed zpos value for this plane. The return value is unde= fined + * if zpos is disabled. + */ +static inline +unsigned int vkms_config_plane_get_zpos_max(const struct vkms_config_plane= *plane_cfg) +{ + return plane_cfg->zpos_max; +} + +#if IS_ENABLED(CONFIG_KUNIT) +bool vkms_config_valid_plane_zpos(const struct vkms_config *config, + const struct vkms_config_plane *plane_cfg); +#endif + /** * vkms_config_plane_attach_crtc - Attach a plane to a CRTC * @plane_cfg: Plane to attach diff --git a/drivers/gpu/drm/vkms/vkms_plane.c b/drivers/gpu/drm/vkms/vkms_= plane.c index c2854b2117d1..809ca07e5f69 100644 --- a/drivers/gpu/drm/vkms/vkms_plane.c +++ b/drivers/gpu/drm/vkms/vkms_plane.c @@ -214,6 +214,16 @@ struct vkms_plane *vkms_plane_init(struct vkms_device = *vkmsdev, =20 if (vkms_config_plane_get_default_pipeline(plane_cfg)) vkms_initialize_colorops(&plane->base); + if (vkms_config_plane_get_zpos_enabled(plane_cfg)) { + if (vkms_config_plane_get_zpos_mutable(plane_cfg)) + drm_plane_create_zpos_property(&plane->base, + vkms_config_plane_get_zpos_initial(plane_cfg), + vkms_config_plane_get_zpos_min(plane_cfg), + vkms_config_plane_get_zpos_max(plane_cfg)); + else + drm_plane_create_zpos_immutable_property(&plane->base, + vkms_config_plane_get_zpos_initial(plane_cfg)); + } =20 return plane; } --=20 2.51.2