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: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
parent
a1ef8bad50
commit
0ad679d157
|
@ -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)
|
||||||
(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)
|
||||||
|
|
||||||
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 {
|
||||||
* 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;
|
||||||
|
|
Loading…
Reference in New Issue