summaryrefslogtreecommitdiff
path: root/xc/programs/Xserver/hw/xfree86/drivers/imstt/imstt_driver.c
diff options
context:
space:
mode:
Diffstat (limited to 'xc/programs/Xserver/hw/xfree86/drivers/imstt/imstt_driver.c')
-rw-r--r--xc/programs/Xserver/hw/xfree86/drivers/imstt/imstt_driver.c302
1 files changed, 166 insertions, 136 deletions
diff --git a/xc/programs/Xserver/hw/xfree86/drivers/imstt/imstt_driver.c b/xc/programs/Xserver/hw/xfree86/drivers/imstt/imstt_driver.c
index c234619bd..de3b0e656 100644
--- a/xc/programs/Xserver/hw/xfree86/drivers/imstt/imstt_driver.c
+++ b/xc/programs/Xserver/hw/xfree86/drivers/imstt/imstt_driver.c
@@ -1,4 +1,4 @@
-/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/imstt/imstt_driver.c,v 1.6 2000/06/22 16:59:28 tsi Exp $ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/imstt/imstt_driver.c,v 1.8 2000/08/01 20:05:43 dawes Exp $ */
/*
* Copyright 2000 Ani Joshi <ajoshi@unixbox.com>
@@ -6,10 +6,6 @@
* XFree86 4.0 driver for the Integrated Micro Solutions
* Twin Turbo 128 chipset
*
- * Credits:
- * Sigurdur Asgeirsson, Jeffrey Kuskin, Ryan Nielsen
- * for their work on imsttfb
- *
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that copyright
@@ -28,11 +24,13 @@
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*
+ * Credits:
+ * Sigurdur Asgeirsson, Jeffrey Kuskin, Ryan Nielsen
+ * for their work on imsttfb
*
*/
-#include "compiler.h"
#include "xf86.h"
#include "xf86_OSproc.h"
#include "xf86_ansic.h"
@@ -41,6 +39,7 @@
#include "xf86Version.h"
#include "xf86Resources.h"
#include "xf86fbman.h"
+#include "compiler.h"
#include "xaa.h"
#include "mipointer.h"
#include "micmap.h"
@@ -86,8 +85,8 @@ static Bool IMSTTMapMem(ScrnInfoPtr pScrn);
static void IMSTTUnmapMem(ScrnInfoPtr pScrn);
static Bool IMSTTModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode);
static void IMSTTAdjustFrame(int scrnIndex, int x, int y, int flags);
-static Bool IMSTTCloseScreen(int scrnIndex, ScreenPtr pScreen);
-static Bool IMSTTSaveSCreen(ScreenPtr pScreen, int mode);
+Bool IMSTTCloseScreen(int scrnIndex, ScreenPtr pScreen);
+Bool IMSTTSaveScreen(ScreenPtr pScreen, int mode);
static void IMSTTLoadPalette(ScrnInfoPtr pScrn, int numColors,
int *indicies, LOCO *colors,
VisualPtr pVisual);
@@ -158,6 +157,11 @@ static const char *cfbSymbols[] = {
};
+static const char *fbSymbols[] = {
+ "fbScreenInit",
+ NULL
+};
+
static const char *xaaSymbols[] = {
"XAADestroyInfoRec",
"XAACreateInfoRec",
@@ -189,8 +193,13 @@ static const char *fbdevHWSymbols[] = {
#ifdef XFree86LOADER
-static pointer IMSTTSetup(pointer module, pointer opts, int *errmaj,
+
+MODULESETUPPROTO(IMSTTSetup);
+
+/*
+pointer IMSTTSetup(pointer module, pointer opts, int *errmaj,
int *errmin);
+*/
static XF86ModuleVersionInfo IMSTTVersRec = {
"imstt",
@@ -205,13 +214,14 @@ static XF86ModuleVersionInfo IMSTTVersRec = {
{0, 0, 0, 0}
};
-XF86ModuleData IMSTTModuleData = { &IMSTTVersRec, IMSTTSetup, NULL };
+XF86ModuleData imsttModuleData = { &IMSTTVersRec, IMSTTSetup, NULL };
-static pointer IMSTTSetup(pointer module, pointer opts, int *errmaj,
+pointer IMSTTSetup(pointer module, pointer opts, int *errmaj,
int *errmin)
{
static Bool setupDone = FALSE;
+ IMSTTTRACE("IMSTTSetup -- begin\n");
if (!setupDone) {
setupDone = TRUE;
xf86AddDriver(&IMSTT, module, 0);
@@ -222,6 +232,7 @@ static pointer IMSTTSetup(pointer module, pointer opts, int *errmaj,
*errmaj = LDR_ONCEONLY;
return NULL;
}
+ IMSTTTRACE("IMSTTSetup -- end\n");
}
@@ -271,6 +282,7 @@ static Bool IMSTTProbe(DriverPtr drv, int flags)
int numUsed;
Bool foundScreen = FALSE;
+ IMSTTTRACE("IMSTTProbe begin\n");
/* sanity checks */
if ((numDevSections = xf86MatchDevice("imstt", &devSections)) <= 0)
return FALSE;
@@ -311,6 +323,9 @@ static Bool IMSTTProbe(DriverPtr drv, int flags)
NULL, NULL, NULL, NULL, NULL);
}
+
+ IMSTTTRACE("IMSTTProbe end\n");
+
xfree(usedChips);
return foundScreen;
}
@@ -364,6 +379,9 @@ static Bool IMSTTPreInit(ScrnInfoPtr pScrn, int flags)
if (pScrn->depth == 8)
pScrn->rgbBits = 8;
+ if (!xf86SetDefaultVisual(pScrn, -1))
+ return FALSE;
+
pScrn->progClock = TRUE;
if (!IMSTTGetRec(pScrn))
@@ -481,15 +499,19 @@ static Bool IMSTTPreInit(ScrnInfoPtr pScrn, int flags)
return FALSE;
}
+ iptr->rev = (INREG(IMSTT_SSTATUS) & 0x0f00) >> 8;
+
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "revision %d\n", iptr->rev);
+
if (!pScrn->videoRam) {
+ pScrn->videoRam = iptr->videoRam / 1024;
xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
"probed videoram = %dk\n",
- (iptr->videoRam / 1024));
- pScrn->videoRam = (iptr->videoRam / 1024);
+ pScrn->videoRam);
} else {
xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
"videoram = %dk\n",
- pScrn->videoRam);
+ pScrn->videoRam / 1024);
}
/* XXX this is sorta a guess, got some info from the TVP3030 manual */
@@ -537,31 +559,16 @@ static Bool IMSTTPreInit(ScrnInfoPtr pScrn, int flags)
xf86PrintModes(pScrn);
xf86SetDpi(pScrn, 0, 0);
- switch (pScrn->bitsPerPixel) {
- case 8:
- mod = "cfb";
- reqSym = "cfbScreenInit";
- break;
- case 16:
- mod = "cfb16";
- reqSym = "cfb16ScreenInit";
- break;
- case 32:
- mod = "cfb32";
- reqSym = "cfb32ScreenInit";
- break;
- }
- if (mod && xf86LoadSubModule(pScrn, mod) == NULL) {
- IMSTTFreeRec(pScrn);
+ xf86LoadSubModule(pScrn, "fb");
+/* xf86LoaderReqSymbols(fbSymbols, NULL); */
+ xf86LoaderReqSymbols("fbScreenInit", NULL);
+
+ if (!xf86LoadSubModule(pScrn, "xaa"))
return FALSE;
- }
- xf86LoaderReqSymbols(reqSym, NULL);
+ xf86LoaderReqSymLists(xaaSymbols, NULL);
- if (!iptr->NoAccel) {
- if (!xf86LoadSubModule(pScrn, "xaa"))
- return FALSE;
- }
+ IMSTTTRACE("PreInit -- END\n");
return TRUE;
}
@@ -574,19 +581,17 @@ static Bool IMSTTMapMem(ScrnInfoPtr pScrn)
iptr = IMSTTPTR(pScrn);
- if (iptr->FBDev) {
- iptr->MMIOBase = fbdevHWMapMMIO(pScrn);
- } else {
- iptr->MMIOBase = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_MMIO, iptr->PciTag,
- iptr->PciInfo->memBase[0] + 0x800000,
- 0x1000);
- }
+ iptr->MMIOBase = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_MMIO, iptr->PciTag,
+ iptr->PciInfo->memBase[0] + 0x800000,
+ 0x41000);
if (!iptr->MMIOBase) {
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
"Internal error: could not map MMIO\n");
return FALSE;
}
+ IMSTTTRACE("Mapped MMIO @ 0x%x with size 0x1000\n", iptr->PciInfo->memBase[0] + 0x800000);
+
IMSTTGetVideoMemSize(pScrn);
if (iptr->FBDev) {
@@ -655,6 +660,11 @@ static void IMSTTGetVideoMemSize(ScrnInfoPtr pScrn)
IMSTTMMIO_VARS();
unsigned long tmp;
+ if (iptr->FBDev) {
+ iptr->videoRam = fbdevHWGetVidmem(pScrn);
+ return;
+ }
+
tmp = INREG(IMSTT_PRC);
if (iptr->ramdac == RAMDAC_IBM)
iptr->videoRam = (tmp & 0x0004) ? 0x400000 : 0x200000;
@@ -675,86 +685,92 @@ static Bool IMSTTScreenInit(int scrnIndex, ScreenPtr pScreen,
VisualPtr visual;
int r = TRUE;
+ IMSTTTRACE("ScreenInit -- Begin\n");
+
pScrn = xf86Screens[pScreen->myNum];
- iptr = IMSTTPTR(pScrn);
- /* initialize the card */
- tmp = INREG(IMSTT_STGCTL);
- OUTREG(IMSTT_STGCTL, tmp & ~0x1);
- OUTREG(IMSTT_SSR, 0);
+ iptr = IMSTTPTR(pScrn);
- if (iptr->InitDAC) {
- /* set default values for DAC registers */
- if (iptr->ramdac == RAMDAC_IBM) {
- iptr->CMAPBase[IBM624_PPMASK] = 0xff; eieio();
- iptr->CMAPBase[IBM624_PIDXHI] = 0; eieio();
- OUTREGPI(IBM624_CLKCTL, 0x21);
- OUTREGPI(IBM624_SYNCCTL, 0x00);
- OUTREGPI(IBM624_HSYNCPOS, 0x00);
- OUTREGPI(IBM624_PWRMNGMT, 0x00);
- OUTREGPI(IBM624_DACOP, 0x02);
- OUTREGPI(IBM624_PALETCTL, 0x00);
- OUTREGPI(IBM624_SYSCLKCTL, 0x01);
- OUTREGPI(IBM624_BPP8, 0x00);
- OUTREGPI(IBM624_BPP16, 0x01);
- OUTREGPI(IBM624_BPP24, 0x00);
- OUTREGPI(IBM624_BPP32, 0x00);
- OUTREGPI(IBM624_PIXCTL1, 0x05);
- OUTREGPI(IBM624_PIXCTL2, 0x00);
- OUTREGPI(IBM624_SYSCLKN, 0x08);
- OUTREGPI(IBM624_SYSCLKM, 0x4f);
- OUTREGPI(IBM624_SYSCLKP, 0x00);
- OUTREGPI(IBM624_SYSCLKC, 0x00);
- OUTREGPI(IBM624_CURSCTL, 0x00);
- OUTREGPI(IBM624_CURSACCTL, 0x01);
- OUTREGPI(IBM624_CURSACATTR, 0xa8);
- OUTREGPI(IBM624_CURS1R, 0xff);
- OUTREGPI(IBM624_CURS1G, 0xff);
- OUTREGPI(IBM624_CURS1B, 0xff);
- OUTREGPI(IBM624_CURS2R, 0xff);
- OUTREGPI(IBM624_CURS2G, 0xff);
- OUTREGPI(IBM624_CURS2B, 0xff);
- OUTREGPI(IBM624_CURS3R, 0xff);
- OUTREGPI(IBM624_CURS3G, 0xff);
- OUTREGPI(IBM624_CURS3B, 0xff);
- OUTREGPI(IBM624_BORDR, 0xff);
- OUTREGPI(IBM624_BORDG, 0xff);
- OUTREGPI(IBM624_BORDB, 0xff);
- OUTREGPI(IBM624_MISCTL1, 0x01);
- OUTREGPI(IBM624_MISCTL2, 0x45);
- OUTREGPI(IBM624_MISCTL3, 0x00);
- OUTREGPI(IBM624_KEYCTL, 0x00);
- } else {
- OUTREGPT(TVP_IRICC, 0x00);
- OUTREGPT(TVP_IRBRC, 0xe4);
- OUTREGPT(TVP_IRLAC, 0x06);
- OUTREGPT(TVP_IRTCC, 0x80);
- OUTREGPT(TVP_IRMXC, 0x4d);
- OUTREGPT(TVP_IRCLS, 0x05);
- OUTREGPT(TVP_IRPPG, 0x00);
- OUTREGPT(TVP_IRGEC, 0x00);
- OUTREGPT(TVP_IRMIC, 0x08);
- OUTREGPT(TVP_IRCKL, 0xff);
- OUTREGPT(TVP_IRCKH, 0xff);
- OUTREGPT(TVP_IRCRL, 0xff);
- OUTREGPT(TVP_IRCRH, 0xff);
- OUTREGPT(TVP_IRCGL, 0xff);
- OUTREGPT(TVP_IRCGH, 0xff);
- OUTREGPT(TVP_IRCBL, 0xff);
- OUTREGPT(TVP_IRCBH, 0xff);
- OUTREGPT(TVP_IRCKC, 0x00);
- OUTREGPT(TVP_IRPLA, 0x00);
- OUTREGPT(TVP_IRPPD, 0xc0);
- OUTREGPT(TVP_IRPPD, 0xd5);
- OUTREGPT(TVP_IRPPD, 0xea);
- OUTREGPT(TVP_IRPLA, 0x00);
- OUTREGPT(TVP_IRMPD, 0xb9);
- OUTREGPT(TVP_IRMPD, 0x3a);
- OUTREGPT(TVP_IRMPD, 0xb1);
- OUTREGPT(TVP_IRPLA, 0x00);
- OUTREGPT(TVP_IRLPD, 0xc1);
- OUTREGPT(TVP_IRLPD, 0x3d);
- OUTREGPT(TVP_IRLPD, 0xf3);
+ if (!iptr->FBDev) {
+ /* initialize the card */
+ tmp = INREG(IMSTT_STGCTL);
+
+ OUTREG(IMSTT_STGCTL, tmp & ~0x1);
+ OUTREG(IMSTT_SSR, 0);
+
+ if (iptr->InitDAC) {
+ /* set default values for DAC registers */
+ if (iptr->ramdac == RAMDAC_IBM) {
+ iptr->CMAPBase[IBM624_PPMASK] = 0xff; eieio();
+ iptr->CMAPBase[IBM624_PIDXHI] = 0; eieio();
+ OUTREGPI(IBM624_CLKCTL, 0x21);
+ OUTREGPI(IBM624_SYNCCTL, 0x00);
+ OUTREGPI(IBM624_HSYNCPOS, 0x00);
+ OUTREGPI(IBM624_PWRMNGMT, 0x00);
+ OUTREGPI(IBM624_DACOP, 0x02);
+ OUTREGPI(IBM624_PALETCTL, 0x00);
+ OUTREGPI(IBM624_SYSCLKCTL, 0x01);
+ OUTREGPI(IBM624_BPP8, 0x00);
+ OUTREGPI(IBM624_BPP16, 0x01);
+ OUTREGPI(IBM624_BPP24, 0x00);
+ OUTREGPI(IBM624_BPP32, 0x00);
+ OUTREGPI(IBM624_PIXCTL1, 0x05);
+ OUTREGPI(IBM624_PIXCTL2, 0x00);
+ OUTREGPI(IBM624_SYSCLKN, 0x08);
+ OUTREGPI(IBM624_SYSCLKM, 0x4f);
+ OUTREGPI(IBM624_SYSCLKP, 0x00);
+ OUTREGPI(IBM624_SYSCLKC, 0x00);
+ OUTREGPI(IBM624_CURSCTL, 0x00);
+ OUTREGPI(IBM624_CURSACCTL, 0x01);
+ OUTREGPI(IBM624_CURSACATTR, 0xa8);
+ OUTREGPI(IBM624_CURS1R, 0xff);
+ OUTREGPI(IBM624_CURS1G, 0xff);
+ OUTREGPI(IBM624_CURS1B, 0xff);
+ OUTREGPI(IBM624_CURS2R, 0xff);
+ OUTREGPI(IBM624_CURS2G, 0xff);
+ OUTREGPI(IBM624_CURS2B, 0xff);
+ OUTREGPI(IBM624_CURS3R, 0xff);
+ OUTREGPI(IBM624_CURS3G, 0xff);
+ OUTREGPI(IBM624_CURS3B, 0xff);
+ OUTREGPI(IBM624_BORDR, 0xff);
+ OUTREGPI(IBM624_BORDG, 0xff);
+ OUTREGPI(IBM624_BORDB, 0xff);
+ OUTREGPI(IBM624_MISCTL1, 0x01);
+ OUTREGPI(IBM624_MISCTL2, 0x45);
+ OUTREGPI(IBM624_MISCTL3, 0x00);
+ OUTREGPI(IBM624_KEYCTL, 0x00);
+ } else {
+ OUTREGPT(TVP_IRICC, 0x00);
+ OUTREGPT(TVP_IRBRC, 0xe4);
+ OUTREGPT(TVP_IRLAC, 0x06);
+ OUTREGPT(TVP_IRTCC, 0x80);
+ OUTREGPT(TVP_IRMXC, 0x4d);
+ OUTREGPT(TVP_IRCLS, 0x05);
+ OUTREGPT(TVP_IRPPG, 0x00);
+ OUTREGPT(TVP_IRGEC, 0x00);
+ OUTREGPT(TVP_IRMIC, 0x08);
+ OUTREGPT(TVP_IRCKL, 0xff);
+ OUTREGPT(TVP_IRCKH, 0xff);
+ OUTREGPT(TVP_IRCRL, 0xff);
+ OUTREGPT(TVP_IRCRH, 0xff);
+ OUTREGPT(TVP_IRCGL, 0xff);
+ OUTREGPT(TVP_IRCGH, 0xff);
+ OUTREGPT(TVP_IRCBL, 0xff);
+ OUTREGPT(TVP_IRCBH, 0xff);
+ OUTREGPT(TVP_IRCKC, 0x00);
+ OUTREGPT(TVP_IRPLA, 0x00);
+ OUTREGPT(TVP_IRPPD, 0xc0);
+ OUTREGPT(TVP_IRPPD, 0xd5);
+ OUTREGPT(TVP_IRPPD, 0xea);
+ OUTREGPT(TVP_IRPLA, 0x00);
+ OUTREGPT(TVP_IRMPD, 0xb9);
+ OUTREGPT(TVP_IRMPD, 0x3a);
+ OUTREGPT(TVP_IRMPD, 0xb1);
+ OUTREGPT(TVP_IRPLA, 0x00);
+ OUTREGPT(TVP_IRLPD, 0xc1);
+ OUTREGPT(TVP_IRLPD, 0x3d);
+ OUTREGPT(TVP_IRLPD, 0xf3);
+ }
}
}
@@ -782,28 +798,16 @@ static Bool IMSTTScreenInit(int scrnIndex, ScreenPtr pScreen,
switch (pScrn->bitsPerPixel) {
case 8:
- r = cfbScreenInit(pScreen, iptr->FBBase, pScrn->virtualX,
- pScrn->virtualY, pScrn->xDpi, pScrn->yDpi,
- pScrn->displayWidth);
- break;
case 16:
- r = cfb16ScreenInit(pScreen, iptr->FBBase, pScrn->virtualX,
- pScrn->virtualY, pScrn->xDpi, pScrn->yDpi,
- pScrn->displayWidth);
- break;
case 24:
- r = cfb24ScreenInit(pScreen, iptr->FBBase, pScrn->virtualX,
- pScrn->virtualY, pScrn->xDpi, pScrn->yDpi,
- pScrn->displayWidth);
- break;
case 32:
- r = cfb32ScreenInit(pScreen, iptr->FBBase, pScrn->virtualX,
+ r = fbScreenInit(pScreen, iptr->FBBase, pScrn->virtualX,
pScrn->virtualY, pScrn->xDpi, pScrn->yDpi,
- pScrn->displayWidth);
+ pScrn->displayWidth, pScrn->bitsPerPixel);
break;
default:
- r = FALSE;
- break;
+ ErrorF("invalid bpp %d\n", pScrn->bitsPerPixel);
+ return FALSE;
}
if (!r) {
@@ -853,6 +857,12 @@ static Bool IMSTTScreenInit(int scrnIndex, ScreenPtr pScreen,
if (serverGeneration == 1)
xf86ShowUnusedOptions(pScrn->scrnIndex, pScrn->options);
+ pScreen->SaveScreen = IMSTTSaveScreen;
+ pScreen->CloseScreen = IMSTTCloseScreen;
+
+ IMSTTTRACE("ScreenInit -- End\n");
+
+
return TRUE;
}
@@ -1290,3 +1300,23 @@ static void IMSTTAdjustFrame(int scrnIndex, int x, int y, int flags)
return;
}
+
+
+Bool IMSTTCloseScreen(int scrnIndex, ScreenPtr pScreen)
+{
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ IMSTTPtr iptr = IMSTTPTR(pScrn);
+
+ if (iptr->FBDev)
+ fbdevHWSave(pScrn);
+
+ return TRUE;
+}
+
+
+Bool IMSTTSaveScreen(ScreenPtr pScreen, int mode)
+{
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+
+ return TRUE;
+}