src/nouveau_channel.c |    7 
 src/nouveau_xv.c      |   13 
 src/nv30_exa.c        |   29 +
 src/nv30_shaders.c    |  126 ++-----
 src/nv30_shaders.h    |    2 
 src/nv30_xv_tex.c     |   11 
 src/nv40_exa.c        |   32 +
 src/nv40_xv_tex.c     |   11 
 src/nv_accel_common.c |   29 +
 src/nv_bios.c         |  869 +++++++++++++++++++++-----------------------------
 src/nv_crtc.c         |  526 +++++++++++++-----------------
 src/nv_driver.c       |  264 ++++++---------
 src/nv_hw.c           |  314 +++++++++---------
 src/nv_output.c       |  115 ++----
 src/nv_proto.h        |   26 -
 src/nv_setup.c        |  124 +++----
 src/nv_type.h         |    5 
 src/nvreg.h           |  219 ++++++++----
 18 files changed, 1326 insertions(+), 1396 deletions(-)

New commits:
commit cea05e14f94dcb842adbfcec515e17e9f5655089
Author: Stuart Bennett <[EMAIL PROTECTED]>
Date:   Sun Oct 26 03:51:36 2008 +0000

    randr12: make colour-map setting less complex

diff --git a/src/nv_crtc.c b/src/nv_crtc.c
index c069b57..59db4be 100644
--- a/src/nv_crtc.c
+++ b/src/nv_crtc.c
@@ -1060,48 +1060,47 @@ static void nv_crtc_unlock(xf86CrtcPtr crtc)
 {
 }
 
+#define DEPTH_SHIFT(val, w) ((val << (8 - w)) | (val >> ((w << 1) - 8)))
+
 static void
 nv_crtc_gamma_set(xf86CrtcPtr crtc, CARD16 *red, CARD16 *green, CARD16 *blue,
                                        int size)
 {
        struct nouveau_crtc *nv_crtc = to_nouveau_crtc(crtc);
-       ScrnInfoPtr pScrn = crtc->scrn;
-       NVPtr pNv = NVPTR(pScrn);
-       NVCrtcRegPtr regp = &pNv->ModeReg.crtc_reg[nv_crtc->head];
-       int i, j;
+       NVPtr pNv = NVPTR(crtc->scrn);
+       struct rgb { uint8_t r, g, b; } __attribute__((packed)) *rgbs;
+       int i;
 
-       switch (pScrn->depth) {
+       rgbs = (struct rgb *)pNv->ModeReg.crtc_reg[nv_crtc->head].DAC;
+
+       switch (crtc->scrn->depth) {
        case 15:
                /* R5G5B5 */
-               /* We've got 5 bit (32 values) colors and 256 registers for 
each color */
-               for (i = 0; i < 32; i++)
-                       for (j = 0; j < 8; j++) {
-                               regp->DAC[(i*8 + j) * 3 + 0] = red[i] >> 8;
-                               regp->DAC[(i*8 + j) * 3 + 1] = green[i] >> 8;
-                               regp->DAC[(i*8 + j) * 3 + 2] = blue[i] >> 8;
-                       }
+               /* spread 5 bits per colour (32 colours) over 256 (per colour) 
registers */
+               for (i = 0; i < 32; i++) {
+                       rgbs[DEPTH_SHIFT(i, 5)].r = red[i] >> 8;
+                       rgbs[DEPTH_SHIFT(i, 5)].g = green[i] >> 8;
+                       rgbs[DEPTH_SHIFT(i, 5)].b = blue[i] >> 8;
+               }
                break;
        case 16:
                /* R5G6B5 */
-               /* First deal with the 5 bit colors */
-               for (i = 0; i < 32; i++)
-                       for (j = 0; j < 8; j++) {
-                               regp->DAC[(i*8 + j) * 3 + 0] = red[i] >> 8;
-                               regp->DAC[(i*8 + j) * 3 + 2] = blue[i] >> 8;
+               for (i = 0; i < 64; i++) {
+                       /* set 64 regs for green's 6 bits of colour */
+                       rgbs[DEPTH_SHIFT(i, 6)].g = green[i] >> 8;
+                       if (i < 32) {
+                               rgbs[DEPTH_SHIFT(i, 5)].r = red[i] >> 8;
+                               rgbs[DEPTH_SHIFT(i, 5)].b = blue[i] >> 8;
                        }
-               /* Now deal with the 6 bit color */
-               for (i = 0; i < 64; i++)
-                       for (j = 0; j < 4; j++)
-                               regp->DAC[(i*4 + j) * 3 + 1] = green[i] >> 8;
+               }
                break;
        default:
                /* R8G8B8 */
                for (i = 0; i < 256; i++) {
-                       regp->DAC[i * 3] = red[i] >> 8;
-                       regp->DAC[(i * 3) + 1] = green[i] >> 8;
-                       regp->DAC[(i * 3) + 2] = blue[i] >> 8;
+                       rgbs[i].r = red[i] >> 8;
+                       rgbs[i].g = green[i] >> 8;
+                       rgbs[i].b = blue[i] >> 8;
                }
-               break;
        }
 
        nv_crtc_load_state_palette(crtc, &pNv->ModeReg);

commit 0e4b01a5e06d8b5323c010ce89723369f17b10b2
Author: Stuart Bennett <[EMAIL PROTECTED]>
Date:   Sat Oct 25 02:11:37 2008 +0100

    randr12: convenience functions for vga crtc state access

diff --git a/src/nv_crtc.c b/src/nv_crtc.c
index 10ee1d6..c069b57 100644
--- a/src/nv_crtc.c
+++ b/src/nv_crtc.c
@@ -70,6 +70,19 @@ static void NVCrtcWriteRAMDAC(xf86CrtcPtr crtc, uint32_t 
reg, uint32_t val)
        NVWriteRAMDAC(pNv, nv_crtc->head, reg, val);
 }
 
+static void crtc_rd_cio_state(xf86CrtcPtr crtc, NVCrtcRegPtr crtcstate, int 
index)
+{
+       crtcstate->CRTC[index] = NVReadVgaCrtc(NVPTR(crtc->scrn),
+                                              to_nouveau_crtc(crtc)->head,
+                                              index);
+}
+
+static void crtc_wr_cio_state(xf86CrtcPtr crtc, NVCrtcRegPtr crtcstate, int 
index)
+{
+       NVWriteVgaCrtc(NVPTR(crtc->scrn), to_nouveau_crtc(crtc)->head, index,
+                      crtcstate->CRTC[index]);
+}
+
 /* Even though they are not yet used, i'm adding some notes about some of the 
0x4000 regs */
 /* They are only valid for NV4x, appearantly reordered for NV5x */
 /* gpu pll: 0x4000 + 0x4004
@@ -168,24 +181,24 @@ static void nv_crtc_cursor_set(xf86CrtcPtr crtc)
        NVPtr pNv = NVPTR(crtc->scrn);
        struct nouveau_crtc *nv_crtc = to_nouveau_crtc(crtc);
        uint32_t cursor_start;
-       uint8_t *CRTC = pNv->ModeReg.crtc_reg[nv_crtc->head].CRTC;
+       NVCrtcRegPtr regp = &pNv->ModeReg.crtc_reg[nv_crtc->head];
 
        if (pNv->Architecture == NV_ARCH_04)
                cursor_start = 0x5E00 << 2;
        else
                cursor_start = nv_crtc->head ? pNv->Cursor2->offset : 
pNv->Cursor->offset;
 
-       CRTC[NV_CIO_CRE_HCUR_ADDR0_INDEX] = cursor_start >> 17;
+       regp->CRTC[NV_CIO_CRE_HCUR_ADDR0_INDEX] = cursor_start >> 17;
        if (pNv->Architecture != NV_ARCH_04)
-               CRTC[NV_CIO_CRE_HCUR_ADDR0_INDEX] |= NV_CIO_CRE_HCUR_ASI;
-       CRTC[NV_CIO_CRE_HCUR_ADDR1_INDEX] = (cursor_start >> 11) << 2;
+               regp->CRTC[NV_CIO_CRE_HCUR_ADDR0_INDEX] |= NV_CIO_CRE_HCUR_ASI;
+       regp->CRTC[NV_CIO_CRE_HCUR_ADDR1_INDEX] = (cursor_start >> 11) << 2;
        if (crtc->mode.Flags & V_DBLSCAN)
-               CRTC[NV_CIO_CRE_HCUR_ADDR1_INDEX] |= 
NV_CIO_CRE_HCUR_ADDR1_CUR_DBL;
-       CRTC[NV_CIO_CRE_HCUR_ADDR2_INDEX] = cursor_start >> 24;
+               regp->CRTC[NV_CIO_CRE_HCUR_ADDR1_INDEX] |= 
NV_CIO_CRE_HCUR_ADDR1_CUR_DBL;
+       regp->CRTC[NV_CIO_CRE_HCUR_ADDR2_INDEX] = cursor_start >> 24;
 
-       NVWriteVgaCrtc(pNv, nv_crtc->head, NV_CIO_CRE_HCUR_ADDR0_INDEX, 
CRTC[NV_CIO_CRE_HCUR_ADDR0_INDEX]);
-       NVWriteVgaCrtc(pNv, nv_crtc->head, NV_CIO_CRE_HCUR_ADDR1_INDEX, 
CRTC[NV_CIO_CRE_HCUR_ADDR1_INDEX]);
-       NVWriteVgaCrtc(pNv, nv_crtc->head, NV_CIO_CRE_HCUR_ADDR2_INDEX, 
CRTC[NV_CIO_CRE_HCUR_ADDR2_INDEX]);
+       crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_HCUR_ADDR0_INDEX);
+       crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_HCUR_ADDR1_INDEX);
+       crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_HCUR_ADDR2_INDEX);
        if (pNv->Architecture == NV_ARCH_40)
                nv_fix_nv40_hw_cursor(pNv, nv_crtc->head);
 }
@@ -1323,7 +1336,7 @@ static void nv_crtc_load_state_vga(xf86CrtcPtr crtc, 
RIVA_HW_STATE *state)
                NVWriteVgaSeq(pNv, nv_crtc->head, i, regp->Sequencer[i]);
 
        for (i = 0; i < 25; i++)
-               NVWriteVgaCrtc(pNv, nv_crtc->head, i, regp->CRTC[i]);
+               crtc_wr_cio_state(crtc, regp, i);
 
        for (i = 0; i < 9; i++)
                NVWriteVgaGr(pNv, nv_crtc->head, i, regp->Graphics[i]);
@@ -1361,7 +1374,7 @@ static void nv_crtc_load_state_ext(xf86CrtcPtr crtc, 
RIVA_HW_STATE *state)
                nvWriteVIDEO(pNv, NV_PVIDEO_UVPLANE_LIMIT(1), 
pNv->VRAMPhysicalSize - 1);
                nvWriteMC(pNv, NV_PBUS_POWERCTRL_2, 0);
 
-               NVWriteVgaCrtc(pNv, nv_crtc->head, NV_CIO_CRE_21, 
regp->CRTC[NV_CIO_CRE_21]);
+               crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_21);
                NVCrtcWriteCRTC(crtc, NV_CRTC_CURSOR_CONFIG, 
regp->cursorConfig);
                NVCrtcWriteCRTC(crtc, NV_CRTC_0830, regp->unk830);
                NVCrtcWriteCRTC(crtc, NV_CRTC_0834, regp->unk834);
@@ -1382,44 +1395,44 @@ static void nv_crtc_load_state_ext(xf86CrtcPtr crtc, 
RIVA_HW_STATE *state)
        NVCrtcWriteCRTC(crtc, NV_CRTC_CONFIG, regp->config);
        NVCrtcWriteCRTC(crtc, NV_CRTC_GPIO, regp->gpio);
 
-       NVWriteVgaCrtc(pNv, nv_crtc->head, NV_CIO_CRE_RPC0_INDEX, 
regp->CRTC[NV_CIO_CRE_RPC0_INDEX]);
-       NVWriteVgaCrtc(pNv, nv_crtc->head, NV_CIO_CRE_RPC1_INDEX, 
regp->CRTC[NV_CIO_CRE_RPC1_INDEX]);
-       NVWriteVgaCrtc(pNv, nv_crtc->head, NV_CIO_CRE_LSR_INDEX, 
regp->CRTC[NV_CIO_CRE_LSR_INDEX]);
-       NVWriteVgaCrtc(pNv, nv_crtc->head, NV_CIO_CRE_PIXEL_INDEX, 
regp->CRTC[NV_CIO_CRE_PIXEL_INDEX]);
-       NVWriteVgaCrtc(pNv, nv_crtc->head, NV_CIO_CRE_LCD__INDEX, 
regp->CRTC[NV_CIO_CRE_LCD__INDEX]);
-       NVWriteVgaCrtc(pNv, nv_crtc->head, NV_CIO_CRE_HEB__INDEX, 
regp->CRTC[NV_CIO_CRE_HEB__INDEX]);
-       NVWriteVgaCrtc(pNv, nv_crtc->head, NV_CIO_CRE_ENH_INDEX, 
regp->CRTC[NV_CIO_CRE_ENH_INDEX]);
-       NVWriteVgaCrtc(pNv, nv_crtc->head, NV_CIO_CRE_FF_INDEX, 
regp->CRTC[NV_CIO_CRE_FF_INDEX]);
-       NVWriteVgaCrtc(pNv, nv_crtc->head, NV_CIO_CRE_FFLWM__INDEX, 
regp->CRTC[NV_CIO_CRE_FFLWM__INDEX]);
+       crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_RPC0_INDEX);
+       crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_RPC1_INDEX);
+       crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_LSR_INDEX);
+       crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_PIXEL_INDEX);
+       crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_LCD__INDEX);
+       crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_HEB__INDEX);
+       crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_ENH_INDEX);
+       crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_FF_INDEX);
+       crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_FFLWM__INDEX);
        if (pNv->Architecture >= NV_ARCH_30)
-               NVWriteVgaCrtc(pNv, nv_crtc->head, NV_CIO_CRE_47, 
regp->CRTC[NV_CIO_CRE_47]);
+               crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_47);
 
-       NVWriteVgaCrtc(pNv, nv_crtc->head, NV_CIO_CRE_HCUR_ADDR0_INDEX, 
regp->CRTC[NV_CIO_CRE_HCUR_ADDR0_INDEX]);
-       NVWriteVgaCrtc(pNv, nv_crtc->head, NV_CIO_CRE_HCUR_ADDR1_INDEX, 
regp->CRTC[NV_CIO_CRE_HCUR_ADDR1_INDEX]);
-       NVWriteVgaCrtc(pNv, nv_crtc->head, NV_CIO_CRE_HCUR_ADDR2_INDEX, 
regp->CRTC[NV_CIO_CRE_HCUR_ADDR2_INDEX]);
+       crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_HCUR_ADDR0_INDEX);
+       crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_HCUR_ADDR1_INDEX);
+       crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_HCUR_ADDR2_INDEX);
        if (pNv->Architecture == NV_ARCH_40)
                nv_fix_nv40_hw_cursor(pNv, nv_crtc->head);
-       NVWriteVgaCrtc(pNv, nv_crtc->head, NV_CIO_CRE_ILACE__INDEX, 
regp->CRTC[NV_CIO_CRE_ILACE__INDEX]);
+       crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_ILACE__INDEX);
 
-       NVWriteVgaCrtc(pNv, nv_crtc->head, NV_CIO_CRE_SCRATCH3__INDEX, 
regp->CRTC[NV_CIO_CRE_SCRATCH3__INDEX]);
-       NVWriteVgaCrtc(pNv, nv_crtc->head, NV_CIO_CRE_SCRATCH4__INDEX, 
regp->CRTC[NV_CIO_CRE_SCRATCH4__INDEX]);
+       crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_SCRATCH3__INDEX);
+       crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_SCRATCH4__INDEX);
        if (pNv->Architecture >= NV_ARCH_10) {
-               NVWriteVgaCrtc(pNv, nv_crtc->head, NV_CIO_CRE_EBR_INDEX, 
regp->CRTC[NV_CIO_CRE_EBR_INDEX]);
-               NVWriteVgaCrtc(pNv, nv_crtc->head, NV_CIO_CRE_CSB, 
regp->CRTC[NV_CIO_CRE_CSB]);
-               NVWriteVgaCrtc(pNv, nv_crtc->head, NV_CIO_CRE_4B, 
regp->CRTC[NV_CIO_CRE_4B]);
-               NVWriteVgaCrtc(pNv, nv_crtc->head, NV_CIO_CRE_52, 
regp->CRTC[NV_CIO_CRE_52]);
+               crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_EBR_INDEX);
+               crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_CSB);
+               crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_4B);
+               crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_52);
        }
        /* NV11 and NV20 stop at 0x52. */
        if (pNv->NVArch >= 0x17 && pNv->twoHeads) {
-               NVWriteVgaCrtc(pNv, nv_crtc->head, NV_CIO_CRE_53, 
regp->CRTC[NV_CIO_CRE_53]);
-               NVWriteVgaCrtc(pNv, nv_crtc->head, NV_CIO_CRE_54, 
regp->CRTC[NV_CIO_CRE_54]);
+               crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_53);
+               crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_54);
 
                for (i = 0; i < 0x10; i++)
                        NVWriteVgaCrtc5758(pNv, nv_crtc->head, i, 
regp->CR58[i]);
-               NVWriteVgaCrtc(pNv, nv_crtc->head, NV_CIO_CRE_59, 
regp->CRTC[NV_CIO_CRE_59]);
+               crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_59);
 
-               NVWriteVgaCrtc(pNv, nv_crtc->head, NV_CIO_CRE_85, 
regp->CRTC[NV_CIO_CRE_85]);
-               NVWriteVgaCrtc(pNv, nv_crtc->head, NV_CIO_CRE_86, 
regp->CRTC[NV_CIO_CRE_86]);
+               crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_85);
+               crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_86);
        }
 
        NVCrtcWriteCRTC(crtc, NV_CRTC_START, regp->fb_start);
@@ -1440,7 +1453,7 @@ static void nv_crtc_save_state_vga(xf86CrtcPtr crtc, 
RIVA_HW_STATE *state)
        regp->MiscOutReg = NVReadPRMVIO(pNv, nv_crtc->head, 
NV_PRMVIO_MISC__READ);
 
        for (i = 0; i < 25; i++)
-               regp->CRTC[i] = NVReadVgaCrtc(pNv, nv_crtc->head, i);
+               crtc_rd_cio_state(crtc, regp, i);
 
        NVSetEnablePalette(pNv, nv_crtc->head, true);
        for (i = 0; i < 21; i++)
@@ -1464,23 +1477,23 @@ static void nv_crtc_save_state_ext(xf86CrtcPtr crtc, 
RIVA_HW_STATE *state)
 
        regp = &state->crtc_reg[nv_crtc->head];
 
-       regp->CRTC[NV_CIO_CRE_LCD__INDEX] = NVReadVgaCrtc(pNv, nv_crtc->head, 
NV_CIO_CRE_LCD__INDEX);
-       regp->CRTC[NV_CIO_CRE_RPC0_INDEX] = NVReadVgaCrtc(pNv, nv_crtc->head, 
NV_CIO_CRE_RPC0_INDEX);
-       regp->CRTC[NV_CIO_CRE_RPC1_INDEX] = NVReadVgaCrtc(pNv, nv_crtc->head, 
NV_CIO_CRE_RPC1_INDEX);
-       regp->CRTC[NV_CIO_CRE_LSR_INDEX] = NVReadVgaCrtc(pNv, nv_crtc->head, 
NV_CIO_CRE_LSR_INDEX);
-       regp->CRTC[NV_CIO_CRE_PIXEL_INDEX] = NVReadVgaCrtc(pNv, nv_crtc->head, 
NV_CIO_CRE_PIXEL_INDEX);
-       regp->CRTC[NV_CIO_CRE_HEB__INDEX] = NVReadVgaCrtc(pNv, nv_crtc->head, 
NV_CIO_CRE_HEB__INDEX);
-       regp->CRTC[NV_CIO_CRE_ENH_INDEX] = NVReadVgaCrtc(pNv, nv_crtc->head, 
NV_CIO_CRE_ENH_INDEX);
-
-       regp->CRTC[NV_CIO_CRE_FF_INDEX] = NVReadVgaCrtc(pNv, nv_crtc->head, 
NV_CIO_CRE_FF_INDEX);
-       regp->CRTC[NV_CIO_CRE_FFLWM__INDEX] = NVReadVgaCrtc(pNv, nv_crtc->head, 
NV_CIO_CRE_FFLWM__INDEX);
-       regp->CRTC[NV_CIO_CRE_21] = NVReadVgaCrtc(pNv, nv_crtc->head, 
NV_CIO_CRE_21);
+       crtc_rd_cio_state(crtc, regp, NV_CIO_CRE_LCD__INDEX);
+       crtc_rd_cio_state(crtc, regp, NV_CIO_CRE_RPC0_INDEX);
+       crtc_rd_cio_state(crtc, regp, NV_CIO_CRE_RPC1_INDEX);
+       crtc_rd_cio_state(crtc, regp, NV_CIO_CRE_LSR_INDEX);
+       crtc_rd_cio_state(crtc, regp, NV_CIO_CRE_PIXEL_INDEX);
+       crtc_rd_cio_state(crtc, regp, NV_CIO_CRE_HEB__INDEX);
+       crtc_rd_cio_state(crtc, regp, NV_CIO_CRE_ENH_INDEX);
+
+       crtc_rd_cio_state(crtc, regp, NV_CIO_CRE_FF_INDEX);
+       crtc_rd_cio_state(crtc, regp, NV_CIO_CRE_FFLWM__INDEX);
+       crtc_rd_cio_state(crtc, regp, NV_CIO_CRE_21);
        if (pNv->Architecture >= NV_ARCH_30)
-               regp->CRTC[NV_CIO_CRE_47] = NVReadVgaCrtc(pNv, nv_crtc->head, 
NV_CIO_CRE_47);
-       regp->CRTC[NV_CIO_CRE_HCUR_ADDR0_INDEX] = NVReadVgaCrtc(pNv, 
nv_crtc->head, NV_CIO_CRE_HCUR_ADDR0_INDEX);
-       regp->CRTC[NV_CIO_CRE_HCUR_ADDR1_INDEX] = NVReadVgaCrtc(pNv, 
nv_crtc->head, NV_CIO_CRE_HCUR_ADDR1_INDEX);
-       regp->CRTC[NV_CIO_CRE_HCUR_ADDR2_INDEX] = NVReadVgaCrtc(pNv, 
nv_crtc->head, NV_CIO_CRE_HCUR_ADDR2_INDEX);
-       regp->CRTC[NV_CIO_CRE_ILACE__INDEX] = NVReadVgaCrtc(pNv, nv_crtc->head, 
NV_CIO_CRE_ILACE__INDEX);
+               crtc_rd_cio_state(crtc, regp, NV_CIO_CRE_47);
+       crtc_rd_cio_state(crtc, regp, NV_CIO_CRE_HCUR_ADDR0_INDEX);
+       crtc_rd_cio_state(crtc, regp, NV_CIO_CRE_HCUR_ADDR1_INDEX);
+       crtc_rd_cio_state(crtc, regp, NV_CIO_CRE_HCUR_ADDR2_INDEX);
+       crtc_rd_cio_state(crtc, regp, NV_CIO_CRE_ILACE__INDEX);
 
        if (pNv->Architecture >= NV_ARCH_10) {
                regp->unk830 = NVCrtcReadCRTC(crtc, NV_CRTC_0830);
@@ -1497,25 +1510,25 @@ static void nv_crtc_save_state_ext(xf86CrtcPtr crtc, 
RIVA_HW_STATE *state)
        regp->gpio = NVCrtcReadCRTC(crtc, NV_CRTC_GPIO);
        regp->config = NVCrtcReadCRTC(crtc, NV_CRTC_CONFIG);
 
-       regp->CRTC[NV_CIO_CRE_SCRATCH3__INDEX] = NVReadVgaCrtc(pNv, 
nv_crtc->head, NV_CIO_CRE_SCRATCH3__INDEX);
-       regp->CRTC[NV_CIO_CRE_SCRATCH4__INDEX] = NVReadVgaCrtc(pNv, 
nv_crtc->head, NV_CIO_CRE_SCRATCH4__INDEX);
+       crtc_rd_cio_state(crtc, regp, NV_CIO_CRE_SCRATCH3__INDEX);
+       crtc_rd_cio_state(crtc, regp, NV_CIO_CRE_SCRATCH4__INDEX);
        if (pNv->Architecture >= NV_ARCH_10) {
-               regp->CRTC[NV_CIO_CRE_EBR_INDEX] = NVReadVgaCrtc(pNv, 
nv_crtc->head, NV_CIO_CRE_EBR_INDEX);
-               regp->CRTC[NV_CIO_CRE_CSB] = NVReadVgaCrtc(pNv, nv_crtc->head, 
NV_CIO_CRE_CSB);
-               regp->CRTC[NV_CIO_CRE_4B] = NVReadVgaCrtc(pNv, nv_crtc->head, 
NV_CIO_CRE_4B);
-               regp->CRTC[NV_CIO_CRE_52] = NVReadVgaCrtc(pNv, nv_crtc->head, 
NV_CIO_CRE_52);
+               crtc_rd_cio_state(crtc, regp, NV_CIO_CRE_EBR_INDEX);
+               crtc_rd_cio_state(crtc, regp, NV_CIO_CRE_CSB);
+               crtc_rd_cio_state(crtc, regp, NV_CIO_CRE_4B);
+               crtc_rd_cio_state(crtc, regp, NV_CIO_CRE_52);
        }
        /* NV11 and NV20 don't have this, they stop at 0x52. */
        if (pNv->NVArch >= 0x17 && pNv->twoHeads) {
                for (i = 0; i < 0x10; i++)
                        regp->CR58[i] = NVReadVgaCrtc5758(pNv, nv_crtc->head, 
i);
 
-               regp->CRTC[NV_CIO_CRE_59] = NVReadVgaCrtc(pNv, nv_crtc->head, 
NV_CIO_CRE_59);
-               regp->CRTC[NV_CIO_CRE_53] = NVReadVgaCrtc(pNv, nv_crtc->head, 
NV_CIO_CRE_53);
-               regp->CRTC[NV_CIO_CRE_54] = NVReadVgaCrtc(pNv, nv_crtc->head, 
NV_CIO_CRE_54);
+               crtc_rd_cio_state(crtc, regp, NV_CIO_CRE_59);
+               crtc_rd_cio_state(crtc, regp, NV_CIO_CRE_53);
+               crtc_rd_cio_state(crtc, regp, NV_CIO_CRE_54);
 
-               regp->CRTC[NV_CIO_CRE_85] = NVReadVgaCrtc(pNv, nv_crtc->head, 
NV_CIO_CRE_85);
-               regp->CRTC[NV_CIO_CRE_86] = NVReadVgaCrtc(pNv, nv_crtc->head, 
NV_CIO_CRE_86);
+               crtc_rd_cio_state(crtc, regp, NV_CIO_CRE_85);
+               crtc_rd_cio_state(crtc, regp, NV_CIO_CRE_86);
        }
 
        regp->fb_start = NVCrtcReadCRTC(crtc, NV_CRTC_START);

commit fe9bfd9b1b5ce6fd0cd0360ec850ae48b4abac41
Author: Stuart Bennett <[EMAIL PROTECTED]>
Date:   Fri Oct 24 21:02:00 2008 +0100

    Tidy EnterVT, and don't call it from ScreenInit

diff --git a/src/nv_driver.c b/src/nv_driver.c
index 6e850f7..a169e46 100644
--- a/src/nv_driver.c
+++ b/src/nv_driver.c
@@ -623,7 +623,6 @@ NV50AcquireDisplay(ScrnInfoPtr pScrn)
                return FALSE;
        if (!NV50CursorAcquire(pScrn))
                return FALSE;
-       xf86SetDesiredModes(pScrn);
 
        return TRUE;
 }
@@ -664,38 +663,29 @@ NVEnterVT(int scrnIndex, int flags)
        ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
        NVPtr pNv = NVPTR(pScrn);
 
-       if (!pNv->kms_enable) {
-               if (pNv->randr12_enable) {
-                       xf86DrvMsg(pScrn->scrnIndex, X_INFO, "NVEnterVT is 
called.\n");
-                       pScrn->vtSema = TRUE;
+       xf86DrvMsg(pScrn->scrnIndex, X_INFO, "NVEnterVT is called.\n");
 
-                       if (pNv->Architecture == NV_ARCH_50) {
-                               if (!NV50AcquireDisplay(pScrn))
-                                       return FALSE;
-                               return TRUE;
-                       }
-
-                       /* Save the current state */
-                       NVSave(pScrn);
+       if (!pNv->kms_enable && pNv->randr12_enable)
+               NVSave(pScrn);
 
-                       if (!xf86SetDesiredModes(pScrn))
-                               return FALSE;
+       if (!pNv->randr12_enable) {
+               if (!NVModeInit(pScrn, pScrn->currentMode))
+                       return FALSE;
+               NVAdjustFrame(scrnIndex, pScrn->frameX0, pScrn->frameY0, 0);
+       } else {
+               pScrn->vtSema = TRUE;
 
-                       NVAccelCommonInit(pScrn);
-               } else {
-                       if (!NVModeInit(pScrn, pScrn->currentMode))
+               if (!pNv->kms_enable && pNv->Architecture == NV_ARCH_50)
+                       if (!NV50AcquireDisplay(pScrn))
                                return FALSE;
 
-                       NVAdjustFrame(scrnIndex, pScrn->frameX0, 
pScrn->frameY0, 0);
-               }
-       } else {
-               xf86DrvMsg(pScrn->scrnIndex, X_INFO, "NVEnterVT is called.\n");
-               if (!xf86SetDesiredModes(pScrn)) {
-                       xf86DrvMsg(pScrn->scrnIndex, X_WARNING, 
"xf86SetDesiredModes failed\n");
+               if (!xf86SetDesiredModes(pScrn))
                        return FALSE;
-               }
        }
 
+       if (!pNv->NoAccel)
+               NVAccelCommonInit(pScrn);
+
        if (pNv->overlayAdaptor && pNv->Architecture != NV_ARCH_04)
                NV10WriteOverlayParameters(pScrn);
 
@@ -770,7 +760,6 @@ NVCloseScreen(int scrnIndex, ScreenPtr pScreen)
        NVPtr pNv = NVPTR(pScrn);
 
        if (pScrn->vtSema) {
-               pScrn->vtSema = FALSE;
 #ifdef XF86DRM_MODE
                if (pNv->kms_enable) {
                        NVSync(pScrn);
@@ -1974,17 +1963,7 @@ NVScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, 
char **argv)
        }
 #endif
 
-       if (!pNv->randr12_enable) {
-               /* Save the current state */
-               NVSave(pScrn);
-               /* Initialise the first mode */
-               if (!NVModeInit(pScrn, pScrn->currentMode))
-                       return FALSE;
-
-               /* Darken the screen for aesthetic reasons and set the viewport 
*/
-               NVSaveScreen(pScreen, SCREEN_SAVER_ON);
-               pScrn->AdjustFrame(scrnIndex, pScrn->frameX0, pScrn->frameY0, 
0);
-       } else {
+       if (pNv->randr12_enable) {
                xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
                int i;
 
@@ -1993,15 +1972,29 @@ NVScreenInit(int scrnIndex, ScreenPtr pScreen, int 
argc, char **argv)
                        xf86_config->crtc[i]->scrn = pScrn;
                for (i = 0; i < xf86_config->num_output; i++)
                        xf86_config->output[i]->scrn = pScrn;
+       }
 
-               pScrn->memPhysBase = pNv->VRAMPhysical;
-               pScrn->fbOffset = 0;
+       if (!pNv->kms_enable)
+               NVSave(pScrn);
 
-               if (!NVEnterVT(scrnIndex, 0))
+       if (!pNv->randr12_enable) {
+               if (!NVModeInit(pScrn, pScrn->currentMode))
+                       return FALSE;
+               pScrn->AdjustFrame(scrnIndex, pScrn->frameX0, pScrn->frameY0, 
0);
+       } else {
+               pScrn->vtSema = TRUE;
+
+               if (!pNv->kms_enable && pNv->Architecture == NV_ARCH_50)
+                       if (!NV50AcquireDisplay(pScrn))
+                               return FALSE;
+
+               if (!xf86SetDesiredModes(pScrn))
                        return FALSE;
-               NVSaveScreen(pScreen, SCREEN_SAVER_ON);
        }
 
+       /* Darken the screen for aesthetic reasons */
+       if (!pNv->kms_enable)
+               NVSaveScreen(pScreen, SCREEN_SAVER_ON);
 
        /*
         * The next step is to setup the screen's visuals, and initialise the
@@ -2208,6 +2201,9 @@ NVSave(ScrnInfoPtr pScrn)
        NVPtr pNv = NVPTR(pScrn);
        NVRegPtr nvReg = &pNv->SavedReg;
 
+       if (pNv->Architecture == NV_ARCH_50)
+               return;
+
        NVLockVgaCrtcs(pNv, false);
 
        if (pNv->randr12_enable) {

commit 3e1ccff8744d9cabef0cd3901e987deeeb38ec12
Author: Stuart Bennett <[EMAIL PROTECTED]>
Date:   Fri Oct 24 02:49:19 2008 +0100

    Condense crtc locking
    
    We unlock all crtcs whenever the driver is active, and relock them when
    returning to VT (which is what we were doing, but in a more complicated 
manner)

diff --git a/src/nv_crtc.c b/src/nv_crtc.c
index eb8de97..10ee1d6 100644
--- a/src/nv_crtc.c
+++ b/src/nv_crtc.c
@@ -70,14 +70,6 @@ static void NVCrtcWriteRAMDAC(xf86CrtcPtr crtc, uint32_t 
reg, uint32_t val)
        NVWriteRAMDAC(pNv, nv_crtc->head, reg, val);
 }
 
-void NVCrtcLockUnlock(xf86CrtcPtr crtc, bool lock)
-{
-       struct nouveau_crtc *nv_crtc = to_nouveau_crtc(crtc);
-       NVPtr pNv = NVPTR(crtc->scrn);
-
-       NVLockVgaCrtc(pNv, nv_crtc->head, lock);
-}
-
 /* Even though they are not yet used, i'm adding some notes about some of the 
0x4000 regs */
 /* They are only valid for NV4x, appearantly reordered for NV5x */
 /* gpu pll: 0x4000 + 0x4004
@@ -963,9 +955,6 @@ static void nv_crtc_save(xf86CrtcPtr crtc)
        if (pNv->twoHeads)
                NVSetOwner(pNv, nv_crtc->head);
 
-       /* We just came back from terminal, so unlock */
-       NVCrtcLockUnlock(crtc, false);
-
        nv_crtc_save_state_ramdac(crtc, &pNv->SavedReg);
        nv_crtc_save_state_vga(crtc, &pNv->SavedReg);
        nv_crtc_save_state_palette(crtc, &pNv->SavedReg);
@@ -983,9 +972,6 @@ static void nv_crtc_restore(xf86CrtcPtr crtc)
        struct nouveau_crtc *nv_crtc = to_nouveau_crtc(crtc);
        NVPtr pNv = NVPTR(crtc->scrn);
 
-       /* Just to be safe */
-       NVCrtcLockUnlock(crtc, false);
-
        if (pNv->twoHeads)
                NVSetOwner(pNv, nv_crtc->head);
 
@@ -1009,9 +995,6 @@ static void nv_crtc_prepare(xf86CrtcPtr crtc)
        if (pNv->twoHeads)
                NVSetOwner(pNv, nv_crtc->head);
 
-       /* Just in case */
-       NVCrtcLockUnlock(crtc, 0);
-
        crtc->funcs->dpms(crtc, DPMSModeOff);
 
        /* Sync the engine before adjust mode */
@@ -1324,8 +1307,6 @@ nv_crtc_init(ScrnInfoPtr pScrn, int crtc_num)
                regp->DAC[(i*3)+1] = i;
                regp->DAC[(i*3)+2] = i;
        }
-
-       NVCrtcLockUnlock(crtc, false);
 }
 
 static void nv_crtc_load_state_vga(xf86CrtcPtr crtc, RIVA_HW_STATE *state)
diff --git a/src/nv_driver.c b/src/nv_driver.c
index 2045854..6e850f7 100644
--- a/src/nv_driver.c
+++ b/src/nv_driver.c
@@ -667,8 +667,6 @@ NVEnterVT(int scrnIndex, int flags)
        if (!pNv->kms_enable) {
                if (pNv->randr12_enable) {
                        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "NVEnterVT is 
called.\n");
-                       xf86CrtcConfigPtr xf86_config = 
XF86_CRTC_CONFIG_PTR(pScrn);
-                       int i;
                        pScrn->vtSema = TRUE;
 
                        if (pNv->Architecture == NV_ARCH_50) {
@@ -680,10 +678,6 @@ NVEnterVT(int scrnIndex, int flags)
                        /* Save the current state */
                        NVSave(pScrn);
 
-                       for (i = 0; i < xf86_config->num_crtc; i++) {
-                               NVCrtcLockUnlock(xf86_config->crtc[i], 0);
-                       }
-
                        if (!xf86SetDesiredModes(pScrn))
                                return FALSE;
 
@@ -735,8 +729,6 @@ NVLeaveVT(int scrnIndex, int flags)
        }
 
        NVRestore(pScrn);
-       if (!pNv->randr12_enable)
-               NVLockUnlock(pScrn, 1);
 }
 
 static void 
@@ -791,8 +783,6 @@ NVCloseScreen(int scrnIndex, ScreenPtr pScreen)
                                xf86DrvMsg(pScrn->scrnIndex, X_INFO, 
"NVCloseScreen is called.\n");
                        NVSync(pScrn);
                        NVRestore(pScrn);
-                       if (!pNv->randr12_enable)
-                               NVLockUnlock(pScrn, 1);
                }
        }
 
@@ -1384,9 +1374,10 @@ NVPreInit(ScrnInfoPtr pScrn, int flags)
                                nv_crtc_init(pScrn, i);
                }
 
-               if (pNv->Architecture < NV_ARCH_50)
+               if (pNv->Architecture < NV_ARCH_50) {
+                       NVLockVgaCrtcs(pNv, false);
                        NvSetupOutputs(pScrn);
-               else
+               } else
                        nv50_output_create(pScrn); /* create randr-1.2 
"outputs". */
 
                if (!xf86InitialConfiguration(pScrn, FALSE))
@@ -1712,11 +1703,8 @@ NVModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode)
     if(!NVDACInit(pScrn, mode))
         return FALSE;
 
-    NVLockUnlock(pScrn, 0);
-    if(pNv->twoHeads) {
+    if (pNv->twoHeads)
         nvWriteCurVGA(pNv, NV_CIO_CRE_44, nvReg->crtcOwner);
-        NVLockUnlock(pScrn, 0);
-    }
 
     /* Program the registers */
     vgaHWProtect(pScrn, TRUE);
@@ -1752,13 +1740,12 @@ NVRestore(ScrnInfoPtr pScrn)
 {
        NVPtr pNv = NVPTR(pScrn);
 
+       NVLockVgaCrtcs(pNv, false);
+
        if (pNv->randr12_enable) {
                xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
                int i;
 
-               for (i = 0; i < xf86_config->num_crtc; i++)
-                       NVCrtcLockUnlock(xf86_config->crtc[i], 0);
-
                xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Restoring encoders\n");
                for (i = 0; i < pNv->dcb_table.entries; i++)
                        nv_encoder_restore(pScrn, &pNv->encoders[i]);
@@ -1768,20 +1755,13 @@ NVRestore(ScrnInfoPtr pScrn)
                        
xf86_config->crtc[i]->funcs->restore(xf86_config->crtc[i]);
 
                nv_save_restore_vga_fonts(pScrn, 0);
-
-               for (i = 0; i < xf86_config->num_crtc; i++)
-                       NVCrtcLockUnlock(xf86_config->crtc[i], 1);
        } else {
                vgaHWPtr hwp = VGAHWPTR(pScrn);
                vgaRegPtr vgaReg = &hwp->SavedReg;
                NVRegPtr nvReg = &pNv->SavedReg;
 
-               NVLockUnlock(pScrn, 0);
-
-               if(pNv->twoHeads) {
+               if (pNv->twoHeads)
                        nvWriteCurVGA(pNv, NV_CIO_CRE_44, pNv->crtc_active[1] * 
0x3);
-                       NVLockUnlock(pScrn, 0);
-               }
 
                /* Only restore text mode fonts/text for the primary card */
                vgaHWProtect(pScrn, TRUE);
@@ -1790,11 +1770,11 @@ NVRestore(ScrnInfoPtr pScrn)
        }
 
        if (pNv->twoHeads) {
-               NVLockVgaCrtc(pNv, 0, false);
                xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Restoring CRTC_OWNER to 
%d.\n", pNv->vtOWNER);
                NVSetOwner(pNv, pNv->vtOWNER);
-               NVLockVgaCrtc(pNv, 0, true);
        }
+
+       NVLockVgaCrtcs(pNv, true);
 }
 
 static void
@@ -2228,6 +2208,8 @@ NVSave(ScrnInfoPtr pScrn)
        NVPtr pNv = NVPTR(pScrn);
        NVRegPtr nvReg = &pNv->SavedReg;
 
+       NVLockVgaCrtcs(pNv, false);
+
        if (pNv->randr12_enable) {
                xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
                int i;
@@ -2244,11 +2226,8 @@ NVSave(ScrnInfoPtr pScrn)
        } else {
                vgaHWPtr pVga = VGAHWPTR(pScrn);
                vgaRegPtr vgaReg = &pVga->SavedReg;
-               NVLockUnlock(pScrn, 0);
-               if (pNv->twoHeads) {
+               if (pNv->twoHeads)
                        nvWriteCurVGA(pNv, NV_CIO_CRE_44, pNv->crtc_active[1] * 
0x3);
-                       NVLockUnlock(pScrn, 0);
-               }
 
                NVDACSave(pScrn, vgaReg, nvReg, pNv->Primary);
        }
diff --git a/src/nv_hw.c b/src/nv_hw.c
index ad41d95..9960c0f 100644
--- a/src/nv_hw.c
+++ b/src/nv_hw.c
@@ -270,7 +270,7 @@ void NVSetOwner(NVPtr pNv, int owner)
        }
 }
 
-void NVLockVgaCrtc(NVPtr pNv, int head, bool lock)
+static void NVLockVgaCrtc(NVPtr pNv, int head, bool lock)
 {
        uint8_t cr11;
 
diff --git a/src/nv_proto.h b/src/nv_proto.h
index 08732d2..de91c10 100644
--- a/src/nv_proto.h
+++ b/src/nv_proto.h
@@ -81,7 +81,6 @@ int get_pll_limits(ScrnInfoPtr pScrn, uint32_t limit_match, 
struct pll_lims *pll
 /* nv_crtc.c */
 void NVCrtcSetBase(xf86CrtcPtr crtc, int x, int y);
 void nv_crtc_init(ScrnInfoPtr pScrn, int crtc_num);
-void NVCrtcLockUnlock(xf86CrtcPtr crtc, bool lock);
 
 /* nv_output.c */
 void nv_encoder_restore(ScrnInfoPtr pScrn, struct nouveau_encoder *nv_encoder);
@@ -114,7 +113,6 @@ uint8_t NVReadVgaAttr(NVPtr pNv, int head, uint8_t index);
 void NVVgaSeqReset(NVPtr pNv, int head, bool start);
 void NVVgaProtect(NVPtr pNv, int head, bool protect);
 void NVSetOwner(NVPtr pNv, int owner);
-void NVLockVgaCrtc(NVPtr pNv, int head, bool lock);
 void NVLockVgaCrtcs(NVPtr pNv, bool lock);
 void NVBlankScreen(NVPtr pNv, int head, bool blank);
 void nv_fix_nv40_hw_cursor(NVPtr pNv, int head);
diff --git a/src/nv_setup.c b/src/nv_setup.c
index a66afb9..b092c32 100644
--- a/src/nv_setup.c
+++ b/src/nv_setup.c
@@ -535,7 +535,7 @@ NVCommonSetup(ScrnInfoPtr pScrn)
       
        NVSelectHeadRegisters(pScrn, 0);
        
-       NVLockUnlock(pScrn, 0);
+       NVLockVgaCrtcs(pNv, false);
        
        NVI2CInit(pScrn);
        
@@ -601,7 +601,6 @@ NVCommonSetup(ScrnInfoPtr pScrn)
            
            nvWriteCurVGA(pNv, NV_CIO_CRE_44, 3);
            NVSelectHeadRegisters(pScrn, 1);
-           NVLockUnlock(pScrn, 0);
            
            slaved_on_B = nvReadCurVGA(pNv, NV_CIO_CRE_PIXEL_INDEX) & 0x80;
            if(slaved_on_B) {
@@ -610,7 +609,6 @@ NVCommonSetup(ScrnInfoPtr pScrn)
            
            nvWriteCurVGA(pNv, NV_CIO_CRE_44, 0);
            NVSelectHeadRegisters(pScrn, 0);
-           NVLockUnlock(pScrn, 0);
            
            slaved_on_A = nvReadCurVGA(pNv, NV_CIO_CRE_PIXEL_INDEX) & 0x80;
            if(slaved_on_A) {
diff --git a/src/nv_type.h b/src/nv_type.h
index 41779e6..280b44f 100644
--- a/src/nv_type.h
+++ b/src/nv_type.h
@@ -523,7 +523,6 @@ typedef struct _NVRec {
 #define NVPTR(p) ((NVPtr)((p)->driverPrivate))
 
 #define NVShowHideCursor(pScrn, show) nv_show_cursor(NVPTR(pScrn), 
NVPTR(pScrn)->cur_head, show)
-#define NVLockUnlock(pScrn, lock) NVLockVgaCrtc(NVPTR(pScrn), 
NVPTR(pScrn)->cur_head, lock)
 
 #define nvReadCurVGA(pNv, reg) NVReadVgaCrtc(pNv, pNv->cur_head, reg)
 #define nvWriteCurVGA(pNv, reg, val) NVWriteVgaCrtc(pNv, pNv->cur_head, reg, 
val)

commit 83b541e0a9c454059d0e55a932a2ecdbbf650d60
Author: Stuart Bennett <[EMAIL PROTECTED]>
Date:   Mon Oct 27 19:20:22 2008 +0000

    Common function for the bios condition table

diff --git a/src/nv_bios.c b/src/nv_bios.c
index d010346..042c0d0 100644
--- a/src/nv_bios.c
+++ b/src/nv_bios.c
@@ -447,7 +447,31 @@ static void nv_port_wr(ScrnInfoPtr pScrn, uint16_t port, 
uint8_t data)
        }
 }
 
-static bool io_flag_condition(ScrnInfoPtr pScrn, bios_t *bios, uint16_t 
offset, uint8_t cond)
+static bool bios_condition_met(ScrnInfoPtr pScrn, bios_t *bios, uint16_t 
offset, uint8_t cond)
+{
+       /* The condition table entry has 4 bytes for the address of the
+        * register to check, 4 bytes for a mask to apply to the register and
+        * 4 for a test comparison value
+        */
+
+       uint16_t condptr = bios->condition_tbl_ptr + cond * CONDITION_SIZE;
+       uint32_t reg = le32_to_cpu(*((uint32_t *)(&bios->data[condptr])));
+       uint32_t mask = le32_to_cpu(*((uint32_t *)(&bios->data[condptr + 4])));
+       uint32_t cmpval = le32_to_cpu(*((uint32_t *)(&bios->data[condptr + 
8])));
+       uint32_t data;
+
+       BIOSLOG(pScrn, "0x%04X: Cond: 0x%02X, Reg: 0x%08X, Mask: 0x%08X\n",
+               offset, cond, reg, mask);
+
+               data = nv32_rd(pScrn, reg) & mask;
+
+       BIOSLOG(pScrn, "0x%04X: Checking if 0x%08X equals 0x%08X\n",
+               offset, data, cmpval);
+
+       return (data == cmpval);
+}
+
+static bool io_flag_condition_met(ScrnInfoPtr pScrn, bios_t *bios, uint16_t 
offset, uint8_t cond)
 {
        /* The IO flag condition entry has 2 bytes for the CRTC port; 1 byte
         * for the CRTC index; 1 byte for the mask to apply to the value
@@ -478,10 +502,7 @@ static bool io_flag_condition(ScrnInfoPtr pScrn, bios_t 
*bios, uint16_t offset,
 
        BIOSLOG(pScrn, "0x%04X: Checking if 0x%02X equals 0x%02X\n", offset, 
data, cmpval);
 
-       if (data == cmpval)
-               return true;
-
-       return false;
+       return (data == cmpval);
 }
 
 int getMNP_single(ScrnInfoPtr pScrn, struct pll_lims *pll_lim, int clk, int 
*bestNM, int *bestlog2P)
@@ -1075,7 +1096,7 @@ static bool init_io_restrict_pll(ScrnInfoPtr pScrn, 
bios_t *bios, uint16_t offse
        freq = le16_to_cpu(*((uint16_t *)(&bios->data[offset + 12 + config * 
2])));
 
        if (io_flag_condition_idx > 0) {
-               if (io_flag_condition(pScrn, bios, offset, 
io_flag_condition_idx)) {
+               if (io_flag_condition_met(pScrn, bios, offset, 
io_flag_condition_idx)) {
                        BIOSLOG(pScrn, "0x%04X: Condition fulfilled -- 
frequency doubled\n", offset);
                        freq *= 2;
                } else
@@ -1190,7 +1211,7 @@ static bool init_io_flag_condition(ScrnInfoPtr pScrn, 
bios_t *bios, uint16_t off
        if (!iexec->execute)
                return true;
 
-       if (io_flag_condition(pScrn, bios, offset, cond))
+       if (io_flag_condition_met(pScrn, bios, offset, cond))
                BIOSLOG(pScrn, "0x%04X: Condition fulfilled -- continuing to 
execute\n", offset);
        else {
                BIOSLOG(pScrn, "0x%04X: Condition not fulfilled -- skipping 
following commands\n", offset);
@@ -1574,8 +1595,6 @@ static bool init_condition_time(ScrnInfoPtr pScrn, bios_t 
*bios, uint16_t offset
         * offset + 2  (8 bit): retries / 50
         *
         * Check condition "condition number" in the condition table.
-        * The condition table entry has 4 bytes for the address of the
-        * register to check, 4 bytes for a mask and 4 for a test value.
         * Bios code then sleeps for 2ms if the condition is not met, and
         * repeats up to "retries" times, but on one C51 this has proved
         * insufficient.  In mmiotraces the driver sleeps for 20ms, so we do
@@ -1584,37 +1603,26 @@ static bool init_condition_time(ScrnInfoPtr pScrn, 
bios_t *bios, uint16_t offset
         */
 
        uint8_t cond = bios->data[offset + 1];
-       uint16_t retries = bios->data[offset + 2];
-       uint16_t condptr = bios->condition_tbl_ptr + cond * CONDITION_SIZE;
-       uint32_t reg = le32_to_cpu(*((uint32_t *)(&bios->data[condptr])));
-       uint32_t mask = le32_to_cpu(*((uint32_t *)(&bios->data[condptr + 4])));
-       uint32_t cmpval = le32_to_cpu(*((uint32_t *)(&bios->data[condptr + 
8])));
-       uint32_t data = 0;
+       uint16_t retries = bios->data[offset + 2] * 50;
 
        if (!iexec->execute)
                return true;
 
-       retries *= 50;
        if (retries > 100)
                retries = 100;
 
-       BIOSLOG(pScrn, "0x%04X: Cond: 0x%02X, Retries: 0x%02X\n", offset, cond, 
retries);
-
-       for (; retries > 0; retries--) {
-               data = nv32_rd(pScrn, reg) & mask;
+       BIOSLOG(pScrn, "0x%04X: Condition: 0x%02X, Retries: 0x%02X\n", offset, 
cond, retries);
 
-               BIOSLOG(pScrn, "0x%04X: Checking if 0x%08X equals 0x%08X\n", 
offset, data, cmpval);
-
-               if (data != cmpval) {
-                       BIOSLOG(pScrn, "0x%04X: Condition not met, sleeping for 
20ms\n", offset);
-                       BIOS_USLEEP(20000);
-               } else {
+       for (; retries > 0; retries--)
+               if (bios_condition_met(pScrn, bios, offset, cond)) {
                        BIOSLOG(pScrn, "0x%04X: Condition met, continuing\n", 
offset);
                        break;
+               } else {
+                       BIOSLOG(pScrn, "0x%04X: Condition not met, sleeping for 
20ms\n", offset);
+                       BIOS_USLEEP(20000);
                }
-       }
 
-       if (data != cmpval) {
+       if (!bios_condition_met(pScrn, bios, offset, cond)) {
                xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
                           "0x%04X: Condition still not met after %dms, skiping 
following opcodes\n",
                           offset, 20 * retries);
@@ -2232,30 +2240,18 @@ static bool init_condition(ScrnInfoPtr pScrn, bios_t 
*bios, uint16_t offset, ini
         * offset + 1  (8 bit): condition number
         *
         * Check condition "condition number" in the condition table.
-        * The condition table entry has 4 bytes for the address of the
-        * register to check, 4 bytes for a mask and 4 for a test value.
         * If condition not met skip subsequent opcodes until condition is
         * inverted (INIT_NOT), or we hit INIT_RESUME
         */
 
        uint8_t cond = bios->data[offset + 1];
-       uint16_t condptr = bios->condition_tbl_ptr + cond * CONDITION_SIZE;
-       uint32_t reg = le32_to_cpu(*((uint32_t *)(&bios->data[condptr])));
-       uint32_t mask = le32_to_cpu(*((uint32_t *)(&bios->data[condptr + 4])));
-       uint32_t cmpval = le32_to_cpu(*((uint32_t *)(&bios->data[condptr + 
8])));
-       uint32_t data;
 
        if (!iexec->execute)
                return true;
 
-       BIOSLOG(pScrn, "0x%04X: Cond: 0x%02X, Reg: 0x%08X, Mask: 0x%08X, 
Cmpval: 0x%08X\n",
-               offset, cond, reg, mask, cmpval);
-
-       data = nv32_rd(pScrn, reg) & mask;
+       BIOSLOG(pScrn, "0x%04X: Condition: 0x%02X\n", offset, cond);
 
-       BIOSLOG(pScrn, "0x%04X: Checking if 0x%08X equals 0x%08X\n", offset, 
data, cmpval);
-
-       if (data == cmpval)
+       if (bios_condition_met(pScrn, bios, offset, cond))
                BIOSLOG(pScrn, "0x%04X: Condition fulfilled -- continuing to 
execute\n", offset);
        else {
                BIOSLOG(pScrn, "0x%04X: Condition not fulfilled -- skipping 
following commands\n", offset);

commit 36c6aa449063387b34c31015d618e53d4b6634e0
Author: Stuart Bennett <[EMAIL PROTECTED]>
Date:   Mon Oct 27 18:55:28 2008 +0000

    Allow more time in INIT_CONDITION_TIME (#18234)

diff --git a/src/nv_bios.c b/src/nv_bios.c
index ef358b4..d010346 100644
--- a/src/nv_bios.c
+++ b/src/nv_bios.c
@@ -1576,7 +1576,10 @@ static bool init_condition_time(ScrnInfoPtr pScrn, 
bios_t *bios, uint16_t offset
         * Check condition "condition number" in the condition table.
         * The condition table entry has 4 bytes for the address of the
         * register to check, 4 bytes for a mask and 4 for a test value.
-        * If condition not met sleep for 2ms, and repeat upto "retries" times.
+        * Bios code then sleeps for 2ms if the condition is not met, and
+        * repeats up to "retries" times, but on one C51 this has proved
+        * insufficient.  In mmiotraces the driver sleeps for 20ms, so we do
+        * this, and bail after "retries" times, or 2s, whichever is less.
         * If still not met after retries, clear execution flag for this table.
         */
 
@@ -1592,6 +1595,8 @@ static bool init_condition_time(ScrnInfoPtr pScrn, bios_t 
*bios, uint16_t offset
                return true;
 
        retries *= 50;
+       if (retries > 100)
+               retries = 100;
 
        BIOSLOG(pScrn, "0x%04X: Cond: 0x%02X, Retries: 0x%02X\n", offset, cond, 
retries);
 
@@ -1601,8 +1606,8 @@ static bool init_condition_time(ScrnInfoPtr pScrn, bios_t 
*bios, uint16_t offset
                BIOSLOG(pScrn, "0x%04X: Checking if 0x%08X equals 0x%08X\n", 
offset, data, cmpval);
 
                if (data != cmpval) {
-                       BIOSLOG(pScrn, "0x%04X: Condition not met, sleeping for 
2ms\n", offset);
-                       BIOS_USLEEP(2000);
+                       BIOSLOG(pScrn, "0x%04X: Condition not met, sleeping for 
20ms\n", offset);
+                       BIOS_USLEEP(20000);
                } else {
                        BIOSLOG(pScrn, "0x%04X: Condition met, continuing\n", 
offset);
                        break;
@@ -1610,7 +1615,9 @@ static bool init_condition_time(ScrnInfoPtr pScrn, bios_t 
*bios, uint16_t offset
        }
 
        if (data != cmpval) {
-               BIOSLOG(pScrn, "0x%04X: Condition still not met, skiping 
following opcodes\n", offset);
+               xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+                          "0x%04X: Condition still not met after %dms, skiping 
following opcodes\n",
+                          offset, 20 * retries);
                iexec->execute = false;
        }
 

commit bf810b32bc959f3821bca18cf158f711dd314a26
Author: Stuart Bennett <[EMAIL PROTECTED]>
Date:   Mon Oct 27 18:41:43 2008 +0000

    More warnings for C51's magical unaligned regs

diff --git a/src/nv_bios.c b/src/nv_bios.c
index 7c97866..ef358b4 100644
--- a/src/nv_bios.c
+++ b/src/nv_bios.c
@@ -227,11 +227,16 @@ static int nv_valid_reg(ScrnInfoPtr pScrn, uint32_t reg)
 


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to