ref: cfdbf5977b2b0b74f02c3b5bbeddde570fa75aee
dir: /igfx-linktraining-fix/
diff 990ceeef3bfd9d56e2e6dd39cf5ac185b1a2de08 uncommitted --- a/sys/src/cmd/aux/vga/igfx.c +++ b/sys/src/cmd/aux/vga/igfx.c @@ -1133,8 +1133,6 @@ if((val = dbattr(m->attr, "display")) != nil){ port = atoi(val)-1; - if(igfx->type == TypeHSW && !igfx->dp[port-PortDPA].hdmi) - bpc = 6; }else if(dbattr(m->attr, "lcd") != nil) port = PortLCD; else @@ -1217,7 +1215,7 @@ /* displayport SST mode */ r->v &= ~(1<<27); /* link not in training, send normal pixels */ - r->v |= 3<<8; + r->v &= ~(7<<8); /* enable with pat1 armed */ if(igfx->dp[port-PortDPA].hdmi){ /* hdmi: do not configure displayport */ r->a = 0; @@ -1434,6 +1432,20 @@ sleep(5); } + /* program plane */ + loadreg(igfx, p->dsp->cntr); + loadreg(igfx, p->dsp->linoff); + loadreg(igfx, p->dsp->stride); + loadreg(igfx, p->dsp->tileoff); + loadreg(igfx, p->dsp->size); + loadreg(igfx, p->dsp->pos); + loadreg(igfx, p->dsp->surf); /* arm */ + loadreg(igfx, p->dsp->leftsurf); + + /* enable planes */ + p->conf.v &= ~(3<<18); + loadreg(igfx, p->conf); + /* image size (vga needs to be off) */ loadreg(igfx, p->src); @@ -1451,27 +1463,11 @@ /* enable cpu pipe */ loadtrans(igfx, p); - /* program plane */ - loadreg(igfx, p->dsp->cntr); - loadreg(igfx, p->dsp->linoff); - loadreg(igfx, p->dsp->stride); - loadreg(igfx, p->dsp->tileoff); - loadreg(igfx, p->dsp->size); - loadreg(igfx, p->dsp->pos); - loadreg(igfx, p->dsp->surf); /* arm */ - loadreg(igfx, p->dsp->leftsurf); - /* program cursor */ loadreg(igfx, p->cur->cntr); loadreg(igfx, p->cur->pos); loadreg(igfx, p->cur->base); /* arm */ - /* enable planes */ - if(igfx->type == TypeG45) { - p->conf.v &= ~(3<<18); - loadreg(igfx, p->conf); - } - if(p->fdi->rxctl.a != 0){ /* enable fdi */ loadreg(igfx, p->fdi->rxtu[1]); @@ -1755,7 +1751,6 @@ wr(igfx, igfx->pipe[0].dsp->surf.a, 0); /* arm */ csr(igfx, igfx->pipe[0].conf.a, 0, 3<<18); } - if(igfx->type == TypeHSW){ /* deselect port clock */ for(x=0; x<nelem(igfx->dpllsel); x++) @@ -1782,6 +1777,22 @@ for(x=0; x<nelem(igfx->dpllsel); x++) loadreg(igfx, igfx->dpllsel[x]); + for(x = 0; x < nelem(igfx->dp); x++){ + if(igfx->dp[x].ctl.a == 0 || (igfx->dp[x].ctl.v & 1<<31) == 0) + continue; + 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(100); + loadreg(igfx, igfx->dp[x].bufctl); + sleep(500); + if(enabledp(igfx, &igfx->dp[x]) < 0) + ctlr->flag |= Ferror; + igfx->dp[x].ctl.v |= 3<<8; + loadreg(igfx, igfx->dp[x].ctl); + } + /* program all pipes */ for(x = 0; x < igfx->npipe; x++) enablepipe(igfx, x); @@ -1793,13 +1804,6 @@ loadreg(igfx, igfx->adpa); loadreg(igfx, igfx->sdvob); loadreg(igfx, igfx->sdvoc); - for(x = 0; x < nelem(igfx->dp); x++){ - for(y=0; y<nelem(igfx->dp[x].buftrans); y++) - loadreg(igfx, igfx->dp[x].buftrans[y]); - loadreg(igfx, igfx->dp[x].bufctl); - if(enabledp(igfx, &igfx->dp[x]) < 0) - ctlr->flag |= Ferror; - } /* program lcd power */ loadreg(igfx, igfx->ppcontrol); @@ -2138,7 +2142,7 @@ buf[1] = addr >> 8; buf[2] = addr; buf[3] = len-1; - r = 3; + r = 3; if(data != nil && len > 0){ if((cmd & CmdRead) == 0) memmove(buf+4, data, len); @@ -2188,13 +2192,13 @@ if((dp->ctl.v & (1<<31)) == 0) return 0; - /* FIXME: always times out */ - 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); + } + w = dp->bufctl.v >> (igfx->type == TypeHSW ? 1 : 19) & 7; wdpaux(igfx, dp, 0x101, w+1); r = 0; @@ -2244,11 +2248,12 @@ break; } } -Skip: /* stop training */ - dp->ctl.v &= ~(7<<8); - dp->ctl.v |= 3<<8; - loadreg(igfx, dp->ctl); + if(dp != &igfx->dp[0]){ // eDP: done later + dp->ctl.v &= ~(7<<8); + dp->ctl.v |= 3<<8; + loadreg(igfx, dp->ctl); + } wdpaux(igfx, dp, 0x102, 0x00); return 1;