165 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			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_ */
 |