xserver-multidpi/hw/kdrive/pm2/pm2.h

165 lines
3.3 KiB
C

#ifndef _PM2_H_
#define _PM2_H_
#include <vesa.h>
#include "kxv.h"
#include "klinux.h"
#include "glint_regs.h"
typedef volatile CARD8 VOL8;
typedef volatile CARD16 VOL16;
typedef volatile CARD32 VOL32;
#define PM2_REG_BASE(c) ((c)->attr.address[0] & 0xFFFFC000)
#define PM2_REG_SIZE(c) (0x10000)
typedef struct _PM2CardInfo {
VesaCardPrivRec vesa;
CARD8 *reg_base;
int InFifoSpace;
int FIFOSize;
int pprod;
int bppalign;
int ClippingOn;
int ROP;
int x;
int y;
int w;
int h;
int FrameBufferReadMode;
int BppShift;
int BltScanDirection;
int RasterizerSwap;
int PixelWidth;
int TexMapFormat;
int startxdom;
int startxsub;
int starty;
int count;
int dy;
int dxdom;
int planemask;
} PM2CardInfo;
#define getPM2CardInfo(kd) ((PM2CardInfo *) ((kd)->card->driver))
#define pmCardInfo(kd) PM2CardInfo *pm2c = getPM2CardInfo(kd)
typedef struct _PM2ScreenInfo {
VesaScreenPrivRec vesa;
CARD8 *cursor_base;
CARD8 *screen;
CARD8 *off_screen;
int off_screen_size;
KdVideoAdaptorPtr pAdaptor;
} PM2ScreenInfo;
#define getPM2ScreenInfo(kd) ((PM2ScreenInfo *) ((kd)->screen->driver))
#define pmScreenInfo(kd) PM2ScreenInfo *pm2s = getPM2ScreenInfo(kd)
Bool
pmCardInit (KdCardInfo *card);
Bool
pmScreenInit (KdScreenInfo *screen);
Bool
pmDrawInit(ScreenPtr);
void
pmDrawEnable (ScreenPtr);
void
pmDrawSync (ScreenPtr);
void
pmDrawDisable (ScreenPtr);
void
pmDrawFini (ScreenPtr);
extern KdCardFuncs PM2Funcs;
#define MMIO_OUT32(base, offset, val) \
do { \
*(volatile CARD32 *)(void *)(((CARD8*)(base)) + (offset)) = (val); \
} while (0)
# define MMIO_IN32(base, offset) \
*(volatile CARD32 *)(void *)(((CARD8*)(base)) + (offset))
#define GLINT_WRITE_REG(v,r) \
MMIO_OUT32(mmio,(unsigned long)(r), (v))
#define GLINT_READ_REG(r) \
MMIO_IN32(mmio,(unsigned long)(r))
#define GLINT_SLOW_WRITE_REG(v,r) \
do{ \
GLINT_WAIT(card->FIFOSize); \
GLINT_WRITE_REG(v,r); \
}while(0)
#define REPLICATE(r) \
{ \
if (pScreenPriv->screen->fb[0].bitsPerPixel == 16) { \
r &= 0xFFFF; \
r |= (r<<16); \
} else \
if (pScreenPriv->screen->fb[0].bitsPerPixel == 8) { \
r &= 0xFF; \
r |= (r<<8); \
r |= (r<<16); \
} \
}
#define DO_PLANEMASK(planemask) \
{ \
if (planemask != card->planemask) { \
card->planemask = planemask; \
REPLICATE(planemask); \
GLINT_WRITE_REG(planemask, FBHardwareWriteMask);\
} \
}
#define LOADROP(rop) \
{ \
if (card->ROP != rop) { \
GLINT_WRITE_REG(rop<<1|UNIT_ENABLE, LogicalOpMode); \
card->ROP = rop; \
} \
}
#define GLINT_WAIT(n) \
do{ \
if (card->InFifoSpace>=(n)) \
card->InFifoSpace -= (n); \
else { \
int tmp; \
while((tmp=GLINT_READ_REG(InFIFOSpace))<(n)); \
/* Clamp value due to bugs in PM3 */ \
if (tmp > card->FIFOSize) \
tmp = card->FIFOSize; \
card->InFifoSpace = tmp - (n); \
} \
}while(0)
#define CHECKCLIPPING \
{ \
if (card->ClippingOn) { \
card->ClippingOn = FALSE; \
GLINT_WAIT(1); \
GLINT_WRITE_REG(0, ScissorMode); \
} \
}
#endif /* _PM2_H_ */