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

Merge tag 'drm-intel-fixes-2024-05-30' of...

Merge tag 'drm-intel-fixes-2024-05-30' of https://gitlab.freedesktop.org/drm/i915/kernel

 into drm-fixes

drm/i915 fixes for v6.10-rc2:
- Fix a race in audio component by registering it later
- Make DPT object unshrinkable to avoid shrinking when framebuffer has
  not shrunk
- Fix CCS id calculation to fix a perf regression
- Fix selftest caching mode
- Fix FIELD_PREP compiler warnings
- Fix indefinite wait for GT wakeref release
- Revert overeager multi-gt pm reference removal

Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
From: Jani Nikula <jani.nikula@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/87a5k7iwod.fsf@intel.com
parents 3e049b6b 75800e2e
Loading
Loading
Loading
Loading
+21 −11
Original line number Diff line number Diff line
@@ -1252,17 +1252,6 @@ static const struct component_ops i915_audio_component_bind_ops = {
static void i915_audio_component_init(struct drm_i915_private *i915)
{
	u32 aud_freq, aud_freq_init;
	int ret;

	ret = component_add_typed(i915->drm.dev,
				  &i915_audio_component_bind_ops,
				  I915_COMPONENT_AUDIO);
	if (ret < 0) {
		drm_err(&i915->drm,
			"failed to add audio component (%d)\n", ret);
		/* continue with reduced functionality */
		return;
	}

	if (DISPLAY_VER(i915) >= 9) {
		aud_freq_init = intel_de_read(i915, AUD_FREQ_CNTRL);
@@ -1285,6 +1274,21 @@ static void i915_audio_component_init(struct drm_i915_private *i915)

	/* init with current cdclk */
	intel_audio_cdclk_change_post(i915);
}

static void i915_audio_component_register(struct drm_i915_private *i915)
{
	int ret;

	ret = component_add_typed(i915->drm.dev,
				  &i915_audio_component_bind_ops,
				  I915_COMPONENT_AUDIO);
	if (ret < 0) {
		drm_err(&i915->drm,
			"failed to add audio component (%d)\n", ret);
		/* continue with reduced functionality */
		return;
	}

	i915->display.audio.component_registered = true;
}
@@ -1317,6 +1321,12 @@ void intel_audio_init(struct drm_i915_private *i915)
		i915_audio_component_init(i915);
}

void intel_audio_register(struct drm_i915_private *i915)
{
	if (!i915->display.audio.lpe.platdev)
		i915_audio_component_register(i915);
}

/**
 * intel_audio_deinit() - deinitialize the audio driver
 * @i915: the i915 drm device private data
+1 −0
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ void intel_audio_codec_get_config(struct intel_encoder *encoder,
void intel_audio_cdclk_change_pre(struct drm_i915_private *dev_priv);
void intel_audio_cdclk_change_post(struct drm_i915_private *dev_priv);
void intel_audio_init(struct drm_i915_private *dev_priv);
void intel_audio_register(struct drm_i915_private *i915);
void intel_audio_deinit(struct drm_i915_private *dev_priv);
void intel_audio_sdp_split_update(const struct intel_crtc_state *crtc_state);

+2 −0
Original line number Diff line number Diff line
@@ -540,6 +540,8 @@ void intel_display_driver_register(struct drm_i915_private *i915)

	intel_display_driver_enable_user_access(i915);

	intel_audio_register(i915);

	intel_display_debugfs_register(i915);

	/*
+18 −0
Original line number Diff line number Diff line
@@ -255,6 +255,7 @@ struct i915_execbuffer {
	struct intel_context *context; /* logical state for the request */
	struct i915_gem_context *gem_context; /** caller's context */
	intel_wakeref_t wakeref;
	intel_wakeref_t wakeref_gt0;

	/** our requests to build */
	struct i915_request *requests[MAX_ENGINE_INSTANCE + 1];
@@ -2685,6 +2686,7 @@ static int
eb_select_engine(struct i915_execbuffer *eb)
{
	struct intel_context *ce, *child;
	struct intel_gt *gt;
	unsigned int idx;
	int err;

@@ -2708,10 +2710,17 @@ eb_select_engine(struct i915_execbuffer *eb)
		}
	}
	eb->num_batches = ce->parallel.number_children + 1;
	gt = ce->engine->gt;

	for_each_child(ce, child)
		intel_context_get(child);
	eb->wakeref = intel_gt_pm_get(ce->engine->gt);
	/*
	 * Keep GT0 active on MTL so that i915_vma_parked() doesn't
	 * free VMAs while execbuf ioctl is validating VMAs.
	 */
	if (gt->info.id)
		eb->wakeref_gt0 = intel_gt_pm_get(to_gt(gt->i915));

	if (!test_bit(CONTEXT_ALLOC_BIT, &ce->flags)) {
		err = intel_context_alloc_state(ce);
@@ -2750,6 +2759,9 @@ eb_select_engine(struct i915_execbuffer *eb)
	return err;

err:
	if (gt->info.id)
		intel_gt_pm_put(to_gt(gt->i915), eb->wakeref_gt0);

	intel_gt_pm_put(ce->engine->gt, eb->wakeref);
	for_each_child(ce, child)
		intel_context_put(child);
@@ -2763,6 +2775,12 @@ eb_put_engine(struct i915_execbuffer *eb)
	struct intel_context *child;

	i915_vm_put(eb->context->vm);
	/*
	 * This works in conjunction with eb_select_engine() to prevent
	 * i915_vma_parked() from interfering while execbuf validates vmas.
	 */
	if (eb->gt->info.id)
		intel_gt_pm_put(to_gt(eb->gt->i915), eb->wakeref_gt0);
	intel_gt_pm_put(eb->context->engine->gt, eb->wakeref);
	for_each_child(eb->context, child)
		intel_context_put(child);
+3 −1
Original line number Diff line number Diff line
@@ -284,7 +284,9 @@ bool i915_gem_object_has_iomem(const struct drm_i915_gem_object *obj);
static inline bool
i915_gem_object_is_shrinkable(const struct drm_i915_gem_object *obj)
{
	return i915_gem_object_type_has(obj, I915_GEM_OBJECT_IS_SHRINKABLE);
	/* TODO: make DPT shrinkable when it has no bound vmas */
	return i915_gem_object_type_has(obj, I915_GEM_OBJECT_IS_SHRINKABLE) &&
		!obj->is_dpt;
}

static inline bool
Loading