*/
 
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_damage_helper.h>
 
 #include "display/intel_dp.h"
 
        if (!crtc_state->enable_psr2_sel_fetch)
                return 0;
 
-       ret = drm_atomic_add_affected_planes(&state->base, &crtc->base);
-       if (ret)
-               return ret;
-
        /*
         * Calculate minimal selective fetch area of each plane and calculate
         * the pipe damaged area.
        for_each_oldnew_intel_plane_in_state(state, plane, old_plane_state,
                                             new_plane_state, i) {
                struct drm_rect src, damaged_area = { .y1 = -1 };
-               struct drm_mode_rect *damaged_clips;
-               u32 num_clips, j;
+               struct drm_atomic_helper_damage_iter iter;
+               struct drm_rect clip;
 
                if (new_plane_state->uapi.crtc != crtc_state->uapi.crtc)
                        continue;
                        break;
                }
 
-               num_clips = drm_plane_get_damage_clips_count(&new_plane_state->uapi);
-
                /*
                 * If visibility or plane moved, mark the whole plane area as
                 * damaged as it needs to be complete redraw in the new and old
                        cursor_area_workaround(new_plane_state, &damaged_area,
                                               &pipe_clip);
                        continue;
-               } else if (new_plane_state->uapi.alpha != old_plane_state->uapi.alpha ||
-                          (!num_clips &&
-                           new_plane_state->uapi.fb != old_plane_state->uapi.fb)) {
-                       /*
-                        * If the plane don't have damaged areas but the
-                        * framebuffer changed or alpha changed, mark the whole
-                        * plane area as damaged.
-                        */
+               } else if (new_plane_state->uapi.alpha != old_plane_state->uapi.alpha) {
+                       /* If alpha changed mark the whole plane area as damaged */
                        damaged_area.y1 = new_plane_state->uapi.dst.y1;
                        damaged_area.y2 = new_plane_state->uapi.dst.y2;
                        clip_area_update(&pipe_clip, &damaged_area);
                }
 
                drm_rect_fp_to_int(&src, &new_plane_state->uapi.src);
-               damaged_clips = drm_plane_get_damage_clips(&new_plane_state->uapi);
 
-               for (j = 0; j < num_clips; j++) {
-                       struct drm_rect clip;
-
-                       clip.x1 = damaged_clips[j].x1;
-                       clip.y1 = damaged_clips[j].y1;
-                       clip.x2 = damaged_clips[j].x2;
-                       clip.y2 = damaged_clips[j].y2;
+               drm_atomic_helper_damage_iter_init(&iter,
+                                                  &old_plane_state->uapi,
+                                                  &new_plane_state->uapi);
+               drm_atomic_for_each_plane_damage(&iter, &clip) {
                        if (drm_rect_intersect(&clip, &src))
                                clip_area_update(&damaged_area, &clip);
                }
        if (full_update)
                goto skip_sel_fetch_set_loop;
 
+       ret = drm_atomic_add_affected_planes(&state->base, &crtc->base);
+       if (ret)
+               return ret;
+
        intel_psr2_sel_fetch_pipe_alignment(crtc_state, &pipe_clip);
 
        /*