ref: d55bcedd72dae2af3849c127365c1f828d059fba
parent: 6fbb3c30e1e9643a93fee95eaf0943f4e06328dc
author: qwx <qwx@sciops.net>
date: Mon Jun 20 19:49:05 EDT 2022
igfx: minimize changes a bit two external monitors here: one miniDP→DP, one VGA→DP the second has never worked. this might be the only remaining thing to make this work on notmymachines
--- a/igfx-linktraining-fix
+++ b/igfx-linktraining-fix
@@ -1,4 +1,4 @@
-diff f0fc84aba3a40557539e7c014454b916a101759d uncommitted
+diff 7ca997bf7efdca16416b22488ebc7b70c419fd44 uncommitted
--- a/sys/src/cmd/aux/vga/igfx.c
+++ b/sys/src/cmd/aux/vga/igfx.c
@@ -1090,8 +1090,6 @@
@@ -33,7 +33,7 @@
if(igfx->dp[port-PortDPA].hdmi){
/* hdmi: do not configure displayport */
r->a = 0;
-@@ -1556,12 +1553,11 @@
+@@ -1556,9 +1553,6 @@
{
int i;
@@ -43,12 +43,7 @@
/* disable displayport transcoder */
if(igfx->type == TypeHSW){
csr(igfx, t->dpctl.a, 15<<28, 0);
-+ csr(igfx, t->dpctl.a, 0, 1<<31); /* workaround */
-+ csr(igfx, t->dpctl.a, 1<<31, 0);
- csr(igfx, t->ht.a, ~0, 0);
- csr(igfx, t->hb.a, ~0, 0);
- csr(igfx, t->hs.a, ~0, 0);
-@@ -1582,6 +1578,9 @@
+@@ -1582,6 +1576,9 @@
/* workaround: clear timing override bit */
csr(igfx, t->chicken.a, 1<<31, 0);
@@ -58,7 +53,17 @@
/* disable dpll */
if(igfx->type != TypeHSW && t->dpll != nil)
csr(igfx, t->dpll->ctrl.a, 1<<31, 0);
-@@ -1781,6 +1780,7 @@
+@@ -1766,6 +1763,9 @@
+ csr(igfx, igfx->dpll[x].ctrl.a, 1<<31, 0);
+ }
+
++ /* program lcd power */
++ loadreg(igfx, igfx->ppcontrol);
++
+ /* program new clock sources */
+ loadreg(igfx, igfx->rawclkfreq);
+ loadreg(igfx, igfx->drefctl);
+@@ -1781,6 +1781,7 @@
/* new dpll setting */
for(x=0; x<nelem(igfx->dpllsel); x++)
loadreg(igfx, igfx->dpllsel[x]);
@@ -66,7 +71,7 @@
/* program all pipes */
for(x = 0; x < igfx->npipe; x++)
-@@ -1794,11 +1794,23 @@
+@@ -1794,16 +1795,25 @@
loadreg(igfx, igfx->sdvob);
loadreg(igfx, igfx->sdvoc);
for(x = 0; x < nelem(igfx->dp); x++){
@@ -73,24 +78,29 @@
+ if((igfx->dp[x].ctl.a == 0 || (igfx->dp[x].ctl.v & 1<<31) == 0) && !igfx->dp[x].hdmi)
+ continue;
+ if(!igfx->dp[x].hdmi){
-+ igfx->dp[x].ctl.v &= ~(7<<8); /* arm pattern 1 */
++ igfx->dp[x].ctl.v &= ~(7<<8); /* arm pattern 1 */
+ loadreg(igfx, igfx->dp[x].ctl);
+ }
for(y=0; y<nelem(igfx->dp[x].buftrans); y++)
loadreg(igfx, igfx->dp[x].buftrans[y]);
-+ sleep(500);
++ sleep(100);
loadreg(igfx, igfx->dp[x].bufctl);
-+ sleep(1000);
++ sleep(500); /* needs to take a breath before training */
if(enabledp(igfx, &igfx->dp[x]) < 0)
ctlr->flag |= Ferror;
+ if(!igfx->dp[x].hdmi){
-+ igfx->dp[x].ctl.v |= 3<<8; /* send normal pixels */
++ igfx->dp[x].ctl.v |= 3<<8; /* send normal pixels */
+ loadreg(igfx, igfx->dp[x].ctl);
+ }
}
- /* program lcd power */
-@@ -2138,7 +2150,7 @@
+- /* program lcd power */
+- loadreg(igfx, igfx->ppcontrol);
+-
+ ctlr->flag |= Fload;
+ }
+
+@@ -2138,7 +2148,7 @@
buf[1] = addr >> 8;
buf[2] = addr;
buf[3] = len-1;
@@ -99,7 +109,7 @@
if(data != nil && len > 0){
if((cmd & CmdRead) == 0)
memmove(buf+4, data, len);
-@@ -2188,13 +2200,13 @@
+@@ -2188,13 +2198,13 @@
if((dp->ctl.v & (1<<31)) == 0)
return 0;
@@ -107,19 +117,19 @@
- if(igfx->type == TypeHSW && dp == &igfx->dp[0])
- goto Skip;
-
-+ int try2 = 0;
/* Link configuration */
- wdpaux(igfx, dp, 0x100, (270*MHz) / 27000000);
- w = dp->ctl.v >> (igfx->type == TypeHSW ? 1 : 19) & 7;
-+ while(try2 < 32 && wdpaux(igfx, dp, 0x100, (270*MHz) / 27000000) < 0){
-+ try2++;
-+ sleep(100);
-+ }
++ for(try=0; try<30; try++)
++ if(wdpaux(igfx, dp, 0x100, (270*MHz) / 27000000) >= 0)
++ break;
++ if(try >= 30)
++ trace("can\'t start training\n");
+ w = dp->bufctl.v >> (igfx->type == TypeHSW ? 1 : 19) & 7;
wdpaux(igfx, dp, 0x101, w+1);
r = 0;
-@@ -2244,12 +2256,10 @@
+@@ -2244,11 +2254,8 @@
break;
}
}
@@ -130,7 +140,5 @@
- dp->ctl.v |= 3<<8;
- loadreg(igfx, dp->ctl);
wdpaux(igfx, dp, 0x102, 0x00);
-+ fprint(2, "ctl %08#p a %08#ux v %08#ux\n", &dp->ctl, dp->ctl.a, dp->ctl.v);
return 1;
- Fail: