296 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			296 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			C
		
	
	
	
| #ifdef HAVE_CONFIG_H
 | |
| #include <kdrive-config.h>
 | |
| #endif
 | |
| #include "kdrive.h"
 | |
| #include "kaa.h"
 | |
| 
 | |
| #include "pm2.h"
 | |
| 
 | |
| #define PARTPROD(a,b,c) (((a)<<6) | ((b)<<3) | (c))
 | |
| 
 | |
| char bppand[4] = { 0x03, /* 8bpp */
 | |
| 		   0x01, /* 16bpp */
 | |
| 		   0x00, /* 24bpp */
 | |
| 		   0x00  /* 32bpp */};
 | |
| 
 | |
| int partprodPermedia[] = {
 | |
| 	-1,
 | |
| 	PARTPROD(0,0,1), PARTPROD(0,1,1), PARTPROD(1,1,1), PARTPROD(1,1,2),
 | |
| 	PARTPROD(1,2,2), PARTPROD(2,2,2), PARTPROD(1,2,3), PARTPROD(2,2,3),
 | |
| 	PARTPROD(1,3,3), PARTPROD(2,3,3), PARTPROD(1,2,4), PARTPROD(3,3,3),
 | |
| 	PARTPROD(1,3,4), PARTPROD(2,3,4),              -1, PARTPROD(3,3,4), 
 | |
| 	PARTPROD(1,4,4), PARTPROD(2,4,4),              -1, PARTPROD(3,4,4), 
 | |
| 	             -1, PARTPROD(2,3,5),              -1, PARTPROD(4,4,4), 
 | |
| 	PARTPROD(1,4,5), PARTPROD(2,4,5), PARTPROD(3,4,5),              -1,
 | |
| 	             -1,              -1,              -1, PARTPROD(4,4,5), 
 | |
| 	PARTPROD(1,5,5), PARTPROD(2,5,5),              -1, PARTPROD(3,5,5), 
 | |
| 	             -1,              -1,              -1, PARTPROD(4,5,5), 
 | |
| 	             -1,              -1,              -1, PARTPROD(3,4,6),
 | |
| 	             -1,              -1,              -1, PARTPROD(5,5,5), 
 | |
| 	PARTPROD(1,5,6), PARTPROD(2,5,6),              -1, PARTPROD(3,5,6),
 | |
| 	             -1,              -1,              -1, PARTPROD(4,5,6),
 | |
| 	             -1,              -1,              -1,              -1,
 | |
| 	             -1,              -1,              -1, PARTPROD(5,5,6),
 | |
| 	             -1,              -1,              -1,              -1,
 | |
| 	             -1,              -1,              -1,              -1,
 | |
| 	             -1,              -1,              -1,              -1,
 | |
| 	             -1,              -1,              -1,              -1,
 | |
| 	             -1,              -1,              -1,              -1,
 | |
| 	             -1,              -1,              -1,              -1,
 | |
| 	             -1,              -1,              -1,              -1,
 | |
| 	             -1,              -1,              -1,              -1,
 | |
| 	             -1,              -1,              -1,              -1,
 | |
| 	             -1,              -1,              -1,              -1,
 | |
| 	             -1,              -1,              -1,              -1,
 | |
| 	             -1,              -1,              -1,              -1,
 | |
| 	             -1,              -1,              -1,              -1,
 | |
| 	             -1,              -1,              -1,              -1,
 | |
| 	             -1,              -1,              -1,              -1,
 | |
| 	             -1,              -1,              -1,              -1,
 | |
| 		     0};
 | |
| 
 | |
| static Bool
 | |
| pmMapReg(KdCardInfo *card, PM2CardInfo *pm2c)
 | |
| {
 | |
| 	pm2c->reg_base = (CARD8 *)KdMapDevice(PM2_REG_BASE(card),
 | |
| 	    PM2_REG_SIZE(card));
 | |
| 
 | |
| 	if (pm2c->reg_base == NULL)
 | |
| 		return FALSE;
 | |
| 
 | |
| 	KdSetMappedMode(PM2_REG_BASE(card), PM2_REG_SIZE(card),
 | |
| 	    KD_MAPPED_MODE_REGISTERS);
 | |
| 
 | |
| 	return TRUE;
 | |
| }
 | |
| 
 | |
| static void
 | |
| pmUnmapReg(KdCardInfo *card, PM2CardInfo *pm2c)
 | |
| {
 | |
| 	if (pm2c->reg_base) {
 | |
| 		KdResetMappedMode(PM2_REG_BASE(card), PM2_REG_SIZE(card),
 | |
| 		    KD_MAPPED_MODE_REGISTERS);
 | |
| 		KdUnmapDevice((void *)pm2c->reg_base, PM2_REG_SIZE(card));
 | |
| 		pm2c->reg_base = 0;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| Bool
 | |
| pmCardInit (KdCardInfo *card)
 | |
| {
 | |
|     PM2CardInfo	*pm2c;
 | |
| 
 | |
|     pm2c = (PM2CardInfo *) xalloc (sizeof (PM2CardInfo));
 | |
|     if (!pm2c)
 | |
| 	return FALSE;
 | |
|     memset (pm2c, '\0', sizeof (PM2CardInfo));
 | |
| 
 | |
|     (void) pmMapReg (card, pm2c);
 | |
| 
 | |
|     if (!vesaInitialize (card, &pm2c->vesa))
 | |
|     {
 | |
| 	xfree (pm2c);
 | |
| 	return FALSE;
 | |
|     }
 | |
|     
 | |
|     pm2c->InFifoSpace = 0;
 | |
| 
 | |
|     card->driver = pm2c;    
 | |
| 
 | |
|     return TRUE;
 | |
| }
 | |
| 
 | |
| static  void
 | |
| pmCardFini (KdCardInfo *card)
 | |
| {
 | |
|     PM2CardInfo	*pm2c = (PM2CardInfo *) card->driver;
 | |
|     
 | |
|     pmUnmapReg (card, pm2c);
 | |
|     vesaCardFini (card);
 | |
| }
 | |
| 
 | |
| Bool
 | |
| pmScreenInit (KdScreenInfo *screen)
 | |
| {
 | |
|     PM2CardInfo	*pm2c = screen->card->driver;
 | |
|     PM2ScreenInfo	*pm2s;
 | |
|     int			screen_size, memory;
 | |
| 
 | |
|     pm2s = (PM2ScreenInfo *) xalloc (sizeof (PM2ScreenInfo));
 | |
|     if (!pm2s)
 | |
| 	return FALSE;
 | |
|     memset (pm2s, '\0', sizeof (PM2ScreenInfo));
 | |
| 
 | |
|     if (!vesaScreenInitialize (screen, &pm2s->vesa))
 | |
|     {
 | |
| 	xfree (pm2s);
 | |
| 	return FALSE;
 | |
|     }
 | |
| 
 | |
|     pm2c->pprod = partprodPermedia[screen->width >> 5];
 | |
|     pm2c->bppalign = bppand[(screen->fb[0].bitsPerPixel>>3)-1];
 | |
| 
 | |
|     pm2s->screen = pm2s->vesa.fb;
 | |
|     memory = pm2s->vesa.fb_size;
 | |
|     
 | |
|     screen_size = screen->fb[0].byteStride * screen->height;
 | |
|     
 | |
|     if (pm2s->screen && memory >= screen_size + 2048)
 | |
|     {
 | |
| 	memory -= 2048;
 | |
| 	pm2s->cursor_base = pm2s->screen + memory - 2048;
 | |
|     }
 | |
|     else
 | |
| 	pm2s->cursor_base = 0;
 | |
|     memory -= screen_size;
 | |
|     if (memory > screen->fb[0].byteStride)
 | |
|     {
 | |
| 	pm2s->off_screen = pm2s->screen + screen_size;
 | |
| 	pm2s->off_screen_size = memory;
 | |
|     }
 | |
|     else
 | |
|     {
 | |
| 	pm2s->off_screen = 0;
 | |
| 	pm2s->off_screen_size = 0;
 | |
|     }
 | |
| 
 | |
|     switch (screen->fb[0].bitsPerPixel) {
 | |
|     case 8:
 | |
| 	pm2c->BppShift = 2;
 | |
| 	break;
 | |
|     case 16:
 | |
| 	pm2c->BppShift = 1;
 | |
| 	break;
 | |
|     case 24:
 | |
| 	pm2c->BppShift = 2;
 | |
| 	break;
 | |
|     case 32:
 | |
| 	pm2c->BppShift = 0;
 | |
| 	break;
 | |
|     }
 | |
| 
 | |
|     screen->driver = pm2s;
 | |
| 
 | |
|     return TRUE;
 | |
| }
 | |
| 
 | |
| static void
 | |
| pmScreenFini (KdScreenInfo *screen)
 | |
| {
 | |
|     PM2ScreenInfo	*pm2s = (PM2ScreenInfo *) screen->driver;
 | |
| 
 | |
|     vesaScreenFini (screen);
 | |
|     xfree (pm2s);
 | |
|     screen->driver = 0;
 | |
| }
 | |
| 
 | |
| static Bool
 | |
| pmInitScreen (ScreenPtr pScreen)
 | |
| {
 | |
|     return vesaInitScreen (pScreen);
 | |
| }
 | |
| 
 | |
| #ifdef RANDR
 | |
| static Bool
 | |
| pmRandRSetConfig (ScreenPtr		pScreen,
 | |
| 		      Rotation		rotation,
 | |
| 		      int		rate,
 | |
| 		      RRScreenSizePtr	pSize)
 | |
| {
 | |
|     kaaWaitSync (pScreen);
 | |
| 
 | |
|     if (!vesaRandRSetConfig (pScreen, rotation, rate, pSize))
 | |
| 	return FALSE;
 | |
|     
 | |
|     return TRUE;
 | |
| }
 | |
| 
 | |
| static void
 | |
| pmRandRInit (ScreenPtr pScreen)
 | |
| {
 | |
|     rrScrPriv(pScreen);
 | |
| 
 | |
|     pScrPriv->rrSetConfig = pmRandRSetConfig;
 | |
| }
 | |
| #endif
 | |
| 
 | |
| static Bool
 | |
| pmFinishInitScreen (ScreenPtr pScreen)
 | |
| {
 | |
|     Bool    ret;
 | |
|     ret = vesaFinishInitScreen (pScreen);
 | |
| #ifdef RANDR
 | |
|     pmRandRInit (pScreen);
 | |
| #endif
 | |
|     return ret;
 | |
| }
 | |
| 
 | |
| static void
 | |
| pmPreserve(KdCardInfo *card)
 | |
| {
 | |
|     vesaPreserve(card);
 | |
| }
 | |
| 
 | |
| static void
 | |
| pmRestore(KdCardInfo *card)
 | |
| {
 | |
|     vesaRestore (card);
 | |
| }
 | |
| 
 | |
| static Bool
 | |
| pmEnable (ScreenPtr pScreen)
 | |
| {
 | |
|     if (!vesaEnable (pScreen))
 | |
| 	return FALSE;
 | |
|     
 | |
| #ifdef XV
 | |
|     KdXVEnable (pScreen);
 | |
| #endif
 | |
| 
 | |
|     return TRUE;
 | |
| }
 | |
| 
 | |
| static void
 | |
| pmDisable(ScreenPtr pScreen)
 | |
| {
 | |
| #ifdef XV
 | |
|     KdXVDisable (pScreen);
 | |
| #endif
 | |
|     vesaDisable (pScreen);
 | |
| }
 | |
| 
 | |
| static Bool
 | |
| pmDPMS(ScreenPtr pScreen, int mode) 
 | |
| {
 | |
|     return vesaDPMS (pScreen, mode);
 | |
| }
 | |
| 
 | |
| KdCardFuncs	PM2Funcs = {
 | |
|     pmCardInit,               /* cardinit */
 | |
|     pmScreenInit,             /* scrinit */
 | |
|     pmInitScreen,             /* initScreen */
 | |
|     pmFinishInitScreen, /* finishInitScreen */
 | |
|     vesaCreateResources,    /* createRes */
 | |
|     pmPreserve,               /* preserve */
 | |
|     pmEnable,                 /* enable */
 | |
|     pmDPMS,                   /* dpms */
 | |
|     pmDisable,                /* disable */
 | |
|     pmRestore,                /* restore */
 | |
|     pmScreenFini,             /* scrfini */
 | |
|     pmCardFini,               /* cardfini */
 | |
|     
 | |
|     0,             		/* initCursor */
 | |
|     0,           		/* enableCursor */
 | |
|     0,          		/* disableCursor */
 | |
|     0,             		/* finiCursor */
 | |
|     NULL,                       /* recolorCursor */
 | |
| 
 | |
|     pmDrawInit,              /* initAccel */
 | |
|     pmDrawEnable,            /* enableAccel */
 | |
|     pmDrawDisable,           /* disableAccel */
 | |
|     pmDrawFini,              /* finiAccel */
 | |
|     
 | |
|     vesaGetColors,    	    /* getColors */
 | |
|     vesaPutColors,	    /* putColors */
 | |
| };
 |