xserver-xorg-video-nouveau: Changes to 'upstream-experimental'
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 <sb476@cam.ac.uk>
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 <sb476@cam.ac.uk>
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 <sb476@cam.ac.uk>
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 <sb476@cam.ac.uk>
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 <sb476@cam.ac.uk>
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 <sb476@cam.ac.uk>
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 <sb476@cam.ac.uk>
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)
Reply to: