xserver-multidpi/hw/kdrive/pm2/pm2.c
Eric Anholt 545c082cf9 - Replace the syncAccel hook in the kdrive structure with a pair of hooks
in the kaa structure: markSync and waitMarker. The first, if set,
    returns a hardware-dependent marker number which can then be waited for
    with waitMarker. If markSync is absent (which is the case on all
    drivers currently), waitMarker must wait for idle on any given marker
    number. The intention is to allow for more parallelism when we get
    downloading from framebuffer, or more fine-grained idling.
- Replace the KdMarkSync/KdCheckSync functions with kaaMarkSync and
    kaaWaitSync. These will need to be refined when KAA starts being smart
    about using them. Merge kpict.c into kasync.c since kasyn.c has all the
    rest of these fallback funcs.
- Restructure all drivers to initialize a KaaInfo structure by hand rather
    than statically in dubious order.
- Whack the i810 driver into shape in hopes that it'll work after this
    change (it certainly wouldn't have before this). Doesn't support my
    i845 though.
- Make a new KXV helper to avoid duplicated code to fill the region with
    the necessary color key. Use it in i810 and mach64 (tested).
2005-06-09 10:44:45 +00:00

306 lines
7.3 KiB
C

#ifdef HAVE_CONFIG_H
#include <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};
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;
}
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)
{
int i;
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;
}
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;
}
void
pmScreenFini (KdScreenInfo *screen)
{
PM2ScreenInfo *pm2s = (PM2ScreenInfo *) screen->driver;
vesaScreenFini (screen);
xfree (pm2s);
screen->driver = 0;
}
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
Bool
pmFinishInitScreen (ScreenPtr pScreen)
{
Bool ret;
ret = vesaFinishInitScreen (pScreen);
#ifdef RANDR
pmRandRInit (pScreen);
#endif
return ret;
}
void
pmPreserve(KdCardInfo *card)
{
vesaPreserve(card);
}
static void
pmRestore(KdCardInfo *card)
{
PM2CardInfo *pm2c = card->driver;
vesaRestore (card);
}
Bool
pmEnable (ScreenPtr pScreen)
{
KdScreenPriv(pScreen);
PM2CardInfo *pm2c = pScreenPriv->card->driver;
if (!vesaEnable (pScreen))
return FALSE;
#ifdef XV
KdXVEnable (pScreen);
#endif
return TRUE;
}
void
pmDisable(ScreenPtr pScreen)
{
KdScreenPriv(pScreen);
PM2CardInfo *pm2c = pScreenPriv->card->driver;
#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 */
};