From nobody Sun Sep 20 23:48:10 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass(p=reject dis=none) header.from=oss.qualcomm.com ARC-Seal: i=1; a=rsa-sha256; t=1784192642; cv=none; d=zohomail.com; s=zohoarc; b=MJYG8AwwxFf7FHj92pEs3jkntqP3U2vzrrk6+HkIpPFcSY+gY9wRacGxspeT35KvvrR6mI52FXue5A0zri7f0VBBc8/xSzH4ovJ7TGwdYrIixpVKTCOTjvkzXasja2clTqfyDIXzshZ5jIypFUz0HYn+Ddm1uzhWccnv9X1hAPE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1784192642; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=55r0GLq+rjOijTgoMN/kmPKdqc3ccdl0qgtljn8u9eE=; b=AUK3fTKF2H4SCDwUOUAYPoLX/Ixu54BK//9JRB5zZ3yokXGjhJhzwT22+n6uUkc8ksymGD0zI0Qk9GlPeCKrlzHyD5mV8MyMm8AVej/7iJ50g0qFY2jOlPGkcsyLB3JYPCihJiFzt3w/0i4f7onIYMAdHUhV5aQlTjxLF1CwgUY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1784192642077604.8084295234162; Thu, 16 Jul 2026 02:04:02 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.1363575.1615174 (Exim 4.92) (envelope-from ) id 1wkI04-0002kq-6C; Thu, 16 Jul 2026 09:03:24 +0000 Received: by outflank-mailman (output) from mailman id 1363575.1615174; Thu, 16 Jul 2026 09:03:24 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1wkI03-0002kR-JG; Thu, 16 Jul 2026 09:03:23 +0000 Received: by outflank-mailman (input) for mailman id 1363575; Thu, 16 Jul 2026 09:03:21 +0000 Received: from mx.expurgate.net ([195.190.135.10]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1wkI01-0002bP-7h for xen-devel@lists.xenproject.org; Thu, 16 Jul 2026 09:03:21 +0000 Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp id 1wkI00-005ozh-D5 for xen-devel@lists.xenproject.org; Thu, 16 Jul 2026 11:03:20 +0200 Received: from [10.42.69.2] (helo=localhost) by localhost with ESMTP (eXpurgate MTA 0.9.1) (envelope-from ) id 6a589e52-bab6-0a2a0a5309dd-0a2a4502d8b4-16 for ; Thu, 16 Jul 2026 11:03:20 +0200 Received: from [205.220.180.131] (helo=mx0b-0031df01.pphosted.com) by tlsNG-720697.mxtls.expurgate.net with ESMTPS (eXpurgate 4.57.1) (envelope-from ) id 6a589e56-6ca4-0a2a45020019-cddcb4836d0a-3 for ; Thu, 16 Jul 2026 11:03:20 +0200 Received: from pps.filterd (m0279868.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 66G8379d2123300 for ; Thu, 16 Jul 2026 09:03:18 GMT Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4feuex0754-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 16 Jul 2026 09:03:18 +0000 (GMT) Received: by mail-pl1-f199.google.com with SMTP id d9443c01a7336-2cca5e0a0c9so124162965ad.1 for ; Thu, 16 Jul 2026 02:03:18 -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.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 16 Jul 2026 02:03:16 -0700 (PDT) X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" Authentication-Results: eu.smtp.expurgate.cloud; dkim=pass header.s=qcppdkim1 header.d=qualcomm.com header.i="@qualcomm.com" header.h="Cc:Content-Transfer-Encoding:Content-Type:Date:From:In-Reply-To:Message-Id:MIME-Version:References:Subject:To"; dkim=pass header.s=google header.d=oss.qualcomm.com header.i="@oss.qualcomm.com" header.h="Cc:To:In-Reply-To:References:Message-Id:Content-Transfer-Encoding:Content-Type:MIME-Version:Subject:Date:From" 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= 55r0GLq+rjOijTgoMN/kmPKdqc3ccdl0qgtljn8u9eE=; b=C26XvzUVz7hPvlkJ dtfVmqDwJbLOkKEWKDJgmb/kIMMISQ55NbZtNXcRWFha+0a6ppGwCUxMU3OW4yOd 1QXk8NmuQyBs3NkPtLaj70wiPIN06/WzwgCZibnpgfQQauK0UubvNQoG2vwLxS6x ZyYywU5gaCL2XvTbQHd/+PvP8nEBEfkAq86FN2YcfDKcAiOuP143fz/ZkgY+nAvn sQr1JJ+pUYlXnbIeC8umi3zWhyXNr/FiV14a/0v/xWl3eFByNLlEtKj5xmdOKtkS 4ynTzP2QAkaUaEZBJNyPLqUJBv/Bk4MbjBinG3nl1N+IT/fsoTRUY5KY/zigyfxv N67RLA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1784192597; x=1784797397; darn=lists.xenproject.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=55r0GLq+rjOijTgoMN/kmPKdqc3ccdl0qgtljn8u9eE=; b=TKupEEaK5nJwWsWnMGmk64/ElIsB2FSFKldS4Kcjvbsz7CVPzhria3ryZs/4YLQpcr VO2eumxITj1EUbzveORQsTjevAv3eDEdZUrhXj6nMRsH3TKCyqi78iXKEz27uo9GtCoj YlnakQlCj4d3s4luMXj9sQqItt8TvP36UG0CHsdNNctTSjaAamvUY7zr1Zg+VfQId2cZ +Cn2hHnlqBEjQz1ggb1kUbUlJF/IKFSwinFdqf+RwH4kE4GZgOprBfbiYzhdndkxr2dX iNrMzGwEp64LA0jxD7bgQc88CZ6fCV6DMzcWHx3UdGxHz8gNkjIrkLYYcSTwYdMvYXd9 DoDg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784192597; x=1784797397; 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=55r0GLq+rjOijTgoMN/kmPKdqc3ccdl0qgtljn8u9eE=; b=jce1ZbgvMxfx5IeX/ZrBzn2MuOLeKM+omYP0awzdU0sxkaBKwDeCmjFocJZVpat0Da UQliwhvQtZv6QkF10iujoKrV+KsK64ZNXtJvwrpc74IpHO+nughHtkOpFtYWt2U6aPiF PhkLIHmKGf4S/SqTMXxet6cxkoaRVnI8eI138i+8of0gKo2NbbvMVUcsPHpQ33Mt/g3A D/z5lK+x5JdUEm8UO3sqZ/m0QbAQ/uTqmMApPoc26GdR7Y8pF3CsYaQGOAVkd2ieQX6G XTdsexzhiuQj4ogwcxU6piNZ4cinYKuQXXx1xa50IGOwX4BYW/ieUdEHpYnRUl7Huwu2 LRyQ== X-Forwarded-Encrypted: i=1; AHgh+RrAem3Tpdq6E71/PV1L/n4SzyIv1A4+7RFG+AkJScbkls643ELoW105gKC59XZDrtbEdLVwUkIfe9Q=@lists.xenproject.org X-Gm-Message-State: AOJu0YwrNH3NWckpOognOhtG7bvWoSXb9lZe6nAU87FPfvZBEWxFWjqe th1YmsdxhpQC71pwGvFxVvd4ZvkacfOhNVNHjaLFKasIOFcTA+qwYTAcjNsiUgdTzHbcsOk4Bzh jLOwnMmB02QCVzQXguwom5510zv+vs49j/tq4ARf8S1YqFI5JdZ1O5uYa3PsfZYJzejHhmtTD5j p3uOTM X-Gm-Gg: AfdE7cnauk5ZXpFgdyO2gZ0pJZExif3Wks+LFCr7rei1oRxuwatWCjiSMUSK2Of2iRN vnyYns18YES5eZnpRbr/Z7nXBmekkhG8XrcS84rlp4wcrkDQT/1FE7ottMymWpTm9t1IFOqqHoB jtO+xFy98VcLgHK2g+xAGHkrWEyXA83UawoFIcP0qJ5cmCRp7gHZOGsCDPg0ssHjT/05Syd6L44 41GXcMbdK7j/08Fc08RjiEqZKbeHHUzYKGM9ITRCuRb8dGzYAK8btXkw17DusTcQXl5BLoxB1kV +aYm/tf7Jv3Rs1IbKrz54Yq2SKxqnIZFJGjYpHB9BtEyzrN7RHKZ5VKWqK9waIRP+fB67cfMm4G I46Ci6awwea1hTnrmCUmO X-Received: by 2002:a17:903:19ec:b0:2c2:be43:39bc with SMTP id d9443c01a7336-2cf03cef84dmr63597495ad.22.1784192597253; Thu, 16 Jul 2026 02:03:17 -0700 (PDT) X-Received: by 2002:a17:903:19ec:b0:2c2:be43:39bc with SMTP id d9443c01a7336-2cf03cef84dmr63596785ad.22.1784192596609; Thu, 16 Jul 2026 02:03:16 -0700 (PDT) From: Ze Huang Date: Thu, 16 Jul 2026 17:01:56 +0800 Subject: [PATCH v2 4/8] drm/pl111: replace struct drm_simple_display_pipe with regular atomic helpers MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260716-drm-simple-kms-removal-v2-4-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=12120; i=ze.huang@oss.qualcomm.com; s=20260716; h=from:subject:message-id; bh=POjWDqTR7KA6vV+N+6pzc8ko2zyOgyhZdHPtBjStvhg=; b=Tofb07iFvogf+FT89l3hQY+BQDy+VIGw+zIPY/135cZWAhoei9Fh06Fxb6+Sn+8KL7yidlrT4 urA+kbKxQ36AHKQvNj9ESxfXbRWFcD2Tz0ltw26pBD5TXObL2so68S8 X-Developer-Key: i=ze.huang@oss.qualcomm.com; a=ed25519; pk=8uGhlZHInA8NXq7G6u/g59qEcwXwuMRI7nBSnT/ijtY= X-Authority-Analysis: v=2.4 cv=JeeMa0KV c=1 sm=1 tr=0 ts=6a589e56 cx=c_pps a=JL+w9abYAAE89/QcEU+0QA==:117 a=Uz3yg00KUFJ2y2WijEJ4bw==:17 a=IkcTkHD0fZMA:10 a=RAioF0-LDSMA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=ZpdpYltYx_vBUK5n70dp:22 a=EUspDBNiAAAA:8 a=UMw5XeoU1RqEgw99msIA:9 a=QEXdDO2ut3YA:10 a=324X-CrmTo6CU4MGRt3R:22 X-Proofpoint-ORIG-GUID: Shii65TYO64sxWtNoKpXLv4hfG3_qnxG X-Proofpoint-GUID: Shii65TYO64sxWtNoKpXLv4hfG3_qnxG X-Proofpoint-Spam-Info: AW1haW4tMjYwNzE2MDA5MSBTYWx0ZWRfX8fhkYhjzMNL6 Ps//Ea/qsFdQFxcvFwAsDGYarMw5diH65pBfe2D50HxJBEIm4toKrwJ0UDOtzBFkO5t/HzkVUdc 7mLNPxXlILa0V4/PCyoGIPit4Cql/sA= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNzE2MDA5MSBTYWx0ZWRfX8j69nRj6oW9J Uj4AP5dm8pEKivVQilthWymF28kaFzu8ZdP8O7D8A+np+/JZQeZp70jl/K6vwRyv5A+otmbPSvG Ylj1cr/95gp9ogaVIrXqmF/9EnhztA6aoqQz/GBhzJtY+AKIBbs6UaGMSLbJWKnG52Odp02+swf TizA1osuWpybF3AOfeaoYInHIDaxc50Lyy3T00uAAXDcaR8BCGDurAL6uciZsZljGHRsv7xAANx +JSV/1WTefTyWzVaMJbey+OPVhC+iVvUDIzU8dZycGNsCLa1xoGCiAPjPm/EnG+5L+gAVeBYxDn dYkwJluS5AcMuhyn8DgPwnmscmNCtimBMucSWbeb/xDc5042Aa4teBnjMUJ7vuYV4HVap4S+0lh BSQ+Km5J2teazxVF2IDkdgJ6GP25xvAEb+WZ7fuhyo5mP6l+FiXYPsmBIWLNPRLcQrOnwlqWz1l inAvMt5q8eFEV5Amvzw== 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 spamscore=0 adultscore=0 clxscore=1015 suspectscore=0 lowpriorityscore=0 priorityscore=1501 impostorscore=0 phishscore=0 malwarescore=0 bulkscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2607160091 X-purgate-ID: tlsNG-720697/1784192600-678BC2AC-409A5664/0/0 X-purgate-type: clean X-purgate-size: 12122 X-ZohoMail-DKIM: pass (identity @qualcomm.com) X-ZM-MESSAGEID: 1784192643687158500 Replace PL111 simple display pipe with explicit plane, CRTC and encoder objects. Keep the existing PL111 timing, format and pitch validation, but move it into the explicit atomic check paths. Move event handling to the CRTC commit path. Signed-off-by: Ze Huang --- drivers/gpu/drm/pl111/pl111_display.c | 202 ++++++++++++++++++++++++------= ---- drivers/gpu/drm/pl111/pl111_drm.h | 5 +- drivers/gpu/drm/pl111/pl111_drv.c | 3 +- 3 files changed, 150 insertions(+), 60 deletions(-) diff --git a/drivers/gpu/drm/pl111/pl111_display.c b/drivers/gpu/drm/pl111/= pl111_display.c index 5d10bc5fdf1f..beb6423d4d43 100644 --- a/drivers/gpu/drm/pl111/pl111_display.c +++ b/drivers/gpu/drm/pl111/pl111_display.c @@ -15,6 +15,7 @@ #include #include =20 +#include #include #include #include @@ -37,7 +38,7 @@ irqreturn_t pl111_irq(int irq, void *data) return IRQ_NONE; =20 if (irq_stat & CLCD_IRQ_NEXTBASE_UPDATE) { - drm_crtc_handle_vblank(&priv->pipe.crtc); + drm_crtc_handle_vblank(&priv->crtc); =20 status =3D IRQ_HANDLED; } @@ -49,10 +50,10 @@ irqreturn_t pl111_irq(int irq, void *data) } =20 static enum drm_mode_status -pl111_mode_valid(struct drm_simple_display_pipe *pipe, - const struct drm_display_mode *mode) +pl111_crtc_helper_mode_valid(struct drm_crtc *crtc, + const struct drm_display_mode *mode) { - struct drm_device *drm =3D pipe->crtc.dev; + struct drm_device *drm =3D crtc->dev; struct pl111_drm_dev_private *priv =3D drm->dev_private; u32 cpp =3D DIV_ROUND_UP(priv->variant->fb_depth, 8); u64 bw; @@ -83,13 +84,32 @@ pl111_mode_valid(struct drm_simple_display_pipe *pipe, return MODE_OK; } =20 -static int pl111_display_check(struct drm_simple_display_pipe *pipe, - struct drm_plane_state *pstate, - struct drm_crtc_state *cstate) +static int pl111_plane_helper_atomic_check(struct drm_plane *plane, + struct drm_atomic_commit *commit) { - const struct drm_display_mode *mode =3D &cstate->mode; - struct drm_framebuffer *old_fb =3D pipe->plane.state->fb; + struct drm_plane_state *pstate =3D drm_atomic_get_new_plane_state(commit,= plane); + struct drm_plane_state *old_pstate =3D drm_atomic_get_old_plane_state(com= mit, plane); + struct drm_crtc *crtc =3D pstate->crtc; + struct drm_crtc_state *cstate =3D NULL; + const struct drm_display_mode *mode; + struct drm_framebuffer *old_fb =3D old_pstate->fb; struct drm_framebuffer *fb =3D pstate->fb; + int ret; + + if (crtc) + cstate =3D drm_atomic_get_new_crtc_state(commit, crtc); + + ret =3D drm_atomic_helper_check_plane_state(pstate, cstate, + DRM_PLANE_NO_SCALING, + DRM_PLANE_NO_SCALING, + false, false); + if (ret) + return ret; + + if (!pstate->visible) + return 0; + + mode =3D &cstate->mode; =20 if (mode->hdisplay % 16) return -EINVAL; @@ -117,16 +137,14 @@ static int pl111_display_check(struct drm_simple_disp= lay_pipe *pipe, return 0; } =20 -static void pl111_display_enable(struct drm_simple_display_pipe *pipe, - struct drm_crtc_state *cstate, - struct drm_plane_state *plane_state) +static void pl111_crtc_helper_atomic_enable(struct drm_crtc *crtc, + struct drm_atomic_commit *commit) { - struct drm_crtc *crtc =3D &pipe->crtc; - struct drm_plane *plane =3D &pipe->plane; struct drm_device *drm =3D crtc->dev; struct pl111_drm_dev_private *priv =3D drm->dev_private; + struct drm_crtc_state *cstate =3D drm_atomic_get_new_crtc_state(commit, c= rtc); const struct drm_display_mode *mode =3D &cstate->mode; - struct drm_framebuffer *fb =3D plane->state->fb; + struct drm_framebuffer *fb =3D priv->plane.state->fb; struct drm_connector *connector =3D priv->connector; struct drm_bridge *bridge =3D priv->bridge; bool grayscale =3D false; @@ -355,9 +373,9 @@ static void pl111_display_enable(struct drm_simple_disp= lay_pipe *pipe, drm_crtc_vblank_on(crtc); } =20 -static void pl111_display_disable(struct drm_simple_display_pipe *pipe) +static void pl111_crtc_helper_atomic_disable(struct drm_crtc *crtc, + struct drm_atomic_commit *commit) { - struct drm_crtc *crtc =3D &pipe->crtc; struct drm_device *drm =3D crtc->dev; struct pl111_drm_dev_private *priv =3D drm->dev_private; u32 cntl; @@ -387,38 +405,47 @@ static void pl111_display_disable(struct drm_simple_d= isplay_pipe *pipe) clk_disable_unprepare(priv->clk); } =20 -static void pl111_display_update(struct drm_simple_display_pipe *pipe, - struct drm_plane_state *old_pstate) +static void pl111_plane_helper_atomic_update(struct drm_plane *plane, + struct drm_atomic_commit *commit) { - struct drm_crtc *crtc =3D &pipe->crtc; - struct drm_device *drm =3D crtc->dev; - struct pl111_drm_dev_private *priv =3D drm->dev_private; - struct drm_pending_vblank_event *event =3D crtc->state->event; - struct drm_plane *plane =3D &pipe->plane; - struct drm_plane_state *pstate =3D plane->state; + struct drm_plane_state *pstate =3D drm_atomic_get_new_plane_state(commit,= plane); + struct drm_crtc *crtc =3D pstate->crtc; + struct drm_device *drm; + struct pl111_drm_dev_private *priv; struct drm_framebuffer *fb =3D pstate->fb; =20 - if (fb) { - u32 addr =3D drm_fb_dma_get_gem_addr(fb, pstate, 0); + if (!fb) + return; =20 - writel(addr, priv->regs + CLCD_UBAS); - } + drm =3D crtc->dev; + priv =3D drm->dev_private; =20 - if (event) { - crtc->state->event =3D NULL; + u32 addr =3D drm_fb_dma_get_gem_addr(fb, pstate, 0); =20 - spin_lock_irq(&crtc->dev->event_lock); - if (crtc->state->active && drm_crtc_vblank_get(crtc) =3D=3D 0) - drm_crtc_arm_vblank_event(crtc, event); - else - drm_crtc_send_vblank_event(crtc, event); - spin_unlock_irq(&crtc->dev->event_lock); - } + writel(addr, priv->regs + CLCD_UBAS); +} + +static void pl111_crtc_helper_atomic_flush(struct drm_crtc *crtc, + struct drm_atomic_commit *commit) +{ + struct drm_crtc_state *cstate =3D drm_atomic_get_new_crtc_state(commit, c= rtc); + struct drm_pending_vblank_event *event =3D cstate->event; + + if (!event) + return; + + cstate->event =3D NULL; + + spin_lock_irq(&crtc->dev->event_lock); + if (cstate->active && drm_crtc_vblank_get(crtc) =3D=3D 0) + drm_crtc_arm_vblank_event(crtc, event); + else + drm_crtc_send_vblank_event(crtc, event); + spin_unlock_irq(&crtc->dev->event_lock); } =20 -static int pl111_display_enable_vblank(struct drm_simple_display_pipe *pip= e) +static int pl111_display_enable_vblank(struct drm_crtc *crtc) { - struct drm_crtc *crtc =3D &pipe->crtc; struct drm_device *drm =3D crtc->dev; struct pl111_drm_dev_private *priv =3D drm->dev_private; =20 @@ -427,21 +454,62 @@ static int pl111_display_enable_vblank(struct drm_sim= ple_display_pipe *pipe) return 0; } =20 -static void pl111_display_disable_vblank(struct drm_simple_display_pipe *p= ipe) +static void pl111_display_disable_vblank(struct drm_crtc *crtc) { - struct drm_crtc *crtc =3D &pipe->crtc; struct drm_device *drm =3D crtc->dev; struct pl111_drm_dev_private *priv =3D drm->dev_private; =20 writel(0, priv->regs + priv->ienb); } =20 -static struct drm_simple_display_pipe_funcs pl111_display_funcs =3D { - .mode_valid =3D pl111_mode_valid, - .check =3D pl111_display_check, - .enable =3D pl111_display_enable, - .disable =3D pl111_display_disable, - .update =3D pl111_display_update, +static int pl111_crtc_helper_atomic_check(struct drm_crtc *crtc, struct dr= m_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 struct drm_crtc_funcs pl111_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_crtc_helper_funcs pl111_crtc_helper_funcs =3D { + .mode_valid =3D pl111_crtc_helper_mode_valid, + .atomic_check =3D pl111_crtc_helper_atomic_check, + .atomic_enable =3D pl111_crtc_helper_atomic_enable, + .atomic_disable =3D pl111_crtc_helper_atomic_disable, + .atomic_flush =3D pl111_crtc_helper_atomic_flush, +}; + +static const struct drm_plane_funcs pl111_plane_funcs =3D { + .update_plane =3D drm_atomic_helper_update_plane, + .disable_plane =3D drm_atomic_helper_disable_plane, + .reset =3D drm_atomic_helper_plane_reset, + .destroy =3D drm_plane_cleanup, + .atomic_duplicate_state =3D drm_atomic_helper_plane_duplicate_state, + .atomic_destroy_state =3D drm_atomic_helper_plane_destroy_state, +}; + +static const struct drm_plane_helper_funcs pl111_plane_helper_funcs =3D { + .prepare_fb =3D drm_gem_plane_helper_prepare_fb, + .atomic_check =3D pl111_plane_helper_atomic_check, + .atomic_update =3D pl111_plane_helper_atomic_update, +}; + +static const struct drm_encoder_funcs pl111_encoder_funcs =3D { + .destroy =3D drm_encoder_cleanup, }; =20 static int pl111_clk_div_choose_div(struct clk_hw *hw, unsigned long rate, @@ -583,18 +651,40 @@ int pl111_display_init(struct drm_device *drm) return ret; =20 if (!priv->variant->broken_vblank) { - pl111_display_funcs.enable_vblank =3D pl111_display_enable_vblank; - pl111_display_funcs.disable_vblank =3D pl111_display_disable_vblank; + pl111_crtc_funcs.enable_vblank =3D pl111_display_enable_vblank; + pl111_crtc_funcs.disable_vblank =3D pl111_display_disable_vblank; } =20 - ret =3D drm_simple_display_pipe_init(drm, &priv->pipe, - &pl111_display_funcs, - priv->variant->formats, - priv->variant->nformats, - NULL, - priv->connector); + ret =3D drm_universal_plane_init(drm, &priv->plane, 0, + &pl111_plane_funcs, + priv->variant->formats, + priv->variant->nformats, + NULL, DRM_PLANE_TYPE_PRIMARY, NULL); + if (ret) + return ret; + + drm_plane_helper_add(&priv->plane, &pl111_plane_helper_funcs); + + ret =3D drm_crtc_init_with_planes(drm, &priv->crtc, &priv->plane, + NULL, &pl111_crtc_funcs, NULL); + if (ret) + return ret; + + drm_crtc_helper_add(&priv->crtc, &pl111_crtc_helper_funcs); + + ret =3D drm_encoder_init(drm, &priv->encoder, &pl111_encoder_funcs, + DRM_MODE_ENCODER_NONE, NULL); if (ret) return ret; =20 + priv->encoder.possible_crtcs =3D drm_crtc_mask(&priv->crtc); + + if (priv->connector) { + ret =3D drm_connector_attach_encoder(priv->connector, + &priv->encoder); + if (ret) + return ret; + } + return 0; } diff --git a/drivers/gpu/drm/pl111/pl111_drm.h b/drivers/gpu/drm/pl111/pl11= 1_drm.h index d1fe756444ee..ec92a5a180a8 100644 --- a/drivers/gpu/drm/pl111/pl111_drm.h +++ b/drivers/gpu/drm/pl111/pl111_drm.h @@ -21,7 +21,6 @@ #include #include #include -#include =20 /* * CLCD Controller Internal Register addresses @@ -135,7 +134,9 @@ struct pl111_drm_dev_private { struct drm_connector *connector; struct drm_panel *panel; struct drm_bridge *bridge; - struct drm_simple_display_pipe pipe; + struct drm_plane plane; + struct drm_crtc crtc; + struct drm_encoder encoder; =20 void *regs; u32 memory_bw; diff --git a/drivers/gpu/drm/pl111/pl111_drv.c b/drivers/gpu/drm/pl111/pl11= 1_drv.c index ac7b1d12a0f5..f649c266c33a 100644 --- a/drivers/gpu/drm/pl111/pl111_drv.c +++ b/drivers/gpu/drm/pl111/pl111_drv.c @@ -168,8 +168,7 @@ static int pl111_modeset_init(struct drm_device *dev) goto out_bridge; } =20 - ret =3D drm_simple_display_pipe_attach_bridge(&priv->pipe, - bridge); + ret =3D drm_bridge_attach(&priv->encoder, bridge, NULL, 0); if (ret) return ret; =20 --=20 2.43.0