[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

xserver-xorg-video-radeonhd: Changes to 'upstream-experimental'



 .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 <kraai@ftbfs.org>
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 <eich@freedesktop.org>
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 <mhopf@suse.de>
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 <mhopf@suse.de>
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 <mhopf@suse.de>
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 <mhopf@suse.de>
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 <mhopf@suse.de>
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 <mhopf@suse.de>
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 <mhopf@suse.de>
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 <mhopf@suse.de>
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 <mhopf@suse.de>
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 <mhopf@suse.de>
Date:   Fri Oct 5 17:40:14 2007 +0200



Reply to: