From nobody Wed Sep 23 04:40:54 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (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 19ABC3F5BD8 for ; Thu, 16 Jul 2026 09:03:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784192639; cv=none; b=paTSffNISD/8Bq1s/H/NSscoVJiNxScdnwonk8+aX/KY2e0OA++L1oc4/TMi/NbKRdo5/do59cG3x6LC1yfoPkU+KSPEuUEcx6u0pCOGHorokONWFQqamAhFW3k34dh/TTuIfY7fOZwG8bzjz7BQWOg+Z4uZ43sr9lQF7yTX69s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784192639; c=relaxed/simple; bh=7XOFYlYAlSV+ozAl18A522abXND+69x4cTAvNkGYHmc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=dkHTsvciX5sCMAcnOT6YKtNrcKDZ8lyduC/N1Gff+uQ1Igdd0AZvg8Du3K61osYR+qtmESaB/dlOJblr4XqTwKXNUzUFMJPFKXyQWYo3YRM57qSKyYFxo8oq4ZMYojuRrT9QSxb9cCMhLVM6n1OdhHhNUzq3yKAFGTzfb2zjiw4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=NTWCIvEi; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=U5Z3O1Hw; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="NTWCIvEi"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="U5Z3O1Hw" Received: from pps.filterd (m0279864.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 66G7DkFx1734155 for ; Thu, 16 Jul 2026 09:03:46 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= v2+SC8wnTcWyUocd5OZE0bKBPwgO9xMWYvTc4EEJHLo=; b=NTWCIvEikV6s+evA +JwWW2EBvb6KUmHZ8opJCCxEKSHFFkaBv635L+zgOFvV52cN2uFzSA7FA8Vn9yzj R8gzlEv3HglAidC/bQA7O7iDm0CP2xsSdhq+FK4815sH0XX/5PuvRqaL2yrqiKPb zk6dSpeFX2ENutYTxHrGtg5kj2FewvD7TZq5/1WNZ4/bU1SXbPCchz6U8S5Tewc8 CUaHVpxismyN3yf7ha8vbpaAi0JODc7hFLYAcmhamonOLzfAFWOHsZ+sbUCvxOiU 3hm1FkQxR2BRm6t4Ki9Kn3U3CQNaeh8mqILAdNfYpfaOAm1/YYoTp6PIdLGsIvPi PHd54Q== Received: from mail-pg1-f199.google.com (mail-pg1-f199.google.com [209.85.215.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4fed063hk8-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 16 Jul 2026 09:03:46 +0000 (GMT) Received: by mail-pg1-f199.google.com with SMTP id 41be03b00d2f7-c9fe4c5eb39so4629268a12.1 for ; Thu, 16 Jul 2026 02:03:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1784192626; x=1784797426; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=v2+SC8wnTcWyUocd5OZE0bKBPwgO9xMWYvTc4EEJHLo=; b=U5Z3O1Hw/VycnmJy19hXAJAdwNQde6O/LlhJpzfHaXcmoD/n5VMe45Vfps4cUVz5E7 IIqv384sAlqWWUozZV/3Rrmp659pgGyD6S5arGALMB5yM2oIJ0kS1oF8U5sA/buVPFhD m7FaqMYnRFzSDXAAW0ztzxVl/68X36MnyrNbzUGCiojA8QW4QvK1+dde5d95PBoP/XzU V8G69/F6vzX5UCb2XqWitC0BM4UmtVKm5XRnOcVtqsUYmITYc+Gy21n/YrwxE8NDtOft R5EA2dm+G02ZAH24oiagGGv8QT/1KOeoAFBby2BXBhuSzzzjPxPI7214dXpJIK+Oeloq EkYg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784192626; x=1784797426; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=v2+SC8wnTcWyUocd5OZE0bKBPwgO9xMWYvTc4EEJHLo=; b=hGXE055RRS3E+a2eBoOP9fxX1eJgDRbpgA5eRZikyeyIbxLCbFkBHctfzRSS5/v6Ly d6MjgPOzfpBxciVEstS7EPArywXS0NAlO7d2lAWQhKxowBu/jr8P6d1izftjvgtlM5Yz zmELdRg55//UWHIb+FJPDcXfUqxHDpa17YgX2GDaK5aOiMB7cgAG6tTw22DaR7eYt84t Esv2N3cQfqu8a6LQJrlAUzybH6obgOpG1GgFmAh6+P/HemXhOUO7MBf2jWyU43Judq6T DUg/8S9b2abgkRCzfG8YPjSaY2tuNXlwrwJ1mO6l4CqMO90DK+7jc+DbTVt3ujM9sXlP EW3A== X-Forwarded-Encrypted: i=1; AHgh+RpuHr9VMr64i60kAzhePGXoMhqtLMRNy3GMGdNSjqcJ6OhphlMiLcn80jTrSnAFWb8wOXlK+bkZVqJ5mT4=@vger.kernel.org X-Gm-Message-State: AOJu0Yz7YoDoEBEaW0+CIaTnS+MCgneyZC4d+GagZf1kqMDg2ntqV+a2 7tBkjV2a8Wiol/DgjZPytP8GsnnFUI6YPfxNuAymzL4upkCkpUwpSWU702Bgpuj+UhjdvP9XP7k cYIpALxEQFZh010AvHrOrOn9w2PxMh7Fhl6eIhWU0TxPWJiph+23GswPWRRN+lAvmEj0= X-Gm-Gg: AfdE7cm4YOOGBAkyLYVUL0pwILG9FAXeaZf7QCD4i8Zu4MovOkO6kRxPBDPZtF6HrFD syJVVNqIqMoxWQQ7zvmv5pIaKZouFeCRe3/vVkK5qDFDVolZfD32fkAobYVsjC91rooP+A/cut4 7TRH9SjQ8LVqCp1lq2Smiy7pKU7pEs9iML5H/Iq75JpVaYDPq8yY7efP95EuN023QDigk6YkBLO z8tWwTVt8DTs6+4gLN76YqzEOiNJgFv1BzxH0yup5YazKnUnulTq/xJzuK7SWAUpljejOkYuD5u Oo+QZHkI87O6zJu8rD0FIeCODXkAMqBkdlna5EEukcbJNOg/vfuwM+ti9cPIUhFuVbwnvubz/K5 zljx2+qMm0M6IP4iwmF7x X-Received: by 2002:a17:90b:5906:b0:381:26f:8f05 with SMTP id 98e67ed59e1d1-38e29ff97bdmr6389546a91.3.1784192625547; Thu, 16 Jul 2026 02:03:45 -0700 (PDT) X-Received: by 2002:a17:90b:5906:b0:381:26f:8f05 with SMTP id 98e67ed59e1d1-38e29ff97bdmr6389504a91.3.1784192624999; Thu, 16 Jul 2026 02:03:44 -0700 (PDT) Received: from le-cd01-lnx.qualcomm.com ([114.94.8.21]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2cf106b271asm16592555ad.64.2026.07.16.02.03.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 16 Jul 2026 02:03:44 -0700 (PDT) From: Ze Huang Date: Thu, 16 Jul 2026 17:02:00 +0800 Subject: [PATCH v2 8/8] drm/xen: replace struct drm_simple_display_pipe with regular atomic helpers 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: <20260716-drm-simple-kms-removal-v2-8-1133a8fc3785@oss.qualcomm.com> References: <20260716-drm-simple-kms-removal-v2-0-1133a8fc3785@oss.qualcomm.com> In-Reply-To: <20260716-drm-simple-kms-removal-v2-0-1133a8fc3785@oss.qualcomm.com> To: Alexey Brodkin , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Joel Stanley , Andrew Jeffery , Frank Li , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , Linus Walleij , Hans de Goede , Alex Lanzano , Oleksandr Andrushchenko Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-aspeed@lists.ozlabs.org, linux-arm-kernel@lists.infradead.org, imx@lists.linux.dev, xen-devel@lists.xenproject.org, Ze Huang X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1784192560; l=11771; i=ze.huang@oss.qualcomm.com; s=20260716; h=from:subject:message-id; bh=7XOFYlYAlSV+ozAl18A522abXND+69x4cTAvNkGYHmc=; b=GX2ZCGixdNsbm2dBAUjK6OkStWwzedAdHGWUe6gP5dpu2NfD1Po9grA6MgTJQZLa9fCVl6Nx9 7qvMt1rcjWIADy/IhoJ5BQYdNhix/jd8KvBJH9LhdvnhvaUeaGWR/3m X-Developer-Key: i=ze.huang@oss.qualcomm.com; a=ed25519; pk=8uGhlZHInA8NXq7G6u/g59qEcwXwuMRI7nBSnT/ijtY= X-Proofpoint-Spam-Info: AW1haW4tMjYwNzE2MDA5MSBTYWx0ZWRfXzDzrqd03+GAB oMnv1ISi2ADjWZzUvT0qjiuRlz6yEIGIk+m4Nkyba7cNrwb3HUWPIrwvNtEcdAs5Fta8sk/+Jwa OyylJT2kilCNGsG6Y+wiS0+bO0Km9FM= X-Proofpoint-GUID: YK5rMPA5E6Vnifi63CQGCS1f6GwMh5ih X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNzE2MDA5MSBTYWx0ZWRfX3zJXZnxNNEIX D2ZuhgqY9gzJGE+Obkk5UXsI/rDdTkFDfnI+ZjjClmUxJw8cCZ0HdIt9jbjKK88H0S/zfc935es ShtGyF0D9x4mVZLGE56jShQ7ow+8EUxz+EhyDu8tyVh3AwAnaTbRKg2IF+8v9svxUHutUA8EcS/ vGq2BOz9rStRb+klWM3zjZgH5257HQp0SkcmMxbyD/VrpYxauTwUXfcseaT2/1V3Mc+nShYYvZD q9dYb2iJeR+yMOT9QcmeozXWQ8WaAWp+LJT+wXuwK6KgtRwMFMk0qQ06qHoXaRSD783M8uA8kc9 NQp+hKj/RSvFqUehc3tjlz9DRRC00nFBUauDhtYNYVu6lD8xmIThGOz+Roy9nKDiS1sTV0iEZsL +GxcwDW0JidDjloTQIHveufvmOvGx/jPrmF8mK1azubOYv8gCmcbIaJT9KzpY/P8DxFUtvROzbd tFA1hOE6BiJTJ3WSpVQ== X-Authority-Analysis: v=2.4 cv=Xb25Co55 c=1 sm=1 tr=0 ts=6a589e72 cx=c_pps a=Oh5Dbbf/trHjhBongsHeRQ==:117 a=Uz3yg00KUFJ2y2WijEJ4bw==:17 a=IkcTkHD0fZMA:10 a=RAioF0-LDSMA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=DJpcGTmdVt4CTyJn9g5Z:22 a=EUspDBNiAAAA:8 a=yt2wVW2Sl_HzNKkdQ3QA:9 a=QEXdDO2ut3YA:10 a=_Vgx9l1VpLgwpw_dHYaR:22 X-Proofpoint-ORIG-GUID: YK5rMPA5E6Vnifi63CQGCS1f6GwMh5ih X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-07-16_03,2026-07-15_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 spamscore=0 priorityscore=1501 suspectscore=0 bulkscore=0 impostorscore=0 malwarescore=0 adultscore=0 lowpriorityscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2607160091 Replace Xen frontend simple display pipe with explicit plane, CRTC and encoder objects for each pipeline. Keep generic plane-state validation before Xen-specific checks, and install GEM framebuffer prepare helper explicitly. Signed-off-by: Ze Huang --- drivers/gpu/drm/xen/xen_drm_front.h | 6 +- drivers/gpu/drm/xen/xen_drm_front_kms.c | 175 ++++++++++++++++++++++++----= ---- 2 files changed, 134 insertions(+), 47 deletions(-) diff --git a/drivers/gpu/drm/xen/xen_drm_front.h b/drivers/gpu/drm/xen/xen_= drm_front.h index a987c78abe41..02138b5abef5 100644 --- a/drivers/gpu/drm/xen/xen_drm_front.h +++ b/drivers/gpu/drm/xen/xen_drm_front.h @@ -14,7 +14,7 @@ #include =20 #include -#include +#include =20 #include "xen_drm_front_cfg.h" =20 @@ -100,7 +100,9 @@ struct xen_drm_front_drm_pipeline { =20 int index; =20 - struct drm_simple_display_pipe pipe; + struct drm_plane plane; + struct drm_crtc crtc; + struct drm_encoder encoder; =20 struct drm_connector conn; /* These are only for connector mode checking */ diff --git a/drivers/gpu/drm/xen/xen_drm_front_kms.c b/drivers/gpu/drm/xen/= xen_drm_front_kms.c index 48772b5fe71c..f869da3f3058 100644 --- a/drivers/gpu/drm/xen/xen_drm_front_kms.c +++ b/drivers/gpu/drm/xen/xen_drm_front_kms.c @@ -31,9 +31,15 @@ #define FRAME_DONE_TO_MS (XEN_DRM_FRONT_WAIT_BACK_MS + 100) =20 static struct xen_drm_front_drm_pipeline * -to_xen_drm_pipeline(struct drm_simple_display_pipe *pipe) +xen_drm_pipeline_from_crtc(struct drm_crtc *crtc) { - return container_of(pipe, struct xen_drm_front_drm_pipeline, pipe); + return container_of(crtc, struct xen_drm_front_drm_pipeline, crtc); +} + +static struct xen_drm_front_drm_pipeline * +xen_drm_pipeline_from_plane(struct drm_plane *plane) +{ + return container_of(plane, struct xen_drm_front_drm_pipeline, plane); } =20 static void fb_destroy(struct drm_framebuffer *fb) @@ -94,7 +100,7 @@ static const struct drm_mode_config_funcs mode_config_fu= ncs =3D { =20 static void send_pending_event(struct xen_drm_front_drm_pipeline *pipeline) { - struct drm_crtc *crtc =3D &pipeline->pipe.crtc; + struct drm_crtc *crtc =3D &pipeline->crtc; struct drm_device *dev =3D crtc->dev; unsigned long flags; =20 @@ -105,24 +111,21 @@ static void send_pending_event(struct xen_drm_front_d= rm_pipeline *pipeline) spin_unlock_irqrestore(&dev->event_lock, flags); } =20 -static void display_enable(struct drm_simple_display_pipe *pipe, - struct drm_crtc_state *crtc_state, - struct drm_plane_state *plane_state) +static void xen_drm_crtc_helper_atomic_enable(struct drm_crtc *crtc, + struct drm_atomic_commit *commit) { - struct xen_drm_front_drm_pipeline *pipeline =3D - to_xen_drm_pipeline(pipe); - struct drm_crtc *crtc =3D &pipe->crtc; + struct xen_drm_front_drm_pipeline *pipeline =3D xen_drm_pipeline_from_crt= c(crtc); + struct drm_plane_state *plane_state =3D pipeline->plane.state; struct drm_framebuffer *fb =3D plane_state->fb; int ret, idx; =20 - if (!drm_dev_enter(pipe->crtc.dev, &idx)) + if (!drm_dev_enter(crtc->dev, &idx)) return; =20 ret =3D xen_drm_front_mode_set(pipeline, crtc->x, crtc->y, fb->width, fb->height, fb->format->cpp[0] * 8, xen_drm_front_fb_to_cookie(fb)); - if (ret) { DRM_ERROR("Failed to enable display: %d\n", ret); pipeline->conn_connected =3D false; @@ -131,13 +134,13 @@ static void display_enable(struct drm_simple_display_= pipe *pipe, drm_dev_exit(idx); } =20 -static void display_disable(struct drm_simple_display_pipe *pipe) +static void xen_drm_crtc_helper_atomic_disable(struct drm_crtc *crtc, + struct drm_atomic_commit *commit) { - struct xen_drm_front_drm_pipeline *pipeline =3D - to_xen_drm_pipeline(pipe); + struct xen_drm_front_drm_pipeline *pipeline =3D xen_drm_pipeline_from_crt= c(crtc); int ret =3D 0, idx; =20 - if (drm_dev_enter(pipe->crtc.dev, &idx)) { + if (drm_dev_enter(crtc->dev, &idx)) { ret =3D xen_drm_front_mode_set(pipeline, 0, 0, 0, 0, 0, xen_drm_front_fb_to_cookie(NULL)); drm_dev_exit(idx); @@ -177,12 +180,13 @@ static void pflip_to_worker(struct work_struct *work) send_pending_event(pipeline); } =20 -static bool display_send_page_flip(struct drm_simple_display_pipe *pipe, +static bool display_send_page_flip(struct xen_drm_front_drm_pipeline *pipe= line, + struct drm_atomic_commit *commit, struct drm_plane_state *old_plane_state) { struct drm_plane_state *plane_state =3D - drm_atomic_get_new_plane_state(old_plane_state->state, - &pipe->plane); + drm_atomic_get_new_plane_state(commit, + &pipeline->plane); =20 /* * If old_plane_state->fb is NULL and plane_state->fb is not, @@ -193,8 +197,6 @@ static bool display_send_page_flip(struct drm_simple_di= splay_pipe *pipe, * sent to the backend as a part of display_set_config call. */ if (old_plane_state->fb && plane_state->fb) { - struct xen_drm_front_drm_pipeline *pipeline =3D - to_xen_drm_pipeline(pipe); struct xen_drm_front_drm_info *drm_info =3D pipeline->drm_info; int ret; =20 @@ -224,10 +226,27 @@ static bool display_send_page_flip(struct drm_simple_= display_pipe *pipe, return false; } =20 -static int display_check(struct drm_simple_display_pipe *pipe, - struct drm_plane_state *plane_state, - struct drm_crtc_state *crtc_state) +static int xen_drm_plane_helper_atomic_check(struct drm_plane *plane, + struct drm_atomic_commit *commit) { + struct drm_plane_state *plane_state =3D drm_atomic_get_new_plane_state(co= mmit, plane); + struct drm_crtc *crtc =3D plane_state->crtc; + struct drm_crtc_state *crtc_state =3D NULL; + int ret; + + if (crtc) + crtc_state =3D drm_atomic_get_new_crtc_state(commit, crtc); + + ret =3D drm_atomic_helper_check_plane_state(plane_state, crtc_state, + DRM_PLANE_NO_SCALING, + DRM_PLANE_NO_SCALING, + false, false); + if (ret) + return ret; + + if (!plane_state->visible || !crtc_state) + return 0; + /* * Xen doesn't initialize vblanking via drm_vblank_init(), so * DRM helpers assume that it doesn't handle vblanking and start @@ -242,12 +261,12 @@ static int display_check(struct drm_simple_display_pi= pe *pipe, return 0; } =20 -static void display_update(struct drm_simple_display_pipe *pipe, - struct drm_plane_state *old_plane_state) +static void xen_drm_plane_helper_atomic_update(struct drm_plane *plane, + struct drm_atomic_commit *commit) { - struct xen_drm_front_drm_pipeline *pipeline =3D - to_xen_drm_pipeline(pipe); - struct drm_crtc *crtc =3D &pipe->crtc; + struct drm_plane_state *old_plane_state =3D drm_atomic_get_old_plane_stat= e(commit, plane); + struct xen_drm_front_drm_pipeline *pipeline =3D xen_drm_pipeline_from_pla= ne(plane); + struct drm_crtc *crtc =3D &pipeline->crtc; struct drm_pending_vblank_event *event; int idx; =20 @@ -265,7 +284,7 @@ static void display_update(struct drm_simple_display_pi= pe *pipe, spin_unlock_irqrestore(&dev->event_lock, flags); } =20 - if (!drm_dev_enter(pipe->crtc.dev, &idx)) { + if (!drm_dev_enter(crtc->dev, &idx)) { send_pending_event(pipeline); return; } @@ -278,19 +297,17 @@ static void display_update(struct drm_simple_display_= pipe *pipe, * If this is not a page flip, e.g. no flip done event from the backend * is expected, then send now. */ - if (!display_send_page_flip(pipe, old_plane_state)) + if (!display_send_page_flip(pipeline, commit, old_plane_state)) send_pending_event(pipeline); =20 drm_dev_exit(idx); } =20 static enum drm_mode_status -display_mode_valid(struct drm_simple_display_pipe *pipe, - const struct drm_display_mode *mode) +xen_drm_crtc_helper_mode_valid(struct drm_crtc *crtc, + const struct drm_display_mode *mode) { - struct xen_drm_front_drm_pipeline *pipeline =3D - container_of(pipe, struct xen_drm_front_drm_pipeline, - pipe); + struct xen_drm_front_drm_pipeline *pipeline =3D xen_drm_pipeline_from_crt= c(crtc); =20 if (mode->hdisplay !=3D pipeline->width) return MODE_ERROR; @@ -301,12 +318,53 @@ display_mode_valid(struct drm_simple_display_pipe *pi= pe, return MODE_OK; } =20 -static const struct drm_simple_display_pipe_funcs display_funcs =3D { - .mode_valid =3D display_mode_valid, - .enable =3D display_enable, - .disable =3D display_disable, - .check =3D display_check, - .update =3D display_update, +static int xen_drm_crtc_helper_atomic_check(struct drm_crtc *crtc, struct = drm_atomic_commit *commit) +{ + struct drm_crtc_state *crtc_state =3D drm_atomic_get_new_crtc_state(commi= t, crtc); + int ret; + + if (crtc_state->enable) { + ret =3D drm_atomic_helper_check_crtc_primary_plane(crtc_state); + if (ret) + return ret; + } + + return drm_atomic_add_affected_planes(commit, crtc); +} + +static const struct drm_plane_helper_funcs display_plane_helper_funcs =3D { + .prepare_fb =3D drm_gem_plane_helper_prepare_fb, + .atomic_check =3D xen_drm_plane_helper_atomic_check, + .atomic_update =3D xen_drm_plane_helper_atomic_update, +}; + +static const struct drm_plane_funcs display_plane_funcs =3D { + .update_plane =3D drm_atomic_helper_update_plane, + .disable_plane =3D drm_atomic_helper_disable_plane, + .destroy =3D drm_plane_cleanup, + .reset =3D drm_atomic_helper_plane_reset, + .atomic_duplicate_state =3D drm_atomic_helper_plane_duplicate_state, + .atomic_destroy_state =3D drm_atomic_helper_plane_destroy_state, +}; + +static const struct drm_crtc_helper_funcs display_crtc_helper_funcs =3D { + .mode_valid =3D xen_drm_crtc_helper_mode_valid, + .atomic_check =3D xen_drm_crtc_helper_atomic_check, + .atomic_enable =3D xen_drm_crtc_helper_atomic_enable, + .atomic_disable =3D xen_drm_crtc_helper_atomic_disable, +}; + +static const struct drm_crtc_funcs display_crtc_funcs =3D { + .reset =3D drm_atomic_helper_crtc_reset, + .destroy =3D drm_crtc_cleanup, + .set_config =3D drm_atomic_helper_set_config, + .page_flip =3D drm_atomic_helper_page_flip, + .atomic_duplicate_state =3D drm_atomic_helper_crtc_duplicate_state, + .atomic_destroy_state =3D drm_atomic_helper_crtc_destroy_state, +}; + +static const struct drm_encoder_funcs display_encoder_funcs =3D { + .destroy =3D drm_encoder_cleanup, }; =20 static int display_pipe_init(struct xen_drm_front_drm_info *drm_info, @@ -331,10 +389,37 @@ static int display_pipe_init(struct xen_drm_front_drm= _info *drm_info, =20 formats =3D xen_drm_front_conn_get_formats(&format_count); =20 - return drm_simple_display_pipe_init(dev, &pipeline->pipe, - &display_funcs, formats, - format_count, NULL, - &pipeline->conn); + ret =3D drm_universal_plane_init(dev, &pipeline->plane, 0, + &display_plane_funcs, + formats, format_count, + NULL, + DRM_PLANE_TYPE_PRIMARY, NULL); + if (ret) + return ret; + + drm_plane_helper_add(&pipeline->plane, &display_plane_helper_funcs); + + ret =3D drm_crtc_init_with_planes(dev, &pipeline->crtc, + &pipeline->plane, NULL, + &display_crtc_funcs, NULL); + if (ret) + return ret; + + drm_crtc_helper_add(&pipeline->crtc, &display_crtc_helper_funcs); + + ret =3D drm_encoder_init(dev, &pipeline->encoder, + &display_encoder_funcs, + DRM_MODE_ENCODER_NONE, NULL); + if (ret) + return ret; + + pipeline->encoder.possible_crtcs =3D drm_crtc_mask(&pipeline->crtc); + + ret =3D drm_connector_attach_encoder(&pipeline->conn, &pipeline->encoder); + if (ret) + return ret; + + return 0; } =20 int xen_drm_front_kms_init(struct xen_drm_front_drm_info *drm_info) --=20 2.43.0