On Mon, 2010-03-08 at 09:42 +0800, yanhua wrote:
> Hi,Teddy:
>    We can test it. please give us the new sm712 driver.

I had some success with Xorg 1.6.5 from Debian Squeeze and the
siliconmotion driver hosted at freedesktop:

 http://cgit.freedesktop.org/xorg/driver/xf86-video-siliconmotion/


Since I won't have the time to work on it for a long time, I'm attaching
all the changes I made to my working tree in the hope they may be useful
to anyone who would like to continue from there.

With these changes applied, X would start without crashing and switch to
a different video mode. Restoring the console on vt switch was also
working. However, the display was totally garbled. Looks like the frame
isn't generated from the same memory region designated as framebuffer by
the driver.

To find what's missing, I suggest comparing the video mode
initialization code in this driver with the equivalent code in the older
driver maintained by siliconmotion. Unfortunately, the code diverged
very much.

If everything else fails, dumping the registers after video mode
initialization in both drivers should help.

-- 
   // Bernie Innocenti - http://codewiz.org/
 \X/  Sugar Labs       - http://sugarlabs.org/
diff --git a/src/regsmi.h b/src/regsmi.h
index 5dd0320..8dc214b 100644
--- a/src/regsmi.h
+++ b/src/regsmi.h
@@ -56,6 +56,13 @@ authorization from the XFree86 Project and SIlicon Motion.
 /* Mobile-System-on-a-Chip */
 #define IS_MSOC(pSmi)		((pSmi)->Chipset == SMI_MSOC)
 
+/* bernie: FIXME: must detect yeeloong */
+#define HAS_VGABIOS(pSmi) \
+	(((pSmi)->Chipset == SMI_MSOC) || \
+	((pSmi)->Chipset == SMI_LYNXEMplus))
+
+
+
 /* I/O Functions */
 static __inline__ CARD8
 VGAIN8_INDEX(SMIPtr pSmi, int indexPort, int dataPort, CARD8 index)
diff --git a/src/smi.h b/src/smi.h
index 0f72db9..3deed1f 100644
--- a/src/smi.h
+++ b/src/smi.h
@@ -65,7 +65,7 @@ authorization from the XFree86 Project and Silicon Motion.
 /******************************************************************************/
 
 #ifndef SMI_DEBUG
-#define SMI_DEBUG		0
+#define SMI_DEBUG		1
 #endif
 
 #define SMI_USE_IMAGE_WRITES	0
diff --git a/src/smi_driver.c b/src/smi_driver.c
index 391efbc..073244e 100644
--- a/src/smi_driver.c
+++ b/src/smi_driver.c
@@ -740,6 +740,7 @@ SMI_PreInit(ScrnInfoPtr pScrn, int flags)
 	char *strptr;
 
 	from = X_DEFAULT;
+	pSmi->useEXA =TRUE;
 	if ((strptr = (char *)xf86GetOptValString(pSmi->Options,
 						  OPTION_ACCELMETHOD))) {
 	    if (!xf86NameCmp(strptr,"XAA")) {
@@ -1217,8 +1218,6 @@ SMI_MapMmio(ScrnInfoPtr pScrn)
     SMIPtr	pSmi = SMIPTR(pScrn);
     CARD32	memBase;
 
-    SMI_EnableMmio(pScrn);
-
     switch (pSmi->Chipset) {
 	case SMI_COUGAR3DR:
 	    memBase = PCI_REGION_BASE(pSmi->PciInfo, 1, REGION_MEM);
@@ -1325,6 +1324,8 @@ SMI_MapMmio(ScrnInfoPtr pScrn)
 	    break;
     }
 
+    SMI_EnableMmio(pScrn);
+
     xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, VERBLEV,
 		   "Physical MMIO at 0x%08lX\n", (unsigned long)memBase);
     xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, VERBLEV,
@@ -1648,7 +1649,7 @@ SMI_ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
     pScrn->fbOffset = pSmi->FBOffset + pSmi->fbMapOffset;
 
     /* Clear frame buffer */
-    memset(pSmi->FBBase, 0, pSmi->videoRAMBytes);
+    memset(pSmi->FBBase, 0xF0, pSmi->videoRAMBytes);
 
     /*
      * The next step is to setup the screen's visuals, and initialise the
@@ -2003,27 +2004,31 @@ SMI_EnableMmio(ScrnInfoPtr pScrn)
 
     ENTER();
 
+    printf("bernie: %ld\n", pSmi->PIOBase);
+
     if (!IS_MSOC(pSmi)) {
 	vgaHWPtr hwp = VGAHWPTR(pScrn);
-	CARD8 tmp;
 
 	/*
 	 * Enable chipset (seen on uninitialized secondary cards) might not be
 	 * needed once we use the VGA softbooter
 	 */
-	vgaHWSetStdFuncs(hwp);
+	if (pSmi->IOBase)
+		vgaHWSetMmioFuncs(hwp, pSmi->MapBase, pSmi->IOBase - pSmi->MapBase);
+	else
+		vgaHWSetStdFuncs(hwp);
 
 	/* Enable linear mode */
-	outb(pSmi->PIOBase + VGA_SEQ_INDEX, 0x18);
-	tmp = inb(pSmi->PIOBase + VGA_SEQ_DATA);
-	pSmi->SR18Value = tmp;					/* PDR#521 */
-	outb(pSmi->PIOBase + VGA_SEQ_DATA, tmp | 0x11);
+	pSmi->SR18Value = VGAIN8_INDEX (pSmi, VGA_SEQ_INDEX, VGA_SEQ_DATA, 0x18);
+	//bernie: FIXME
+	//if (!saved_console_reg)
+	//	pSmi->SavedReg.SR18 = pSmi->SR18Value;
+	//saved_console_reg = true;
+	VGAOUT8(pSmi, VGA_SEQ_DATA, pSmi->SR18Value | 0x11);
 
 	/* Enable 2D/3D Engine and Video Processor */
-	outb(pSmi->PIOBase + VGA_SEQ_INDEX, 0x21);
-	tmp = inb(pSmi->PIOBase + VGA_SEQ_DATA);
-	pSmi->SR21Value = tmp;					/* PDR#521 */
-	outb(pSmi->PIOBase + VGA_SEQ_DATA, tmp & ~0x03);
+	pSmi->SR21Value = VGAIN8_INDEX (pSmi, VGA_SEQ_INDEX, VGA_SEQ_DATA, 0x21);
+	VGAOUT8(pSmi, VGA_SEQ_DATA, pSmi->SR21Value & ~0x03);
     }
 
     LEAVE();
@@ -2042,12 +2047,11 @@ SMI_DisableMmio(ScrnInfoPtr pScrn)
 	vgaHWSetStdFuncs(hwp);
 
 	/* Disable 2D/3D Engine and Video Processor */
-	outb(pSmi->PIOBase + VGA_SEQ_INDEX, 0x21);
-	outb(pSmi->PIOBase + VGA_SEQ_DATA, pSmi->SR21Value);	/* PDR#521 */
+	/* bernie: why ~0x80? */
+	VGAOUT8_INDEX (pSmi, VGA_SEQ_INDEX, VGA_SEQ_DATA, 0x21, pSmi->SR21Value & ~0x80);
 
 	/* Disable linear mode */
-	outb(pSmi->PIOBase + VGA_SEQ_INDEX, 0x18);
-	outb(pSmi->PIOBase + VGA_SEQ_DATA, pSmi->SR18Value);	/* PDR#521 */
+	VGAOUT8_INDEX (pSmi, VGA_SEQ_INDEX, VGA_SEQ_DATA, 0x18, pSmi->SR18Value);
     }
 
     LEAVE();
diff --git a/src/smilynx_hw.c b/src/smilynx_hw.c
index 019261d..781f4e4 100644
--- a/src/smilynx_hw.c
+++ b/src/smilynx_hw.c
@@ -163,7 +163,8 @@ SMILynx_Save(ScrnInfoPtr pScrn)
     ENTER();
 
     /* Save the standard VGA registers */
-    vgaHWSave(pScrn, vgaSavePtr, VGA_SR_ALL);
+    //bernie: FIXME: we need to fix DACDelay() in xserver for __mips__
+    //vgaHWSave(pScrn, vgaSavePtr, VGA_SR_ALL);
     save->smiDACMask = VGAIN8(pSmi, VGA_DAC_MASK);
     VGAOUT8(pSmi, VGA_DAC_READ_ADDR, 0);
     for (i = 0; i < 256; i++) {
@@ -374,7 +375,8 @@ SMILynx_WriteMode(ScrnInfoPtr pScrn, vgaRegPtr vgaSavePtr, SMIRegPtr restore)
 	VGAOUT8_INDEX(pSmi, VGA_SEQ_INDEX, VGA_SEQ_DATA, 0x21, tmp & ~0x03);
     } else {
 	/* Restore the standard VGA registers */
-	vgaHWRestore(pScrn, vgaSavePtr, VGA_SR_ALL);
+	//bernie: FIXME
+	//vgaHWRestore(pScrn, vgaSavePtr, VGA_SR_ALL);
 	if (restore->smiDACMask) {
 	    VGAOUT8(pSmi, VGA_DAC_MASK, restore->smiDACMask);
 	} else {
_______________________________________________
gNewSense-dev mailing list
[email protected]
http://lists.nongnu.org/mailman/listinfo/gnewsense-dev

Reply via email to