summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/g80_display.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/src/g80_display.c b/src/g80_display.c
index a79c1e1..e56fb78 100644
--- a/src/g80_display.c
+++ b/src/g80_display.c
@@ -293,18 +293,21 @@ Bool
G80DispPreInit(ScrnInfoPtr pScrn)
{
G80Ptr pNv = G80PTR(pScrn);
+ xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
/* nouveau guys dont know what this does */
pNv->reg[0x00610184/4] = pNv->reg[0x00614004/4];
/* CRTC capabilities */
- pNv->reg[0x00610190/4] = pNv->reg[0x00616100/4];
- pNv->reg[0x006101a0/4] = pNv->reg[0x00616900/4];
- pNv->reg[0x00610194/4] = pNv->reg[0x00616104/4];
- pNv->reg[0x006101a4/4] = pNv->reg[0x00616904/4];
- pNv->reg[0x00610198/4] = pNv->reg[0x00616108/4];
- pNv->reg[0x006101a8/4] = pNv->reg[0x00616908/4];
- pNv->reg[0x0061019C/4] = pNv->reg[0x0061610C/4];
- pNv->reg[0x006101ac/4] = pNv->reg[0x0061690c/4];
+ for(int i = 0; i < xf86_config->num_crtc; i++) {
+ xf86CrtcPtr crtc = xf86_config->crtc[i];
+ const int headOff = 0x800 * G80CrtcGetHead(crtc);
+
+ /* Some photos of G80 cards had more than two of these, I think this can be justified */
+ pNv->reg[(0x00610190 + (G80CrtcGetHead(crtc) * 0x10))/4] = pNv->reg[(0x00616100 + headOff)/4];
+ pNv->reg[(0x00610194 + (G80CrtcGetHead(crtc) * 0x10))/4] = pNv->reg[(0x00616104 + headOff)/4];
+ pNv->reg[(0x00610198 + (G80CrtcGetHead(crtc) * 0x10))/4] = pNv->reg[(0x00616108 + headOff)/4];
+ pNv->reg[(0x0061019C + (G80CrtcGetHead(crtc) * 0x10))/4] = pNv->reg[(0x0061610C + headOff)/4];
+ }
/* DAC capabilities */
pNv->reg[0x006101D0/4] = pNv->reg[0x0061A000/4];
pNv->reg[0x006101D4/4] = pNv->reg[0x0061A800/4];