From nobody Sat Oct 4 08:06:49 2025 Received: from sonic309-21.consmr.mail.gq1.yahoo.com (sonic309-21.consmr.mail.gq1.yahoo.com [98.137.65.147]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5B4733451B6 for ; Mon, 18 Aug 2025 19:36:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=98.137.65.147 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755545784; cv=none; b=r4ajvEdmmRLpxxZplyDmp26arEtgcApOK0TTQ1bQwNXECKbyg2oD/J8sADsskoRLrI6renLX64YrgbdJb1iE16eYrFmgk9coKRSqQumAARhayg78/7Hbw6KSIW4h1WwfQd1ZmKVxtfosf5Yst28QGdq4lShz0r9y8wA3zJd5cGk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755545784; c=relaxed/simple; bh=9w2QWQy7rYk9dKYpYPegG+yd2iyRo3B6ltA1ZqmjCMI=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version:References; b=t0XSk767bp/TaQwA9IjD//2TGawKdsiVOgrjwQlVFr3r/5FRSKRy9TwYIwVkYo2kuOKNQYvfM5/zxkhwxEfZUt8FPrmL1YgGTAcsbCWT1TOa6HttGmnZdSL2R0c2lMgmfLuJyPaxkuqbcTjg9hbGYKSBKvSw51XiKspOaqLaXPQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=aol.com; spf=pass smtp.mailfrom=aol.com; dkim=pass (2048-bit key) header.d=aol.com header.i=@aol.com header.b=HWLaH2v9; arc=none smtp.client-ip=98.137.65.147 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=aol.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=aol.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=aol.com header.i=@aol.com header.b="HWLaH2v9" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=aol.com; s=a2048; t=1755545775; bh=QAsS/ZK9/jR90ZYLdsDJZA2QChRMRi5HB4btNMfMTh4=; h=From:To:Cc:Subject:Date:References:From:Subject:Reply-To; b=HWLaH2v9E5kQtq2PDcFvZ3hgDVyxtglOEJZ5pp93BFNpxKfhGXStfU5YObNSA/G6jsPRDCvxe9qTvosiMOkBkpTKWE81tIpCz2bCZ/K0oQb4QCnmraAT0f316M5M0Kt8nUX3Z3pBCvdRqMjsS/FagfboZThKBqm+7EAjI42lg6nu7tLnNt6nkppK6767U/cfSXKMEuWDCfR5wYpRC1YL9KN02tG70nN92hnnSRWhy8FIOEQbYml6P/zPNqoFX+fg44l0FAh95GbO8OkIr0PEKtQyjTQg4i9xg7K8Ss6p3CmbamYbTPOmTFE8AvQb4Kl54RtIP7ca6xTPhUA20A05Gw== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1755545775; bh=4zox/e+Z/zmrgyn6Mmffd3ovgE1eK4s90dSC4Gtvzh+=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=SpAVY02r736r+Gm5i+f2kpdyIHUdJFTpvMLvUpTBEnkh6/E1/13GJUmpGGo5u47SawObf26Aj8o+i47jUp1H6GHeiQl/g2MNO9FlYMRRTlCi2zqXhb5udAIdnQd0oFooSnmxFmW5Oj+e6WLtgeQaxy215sw5gzYlKuzfiYSyoMdPpYq+ZBP62zgdt/M4/LDoj+SYkiwzOEbk5kAR30L6Ij9O6woiNA0oEeCWd3wKJG+AZTFnnemdy042skf56Gc5iXQx831KvqpG7kzCzeLS1NmQZ4Ol8watxcfpno+2p85P5dd1XMtzRl915E7C9N2ATzsSZ15pHjiStYXlJ52cyg== X-YMail-OSG: XMrjKWIVM1ng2ttLT.NJlMLdZNSy_w0HvctIArKvpXGIA88ErVh_X_rsH7rIy7r 7Nc36XUH19rxEBmaXY_1V203c0svQf33GtLAMv58nQq6WbvWoXjNZyRcOU6L.1eBS06WL5fVNVME ddDytxs6Btd2073axHfbwDWVqPATCTAasVFyuAAOEFZGjo5CbrEQMrSmnIy9PX1r58vdDQ8ikeOm eTjaNX21Dt7D5J4MdSo8kqqKWuH5LPHnWURle_38NiWvtMcvbZXiMqKbs_DMqL89Mq0HRH1cdajv HvlEWm_QdXpTkEv4YNmcZ3eTxPu92PzmWBR9msIimI2N.VB7gSGSKBT9hYQynAx0bXMzEhJ9a9ET .InaY93102f4nDmO1g8FKOIBheFtXZj8wjEYO1ey5205iP2LUpNJrV_k1C1OoQ7DaqGJhqB.10aL SIFzhqHuzDwk2jl7C5ddqhn5_k_rrLlQoHyBe8olGsMiJfh8QXAWiWKHefdJqz_eU.4.Ab7nDN2I Xy6kg5Vahu2xlR2dYIm6s6tpBVyyUlyaNKyuSWu9lMho8j5.z8593JbcqzpTaLiv..CYlGUT4Sg3 ohnGVX2Sqyaj7OftWKzcePWo.7XI_d8xvG7k4pMStsAA9yETBqvt6q1V.rWGy8Qlr16DBPUFqsZM UmhJlKSqB2n2u69c2ueAmN5NrKIq.NVBIPBapJQcN.Y6gvIq5QM_9AHT.PPgczHUwP5OCoGJuixv yLW9DmZzeyi1AuJhhX23iVDDfn1V56FhV1Zy2svznNtaI2CRwYyxiZgMlaYhkBvG0TYGR_8mx7bz nQ1Bjc510gFk9eG8uDmFPDnGCcgqeeNYhmmak6gHzUxali9E4JRFDN_RGbvEO.kaMrm1_spfhK3F lpaq4XKhNxIq9mePbpOylH0zN8_IPTPY7kNYEB0vNMtNREY7zcklwONJcqnK3g8X2n2WbYysDI08 N5.ez9t6zAo_vZdbhTZ9v.xUJumGsEY8n9Ygq0svxvwSoz9hQIeUgbfX5qybfU6jM637_BkLyn2M ACEbZ54ZM4wUewqRww9k1nl.mTVCdHu1rW4xx1OrqBXeXLFj6eF5jWiLVDBYttxDvZhEzf0r0RPs zXQNwOqfMWSvjKogQawhExpdUOXz49feQvLfVp1Wflql_hD68ZXHU16rSwmFNK8vYd4KQl.J3e0o UIKHn_V3e.3Q9udLHI3P1MGZ9Scaheg5npbfidtobz8IPJkq6jfVkmMnlcxg83UBv7j2OxrOggr7 pqLQi8mxzou4seNWdU8thnWZoH9pC8sVrKa_k7qApkmJOo5KwONM9oDCw33qWkoxCpgujJTFFnVP Mf6ZxKeGUdrbv2UUCWwzHeIUbWC2VjMZ07lL6hm6pKMJ2xOwwJqH0oHPwyik9861OGSV95Qm3L5i asyuNx9joWPuYWrRcR6de4v6gv5HCeKUKR0pFnI2WBkqBwwShC_ch57.5PJMJzJSSjEJYLdcf0NX Nd29EiLOKc8lzDKzLq6J75Nz9nSho2IKzxvvpKHV.7c9LU0Nzn0D_DoyQ4ZNw_JM7xF9hj5lUc_w T2EaNlkWn2roB8v.runkdYOmRxfL.BQTKRGyJrqb2IWCUc5nT5QxY63ZL1zXALCoRLryCDpOV2bH v8vCHlAuP4k6JR7tP7VHxlBVRzp3aK9gHax_U1yAADAxXt8b3AVXBI4STxqZnik8DWq16mfhCXnu BWszoXHTwY_5Y4gxyZgvX.FIe_uct7YpRLyni5iHl5B6x4z97z97NkrCXEtEdvXQnqzA5A5Q.TVN uw0U7n9uG9Rd1Fll6pH3in8JpLtqZz1ko2anz_O61NOi2L4pr9BJn_1V7aEEMzgfKyT9p_rMqwjo wLu1a5Jt_462.j.w9s66yUsZ1qscJoIrq3AvCw1KgpAzqqDrm5fXDqaL4H.8JBeHr8XZTfEUq_PO CvQZMs0CXJybeUQ_saxX6qg8N3sl3kYIJWZ3oAyO_iOlEnh6eajGRheIBlE4tFm_eazOHAJx68Fs FBE7R3A94UxpE3yOBd0gOxE8TYv2i0hqEDm47bZn3xKxMoMtPF0bFYL6MnHEPCzQj0FNsTrrpDCF 9jHR4PnNZww7fEsjzeDHcrS7s5VUWnUV5cLOCI2mrF81fw1OglMQIsS_.l3l552l3GwAr2pBpY0g 2LyzcpalIxtxGMKbKUBOnF04rllPZdm9sDFCziN_Pev4r7RY1OmptKb4ijiTB0SRoghfCFr4KBXa QYaPzWyaTqWVs0rqmva9V1OoZnKUZ1.cwIVid8DZlDU9WgMhrqk43o4TBH29UlkOt.dVyk2nl0EK lLCo- X-Sonic-MF: X-Sonic-ID: 3d8495f8-08f8-4331-ad32-4cda6f07ae8f Received: from sonic.gate.mail.ne1.yahoo.com by sonic309.consmr.mail.gq1.yahoo.com with HTTP; Mon, 18 Aug 2025 19:36:15 +0000 Received: by hermes--production-ir2-858bd4ff7b-9hnb8 (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID 770dc5b5c7bc51b7c8c3e3830a69544b; Mon, 18 Aug 2025 19:36:10 +0000 (UTC) From: Ruben Wauters To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Ingo Molnar , Thomas Gleixner , Jani Nikula , Jocelyn Falempe Cc: Ruben Wauters , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org Subject: [PATCH v3] drm/gud: Replace simple display pipe with DRM atomic helpers Date: Mon, 18 Aug 2025 20:35:26 +0100 Message-ID: <20250818193553.2162-1-rubenru09@aol.com> X-Mailer: git-send-email 2.49.1 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable References: <20250818193553.2162-1-rubenru09.ref@aol.com> Content-Type: text/plain; charset="utf-8" The simple display pipe is obsolete and the atomic helpers allow for more control over the rendering process. As such, this patch replaces the old simple display pipe system with the newer atomic helpers. As the code is mainly the same, merely replaced with the new atomic system, there should be no change in functionality. Signed-off-by: Ruben Wauters Reviewed-by: Thomas Zimmermann --- I noticed as well elsewhere in the driver WARN_ON_ONCE was used instead of drm_WARN_ON_ONCE(). I have fixed it for the ones I've modified, and will fix it for the driver as a whole in another patch. v2 changes: - address review comments by reorganising gud_probe() v3 changes: - fix formatting and spacing - remove unnecessary includes - convert WARN_ON_ONCE() to drm_WARN_ON_ONCE() - remove dst rect intersect check - remove encoder from gud_device and switch to gconn->encoder --- drivers/gpu/drm/gud/gud_connector.c | 25 +++++------ drivers/gpu/drm/gud/gud_drv.c | 52 ++++++++++++++++++----- drivers/gpu/drm/gud/gud_internal.h | 13 +++--- drivers/gpu/drm/gud/gud_pipe.c | 64 +++++++++++++++++++---------- 4 files changed, 99 insertions(+), 55 deletions(-) diff --git a/drivers/gpu/drm/gud/gud_connector.c b/drivers/gpu/drm/gud/gud_= connector.c index 0f07d77c5d52..4a15695fa933 100644 --- a/drivers/gpu/drm/gud/gud_connector.c +++ b/drivers/gpu/drm/gud/gud_connector.c @@ -16,7 +16,6 @@ #include #include #include -#include #include =20 #include "gud_internal.h" @@ -607,13 +606,16 @@ int gud_connector_fill_properties(struct drm_connecto= r_state *connector_state, return gconn->num_properties; } =20 +static const struct drm_encoder_funcs gud_drm_simple_encoder_funcs_cleanup= =3D { + .destroy =3D drm_encoder_cleanup, +}; + static int gud_connector_create(struct gud_device *gdrm, unsigned int inde= x, struct gud_connector_descriptor_req *desc) { struct drm_device *drm =3D &gdrm->drm; struct gud_connector *gconn; struct drm_connector *connector; - struct drm_encoder *encoder; int ret, connector_type; u32 flags; =20 @@ -681,20 +683,13 @@ static int gud_connector_create(struct gud_device *gd= rm, unsigned int index, return ret; } =20 - /* The first connector is attached to the existing simple pipe encoder */ - if (!connector->index) { - encoder =3D &gdrm->pipe.encoder; - } else { - encoder =3D &gconn->encoder; - - ret =3D drm_simple_encoder_init(drm, encoder, DRM_MODE_ENCODER_NONE); - if (ret) - return ret; - - encoder->possible_crtcs =3D 1; - } + gconn->encoder.possible_crtcs =3D drm_crtc_mask(&gdrm->crtc); + ret =3D drm_encoder_init(drm, &gconn->encoder, &gud_drm_simple_encoder_fu= ncs_cleanup, + DRM_MODE_ENCODER_NONE, NULL); + if (ret) + return ret; =20 - return drm_connector_attach_encoder(connector, encoder); + return drm_connector_attach_encoder(connector, &gconn->encoder); } =20 int gud_get_connectors(struct gud_device *gdrm) diff --git a/drivers/gpu/drm/gud/gud_drv.c b/drivers/gpu/drm/gud/gud_drv.c index 5385a2126e45..5f57f841e603 100644 --- a/drivers/gpu/drm/gud/gud_drv.c +++ b/drivers/gpu/drm/gud/gud_drv.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -27,7 +28,6 @@ #include #include #include -#include #include =20 #include "gud_internal.h" @@ -289,7 +289,7 @@ static int gud_get_properties(struct gud_device *gdrm) * but mask out any additions on future devices. */ val &=3D GUD_ROTATION_MASK; - ret =3D drm_plane_create_rotation_property(&gdrm->pipe.plane, + ret =3D drm_plane_create_rotation_property(&gdrm->plane, DRM_MODE_ROTATE_0, val); break; default: @@ -338,10 +338,30 @@ static int gud_stats_debugfs(struct seq_file *m, void= *data) return 0; } =20 -static const struct drm_simple_display_pipe_funcs gud_pipe_funcs =3D { - .check =3D gud_pipe_check, - .update =3D gud_pipe_update, - DRM_GEM_SIMPLE_DISPLAY_PIPE_SHADOW_PLANE_FUNCS +static const struct drm_crtc_helper_funcs gud_crtc_helper_funcs =3D { + .atomic_check =3D drm_crtc_helper_atomic_check +}; + +static const struct drm_crtc_funcs gud_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_plane_helper_funcs gud_plane_helper_funcs =3D { + DRM_GEM_SHADOW_PLANE_HELPER_FUNCS, + .atomic_check =3D gud_plane_atomic_check, + .atomic_update =3D gud_plane_atomic_update, +}; + +static const struct drm_plane_funcs gud_plane_funcs =3D { + .update_plane =3D drm_atomic_helper_update_plane, + .disable_plane =3D drm_atomic_helper_disable_plane, + .destroy =3D drm_plane_cleanup, + DRM_GEM_SHADOW_PLANE_FUNCS, }; =20 static const struct drm_mode_config_funcs gud_mode_config_funcs =3D { @@ -350,7 +370,7 @@ static const struct drm_mode_config_funcs gud_mode_conf= ig_funcs =3D { .atomic_commit =3D drm_atomic_helper_commit, }; =20 -static const u64 gud_pipe_modifiers[] =3D { +static const u64 gud_plane_modifiers[] =3D { DRM_FORMAT_MOD_LINEAR, DRM_FORMAT_MOD_INVALID }; @@ -567,12 +587,17 @@ static int gud_probe(struct usb_interface *intf, cons= t struct usb_device_id *id) return -ENOMEM; } =20 - ret =3D drm_simple_display_pipe_init(drm, &gdrm->pipe, &gud_pipe_funcs, - formats, num_formats, - gud_pipe_modifiers, NULL); + ret =3D drm_universal_plane_init(drm, &gdrm->plane, 0, + &gud_plane_funcs, + formats, num_formats, + gud_plane_modifiers, + DRM_PLANE_TYPE_PRIMARY, NULL); if (ret) return ret; =20 + drm_plane_helper_add(&gdrm->plane, &gud_plane_helper_funcs); + drm_plane_enable_fb_damage_clips(&gdrm->plane); + devm_kfree(dev, formats); devm_kfree(dev, formats_dev); =20 @@ -582,7 +607,12 @@ static int gud_probe(struct usb_interface *intf, const= struct usb_device_id *id) return ret; } =20 - drm_plane_enable_fb_damage_clips(&gdrm->pipe.plane); + ret =3D drm_crtc_init_with_planes(drm, &gdrm->crtc, &gdrm->plane, NULL, + &gud_crtc_funcs, NULL); + if (ret) + return ret; + + drm_crtc_helper_add(&gdrm->crtc, &gud_crtc_helper_funcs); =20 ret =3D gud_get_connectors(gdrm); if (ret) { diff --git a/drivers/gpu/drm/gud/gud_internal.h b/drivers/gpu/drm/gud/gud_i= nternal.h index d6fb25388722..d27c31648341 100644 --- a/drivers/gpu/drm/gud/gud_internal.h +++ b/drivers/gpu/drm/gud/gud_internal.h @@ -11,11 +11,11 @@ #include =20 #include -#include =20 struct gud_device { struct drm_device drm; - struct drm_simple_display_pipe pipe; + struct drm_plane plane; + struct drm_crtc crtc; struct work_struct work; u32 flags; const struct drm_format_info *xrgb8888_emulation_format; @@ -62,11 +62,10 @@ int gud_usb_set_u8(struct gud_device *gdrm, u8 request,= u8 val); =20 void gud_clear_damage(struct gud_device *gdrm); void gud_flush_work(struct work_struct *work); -int gud_pipe_check(struct drm_simple_display_pipe *pipe, - struct drm_plane_state *new_plane_state, - struct drm_crtc_state *new_crtc_state); -void gud_pipe_update(struct drm_simple_display_pipe *pipe, - struct drm_plane_state *old_state); +int gud_plane_atomic_check(struct drm_plane *plane, + struct drm_atomic_state *state); +void gud_plane_atomic_update(struct drm_plane *plane, + struct drm_atomic_state *atomic_state); int gud_connector_fill_properties(struct drm_connector_state *connector_st= ate, struct gud_property_req *properties); int gud_get_connectors(struct gud_device *gdrm); diff --git a/drivers/gpu/drm/gud/gud_pipe.c b/drivers/gpu/drm/gud/gud_pipe.c index 8d548d08f127..54d9aa9998e5 100644 --- a/drivers/gpu/drm/gud/gud_pipe.c +++ b/drivers/gpu/drm/gud/gud_pipe.c @@ -20,7 +20,6 @@ #include #include #include -#include #include =20 #include "gud_internal.h" @@ -451,14 +450,15 @@ static void gud_fb_handle_damage(struct gud_device *g= drm, struct drm_framebuffer gud_flush_damage(gdrm, fb, src, !fb->obj[0]->import_attach, damage); } =20 -int gud_pipe_check(struct drm_simple_display_pipe *pipe, - struct drm_plane_state *new_plane_state, - struct drm_crtc_state *new_crtc_state) +int gud_plane_atomic_check(struct drm_plane *plane, + struct drm_atomic_state *state) { - struct gud_device *gdrm =3D to_gud_device(pipe->crtc.dev); - struct drm_plane_state *old_plane_state =3D pipe->plane.state; - const struct drm_display_mode *mode =3D &new_crtc_state->mode; - struct drm_atomic_state *state =3D new_plane_state->state; + struct gud_device *gdrm =3D to_gud_device(plane->dev); + struct drm_plane_state *old_plane_state =3D drm_atomic_get_old_plane_stat= e(state, plane); + struct drm_plane_state *new_plane_state =3D drm_atomic_get_new_plane_stat= e(state, plane); + struct drm_crtc *crtc =3D new_plane_state->crtc; + struct drm_crtc_state *crtc_state; + const struct drm_display_mode *mode; struct drm_framebuffer *old_fb =3D old_plane_state->fb; struct drm_connector_state *connector_state =3D NULL; struct drm_framebuffer *fb =3D new_plane_state->fb; @@ -469,20 +469,37 @@ int gud_pipe_check(struct drm_simple_display_pipe *pi= pe, int idx, ret; size_t len; =20 - if (WARN_ON_ONCE(!fb)) + if (drm_WARN_ON_ONCE(plane->dev, !fb)) return -EINVAL; =20 + if (drm_WARN_ON_ONCE(plane->dev, !crtc)) + return -EINVAL; + + crtc_state =3D drm_atomic_get_new_crtc_state(state, crtc); + + mode =3D &crtc_state->mode; + + ret =3D drm_atomic_helper_check_plane_state(new_plane_state, crtc_state, + DRM_PLANE_NO_SCALING, + DRM_PLANE_NO_SCALING, + false, false); + if (ret) + return ret; + + if (!new_plane_state->visible) + return 0; + if (old_plane_state->rotation !=3D new_plane_state->rotation) - new_crtc_state->mode_changed =3D true; + crtc_state->mode_changed =3D true; =20 if (old_fb && old_fb->format !=3D format) - new_crtc_state->mode_changed =3D true; + crtc_state->mode_changed =3D true; =20 - if (!new_crtc_state->mode_changed && !new_crtc_state->connectors_changed) + if (!crtc_state->mode_changed && !crtc_state->connectors_changed) return 0; =20 /* Only one connector is supported */ - if (hweight32(new_crtc_state->connector_mask) !=3D 1) + if (hweight32(crtc_state->connector_mask) !=3D 1) return -EINVAL; =20 if (format->format =3D=3D DRM_FORMAT_XRGB8888 && gdrm->xrgb8888_emulation= _format) @@ -500,7 +517,7 @@ int gud_pipe_check(struct drm_simple_display_pipe *pipe, if (!connector_state) { struct drm_connector_list_iter conn_iter; =20 - drm_connector_list_iter_begin(pipe->crtc.dev, &conn_iter); + drm_connector_list_iter_begin(plane->dev, &conn_iter); drm_for_each_connector_iter(connector, &conn_iter) { if (connector->state->crtc) { connector_state =3D connector->state; @@ -567,16 +584,18 @@ int gud_pipe_check(struct drm_simple_display_pipe *pi= pe, return ret; } =20 -void gud_pipe_update(struct drm_simple_display_pipe *pipe, - struct drm_plane_state *old_state) +void gud_plane_atomic_update(struct drm_plane *plane, + struct drm_atomic_state *atomic_state) { - struct drm_device *drm =3D pipe->crtc.dev; + struct drm_device *drm =3D plane->dev; struct gud_device *gdrm =3D to_gud_device(drm); - struct drm_plane_state *state =3D pipe->plane.state; - struct drm_shadow_plane_state *shadow_plane_state =3D to_drm_shadow_plane= _state(state); - struct drm_framebuffer *fb =3D state->fb; - struct drm_crtc *crtc =3D &pipe->crtc; + struct drm_plane_state *old_state =3D drm_atomic_get_old_plane_state(atom= ic_state, plane); + struct drm_plane_state *new_state =3D drm_atomic_get_new_plane_state(atom= ic_state, plane); + struct drm_shadow_plane_state *shadow_plane_state =3D to_drm_shadow_plane= _state(new_state); + struct drm_framebuffer *fb =3D new_state->fb; + struct drm_crtc *crtc =3D new_state->crtc; struct drm_rect damage; + struct drm_atomic_helper_damage_iter iter; int ret, idx; =20 if (crtc->state->mode_changed || !crtc->state->enable) { @@ -611,7 +630,8 @@ void gud_pipe_update(struct drm_simple_display_pipe *pi= pe, if (ret) goto ctrl_disable; =20 - if (drm_atomic_helper_damage_merged(old_state, state, &damage)) + drm_atomic_helper_damage_iter_init(&iter, old_state, new_state); + drm_atomic_for_each_plane_damage(&iter, &damage) gud_fb_handle_damage(gdrm, fb, &shadow_plane_state->data[0], &damage); =20 drm_gem_fb_end_cpu_access(fb, DMA_FROM_DEVICE); --=20 2.49.1