debian/changelog | 55 +++ debian/control | 2 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 ++++++++---- 20 files changed, 1382 insertions(+), 1397 deletions(-)
New commits: commit ad485976ba8f7ad53197656eb183cb4ada78089a Author: Chris Lamb <[EMAIL PROTECTED]> Date: Tue Oct 28 07:48:06 2008 +0000 Bump Build-Depends on libdrm-dev. Signed-off-by: Chris Lamb <[EMAIL PROTECTED]> diff --git a/debian/changelog b/debian/changelog index 78d509c..a022897 100644 --- a/debian/changelog +++ b/debian/changelog @@ -49,6 +49,7 @@ xserver-xorg-video-nouveau (1:0.0.10~git+20081028+cea05e1-1) experimental; urgen - b175bfc... Bios register list is easier to read when sorted numerically - e51b49c... randr12: panels with edid have only a constant mode - 765494e... Remove unnecessary "Setting owner" message + * Bump Build-Depends on libdrm-dev. -- Chris Lamb <[EMAIL PROTECTED]> Tue, 28 Oct 2008 07:44:02 +0000 diff --git a/debian/control b/debian/control index 1b335dd..4dc7b4b 100644 --- a/debian/control +++ b/debian/control @@ -3,7 +3,7 @@ Section: x11 Priority: optional Maintainer: Debian X Strike Force <debian-x@lists.debian.org> Uploaders: Chris Lamb <[EMAIL PROTECTED]>, Matthew Johnson <[EMAIL PROTECTED]> -Build-Depends: debhelper (>= 7), pkg-config, xserver-xorg-dev (>= 2:1.2.99.902), x11proto-video-dev, x11proto-core-dev, x11proto-fonts-dev, x11proto-randr-dev (>= 1.2), x11proto-render-dev, x11proto-xext-dev, libdrm-dev (>= 2.3.1+git+20081012+f5327ac), x11proto-xf86dri-dev, x11proto-gl-dev, mesa-common-dev, git-core, automake, libtool, xutils-dev, xserver-xorg-dev +Build-Depends: debhelper (>= 7), pkg-config, xserver-xorg-dev (>= 2:1.2.99.902), x11proto-video-dev, x11proto-core-dev, x11proto-fonts-dev, x11proto-randr-dev (>= 1.2), x11proto-render-dev, x11proto-xext-dev, libdrm-dev (>= 2.3.1+git+20081027+1d930fc), x11proto-xf86dri-dev, x11proto-gl-dev, mesa-common-dev, git-core, automake, libtool, xutils-dev, xserver-xorg-dev Standards-Version: 3.8.0 Homepage: http://nouveau.freedesktop.org/wiki/ Vcs-Git: git://git.debian.org/git/pkg-xorg/driver/xserver-xorg-video-nouveau commit 6a3088b06d70c137bc4b5d9c601c52383fcb3f77 Author: Chris Lamb <[EMAIL PROTECTED]> Date: Tue Oct 28 07:46:50 2008 +0000 New upstream snapshot. Signed-off-by: Chris Lamb <[EMAIL PROTECTED]> diff --git a/debian/changelog b/debian/changelog index 6480e1a..78d509c 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,57 @@ +xserver-xorg-video-nouveau (1:0.0.10~git+20081028+cea05e1-1) experimental; urgency=low + + * New upstream snapshot (Closes: #503541) + - cea05e1... randr12: make colour-map setting less complex + - 0e4b01a... randr12: convenience functions for vga crtc state access + - fe9bfd9... Tidy EnterVT, and don't call it from ScreenInit + - 3e1ccff... Condense crtc locking + - 83b541e... Common function for the bios condition table + - 36c6aa4... Allow more time in INIT_CONDITION_TIME (#18234) + - bf810b3... More warnings for C51's magical unaligned regs + - d481b5e... Rework bios parser error handling + - 387f308... RivaTuner dumps call the `how much memory have I got?' reg + NV_PFB_CSTATUS + - bb20175... pedantry fix for nv11 locking, and some minor cleanups + - 9aecc42... Add a function to lock/unlock all crtcs, use it in nv_bios + code + - 48581da... Attempt to make the usage of cr44 rational instead of + cargoculted + - 1c7bee9... Robust nv11 head setting (from mmiotrace) + - cf5162b... randr12: update scrn field on server regen, and emit an error + if rotated + - 13739cf... randr12: don't change virtualX/virtualY + - 98a4dcb... Delete notifiers and grobjs in CloseScreen to avoid channel + member becoming stale on server regeneration + - 12fce00... Remove all object with mmaps in CloseScreen, so that + drmClose actually calls the drm release method + - 8e3f27a... No reason to call AccelCommonInit twice in ScreenInit, but + calling it in EnterVT helps resume... + - f495fa9... nouveau_channel_free should remove mmaps made in + nouveau_channel_alloc + - 1cedb8e... Do frag prog allocation and shader upload in TCL init + - 9e2c089... Only hackup shaders once + - afc6668... cr26 is just another view of 0x3c0 + - 539f499... Use symbolic define values where known + - 791666a... Convert CIO, DIO and VIO use to use defines from nvreg for + index and data reg offsets + - a1b7f8d... Rename relevant functions, sizes and offsets to PRM.IO from + P.IO, in keeping with the nvidia scheme + - 267c0ee... Name crtc index regs according to rules.xml + - 9261c34... SaveGeneration isn't doing a lot + - c29c190... Replace a few memsets with initializers + - 3b53f6c... Eliminate separate NVRec ctor and dtor + - 1b18db2... randr12: remove pointless debug in nv_output and nv_crtc + - 240d51d... randr12: deBoolification and eliminate `override' arg to + nv_crtc_load_state_ext + - b95c3e2... Make all CR 57/58 access use the proper functions and defines + - 9988ae5... Redo bios logging + - 0e6a9cc... Improve some nv_bios messages, remove others + - b175bfc... Bios register list is easier to read when sorted numerically + - e51b49c... randr12: panels with edid have only a constant mode + - 765494e... Remove unnecessary "Setting owner" message + + -- Chris Lamb <[EMAIL PROTECTED]> Tue, 28 Oct 2008 07:44:02 +0000 + xserver-xorg-video-nouveau (1:0.0.10~git+20081012+3b53f6c-1) experimental; urgency=low * New upstream snapshot: 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); } -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]