163 lines
3.2 KiB
C
163 lines
3.2 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;
|
|
KaaScreenInfoRec kaa;
|
|
} 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
|
|
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_ */
|