diff options
-rw-r--r-- | src/smi.h | 1 | ||||
-rw-r--r-- | src/smi501_crtc.c | 6 | ||||
-rw-r--r-- | src/smi_crtc.c | 25 | ||||
-rw-r--r-- | src/smi_driver.c | 43 |
4 files changed, 39 insertions, 36 deletions
@@ -112,7 +112,6 @@ typedef struct CloseScreenProcPtr CloseScreen; /* Pointer used to save wrapped CloseScreen function */ - xf86CursorInfoPtr CursorInfoRec; /* HW Cursor info */ I2CBusPtr I2C; /* Pointer into I2C module */ xf86Int10InfoPtr pInt10; /* Pointer to INT10 module */ vbeInfoPtr pVbe; /* Pointer to VBE module */ diff --git a/src/smi501_crtc.c b/src/smi501_crtc.c index 606a169..9cf6817 100644 --- a/src/smi501_crtc.c +++ b/src/smi501_crtc.c @@ -440,9 +440,11 @@ SMI501_CrtcLoadCursorImage(xf86CrtcPtr crtc, CARD8 *image) ENTER(); port = crtc == crtcConf->crtc[0] ? 0x00f0 : 0x0230; - value = pSmi->FBCursorOffset + (port == 0x00f0 ? 0 : 1024); + value = pSmi->FBCursorOffset + (port == 0x00f0 ? 0 : SMI501_MAX_CURSOR); WRITE_DCR(pSmi, port, value); - memcpy(pSmi->FBBase + value, image, 1024); + memcpy(pSmi->FBBase + value, image, + /* FIXME 1024, but then, should not be using 64x64 cursors */ + (SMI501_MAX_CURSOR >> 2) * SMI501_MAX_CURSOR); LEAVE(); } diff --git a/src/smi_crtc.c b/src/smi_crtc.c index 9c452c9..90728f4 100644 --- a/src/smi_crtc.c +++ b/src/smi_crtc.c @@ -42,9 +42,12 @@ SMI_CrtcDPMS(xf86CrtcPtr crtc, static Bool SMI_CrtcLock (xf86CrtcPtr crtc) { + ScrnInfoPtr pScrn = crtc->scrn; + SMIPtr pSmi = SMIPTR(pScrn); + ENTER(); - /* Nothing */ + WaitIdle(); RETURN(FALSE); } @@ -79,8 +82,8 @@ SMI_CrtcPrepare(xf86CrtcPtr crtc) ENTER(); - if (pSmi->HwCursor) - xf86_hide_cursors(pScrn); + if (!pSmi->Dualhead && pSmi->HwCursor) + crtc->funcs->hide_cursor(crtc); LEAVE(); } @@ -93,7 +96,21 @@ SMI_CrtcCommit(xf86CrtcPtr crtc) ENTER(); - if(pSmi->HwCursor) + /* Problem: + * When starting in Dualhead mode, both hw cursors will be shown, + * and at the same position, as both are at the same address. + * When reconfiguring with something like: + * $ xrandr --output VGA --right-of LVDS + * what will happen is basically: + * hide_cursor(panel) + * hide_cursor(crt) + * <set-crt-mode-and-modify-mapped-address> + * show_cursor(panel) <- besides a sw argb cursor is being used... + * + * It should not be a problem if argb cursors were supported, + * or only one output is available... + */ + if (!pSmi->Dualhead && pSmi->HwCursor) xf86_reload_cursors(pScrn->pScreen); LEAVE(); diff --git a/src/smi_driver.c b/src/smi_driver.c index f7484a6..9e80cd1 100644 --- a/src/smi_driver.c +++ b/src/smi_driver.c @@ -247,14 +247,6 @@ static const char *exaSymbols[] = NULL }; -static const char *ramdacSymbols[] = -{ - "xf86CreateCursorInfoRec", - "xf86DestroyCursorInfoRec", - "xf86InitCursor", - NULL -}; - static const char *ddcSymbols[] = { "xf86PrintEDID", @@ -350,7 +342,7 @@ siliconmotionSetup(pointer module, pointer opts, int *errmaj, int *errmin) * Tell the loader about symbols from other modules that this module * might refer to. */ - LoaderRefSymLists(vgahwSymbols, fbSymbols, xaaSymbols, exaSymbols, ramdacSymbols, + LoaderRefSymLists(vgahwSymbols, fbSymbols, xaaSymbols, exaSymbols, ddcSymbols, i2cSymbols, int10Symbols, vbeSymbols, NULL); @@ -996,7 +988,6 @@ SMI_PreInit(ScrnInfoPtr pScrn, int flags) SMI_FreeRec(pScrn); RETURN(FALSE); } - xf86LoaderReqSymLists(ramdacSymbols, NULL); } RETURN(TRUE); @@ -1063,7 +1054,8 @@ SMI_LeaveVT(int scrnIndex, int flags) unmapped. */ xf86RotateCloseScreen(pScrn->pScreen); - memset(pSmi->FBBase, 0, 256 * 1024); /* #689 */ + /* Clear frame buffer */ + memset(pSmi->FBBase, 0, pSmi->videoRAMBytes); if (!IS_MSOC(pSmi)) { vgaHWPtr hwp = VGAHWPTR(pScrn); @@ -1503,16 +1495,16 @@ SMI_MapMem(ScrnInfoPtr pScrn) xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Cursor Offset: %08lX\n", (unsigned long)pSmi->FBCursorOffset); - /* set up the fifo reserved space */ - if (IS_MSOC(pSmi)) { - pSmi->FBCursorOffset = pSmi->videoRAMBytes - 2048; - pSmi->FBReserved = pSmi->videoRAMBytes - 4096; - } + if (IS_MSOC(pSmi)) + /* Reserve space for panel cursr, and crt if in dual head mode */ + pSmi->FBReserved = pSmi->FBCursorOffset = pSmi->videoRAMBytes - + (pSmi->Dualhead ? SMI501_CURSOR_SIZE << 1 : SMI501_CURSOR_SIZE); else { - /* Set up offset to hwcursor memory area. It's a 1K chunk at the end of + /* Set up offset to hwcursor memory area, at the end of * the frame buffer. */ - pSmi->FBCursorOffset = pSmi->videoRAMBytes - 1024; + pSmi->FBCursorOffset = pSmi->videoRAMBytes - SMILYNX_CURSOR_SIZE; + /* set up the fifo reserved space */ if (VGAIN8_INDEX(pSmi, VGA_SEQ_INDEX, VGA_SEQ_DATA, 0x30) & 0x01)/* #1074 */ { CARD32 fifoOffset = 0; fifoOffset |= VGAIN8_INDEX(pSmi, VGA_SEQ_INDEX, VGA_SEQ_DATA, @@ -1618,9 +1610,6 @@ SMI_ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) /* Save the chip/graphics state */ pSmi->Save(pScrn); - /* Zero the frame buffer, #258 */ - memset(pSmi->FBBase, 0, pSmi->videoRAMBytes); - /* Fill in some needed pScrn fields */ pScrn->vtSema = TRUE; pScrn->pScreen = pScreen; @@ -1632,6 +1621,9 @@ SMI_ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) pSmi->FBOffset = 0; pScrn->fbOffset = pSmi->FBOffset + pSmi->fbMapOffset; + /* Clear frame buffer */ + memset(pSmi->FBBase, 0, pSmi->videoRAMBytes); + /* * The next step is to setup the screen's visuals, and initialise the * framebuffer code. In cases where the framebuffer's default choises for @@ -1781,11 +1773,7 @@ SMI_ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) !xf86DPMSInit(pScreen, SMILynx_DisplayPowerManagementSet, 0))) xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "DPMS initialization failed!\n"); - /* FIXME This could be an option. - * When not scaling doesn't seem to make much of a difference - * on MSOC, and this way, one can watch video on both screens... */ - if (!IS_MSOC(pSmi) || !pSmi->Dualhead) - SMI_InitVideo(pScreen); + SMI_InitVideo(pScreen); if(!xf86CrtcScreenInit(pScreen)) RETURN(FALSE); @@ -1836,9 +1824,6 @@ SMI_CloseScreen(int scrnIndex, ScreenPtr pScreen) exaDriverFini(pScreen); pSmi->EXADriverPtr = NULL; } - if (pSmi->CursorInfoRec != NULL) { - xf86DestroyCursorInfoRec(pSmi->CursorInfoRec); - } if (pSmi->DGAModes != NULL) { xfree(pSmi->DGAModes); } |