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 */
 | 
						|
};
 |