Commit b3be33f2 authored by Dave Airlie's avatar Dave Airlie
Browse files

Merge tag 'drm-intel-fixes-2026-04-09' of...

Merge tag 'drm-intel-fixes-2026-04-09' of https://gitlab.freedesktop.org/drm/i915/kernel

 into drm-fixes

- Drop check for changed VM in EXECBUF
- Fix refcount underflow race in intel_engine_park_heartbeat
- Do not use pipe_src as borders for SU area in PSR

Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
From: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: https://patch.msgid.link/add6fPHRC7Bc8Uri@jlahtine-mobl
parents 93be8c74 a13edf9b
Loading
Loading
Loading
Loading
+19 −11
Original line number Diff line number Diff line
@@ -2678,9 +2678,9 @@ static u32 psr2_pipe_srcsz_early_tpt_calc(struct intel_crtc_state *crtc_state,

static void clip_area_update(struct drm_rect *overlap_damage_area,
			     struct drm_rect *damage_area,
			     struct drm_rect *pipe_src)
			     struct drm_rect *display_area)
{
	if (!drm_rect_intersect(damage_area, pipe_src))
	if (!drm_rect_intersect(damage_area, display_area))
		return;

	if (overlap_damage_area->y1 == -1) {
@@ -2731,6 +2731,7 @@ static bool intel_psr2_sel_fetch_pipe_alignment(struct intel_crtc_state *crtc_st
static void
intel_psr2_sel_fetch_et_alignment(struct intel_atomic_state *state,
				  struct intel_crtc *crtc,
				  struct drm_rect *display_area,
				  bool *cursor_in_su_area)
{
	struct intel_crtc_state *crtc_state = intel_atomic_get_new_crtc_state(state, crtc);
@@ -2758,7 +2759,7 @@ intel_psr2_sel_fetch_et_alignment(struct intel_atomic_state *state,
			continue;

		clip_area_update(&crtc_state->psr2_su_area, &new_plane_state->uapi.dst,
				 &crtc_state->pipe_src);
				 display_area);
		*cursor_in_su_area = true;
	}
}
@@ -2855,6 +2856,12 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state *state,
	struct intel_crtc_state *crtc_state = intel_atomic_get_new_crtc_state(state, crtc);
	struct intel_plane_state *new_plane_state, *old_plane_state;
	struct intel_plane *plane;
	struct drm_rect display_area = {
		.x1 = 0,
		.y1 = 0,
		.x2 = crtc_state->hw.adjusted_mode.crtc_hdisplay,
		.y2 = crtc_state->hw.adjusted_mode.crtc_vdisplay,
	};
	bool full_update = false, su_area_changed;
	int i, ret;

@@ -2868,7 +2875,7 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state *state,

	crtc_state->psr2_su_area.x1 = 0;
	crtc_state->psr2_su_area.y1 = -1;
	crtc_state->psr2_su_area.x2 = drm_rect_width(&crtc_state->pipe_src);
	crtc_state->psr2_su_area.x2 = drm_rect_width(&display_area);
	crtc_state->psr2_su_area.y2 = -1;

	/*
@@ -2906,14 +2913,14 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state *state,
				damaged_area.y1 = old_plane_state->uapi.dst.y1;
				damaged_area.y2 = old_plane_state->uapi.dst.y2;
				clip_area_update(&crtc_state->psr2_su_area, &damaged_area,
						 &crtc_state->pipe_src);
						 &display_area);
			}

			if (new_plane_state->uapi.visible) {
				damaged_area.y1 = new_plane_state->uapi.dst.y1;
				damaged_area.y2 = new_plane_state->uapi.dst.y2;
				clip_area_update(&crtc_state->psr2_su_area, &damaged_area,
						 &crtc_state->pipe_src);
						 &display_area);
			}
			continue;
		} else if (new_plane_state->uapi.alpha != old_plane_state->uapi.alpha) {
@@ -2921,7 +2928,7 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state *state,
			damaged_area.y1 = new_plane_state->uapi.dst.y1;
			damaged_area.y2 = new_plane_state->uapi.dst.y2;
			clip_area_update(&crtc_state->psr2_su_area, &damaged_area,
					 &crtc_state->pipe_src);
					 &display_area);
			continue;
		}

@@ -2937,7 +2944,7 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state *state,
		damaged_area.x1 += new_plane_state->uapi.dst.x1 - src.x1;
		damaged_area.x2 += new_plane_state->uapi.dst.x1 - src.x1;

		clip_area_update(&crtc_state->psr2_su_area, &damaged_area, &crtc_state->pipe_src);
		clip_area_update(&crtc_state->psr2_su_area, &damaged_area, &display_area);
	}

	/*
@@ -2972,7 +2979,8 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state *state,
		 * cursor is added into affected planes even when
		 * cursor is not updated by itself.
		 */
		intel_psr2_sel_fetch_et_alignment(state, crtc, &cursor_in_su_area);
		intel_psr2_sel_fetch_et_alignment(state, crtc, &display_area,
						  &cursor_in_su_area);

		su_area_changed = intel_psr2_sel_fetch_pipe_alignment(crtc_state);

@@ -3048,8 +3056,8 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state *state,

skip_sel_fetch_set_loop:
	if (full_update)
		clip_area_update(&crtc_state->psr2_su_area, &crtc_state->pipe_src,
				 &crtc_state->pipe_src);
		clip_area_update(&crtc_state->psr2_su_area, &display_area,
				 &display_area);

	psr2_man_trk_ctl_calc(crtc_state, full_update);
	crtc_state->pipe_srcsz_early_tpt =
+1 −1
Original line number Diff line number Diff line
@@ -896,7 +896,7 @@ static struct i915_vma *eb_lookup_vma(struct i915_execbuffer *eb, u32 handle)

		rcu_read_lock();
		vma = radix_tree_lookup(&eb->gem_context->handles_vma, handle);
		if (likely(vma && vma->vm == vm))
		if (likely(vma))
			vma = i915_vma_tryget(vma);
		else
			vma = NULL;
+18 −8
Original line number Diff line number Diff line
@@ -148,10 +148,12 @@ static void heartbeat(struct work_struct *wrk)
	/* Just in case everything has gone horribly wrong, give it a kick */
	intel_engine_flush_submission(engine);

	rq = engine->heartbeat.systole;
	if (rq && i915_request_completed(rq)) {
	rq = xchg(&engine->heartbeat.systole, NULL);
	if (rq) {
		if (i915_request_completed(rq))
			i915_request_put(rq);
		engine->heartbeat.systole = NULL;
		else
			engine->heartbeat.systole = rq;
	}

	if (!intel_engine_pm_get_if_awake(engine))
@@ -232,8 +234,11 @@ static void heartbeat(struct work_struct *wrk)
unlock:
	mutex_unlock(&ce->timeline->mutex);
out:
	if (!engine->i915->params.enable_hangcheck || !next_heartbeat(engine))
		i915_request_put(fetch_and_zero(&engine->heartbeat.systole));
	if (!engine->i915->params.enable_hangcheck || !next_heartbeat(engine)) {
		rq = xchg(&engine->heartbeat.systole, NULL);
		if (rq)
			i915_request_put(rq);
	}
	intel_engine_pm_put(engine);
}

@@ -247,8 +252,13 @@ void intel_engine_unpark_heartbeat(struct intel_engine_cs *engine)

void intel_engine_park_heartbeat(struct intel_engine_cs *engine)
{
	if (cancel_delayed_work(&engine->heartbeat.work))
		i915_request_put(fetch_and_zero(&engine->heartbeat.systole));
	if (cancel_delayed_work(&engine->heartbeat.work)) {
		struct i915_request *rq;

		rq = xchg(&engine->heartbeat.systole, NULL);
		if (rq)
			i915_request_put(rq);
	}
}

void intel_gt_unpark_heartbeats(struct intel_gt *gt)