Commit 0ad679d1 authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau/kms/gt215-: fix race with audio driver runpm



The audio driver can call into nouveau right while we're in the middle
of re-fetching the EDID, and decide it no longer needs to be awake.

Stop depending on EDID in the audio component get_eld() callback, and
instead cache whether audio support is present from the prior modeset.

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent a1ef8bad
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -510,7 +510,7 @@ nv50_audio_component_get_eld(struct device *kdev, int port, int dev_id,
		if (!nv_connector || !nv_crtc || nv_encoder->or != port ||
		    nv_crtc->index != dev_id)
			continue;
		*enabled = drm_detect_monitor_audio(nv_connector->edid);
		*enabled = nv_encoder->audio;
		if (*enabled) {
			ret = drm_eld_size(nv_connector->base.eld);
			memcpy(buf, nv_connector->base.eld,
@@ -600,6 +600,7 @@ nv50_audio_disable(struct drm_encoder *encoder, struct nouveau_crtc *nv_crtc)
				(0x0100 << nv_crtc->index),
	};

	nv_encoder->audio = false;
	nvif_mthd(&disp->disp->object, 0, &args, sizeof(args));

	nv50_audio_component_eld_notify(drm->audio.component, nv_encoder->or,
@@ -636,6 +637,7 @@ nv50_audio_enable(struct drm_encoder *encoder, struct drm_display_mode *mode)

	nvif_mthd(&disp->disp->object, 0, &args,
		  sizeof(args.base) + drm_eld_size(args.data));
	nv_encoder->audio = true;

	nv50_audio_component_eld_notify(drm->audio.component, nv_encoder->or,
					nv_crtc->index);
+1 −0
Original line number Diff line number Diff line
@@ -52,6 +52,7 @@ struct nouveau_encoder {
	 * actually programmed on the hw, not the proposed crtc */
	struct drm_crtc *crtc;
	u32 ctrl;
	bool audio;

	struct drm_display_mode mode;
	int last_dpms;