.gitignore | 3 Imakefile | 8 configure.ac | 5 src/AtomBios/includes/CD_Common_Types.h | 6 src/AtomBios/includes/ObjectID.h | 448 ++++++++++++ src/Imakefile | 93 ++ src/rhd.h | 81 +- src/rhd_atombios.c | 1106 +++++++++++++++++++++++++++++--- src/rhd_atombios.h | 10 src/rhd_card.h | 55 + src/rhd_connector.c | 81 +- src/rhd_connector.h | 44 - src/rhd_crtc.c | 3 src/rhd_cursor.c | 347 +++++----- src/rhd_cursor.h | 25 src/rhd_driver.c | 80 +- src/rhd_helper.c | 33 src/rhd_i2c.c | 406 +++++++---- src/rhd_id.c | 352 ++++++---- src/rhd_lvtma.c | 13 src/rhd_modes.c | 18 src/rhd_monitor.c | 126 +-- src/rhd_monitor.h | 7 src/rhd_output.h | 16 src/rhd_pll.c | 268 +++++-- src/rhd_pll.h | 10 src/rhd_regs.h | 82 +- src/rhd_tmds.c | 8 utils/conntest/.gitignore | 2 utils/conntest/Makefile | 2 utils/conntest/README | 14 utils/conntest/rhd_conntest.c | 965 ++++++++++++++++++++------- 32 files changed, 3626 insertions(+), 1091 deletions(-)
New commits: commit d82090a1c82a4c57e995cdbf24ecc4f4164646c1 Author: Matt Kraai <[EMAIL PROTECTED]> Date: Sat Oct 6 19:02:53 2007 +0200 Call RHDMonitorInit() even if there is no DDC for the Connector. We don't solely depend on DDC any more to get mode for a connector. For panels we may use data pulled from AtomBIOS. Therefore we handle this inside RHDMonitorInit(). diff --git a/src/rhd_driver.c b/src/rhd_driver.c index 8281023..8b4d939 100644 --- a/src/rhd_driver.c +++ b/src/rhd_driver.c @@ -1245,8 +1245,7 @@ rhdModeLayoutSelect(RHDPtr rhdPtr, char *ignore) Connector = Output->Connector; - if (Connector->DDC) - Monitor = RHDMonitorInit(Connector); + Monitor = RHDMonitorInit(Connector); if (!Monitor && (Connector->Type == RHD_CONNECTOR_PANEL)) { xf86DrvMsg(rhdPtr->scrnIndex, X_WARNING, "Unable to attach a" commit 7a419e06d5aa539a538df7f8cf2f30c241a39bb7 Author: Egbert Eich <[EMAIL PROTECTED]> Date: Sat Oct 6 10:40:24 2007 +0200 If DDC fails try to get EDID or mode data from AtomBIOS. diff --git a/src/rhd_monitor.c b/src/rhd_monitor.c index 96afd4c..571b3ac 100644 --- a/src/rhd_monitor.c +++ b/src/rhd_monitor.c @@ -216,7 +216,11 @@ RHDMonitorInit(struct rhdConnector *Connector) RHDFUNC(Connector); /* TODO: For now. This should be handled differently. */ - if (!Connector->DDC) { + if (Connector->DDC) { + EDID = xf86DoEDID_DDC2(Connector->scrnIndex, Connector->DDC); + } + + if (!EDID) { #ifdef ATOM_BIOS if (Connector->Type == RHD_CONNECTOR_PANEL) { RHDPtr rhdPtr = RHDPTR(xf86Screens[Connector->scrnIndex]); @@ -233,19 +237,19 @@ RHDMonitorInit(struct rhdConnector *Connector) } else return NULL; - } else + } #endif - return NULL; - } else - EDID = xf86DoEDID_DDC2(Connector->scrnIndex, Connector->DDC); + } - if (!EDID && !mode) { + if (!EDID && !mode) { /* still no information? */ if (Connector->Type != RHD_CONNECTOR_PANEL) xf86DrvMsg(Connector->scrnIndex, X_INFO, - "No EDID data found on connector \"%s\"\n", Connector->Name); + "No EDID data found on connector \"%s\"\n", + Connector->Name); else xf86DrvMsg(Connector->scrnIndex, X_INFO, - "No EDID data nor mode found on panel connector \"%s\"\n", Connector->Name); + "No EDID data nor mode found on panel connector " + "\"%s\"\n", Connector->Name); return NULL; } commit 01b6a56fb46fee28c2e058b5183d3f71dd4be974 Author: Matthias Hopf <[EMAIL PROTECTED]> Date: Sat Oct 6 01:25:54 2007 +0200 Cursor cleanup: Moving all locks to interface functions. diff --git a/src/rhd_cursor.c b/src/rhd_cursor.c index 7b4725b..a1d11ba 100644 --- a/src/rhd_cursor.c +++ b/src/rhd_cursor.c @@ -176,8 +176,6 @@ restoreCursor(struct rhdCursor *Cursor) return; } - lockCursor(Cursor, TRUE); - RHDRegWrite(Cursor, Cursor->RegOffset + D1CUR_CONTROL, Cursor->StoreControl); RHDRegWrite(Cursor, Cursor->RegOffset + D1CUR_SURFACE_ADDRESS, @@ -192,8 +190,6 @@ restoreCursor(struct rhdCursor *Cursor) if (Cursor->StoreImage) memcpy ((CARD8 *) rhdPtr->FbBase + Cursor->StoreOffset, Cursor->StoreImage, Cursor->StoreImageSize); - - lockCursor(Cursor, FALSE); } /* @@ -256,15 +252,10 @@ displayCursor(struct rhdCrtc *Crtc) HotX = Cursor->X >= 0 ? 0 : -Cursor->X; HotY = Cursor->Y >= 0 ? 0 : -Cursor->Y; - lockCursor (Cursor, TRUE); enableCursor(Cursor, TRUE); setCursorPos(Cursor, X, Y, HotX, HotY); - lockCursor (Cursor, FALSE); - } else { - lockCursor (Cursor, TRUE); + } else enableCursor(Cursor, FALSE); - lockCursor (Cursor, FALSE); - } } /* @@ -280,8 +271,13 @@ rhdShowCursor(ScrnInfoPtr pScrn) for (i = 0; i < 2; i++) { struct rhdCrtc *Crtc = rhdPtr->Crtc[i]; - if (Crtc->Active && Crtc->scrnIndex == pScrn->scrnIndex) + if (Crtc->Active && Crtc->scrnIndex == pScrn->scrnIndex) { + struct rhdCursor *Cursor = Crtc->Cursor; + + lockCursor (Cursor, TRUE); displayCursor(Crtc); + lockCursor (Cursor, FALSE); + } } } @@ -329,8 +325,13 @@ rhdRestoreCursor(ScrnInfoPtr pScrn) for (i = 0; i < 2; i++) { struct rhdCrtc *Crtc = rhdPtr->Crtc[i]; - if (Crtc->Active && Crtc->scrnIndex == pScrn->scrnIndex) - restoreCursor(Crtc->Cursor); + if (Crtc->Active && Crtc->scrnIndex == pScrn->scrnIndex) { + struct rhdCursor *Cursor = Crtc->Cursor; + + lockCursor (Cursor, TRUE); + restoreCursor(Cursor); + lockCursor (Cursor, FALSE); + } } } @@ -345,9 +346,13 @@ rhdReloadCursor(ScrnInfoPtr pScrn) struct rhdCrtc *Crtc = rhdPtr->Crtc[i]; if (Crtc->Active && Crtc->scrnIndex == pScrn->scrnIndex) { - uploadCursorImage(Crtc->Cursor, rhdPtr->CursorImage); - setCursorImage (Crtc->Cursor); + struct rhdCursor *Cursor = Crtc->Cursor; + + lockCursor (Cursor, TRUE); + uploadCursorImage(Cursor, rhdPtr->CursorImage); + setCursorImage (Cursor); displayCursor (Crtc); + lockCursor (Cursor, FALSE); } } } @@ -365,12 +370,15 @@ rhdSetCursorPosition(ScrnInfoPtr pScrn, int x, int y) struct rhdCrtc *Crtc = rhdPtr->Crtc[i]; if (Crtc->Active && Crtc->scrnIndex == pScrn->scrnIndex) { + struct rhdCursor *Cursor = Crtc->Cursor; /* Given cursor pos is always relative to frame - make absolute */ Crtc->Cursor->X = x + pScrn->frameX0; Crtc->Cursor->Y = y + pScrn->frameY0; + lockCursor (Cursor, TRUE); displayCursor(Crtc); + lockCursor (Cursor, FALSE); } } } commit aa6ef99c879b398c1daa9b84f96c907e070381a8 Author: Matthias Hopf <[EMAIL PROTECTED]> Date: Sat Oct 6 01:19:00 2007 +0200 Cursor cleanup: Nuke export of bit-banging interface. These functions were never intended to be called outside cursor.c, or to be overloaded. Calling function pointers also disables inlining by the compiler. Found some more reasonable function names for some. Some whitespace cleanup. Added missing rhdRestoreCursor() prototype. diff --git a/src/rhd_cursor.c b/src/rhd_cursor.c index 31460ba..7b4725b 100644 --- a/src/rhd_cursor.c +++ b/src/rhd_cursor.c @@ -123,7 +123,7 @@ uploadCursorImage(struct rhdCursor *Cursor, CARD32 *img) } static void -rhdCursorSave(struct rhdCursor *Cursor) +saveCursor(struct rhdCursor *Cursor) { ScrnInfoPtr pScrn = xf86Screens[Cursor->scrnIndex]; RHDPtr rhdPtr = RHDPTR(pScrn); @@ -165,7 +165,7 @@ rhdCursorSave(struct rhdCursor *Cursor) } static void -rhdCursorRestore(struct rhdCursor *Cursor) +restoreCursor(struct rhdCursor *Cursor) { RHDPtr rhdPtr = RHDPTRI(Cursor); RHDFUNC(Cursor); @@ -176,7 +176,7 @@ rhdCursorRestore(struct rhdCursor *Cursor) return; } - Cursor->Lock(Cursor, TRUE); + lockCursor(Cursor, TRUE); RHDRegWrite(Cursor, Cursor->RegOffset + D1CUR_CONTROL, Cursor->StoreControl); @@ -193,7 +193,7 @@ rhdCursorRestore(struct rhdCursor *Cursor) memcpy ((CARD8 *) rhdPtr->FbBase + Cursor->StoreOffset, Cursor->StoreImage, Cursor->StoreImageSize); - Cursor->Lock(Cursor, FALSE); + lockCursor(Cursor, FALSE); } /* @@ -237,7 +237,7 @@ convertBitsToARGB(struct rhd_Cursor_Bits *bits, CARD32 *dest, /* Enable/disable cursor according to visibility, and set cursor pos */ static void -rhdCursorSet(struct rhdCrtc *Crtc) +displayCursor(struct rhdCrtc *Crtc) { struct rhdCursor *Cursor = Crtc->Cursor; @@ -256,14 +256,14 @@ rhdCursorSet(struct rhdCrtc *Crtc) HotX = Cursor->X >= 0 ? 0 : -Cursor->X; HotY = Cursor->Y >= 0 ? 0 : -Cursor->Y; - Cursor->Lock(Cursor, TRUE); - Cursor->Enable(Cursor, TRUE); - Cursor->Position(Cursor, X, Y, HotX, HotY); - Cursor->Lock(Cursor, FALSE); + lockCursor (Cursor, TRUE); + enableCursor(Cursor, TRUE); + setCursorPos(Cursor, X, Y, HotX, HotY); + lockCursor (Cursor, FALSE); } else { - Cursor->Lock(Cursor, TRUE); - Cursor->Enable(Cursor, FALSE); - Cursor->Lock(Cursor, FALSE); + lockCursor (Cursor, TRUE); + enableCursor(Cursor, FALSE); + lockCursor (Cursor, FALSE); } } @@ -281,7 +281,7 @@ rhdShowCursor(ScrnInfoPtr pScrn) struct rhdCrtc *Crtc = rhdPtr->Crtc[i]; if (Crtc->Active && Crtc->scrnIndex == pScrn->scrnIndex) - rhdCursorSet(Crtc); + displayCursor(Crtc); } } @@ -297,9 +297,9 @@ rhdHideCursor(ScrnInfoPtr pScrn) if (Crtc->Active && Crtc->scrnIndex == pScrn->scrnIndex) { struct rhdCursor *Cursor = Crtc->Cursor; - Cursor->Lock(Cursor, TRUE); - Cursor->Enable(Cursor, FALSE); - Cursor->Lock(Cursor, FALSE); + lockCursor (Cursor, TRUE); + enableCursor(Cursor, FALSE); + lockCursor (Cursor, FALSE); } } } @@ -315,7 +315,7 @@ rhdSaveCursor(ScrnInfoPtr pScrn) struct rhdCrtc *Crtc = rhdPtr->Crtc[i]; if (Crtc->Active && Crtc->scrnIndex == pScrn->scrnIndex) - Crtc->Cursor->Save(Crtc->Cursor); + saveCursor(Crtc->Cursor); } } @@ -330,7 +330,7 @@ rhdRestoreCursor(ScrnInfoPtr pScrn) struct rhdCrtc *Crtc = rhdPtr->Crtc[i]; if (Crtc->Active && Crtc->scrnIndex == pScrn->scrnIndex) - Crtc->Cursor->Restore(Crtc->Cursor); + restoreCursor(Crtc->Cursor); } } @@ -345,9 +345,9 @@ rhdReloadCursor(ScrnInfoPtr pScrn) struct rhdCrtc *Crtc = rhdPtr->Crtc[i]; if (Crtc->Active && Crtc->scrnIndex == pScrn->scrnIndex) { - Crtc->Cursor->Load(Crtc->Cursor, rhdPtr->CursorImage); - Crtc->Cursor->Set (Crtc->Cursor); - rhdCursorSet (Crtc); + uploadCursorImage(Crtc->Cursor, rhdPtr->CursorImage); + setCursorImage (Crtc->Cursor); + displayCursor (Crtc); } } } @@ -370,7 +370,7 @@ rhdSetCursorPosition(ScrnInfoPtr pScrn, int x, int y) Crtc->Cursor->X = x + pScrn->frameX0; Crtc->Cursor->Y = y + pScrn->frameY0; - rhdCursorSet(Crtc); + displayCursor(Crtc); } } } @@ -397,10 +397,10 @@ rhdSetCursorColors(ScrnInfoPtr pScrn, int bg, int fg) if (Crtc->Active && Crtc->scrnIndex == pScrn->scrnIndex) { struct rhdCursor *Cursor = Crtc->Cursor; - Cursor->Lock(Cursor, TRUE); - Cursor->Load(Cursor, rhdPtr->CursorImage); - Cursor->Set(Cursor); - Cursor->Lock(Cursor, FALSE); + lockCursor (Cursor, TRUE); + uploadCursorImage(Cursor, rhdPtr->CursorImage); + setCursorImage (Cursor); + lockCursor (Cursor, FALSE); } } } @@ -426,10 +426,10 @@ rhdLoadCursorImage(ScrnInfoPtr pScrn, unsigned char *src) Cursor->Width = bits->width; Cursor->Height = bits->height; - Cursor->Lock(Cursor, TRUE); - Cursor->Load(Cursor, rhdPtr->CursorImage); - Cursor->Set(Cursor); - Cursor->Lock(Cursor, FALSE); + lockCursor (Cursor, TRUE); + uploadCursorImage(Cursor, rhdPtr->CursorImage); + setCursorImage (Cursor); + lockCursor (Cursor, FALSE); } } } @@ -465,10 +465,10 @@ rhdLoadCursorARGB(ScrnInfoPtr pScrn, CursorPtr cur) Cursor->Width = cur->bits->width; Cursor->Height = cur->bits->height; - Cursor->Lock(Cursor, TRUE); - Cursor->Load(Cursor, rhdPtr->CursorImage); - Cursor->Set(Cursor); - Cursor->Lock(Cursor, FALSE); + lockCursor (Cursor, TRUE); + uploadCursorImage(Cursor, rhdPtr->CursorImage); + setCursorImage (Cursor); + lockCursor (Cursor, FALSE); } } } @@ -515,14 +515,6 @@ RHDCursorsInit(RHDPtr rhdPtr) rhdPtr->FbFreeStart += size; rhdPtr->FbFreeSize -= size; - Cursor->Lock = lockCursor; - Cursor->Enable = enableCursor; - Cursor->Position = setCursorPos; - Cursor->Set = setCursorImage; - Cursor->Load = uploadCursorImage; - Cursor->Save = rhdCursorSave; - Cursor->Restore = rhdCursorRestore; - rhdPtr->Crtc[i]->Cursor = Cursor; /* HW is fixed anyway */ } } diff --git a/src/rhd_cursor.h b/src/rhd_cursor.h index bd86b28..56357a4 100644 --- a/src/rhd_cursor.h +++ b/src/rhd_cursor.h @@ -45,15 +45,6 @@ struct rhdCursor int X; int Y; - void (*Lock) (struct rhdCursor *Cursor, Bool Lock); - void (*Enable) (struct rhdCursor *Cursor, Bool Enable); - void (*Position) (struct rhdCursor *Cursor, - CARD32 x, CARD32 y, CARD32 hotx, CARD32 hoty); - void (*Set) (struct rhdCursor *Cursor); - void (*Load) (struct rhdCursor *Cursor, CARD32 *img); - void (*Save) (struct rhdCursor *Cursor); - void (*Restore) (struct rhdCursor *Cursor); - Bool Stored; CARD32 StoreControl; @@ -72,5 +63,6 @@ void rhdShowCursor(ScrnInfoPtr); void rhdHideCursor(ScrnInfoPtr); void rhdReloadCursor(ScrnInfoPtr pScrn); void rhdSaveCursor(ScrnInfoPtr pScrn); +void rhdRestoreCursor(ScrnInfoPtr pScrn); #endif commit 1ba6ec693c8f8a2eae018160b36659d45bcae274 Author: Matthias Hopf <[EMAIL PROTECTED]> Date: Sat Oct 6 00:59:52 2007 +0200 Cursor cleanup: Move functions to right place. Adjust comments. diff --git a/src/rhd_cursor.c b/src/rhd_cursor.c index fef3b4b..31460ba 100644 --- a/src/rhd_cursor.c +++ b/src/rhd_cursor.c @@ -50,17 +50,10 @@ /* System headers */ #include <assert.h> -/* Internal interface to RealizeCursor - we need width/height */ -struct rhd_Cursor_Bits { - int width, height; - /* Cursor source bitmap follows */ - /* Cursor mask bitmap follows */ -} ; - /* * Bit-banging ONLY */ - + /* RadeonHD registers are double buffered, exchange only during vertical blank. * By locking registers, a set of registers is updated atomically. * Probably not necessary for cursors, but trivial and fast. */ @@ -129,7 +122,6 @@ uploadCursorImage(struct rhdCursor *Cursor, CARD32 *img) MAX_CURSOR_WIDTH * Cursor->Height * 4); } -/* Save hardware state. */ static void rhdCursorSave(struct rhdCursor *Cursor) { @@ -172,7 +164,6 @@ rhdCursorSave(struct rhdCursor *Cursor) Cursor->Stored = TRUE; } -/* Restore hardware state. */ static void rhdCursorRestore(struct rhdCursor *Cursor) { @@ -206,82 +197,17 @@ rhdCursorRestore(struct rhdCursor *Cursor) } /* - * - */ -void -RHDCursorsInit(RHDPtr rhdPtr) -{ - struct rhdCursor *Cursor; - int size = RHD_FB_CHUNK(MAX_CURSOR_WIDTH * MAX_CURSOR_HEIGHT * 4); - - RHDFUNC(rhdPtr); - - /* First Cursor */ - Cursor = xnfcalloc(sizeof(struct rhdCursor), 1); - - Cursor->scrnIndex = rhdPtr->scrnIndex; - - Cursor->RegOffset = 0; - - /* Don't set width and height yet */ - - /* grab our cursor FB */ - /* I love a bit of a challenge, so move start instead of end */ - Cursor->Base = rhdPtr->FbFreeStart; - rhdPtr->FbFreeStart += size; - rhdPtr->FbFreeSize -= size; - - Cursor->Lock = lockCursor; - Cursor->Enable = enableCursor; - Cursor->Position = setCursorPos; - Cursor->Set = setCursorImage; - Cursor->Load = uploadCursorImage; - Cursor->Save = rhdCursorSave; - Cursor->Restore = rhdCursorRestore; - - rhdPtr->Crtc[0]->Cursor = Cursor; /* HW is fixed anyway */ - - /* Second Cursor */ - Cursor = xnfcalloc(sizeof(struct rhdCursor), 1); - - Cursor->scrnIndex = rhdPtr->scrnIndex; - - Cursor->RegOffset = 0x800; - - Cursor->Base = rhdPtr->FbFreeStart; - rhdPtr->FbFreeStart += size; - rhdPtr->FbFreeSize -= size; - - Cursor->Lock = lockCursor; - Cursor->Enable = enableCursor; - Cursor->Position = setCursorPos; - Cursor->Set = setCursorImage; - Cursor->Load = uploadCursorImage; - Cursor->Save = rhdCursorSave; - Cursor->Restore = rhdCursorRestore; - - rhdPtr->Crtc[1]->Cursor = Cursor; -} - -/* - * - */ -void -RHDCursorsDestroy(RHDPtr rhdPtr) -{ - RHDFUNC(rhdPtr); - - if (rhdPtr->Crtc[0]) - xfree(rhdPtr->Crtc[0]->Cursor); - if (rhdPtr->Crtc[1]) - xfree(rhdPtr->Crtc[1]->Cursor); -} - -/* * Helper functions */ -/* Convert bitmaps as defined in rhd_CursorBits to ARGB tupels */ +/* Internal interface to RealizeCursor - we need width/height */ +struct rhd_Cursor_Bits { + int width, height; + /* Cursor source bitmap follows */ + /* Cursor mask bitmap follows */ +} ; + +/* Convert bitmaps as defined in rhd_Cursor_Bits to ARGB tupels */ static void convertBitsToARGB(struct rhd_Cursor_Bits *bits, CARD32 *dest, CARD32 color0, CARD32 color1) @@ -309,10 +235,7 @@ convertBitsToARGB(struct rhd_Cursor_Bits *bits, CARD32 *dest, } } - -/* - * - */ +/* Enable/disable cursor according to visibility, and set cursor pos */ static void rhdCursorSet(struct rhdCrtc *Crtc) { @@ -345,7 +268,7 @@ rhdCursorSet(struct rhdCrtc *Crtc) } /* - * Interface + * Internal Driver + Xorg Interface */ void @@ -381,6 +304,7 @@ rhdHideCursor(ScrnInfoPtr pScrn) } } +/* Called for saving VT cursor info */ void rhdSaveCursor(ScrnInfoPtr pScrn) { @@ -395,6 +319,7 @@ rhdSaveCursor(ScrnInfoPtr pScrn) } } +/* Called for restoring VT cursor info */ void rhdRestoreCursor(ScrnInfoPtr pScrn) { @@ -409,6 +334,7 @@ rhdRestoreCursor(ScrnInfoPtr pScrn) } } +/* Called for restoring Xorg cursor */ void rhdReloadCursor(ScrnInfoPtr pScrn) { @@ -426,6 +352,9 @@ rhdReloadCursor(ScrnInfoPtr pScrn) } } +/* + * Xorg Interface + */ static void rhdSetCursorPosition(ScrnInfoPtr pScrn, int x, int y) { @@ -437,7 +366,7 @@ rhdSetCursorPosition(ScrnInfoPtr pScrn, int x, int y) if (Crtc->Active && Crtc->scrnIndex == pScrn->scrnIndex) { - /* Given cursor pos is always relative to frame - make absolute here */ + /* Given cursor pos is always relative to frame - make absolute */ Crtc->Cursor->X = x + pScrn->frameX0; Crtc->Cursor->Y = y + pScrn->frameY0; @@ -565,6 +494,52 @@ rhdRealizeCursor(xf86CursorInfoPtr infoPtr, CursorPtr cur) * Init */ +void +RHDCursorsInit(RHDPtr rhdPtr) +{ + int size = RHD_FB_CHUNK(MAX_CURSOR_WIDTH * MAX_CURSOR_HEIGHT * 4); + int i; + + RHDFUNC(rhdPtr); + + for (i = 0; i < 2; i++) { + struct rhdCursor *Cursor = xnfcalloc(sizeof(struct rhdCursor), 1); + + Cursor->scrnIndex = rhdPtr->scrnIndex; + + Cursor->RegOffset = i * 0x0800; + + /* grab our cursor FB */ + /* I love a bit of a challenge, so move start instead of end */ + Cursor->Base = rhdPtr->FbFreeStart; + rhdPtr->FbFreeStart += size; + rhdPtr->FbFreeSize -= size; + + Cursor->Lock = lockCursor; + Cursor->Enable = enableCursor; + Cursor->Position = setCursorPos; + Cursor->Set = setCursorImage; + Cursor->Load = uploadCursorImage; + Cursor->Save = rhdCursorSave; + Cursor->Restore = rhdCursorRestore; + + rhdPtr->Crtc[i]->Cursor = Cursor; /* HW is fixed anyway */ + } +} + +void +RHDCursorsDestroy(RHDPtr rhdPtr) +{ + int i; + RHDFUNC(rhdPtr); + + for (i = 0; i < 2; i++) { + xfree(rhdPtr->Crtc[i]->Cursor->StoreImage); + rhdPtr->Crtc[i]->Cursor->Stored = FALSE; + xfree(rhdPtr->Crtc[i]->Cursor); + } +} + Bool RHDxf86InitCursor(ScreenPtr pScreen) { commit c8780b2f3b75cec582126ace85137fdf2208bb3d Author: Matthias Hopf <[EMAIL PROTECTED]> Date: Sat Oct 6 00:51:41 2007 +0200 On reloading cursor, do not only upload image, but also set cursor address. diff --git a/src/rhd_cursor.c b/src/rhd_cursor.c index a463508..fef3b4b 100644 --- a/src/rhd_cursor.c +++ b/src/rhd_cursor.c @@ -418,8 +418,11 @@ rhdReloadCursor(ScrnInfoPtr pScrn) for (i = 0; i < 2; i++) { struct rhdCrtc *Crtc = rhdPtr->Crtc[i]; - if (Crtc->Active && Crtc->scrnIndex == pScrn->scrnIndex) + if (Crtc->Active && Crtc->scrnIndex == pScrn->scrnIndex) { Crtc->Cursor->Load(Crtc->Cursor, rhdPtr->CursorImage); + Crtc->Cursor->Set (Crtc->Cursor); + rhdCursorSet (Crtc); + } } } commit 1947ab3ed81835a7ffb95ae0a7056766d24c90d2 Author: Matthias Hopf <[EMAIL PROTECTED]> Date: Sat Oct 6 00:29:35 2007 +0200 Correct cursor image saving. Calculate correct cursor offset. Calculate correct cursor height. Verify against correct videoRam (Kbytes). diff --git a/src/rhd_cursor.c b/src/rhd_cursor.c index b7bec76..a463508 100644 --- a/src/rhd_cursor.c +++ b/src/rhd_cursor.c @@ -140,8 +140,9 @@ rhdCursorSave(struct rhdCursor *Cursor) Cursor->StoreControl = RHDRegRead(Cursor, Cursor->RegOffset + D1CUR_CONTROL); - Cursor->StoreAddress = RHDRegRead(Cursor, Cursor->RegOffset - + D1CUR_SURFACE_ADDRESS); + Cursor->StoreOffset = RHDRegRead(Cursor, Cursor->RegOffset + + D1CUR_SURFACE_ADDRESS) + - rhdPtr->FbIntAddress; Cursor->StoreSize = RHDRegRead(Cursor, Cursor->RegOffset + D1CUR_SIZE); Cursor->StorePosition = RHDRegRead(Cursor, Cursor->RegOffset @@ -149,7 +150,7 @@ rhdCursorSave(struct rhdCursor *Cursor) Cursor->StoreHotSpot = RHDRegRead(Cursor, Cursor->RegOffset + D1CUR_HOT_SPOT); - Cursor->StoreImageSize = Cursor->StoreSize & 0x003f; /* Height */ + Cursor->StoreImageSize = (Cursor->StoreSize & 0x003f) + 1; /* Height */ switch ((Cursor->StoreControl & 0x0300) >> 8) { case 0: /* 2bpp */ Cursor->StoreImageSize *= 64*2/8; @@ -158,10 +159,10 @@ rhdCursorSave(struct rhdCursor *Cursor) Cursor->StoreImageSize *= 64*32/8; } xfree (Cursor->StoreImage); - if (Cursor->StoreAddress + Cursor->StoreImageSize < pScrn->videoRam) { + if ((Cursor->StoreOffset + Cursor->StoreImageSize)/1024 < pScrn->videoRam) { if ( (Cursor->StoreImage = xalloc (Cursor->StoreImageSize)) ) memcpy (Cursor->StoreImage, - (CARD8 *) rhdPtr->FbBase + Cursor->StoreAddress, + (CARD8 *) rhdPtr->FbBase + Cursor->StoreOffset, Cursor->StoreImageSize); else ErrorF("Out of memory for cursor save area\n"); @@ -189,7 +190,7 @@ rhdCursorRestore(struct rhdCursor *Cursor) RHDRegWrite(Cursor, Cursor->RegOffset + D1CUR_CONTROL, Cursor->StoreControl); RHDRegWrite(Cursor, Cursor->RegOffset + D1CUR_SURFACE_ADDRESS, - Cursor->StoreAddress); + Cursor->StoreOffset + rhdPtr->FbIntAddress); RHDRegWrite(Cursor, Cursor->RegOffset + D1CUR_SIZE, Cursor->StoreSize); RHDRegWrite(Cursor, Cursor->RegOffset + D1CUR_POSITION, @@ -198,7 +199,7 @@ rhdCursorRestore(struct rhdCursor *Cursor) Cursor->StoreHotSpot); if (Cursor->StoreImage) - memcpy ((CARD8 *) rhdPtr->FbBase + Cursor->StoreAddress, + memcpy ((CARD8 *) rhdPtr->FbBase + Cursor->StoreOffset, Cursor->StoreImage, Cursor->StoreImageSize); Cursor->Lock(Cursor, FALSE); diff --git a/src/rhd_cursor.h b/src/rhd_cursor.h index 6530701..bd86b28 100644 --- a/src/rhd_cursor.h +++ b/src/rhd_cursor.h @@ -57,7 +57,7 @@ struct rhdCursor Bool Stored; CARD32 StoreControl; - CARD32 StoreAddress; + CARD32 StoreOffset; CARD32 StoreSize; CARD32 StorePosition; CARD32 StoreHotSpot; commit badc3389e46c069a2570687bc36388724db2d19b Author: Matthias Hopf <[EMAIL PROTECTED]> Date: Sat Oct 6 00:15:59 2007 +0200 Fix compilation (oops). Also saving cursor does not depend on CursorInfo. diff --git a/src/rhd_driver.c b/src/rhd_driver.c index 2613818..8281023 100644 --- a/src/rhd_driver.c +++ b/src/rhd_driver.c @@ -711,6 +711,7 @@ RHDScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) pScrn = xf86Screens[pScreen->myNum]; rhdPtr = RHDPTR(pScrn); + RHDFUNC(pScrn); /* * Whack the hardware @@ -1425,6 +1426,8 @@ rhdModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode) static void rhdSave(RHDPtr rhdPtr) { + ScrnInfoPtr pScrn = xf86Screens[rhdPtr->scrnIndex]; + RHDFUNC(rhdPtr); RHDVGASave(rhdPtr); @@ -1436,8 +1439,7 @@ rhdSave(RHDPtr rhdPtr) rhdPtr->Crtc[0]->Save(rhdPtr->Crtc[0]); rhdPtr->Crtc[1]->Save(rhdPtr->Crtc[1]); - if (rhdPtr->CursorInfo) - rhdSaveCursor(pScrn); + rhdSaveCursor(pScrn); } /* @@ -1446,6 +1448,8 @@ rhdSave(RHDPtr rhdPtr) static void rhdRestore(RHDPtr rhdPtr) { + ScrnInfoPtr pScrn = xf86Screens[rhdPtr->scrnIndex]; + RHDFUNC(rhdPtr); RHDPLLsRestore(rhdPtr); commit 842701653a379692cc489cd4200bdef40baa8730 Author: Matthias Hopf <[EMAIL PROTECTED]> Date: Fri Oct 5 17:48:15 2007 +0200 Cleanup: cursor.h no longer necessary. diff --git a/src/rhd_crtc.c b/src/rhd_crtc.c index ab1b4ce..6bd7f93 100644 --- a/src/rhd_crtc.c +++ b/src/rhd_crtc.c @@ -34,7 +34,6 @@ #include "rhd.h" #include "rhd_crtc.h" -#include "rhd_cursor.h" #include "rhd_pll.h" #include "rhd_lut.h" #include "rhd_regs.h" commit 90ea9d3c6d6f37bc99592f993610271a1f6bf068 Author: Matthias Hopf <[EMAIL PROTECTED]> Date: Fri Oct 5 17:47:40 2007 +0200 Only save cursor image if address is in mapped memory range. diff --git a/src/rhd_cursor.c b/src/rhd_cursor.c index 04dfa89..b7bec76 100644 --- a/src/rhd_cursor.c +++ b/src/rhd_cursor.c @@ -133,7 +133,9 @@ uploadCursorImage(struct rhdCursor *Cursor, CARD32 *img) static void rhdCursorSave(struct rhdCursor *Cursor) { - RHDPtr rhdPtr = RHDPTRI(Cursor); + ScrnInfoPtr pScrn = xf86Screens[Cursor->scrnIndex]; + RHDPtr rhdPtr = RHDPTR(pScrn); + RHDFUNC(Cursor); Cursor->StoreControl = RHDRegRead(Cursor, Cursor->RegOffset @@ -156,12 +158,15 @@ rhdCursorSave(struct rhdCursor *Cursor) Cursor->StoreImageSize *= 64*32/8; } xfree (Cursor->StoreImage); - if ( (Cursor->StoreImage = xalloc (Cursor->StoreImageSize)) ) - memcpy (Cursor->StoreImage, - (CARD8 *) rhdPtr->FbBase + Cursor->StoreAddress, - Cursor->StoreImageSize); - else - ErrorF("Out of memory for cursor save area\n"); + if (Cursor->StoreAddress + Cursor->StoreImageSize < pScrn->videoRam) { + if ( (Cursor->StoreImage = xalloc (Cursor->StoreImageSize)) ) + memcpy (Cursor->StoreImage, + (CARD8 *) rhdPtr->FbBase + Cursor->StoreAddress, + Cursor->StoreImageSize); + else + ErrorF("Out of memory for cursor save area\n"); + } else + Cursor->StoreImage = NULL; Cursor->Stored = TRUE; } @@ -173,6 +178,12 @@ rhdCursorRestore(struct rhdCursor *Cursor) RHDPtr rhdPtr = RHDPTRI(Cursor); RHDFUNC(Cursor); + if (!Cursor->Stored) { + xf86DrvMsg(Cursor->scrnIndex, X_ERROR, "%s: trying to restore " + "uninitialized values.\n", __func__); + return; + } + Cursor->Lock(Cursor, TRUE); RHDRegWrite(Cursor, Cursor->RegOffset + D1CUR_CONTROL, commit 0288ac3d6a87d38983f60df7e5f398200dc58354 Author: Matthias Hopf <[EMAIL PROTECTED]> Date: Fri Oct 5 17:43:08 2007 +0200 Move Cursor Save & Restore to right places. Nuke HideCursor on LeaveVT. diff --git a/src/rhd_driver.c b/src/rhd_driver.c index e281d57..2613818 100644 --- a/src/rhd_driver.c +++ b/src/rhd_driver.c @@ -727,6 +727,7 @@ RHDScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) } /* save previous mode */ +// FIXME: necessary? is EnterVT called? rhdSave(rhdPtr); /* now init the new mode */ @@ -864,11 +865,8 @@ RHDCloseScreen(int scrnIndex, ScreenPtr pScreen) ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; RHDPtr rhdPtr = RHDPTR(pScrn); - if(pScrn->vtSema){ - if (rhdPtr->CursorInfo) - rhdHideCursor(pScrn); + if(pScrn->vtSema) rhdRestore(rhdPtr); - } RHDShadowCloseScreen(pScreen); rhdUnmapFB(rhdPtr); @@ -920,11 +918,7 @@ RHDLeaveVT(int scrnIndex, int flags) ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; RHDPtr rhdPtr = RHDPTR(pScrn); - /* Invalidate the cached acceleration registers */ - if (rhdPtr->CursorInfo) { - rhdSaveCursor(pScrn); - rhdHideCursor(pScrn); - } + /* TODO: Invalidate the cached acceleration registers */ rhdRestore(rhdPtr); } @@ -1442,6 +1436,8 @@ rhdSave(RHDPtr rhdPtr) rhdPtr->Crtc[0]->Save(rhdPtr->Crtc[0]); rhdPtr->Crtc[1]->Save(rhdPtr->Crtc[1]); + if (rhdPtr->CursorInfo) + rhdSaveCursor(pScrn); } /* @@ -1457,6 +1453,8 @@ rhdRestore(RHDPtr rhdPtr) rhdPtr->Crtc[0]->Restore(rhdPtr->Crtc[0]); rhdPtr->Crtc[1]->Restore(rhdPtr->Crtc[1]); + if (rhdPtr->CursorInfo) + rhdRestoreCursor(pScrn); RHDVGARestore(rhdPtr); commit 4dea386f003e2b9f0c0f70dd594ce13a0b033bfc Author: Matthias Hopf <[EMAIL PROTECTED]> Date: Fri Oct 5 17:40:14 2007 +0200 -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]