Hi Mark, list. I am a bit confused with the code for the I2C bus(ses), especially in a multiple heads environment.
The current code use the extended registers 0x3e, 0x3f in order to implement the I2C's functions I2CPutBits and I2CGetBits, but I think that the second head should use actually the registers 0x36 and 0x37. Am I correct? If yes, following patch should fix that. Cheers, -- Ducrot Bruno http://www.poupinou.org Page profaissionelle http://toto.tu-me-saoules.com Haume page
diff -Naur xc/programs/Xserver/hw/xfree86/drivers/nv.old/nv_dac.c xc/programs/Xserver/hw/xfree86/drivers/nv/nv_dac.c --- xc/programs/Xserver/hw/xfree86/drivers/nv.old/nv_dac.c Mon Oct 14 20:22:45 2002 +++ xc/programs/Xserver/hw/xfree86/drivers/nv/nv_dac.c Mon Nov 25 15:36:42 2002 @@ -320,13 +320,16 @@ { NVPtr pNv = NVPTR(pScrn); unsigned char val; + unsigned char cr; + + cr = pNv->SecondCRTC ? 0x36 : 0x3e; /* wait for Vsync */ while(VGA_RD08(pNv->riva.PCIO, 0x3da) & 0x08); while(!(VGA_RD08(pNv->riva.PCIO, 0x3da) & 0x08)); /* Get the result */ - VGA_WR08(pNv->riva.PCIO, 0x3d4, 0x3e); + VGA_WR08(pNv->riva.PCIO, 0x3d4, cr); val = VGA_RD08(pNv->riva.PCIO, 0x3d5); DEBUG(ErrorF("NV_ddc1Read(%p,...) returns %d\n", pScrn, val)); @@ -338,9 +341,12 @@ { NVPtr pNv = NVPTR(xf86Screens[b->scrnIndex]); unsigned char val; + unsigned char cr; + + cr = pNv->SecondCRTC ? 0x36 : 0x3e; /* Get the result. */ - VGA_WR08(pNv->riva.PCIO, 0x3d4, 0x3e); + VGA_WR08(pNv->riva.PCIO, 0x3d4, cr); val = VGA_RD08(pNv->riva.PCIO, 0x3d5); *clock = (val & DDC_SCL_READ_MASK) != 0; @@ -354,8 +360,11 @@ { NVPtr pNv = NVPTR(xf86Screens[b->scrnIndex]); unsigned char val; + unsigned char cr; + + cr = pNv->SecondCRTC ? 0x37 : 0x3f; - VGA_WR08(pNv->riva.PCIO, 0x3d4, 0x3f); + VGA_WR08(pNv->riva.PCIO, 0x3d4, cr); val = VGA_RD08(pNv->riva.PCIO, 0x3d5) & 0xf0; if (clock) val |= DDC_SCL_WRITE_MASK; @@ -367,7 +376,7 @@ else val &= ~DDC_SDA_WRITE_MASK; - VGA_WR08(pNv->riva.PCIO, 0x3d4, 0x3f); + VGA_WR08(pNv->riva.PCIO, 0x3d4, cr); VGA_WR08(pNv->riva.PCIO, 0x3d5, val | 0x1); DEBUG(ErrorF("NV_I2CPutBits(%p, %d, %d) val=0x%x\n", b, clock, data, val));