mirror of
https://github.com/torvalds/linux
synced 2024-11-05 18:23:50 +00:00
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 186ecad21c
("drm/nv50/disp: move remaining interrupt handling into core").
Reported-by: J Binder <wheel@herr-der-mails.de>
Reported-by: Pontus Fuchs <pontus.fuchs@gmail.com>
Reported-by: Sune Mølgaard <sune@molgaard.org>
Signed-off-by: Marcin Slusarz <marcin.slusarz@gmail.com>
Tested-by: Marcin Slusarz <marcin.slusarz@gmail.com>
Tested-by: Sune Mølgaard <sune@molgaard.org>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
parent
f20ebd034e
commit
c684cef795
1 changed files with 26 additions and 20 deletions
|
@ -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,
|
||||||
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)
|
||||||
|
|
Loading…
Reference in a new issue