Commit c684cef7 authored by Marcin Slusarz's avatar Marcin Slusarz Committed by Ben Skeggs

drm/nv50/disp: fix selection of bios script for analog outputs

Analog output number was overwritten by value from digital output path.
Fix it.

Fixes resume from s2ram: https://bugs.freedesktop.org/show_bug.cgi?id=58729
(as stumbled on by J Binder, Pontus Fuchs and me)
Fixes blank screen on module load (reported by Sune Mølgaard).

Fixes regression from commit 186ecad2
("drm/nv50/disp: move remaining interrupt handling into core").
Reported-by: default avatarJ Binder <wheel@herr-der-mails.de>
Reported-by: default avatarPontus Fuchs <pontus.fuchs@gmail.com>
Reported-by: default avatarSune Mølgaard <sune@molgaard.org>
Signed-off-by: default avatarMarcin Slusarz <marcin.slusarz@gmail.com>
Tested-by: default avatarMarcin Slusarz <marcin.slusarz@gmail.com>
Tested-by: default avatarSune Mølgaard <sune@molgaard.org>
Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent f20ebd03
...@@ -851,20 +851,23 @@ exec_script(struct nv50_disp_priv *priv, int head, int id) ...@@ -851,20 +851,23 @@ exec_script(struct nv50_disp_priv *priv, int head, int id)
for (i = 0; !(ctrl & (1 << head)) && i < 3; i++) for (i = 0; !(ctrl & (1 << head)) && i < 3; i++)
ctrl = nv_rd32(priv, 0x610b5c + (i * 8)); ctrl = nv_rd32(priv, 0x610b5c + (i * 8));
if (nv_device(priv)->chipset < 0x90 || if (!(ctrl & (1 << head))) {
nv_device(priv)->chipset == 0x92 || if (nv_device(priv)->chipset < 0x90 ||
nv_device(priv)->chipset == 0xa0) { nv_device(priv)->chipset == 0x92 ||
for (i = 0; !(ctrl & (1 << head)) && i < 2; i++) nv_device(priv)->chipset == 0xa0) {
ctrl = nv_rd32(priv, 0x610b74 + (i * 8)); for (i = 0; !(ctrl & (1 << head)) && i < 2; i++)
i += 3; ctrl = nv_rd32(priv, 0x610b74 + (i * 8));
} else { i += 4;
for (i = 0; !(ctrl & (1 << head)) && i < 4; i++) } else {
ctrl = nv_rd32(priv, 0x610798 + (i * 8)); for (i = 0; !(ctrl & (1 << head)) && i < 4; i++)
i += 3; ctrl = nv_rd32(priv, 0x610798 + (i * 8));
i += 4;
}
} }
if (!(ctrl & (1 << head))) if (!(ctrl & (1 << head)))
return false; return false;
i--;
data = exec_lookup(priv, head, i, ctrl, &dcb, &ver, &hdr, &cnt, &len, &info); data = exec_lookup(priv, head, i, ctrl, &dcb, &ver, &hdr, &cnt, &len, &info);
if (data) { if (data) {
...@@ -898,20 +901,23 @@ exec_clkcmp(struct nv50_disp_priv *priv, int head, int id, u32 pclk, ...@@ -898,20 +901,23 @@ exec_clkcmp(struct nv50_disp_priv *priv, int head, int id, u32 pclk,
for (i = 0; !(ctrl & (1 << head)) && i < 3; i++) for (i = 0; !(ctrl & (1 << head)) && i < 3; i++)
ctrl = nv_rd32(priv, 0x610b58 + (i * 8)); ctrl = nv_rd32(priv, 0x610b58 + (i * 8));
if (nv_device(priv)->chipset < 0x90 || if (!(ctrl & (1 << head))) {
nv_device(priv)->chipset == 0x92 || if (nv_device(priv)->chipset < 0x90 ||
nv_device(priv)->chipset == 0xa0) { nv_device(priv)->chipset == 0x92 ||
for (i = 0; !(ctrl & (1 << head)) && i < 2; i++) nv_device(priv)->chipset == 0xa0) {
ctrl = nv_rd32(priv, 0x610b70 + (i * 8)); for (i = 0; !(ctrl & (1 << head)) && i < 2; i++)
i += 3; ctrl = nv_rd32(priv, 0x610b70 + (i * 8));
} else { i += 4;
for (i = 0; !(ctrl & (1 << head)) && i < 4; i++) } else {
ctrl = nv_rd32(priv, 0x610794 + (i * 8)); for (i = 0; !(ctrl & (1 << head)) && i < 4; i++)
i += 3; ctrl = nv_rd32(priv, 0x610794 + (i * 8));
i += 4;
}
} }
if (!(ctrl & (1 << head))) if (!(ctrl & (1 << head)))
return 0x0000; return 0x0000;
i--;
data = exec_lookup(priv, head, i, ctrl, outp, &ver, &hdr, &cnt, &len, &info1); data = exec_lookup(priv, head, i, ctrl, outp, &ver, &hdr, &cnt, &len, &info1);
if (!data) if (!data)
......
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