Commit 4f367164 authored by Thomas Winischhofer's avatar Thomas Winischhofer

SiS driver:

- Fix for 1600x1200 LCD panels
- Fix DGA in MergedFB mode
parent 6ef9f9d2
......@@ -5842,7 +5842,7 @@ SiS_SetGroup1_LVDS(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
else if(issis) tempbx++;
}
if(tempbx >= SiS_Pr->SiS_VT) tempbx -= SiS_Pr->SiS_VT; /* BPLVRS */
if(tempbx >= SiS_Pr->SiS_VT) tempbx -= SiS_Pr->SiS_VT;
temp = tempbx & 0x00FF;
if(SiS_Pr->SiS_IF_DEF_TRUMPION) {
......@@ -5850,7 +5850,7 @@ SiS_SetGroup1_LVDS(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
if(ModeNo == 0x10) temp = 0xa9;
}
}
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x18,temp);
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x18,temp); /* BPLVRS */
tempcx >>= 3;
tempcx++;
......@@ -5879,7 +5879,7 @@ SiS_SetGroup1_LVDS(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
if((SiS_Pr->SiS_IF_DEF_CH70xx == 1) && (SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) {
if(SiS_GetReg(SiS_Pr->SiS_Part1Port,0x00) & 0x03) temp |= 0x80;
}
/* Chrontel 701x operates in 24bit mode (8-8-8, 2x12bit mutliplexed) via VGA2 */
/* Chrontel 701x operates in 24bit mode (8-8-8, 2x12bit multiplexed) via VGA2 */
if(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit) {
if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
if(SiS_GetReg(SiS_Pr->SiS_P3c4,0x06) & 0x10) temp |= 0x80;
......@@ -5890,7 +5890,7 @@ SiS_SetGroup1_LVDS(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
}
SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x1A,tempbx,temp);
tempbx = push2; /* BPLVDEE */
tempbx = push2; /* BPLVDEE */
tempcx = SiS_Pr->SiS_LCDVDES; /* BPLVDES */
......@@ -9725,6 +9725,7 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS)
BOOLEAN havesync = FALSE;
BOOLEAN indb = FALSE;
int retry, i;
int panel1280x960 = (pSiS->VGAEngine == SIS_315_VGA) ? Panel310_1280x960 : Panel300_1280x960;
unsigned char buffer[256];
for(i=0; i<7; i++) SiS_Pr->CP_DataValid[i] = FALSE;
......@@ -9837,14 +9838,6 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS)
if(!yres) SiS_Pr->CP_PreferredY = yres = buffer[0x3b] | ((buffer[0x3d] & 0xf0) << 4);
switch(xres) {
#if 0 /* Treat as custom */
case 800:
if(yres == 600) {
paneltype = Panel_800x600;
checkexpand = TRUE;
}
break;
#endif
case 1024:
if(yres == 768) {
paneltype = Panel_1024x768;
......@@ -9856,11 +9849,7 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS)
paneltype = Panel_1280x1024;
checkexpand = TRUE;
} else if(yres == 960) {
if(pSiS->VGAEngine == SIS_300_VGA) {
paneltype = Panel300_1280x960;
} else {
paneltype = Panel310_1280x960;
}
paneltype = panel1280x960;
} else if(yres == 768) {
if( (pclk == 8100) &&
(phb == (1688 - 1280)) &&
......@@ -9886,13 +9875,15 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS)
}
break;
case 1600:
if(pSiS->VGAEngine == SIS_315_VGA) {
if(pSiS->VBFlags & VB_301C) {
if(yres == 1200) {
if((pSiS->VGAEngine == SIS_315_VGA) && (pSiS->VBFlags & VB_301C)) {
if(yres == 1200) {
if( (pclk == 16200) &&
(phb == (2160 - 1600)) &&
(pvb == (1250 - 1200)) ) {
paneltype = Panel310_1600x1200;
checkexpand = TRUE;
}
}
}
}
break;
}
......@@ -10029,7 +10020,7 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS)
(SiS_Pr->CP_VSyncEnd[i] > SiS_Pr->CP_VTotal[i]) ||
(((pSiS->VBFlags & VB_301C) && (SiS_Pr->CP_Clock[i] > 162500)) ||
((!(pSiS->VBFlags & VB_301C)) &&
((SiS_Pr->CP_Clock[i] > 108200) || (SiS_Pr->CP_VDisplay[i] > 1024) ||
((SiS_Pr->CP_Clock[i] > 110500) || (SiS_Pr->CP_VDisplay[i] > 1024) ||
(SiS_Pr->CP_HDisplay[i] > 1600)))) ||
(buffer[base+17] & 0x80)) {
......@@ -10136,14 +10127,6 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS)
SiS_Pr->CP_MaxY = SiS_Pr->CP_PreferredY = yres = buffer[0x78] | (buffer[0x79] << 8);
switch(xres) {
#if 0
case 800:
if(yres == 600) {
paneltype = Panel_800x600;
checkexpand = TRUE;
}
break;
#endif
case 1024:
if(yres == 768) {
paneltype = Panel_1024x768;
......@@ -10152,16 +10135,12 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS)
break;
case 1280:
if(yres == 960) {
if(pSiS->VGAEngine == SIS_315_VGA) {
paneltype = Panel310_1280x960;
} else {
paneltype = Panel300_1280x960;
}
paneltype = panel1280x960;
} else if(yres == 1024) {
paneltype = Panel_1280x1024;
checkexpand = TRUE;
}
/* 1280x768 treated as custom here */
/* 1280x768, 1280x800 treated as custom here */
break;
case 1400:
if(pSiS->VGAEngine == SIS_315_VGA) {
......@@ -10171,16 +10150,7 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS)
}
}
break;
case 1600:
if(pSiS->VGAEngine == SIS_315_VGA) {
if(pSiS->VBFlags & VB_301C) {
if(yres == 1200) {
paneltype = Panel310_1600x1200;
checkexpand = TRUE;
}
}
}
break;
/* 1600x1200 treated as custom */
}
/* Determine if RGB18 or RGB24 */
......@@ -10302,7 +10272,8 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS)
(SiS_Pr->CP_VSyncEnd[i] > SiS_Pr->CP_VTotal[i]) ||
(((pSiS->VBFlags & VB_301C) && (SiS_Pr->CP_Clock[i] > 162500)) ||
((!(pSiS->VBFlags & VB_301C)) &&
((SiS_Pr->CP_Clock[i] > 108200) || (SiS_Pr->CP_VDisplay[i] > 1024)))) ||
((SiS_Pr->CP_Clock[i] > 110500) || (SiS_Pr->CP_VDisplay[i] > 1024) ||
(SiS_Pr->CP_HDisplay[i] > 1600)))) ||
(buffer[index + 17] & 0x80)) {
SiS_Pr->CP_DataValid[i] = FALSE;
......@@ -10339,13 +10310,10 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS)
}
/* 1280x960 panels are always RGB24, unable to scale and use
* high active sync polarity
* high active sync polarity. (Check is save, other panel types
* for other chipset series not being set up)
*/
if(pSiS->VGAEngine == SIS_315_VGA) {
if(paneltype == Panel310_1280x960) cr37 &= 0x0e;
} else {
if(paneltype == Panel300_1280x960) cr37 &= 0x0e;
}
if(paneltype == panel1280x960) cr37 &= 0x0e;
for(i = 0; i < 7; i++) {
if(SiS_Pr->CP_DataValid[i]) {
......@@ -10362,7 +10330,7 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS)
xf86DrvMsg(pSiS->pScrn->scrnIndex, X_PROBED,
" Pixel clock: %3.3fMhz\n", (float)SiS_Pr->CP_Clock[i] / 1000);
xf86DrvMsg(pSiS->pScrn->scrnIndex, X_INFO,
" To use this, add \"%dx%d\" to the list of Modes in the Screen section\n",
" To use this, add \"%dx%d\" to the Modes list in the Screen section\n",
SiS_Pr->CP_HDisplay[i],
SiS_Pr->CP_VDisplay[i]);
}
......
......@@ -37,8 +37,8 @@
#define SISDRIVERVERSIONYEAR 4
#define SISDRIVERVERSIONMONTH 12
#define SISDRIVERVERSIONDAY 03
#define SISDRIVERREVISION 2
#define SISDRIVERVERSIONDAY 6
#define SISDRIVERREVISION 1
#define SISDRIVERIVERSION ((SISDRIVERVERSIONYEAR << 16) | \
(SISDRIVERVERSIONMONTH << 8) | \
......@@ -580,10 +580,13 @@ typedef struct _sisModeInfoPtr {
* driver modules should read these values instead of pScrn's.
*/
typedef struct {
int bitsPerPixel; /* = pScrn->bitsPerPixel */
int depth; /* = pScrn->depth */
int displayWidth; /* = pScrn->displayWidth */
DisplayModePtr mode; /* = pScrn->currentMode */
int bitsPerPixel; /* = pScrn->bitsPerPixel */
int depth; /* = pScrn->depth */
int displayWidth; /* = pScrn->displayWidth */
int displayHeight; /* = imageHeight from DGA mode; ONLY WHEN DGA IS ACTIVE!!! */
int DGAViewportX;
int DGAViewportY;
DisplayModePtr mode; /* = pScrn->currentMode */
} SISFBLayout;
/* For extended memcpy() */
......
......@@ -282,10 +282,10 @@ SIS_SetMode(
}
pScrn->currentMode = pSiS->CurrentLayout.mode;
pSiS->DGAactive = FALSE;
(*pScrn->SwitchMode)(index, pScrn->currentMode, 0);
(*pScrn->AdjustFrame)(index, pScrn->frameX0, pScrn->frameY0, 0);
pSiS->DGAactive = FALSE;
} else { /* set new mode */
......@@ -295,14 +295,16 @@ SIS_SetMode(
pSiS->DGAactive = TRUE;
}
pSiS->CurrentLayout.bitsPerPixel = pMode->bitsPerPixel;
pSiS->CurrentLayout.depth = pMode->depth;
pSiS->CurrentLayout.displayWidth = pMode->bytesPerScanline / (pMode->bitsPerPixel >> 3);
pSiS->CurrentLayout.bitsPerPixel = pMode->bitsPerPixel;
pSiS->CurrentLayout.depth = pMode->depth;
pSiS->CurrentLayout.displayWidth = pMode->bytesPerScanline / (pMode->bitsPerPixel >> 3);
pSiS->CurrentLayout.displayHeight = pMode->imageHeight;
(*pScrn->SwitchMode)(index, pMode->mode, 0);
/* TW: Adjust viewport to 0/0 after mode switch */
/* This should fix the vmware-in-dualhead problems */
/* Adjust viewport to 0/0 after mode switch */
/* This fixes the vmware-in-dualhead problems */
(*pScrn->AdjustFrame)(index, 0, 0, 0);
pSiS->CurrentLayout.DGAViewportX = pSiS->CurrentLayout.DGAViewportY = 0;
}
return TRUE;
......@@ -327,6 +329,8 @@ SIS_SetViewport(
(*pScrn->AdjustFrame)(pScrn->pScreen->myNum, x, y, flags);
pSiS->DGAViewportStatus = 0; /* There are never pending Adjusts */
pSiS->CurrentLayout.DGAViewportX = x;
pSiS->CurrentLayout.DGAViewportY = y;
}
static void
......
......@@ -1235,6 +1235,15 @@ SiSCopyModeNLink(ScrnInfoPtr pScrn, DisplayModePtr dest,
mode->VSyncEnd += dy;
mode->VTotal += dy;
mode->type = M_T_DEFAULT;
#if XF86_VERSION_CURRENT >= XF86_VERSION_NUMERIC(4,2,99,2,0)
/* Set up as user defined (ie fake that the mode has been named in the
* Modes-list in the screen section; corrects cycling with CTRL-ALT-[-+]
* when source mode has not been listed there.)
*/
mode->type |= M_T_USERDEF;
#endif
/* Provide a sophisticated fake DotClock in order to trick the vidmode
* extension to allow selecting among a number of modes whose merged result
* looks identical but consists of different modes for CRT1 and CRT2
......@@ -5657,6 +5666,7 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
/* Copy to CurrentLayout */
pSiS->CurrentLayout.mode = pScrn->currentMode;
pSiS->CurrentLayout.displayWidth = pScrn->displayWidth;
pSiS->CurrentLayout.displayHeight = pScrn->virtualY;
#ifdef SISMERGED
if(pSiS->MergedFB) {
......@@ -5829,6 +5839,7 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
/* Update CurrentLayout */
pSiS->CurrentLayout.mode = pScrn->currentMode;
pSiS->CurrentLayout.displayWidth = pScrn->displayWidth;
pSiS->CurrentLayout.displayHeight = pScrn->virtualY;
}
#endif
......@@ -7363,8 +7374,6 @@ SISScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
if(!pSiS->ShadowFB) SISDGAInit(pScreen);
xf86SetBlackWhitePixels(pScreen);
/* Initialize the accelerators */
switch(pSiS->VGAEngine) {
......@@ -8200,6 +8209,24 @@ SISMergePointerMoved(int scrnIndex, int x, int y)
int deltax, deltay;
int temp1, temp2;
int old1x0, old1y0, old2x0, old2y0;
int CRT1XOffs = 0, CRT1YOffs = 0, CRT2XOffs = 0, CRT2YOffs = 0;
int HVirt = pScrn1->virtualX;
int VVirt = pScrn1->virtualY;
if(pSiS->DGAactive) {
/* DGA: No panning, since all DGA modes match a screen mode */
return;
/* HVirt = pSiS->CurrentLayout.displayWidth;
VVirt = pSiS->CurrentLayout.displayHeight;
BOUND(x, pSiS->CurrentLayout.DGAViewportX, HVirt);
BOUND(y, pSiS->CurrentLayout.DGAViewportY, VVirt);
*/
} else {
CRT1XOffs = pSiS->CRT1XOffs;
CRT1YOffs = pSiS->CRT1YOffs;
CRT2XOffs = pSiS->CRT2XOffs;
CRT2YOffs = pSiS->CRT2YOffs;
}
f1.x0 = old1x0 = pSiS->CRT1frameX0;
f1.x1 = pSiS->CRT1frameX1;
......@@ -8323,22 +8350,22 @@ SISMergePointerMoved(int scrnIndex, int x, int y)
switch(((SiSMergedDisplayModePtr)pSiS->CurrentLayout.mode->Private)->CRT2Position) {
case sisLeftOf:
case sisRightOf:
if(pSiS->CRT1YOffs || pSiS->CRT2YOffs) {
if(CRT1YOffs || CRT2YOffs) {
if(pSiS->CRT1frameY0 != old1y0) {
if(pSiS->CRT1frameY0 < pSiS->CRT1YOffs)
pSiS->CRT1frameY0 = pSiS->CRT1YOffs;
if(pSiS->CRT1frameY0 < CRT1YOffs)
pSiS->CRT1frameY0 = CRT1YOffs;
temp1 = pSiS->CRT1frameY0 + CDMPTR->CRT1->VDisplay;
temp2 = pScrn1->virtualY - pSiS->CRT2YOffs;
temp2 = VVirt - CRT2YOffs;
if(temp1 > temp2)
pSiS->CRT1frameY0 -= (temp1 - temp2);
}
if(pScrn2->frameY0 != old2y0) {
if(pScrn2->frameY0 < pSiS->CRT2YOffs)
pScrn2->frameY0 = pSiS->CRT2YOffs;
if(pScrn2->frameY0 < CRT2YOffs)
pScrn2->frameY0 = CRT2YOffs;
temp1 = pScrn2->frameY0 + CDMPTR->CRT2->VDisplay;
temp2 = pScrn1->virtualY - pSiS->CRT1YOffs;
temp2 = VVirt - CRT1YOffs;
if(temp1 > temp2)
pScrn2->frameY0 -= (temp1 - temp2);
}
......@@ -8346,22 +8373,22 @@ SISMergePointerMoved(int scrnIndex, int x, int y)
break;
case sisBelow:
case sisAbove:
if(pSiS->CRT1XOffs || pSiS->CRT2XOffs) {
if(CRT1XOffs || CRT2XOffs) {
if(pSiS->CRT1frameX0 != old1x0) {
if(pSiS->CRT1frameX0 < pSiS->CRT1XOffs)
pSiS->CRT1frameX0 = pSiS->CRT1XOffs;
if(pSiS->CRT1frameX0 < CRT1XOffs)
pSiS->CRT1frameX0 = CRT1XOffs;
temp1 = pSiS->CRT1frameX0 + CDMPTR->CRT1->HDisplay;
temp2 = pScrn1->virtualX - pSiS->CRT2XOffs;
temp2 = HVirt - CRT2XOffs;
if(temp1 > temp2)
pSiS->CRT1frameX0 -= (temp1 - temp2);
}
if(pScrn2->frameX0 != old2x0) {
if(pScrn2->frameX0 < pSiS->CRT2XOffs)
pScrn2->frameX0 = pSiS->CRT2XOffs;
if(pScrn2->frameX0 < CRT2XOffs)
pScrn2->frameX0 = CRT2XOffs;
temp1 = pScrn2->frameX0 + CDMPTR->CRT2->HDisplay;
temp2 = pScrn1->virtualX - pSiS->CRT1XOffs;
temp2 = HVirt - CRT1XOffs;
if(temp1 > temp2)
pScrn2->frameX0 -= (temp1 - temp2);
}
......@@ -8376,10 +8403,7 @@ SISMergePointerMoved(int scrnIndex, int x, int y)
pScrn2->frameX1 = pScrn2->frameX0 + CDMPTR->CRT2->HDisplay - 1;
pScrn2->frameY1 = pScrn2->frameY0 + CDMPTR->CRT2->VDisplay - 1;
#if 0
pScrn1->frameX1 = pScrn1->frameX0 + pSiS->CurrentLayout.mode->HDisplay - 1;
pScrn1->frameY1 = pScrn1->frameY0 + pSiS->CurrentLayout.mode->VDisplay - 1;
#endif
/* No need to update pScrn1->frame?1, done above */
SISAdjustFrameHW_CRT1(pScrn1, pSiS->CRT1frameX0, pSiS->CRT1frameY0);
SISAdjustFrameHW_CRT2(pScrn1, pScrn2->frameX0, pScrn2->frameY0);
......@@ -8392,21 +8416,34 @@ SISAdjustFrameMerged(int scrnIndex, int x, int y, int flags)
ScrnInfoPtr pScrn1 = xf86Screens[scrnIndex];
SISPtr pSiS = SISPTR(pScrn1);
ScrnInfoPtr pScrn2 = pSiS->CRT2pScrn;
int VTotal = pSiS->CurrentLayout.mode->VDisplay;
int HTotal = pSiS->CurrentLayout.mode->HDisplay;
int VMax = VTotal;
int VTotal = pSiS->CurrentLayout.mode->VDisplay;
int HMax = HTotal;
int VMax = VTotal;
int HVirt = pScrn1->virtualX;
int VVirt = pScrn1->virtualY;
int x1 = x, x2 = x;
int y1 = y, y2 = y;
int CRT1XOffs = 0, CRT1YOffs = 0, CRT2XOffs = 0, CRT2YOffs = 0;
if(pSiS->DGAactive) {
HVirt = pSiS->CurrentLayout.displayWidth;
VVirt = pSiS->CurrentLayout.displayHeight;
} else {
CRT1XOffs = pSiS->CRT1XOffs;
CRT1YOffs = pSiS->CRT1YOffs;
CRT2XOffs = pSiS->CRT2XOffs;
CRT2YOffs = pSiS->CRT2YOffs;
}
BOUND(x, 0, pScrn1->virtualX - HTotal);
BOUND(y, 0, pScrn1->virtualY - VTotal);
BOUND(x, 0, HVirt - HTotal);
BOUND(y, 0, VVirt - VTotal);
if(SDMPTR(pScrn1)->CRT2Position != sisClone) {
BOUND(x1, pSiS->CRT1XOffs, pScrn1->virtualX - HTotal - pSiS->CRT2XOffs);
BOUND(y1, pSiS->CRT1YOffs, pScrn1->virtualY - VTotal - pSiS->CRT2YOffs);
BOUND(x2, pSiS->CRT2XOffs, pScrn1->virtualX - HTotal - pSiS->CRT1XOffs);
BOUND(y2, pSiS->CRT2YOffs, pScrn1->virtualY - VTotal - pSiS->CRT1YOffs);
}
BOUND(x1, CRT1XOffs, HVirt - HTotal - CRT2XOffs);
BOUND(y1, CRT1YOffs, VVirt - VTotal - CRT2YOffs);
BOUND(x2, CRT2XOffs, HVirt - HTotal - CRT1XOffs);
BOUND(y2, CRT2YOffs, VVirt - VTotal - CRT1YOffs);
}
switch(SDMPTR(pScrn1)->CRT2Position) {
case sisLeftOf:
......@@ -8441,10 +8478,10 @@ SISAdjustFrameMerged(int scrnIndex, int x, int y, int flags)
break;
}
BOUND(pSiS->CRT1frameX0, 0, pScrn1->virtualX - CDMPTR->CRT1->HDisplay);
BOUND(pSiS->CRT1frameY0, 0, pScrn1->virtualY - CDMPTR->CRT1->VDisplay);
BOUND(pScrn2->frameX0, 0, pScrn1->virtualX - CDMPTR->CRT2->HDisplay);
BOUND(pScrn2->frameY0, 0, pScrn1->virtualY - CDMPTR->CRT2->VDisplay);
BOUND(pSiS->CRT1frameX0, 0, HVirt - CDMPTR->CRT1->HDisplay);
BOUND(pSiS->CRT1frameY0, 0, VVirt - CDMPTR->CRT1->VDisplay);
BOUND(pScrn2->frameX0, 0, HVirt - CDMPTR->CRT2->HDisplay);
BOUND(pScrn2->frameY0, 0, VVirt - CDMPTR->CRT2->VDisplay);
pScrn1->frameX0 = x;
pScrn1->frameY0 = y;
......@@ -8457,8 +8494,8 @@ SISAdjustFrameMerged(int scrnIndex, int x, int y, int flags)
pScrn1->frameX1 = pScrn1->frameX0 + pSiS->CurrentLayout.mode->HDisplay - 1;
pScrn1->frameY1 = pScrn1->frameY0 + pSiS->CurrentLayout.mode->VDisplay - 1;
if(SDMPTR(pScrn1)->CRT2Position != sisClone) {
pScrn1->frameX1 += pSiS->CRT1XOffs + pSiS->CRT2XOffs;
pScrn1->frameY1 += pSiS->CRT1YOffs + pSiS->CRT2YOffs;
pScrn1->frameX1 += CRT1XOffs + CRT2XOffs;
pScrn1->frameY1 += CRT1YOffs + CRT2YOffs;
}
SISAdjustFrameHW_CRT1(pScrn1, pSiS->CRT1frameX0, pSiS->CRT1frameY0);
......@@ -8524,7 +8561,7 @@ SISAdjustFrame(int scrnIndex, int x, int y, int flags)
/* Head 1 (master) is always CRT2 */
SISSetStartAddressCRT2(pSiS, base);
} else {
/* TW: Head 2 (slave) is always CRT1 */
/* Head 2 (slave) is always CRT1 */
base += (pSiS->dhmOffset/4);
SISSetStartAddressCRT1(pSiS, base);
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment