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

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
...@@ -510,7 +510,7 @@ nv50_audio_component_get_eld(struct device *kdev, int port, int dev_id, ...@@ -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 || if (!nv_connector || !nv_crtc || nv_encoder->or != port ||
nv_crtc->index != dev_id) nv_crtc->index != dev_id)
continue; continue;
*enabled = drm_detect_monitor_audio(nv_connector->edid); *enabled = nv_encoder->audio;
if (*enabled) { if (*enabled) {
ret = drm_eld_size(nv_connector->base.eld); ret = drm_eld_size(nv_connector->base.eld);
memcpy(buf, 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) ...@@ -600,6 +600,7 @@ nv50_audio_disable(struct drm_encoder *encoder, struct nouveau_crtc *nv_crtc)
(0x0100 << nv_crtc->index), (0x0100 << nv_crtc->index),
}; };
nv_encoder->audio = false;
nvif_mthd(&disp->disp->object, 0, &args, sizeof(args)); nvif_mthd(&disp->disp->object, 0, &args, sizeof(args));
nv50_audio_component_eld_notify(drm->audio.component, nv_encoder->or, 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) ...@@ -636,6 +637,7 @@ nv50_audio_enable(struct drm_encoder *encoder, struct drm_display_mode *mode)
nvif_mthd(&disp->disp->object, 0, &args, nvif_mthd(&disp->disp->object, 0, &args,
sizeof(args.base) + drm_eld_size(args.data)); sizeof(args.base) + drm_eld_size(args.data));
nv_encoder->audio = true;
nv50_audio_component_eld_notify(drm->audio.component, nv_encoder->or, nv50_audio_component_eld_notify(drm->audio.component, nv_encoder->or,
nv_crtc->index); nv_crtc->index);
......
...@@ -52,6 +52,7 @@ struct nouveau_encoder { ...@@ -52,6 +52,7 @@ struct nouveau_encoder {
* actually programmed on the hw, not the proposed crtc */ * actually programmed on the hw, not the proposed crtc */
struct drm_crtc *crtc; struct drm_crtc *crtc;
u32 ctrl; u32 ctrl;
bool audio;
struct drm_display_mode mode; struct drm_display_mode mode;
int last_dpms; int last_dpms;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment