514 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			514 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C
		
	
	
	
/* COPYRIGHT AND PERMISSION NOTICE
 | 
						|
 | 
						|
Copyright (c) 2000, 2001 Nokia Home Communications
 | 
						|
 | 
						|
All rights reserved.
 | 
						|
 | 
						|
Permission is hereby granted, free of charge, to any person obtaining
 | 
						|
a copy of this software and associated documentation files (the
 | 
						|
"Software"), to deal in the Software without restriction, including
 | 
						|
without limitation the rights to use, copy, modify, merge, publish,
 | 
						|
distribute, and/or sell copies of the Software, and to permit persons
 | 
						|
to whom the Software is furnished to do so, provided that the above
 | 
						|
copyright notice(s) and this permission notice appear in all copies of
 | 
						|
the Software and that both the above copyright notice(s) and this
 | 
						|
permission notice appear in supporting documentation.
 | 
						|
 | 
						|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 | 
						|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 | 
						|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
 | 
						|
OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
 | 
						|
HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY
 | 
						|
SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER
 | 
						|
RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
 | 
						|
CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
 | 
						|
CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 | 
						|
 | 
						|
Except as contained in this notice, the name of a copyright holder
 | 
						|
shall not be used in advertising or otherwise to promote the sale, use
 | 
						|
or other dealings in this Software without prior written authorization
 | 
						|
of the copyright holder.
 | 
						|
 | 
						|
X Window System is a trademark of The Open Group */
 | 
						|
 | 
						|
/* $RCSId: $ */
 | 
						|
 | 
						|
/*
 | 
						|
 * Author:
 | 
						|
 *   Pontus Lidman <pontus.lidman@nokia.com>
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef _I810_H_
 | 
						|
#define _I810_H_
 | 
						|
 | 
						|
#include "i810_reg.h"
 | 
						|
 | 
						|
/* Globals */
 | 
						|
 | 
						|
typedef struct _I810Rec *I810Ptr;
 | 
						|
 | 
						|
/* Linear region allocated in framebuffer.
 | 
						|
 */
 | 
						|
typedef struct {
 | 
						|
   unsigned long Start;
 | 
						|
   unsigned long End;
 | 
						|
   unsigned long Size;
 | 
						|
} I810MemRange;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
   int tail_mask;
 | 
						|
   I810MemRange mem;
 | 
						|
   unsigned char *virtual_start;
 | 
						|
   int head;
 | 
						|
   int tail;
 | 
						|
   int space;
 | 
						|
} I810RingBuffer;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
   unsigned char DisplayControl;
 | 
						|
   unsigned char PixelPipeCfg0;
 | 
						|
   unsigned char PixelPipeCfg1;
 | 
						|
   unsigned char PixelPipeCfg2;
 | 
						|
   unsigned short VideoClk2_M;
 | 
						|
   unsigned short VideoClk2_N;
 | 
						|
   unsigned char VideoClk2_DivisorSel;
 | 
						|
   unsigned char AddressMapping;
 | 
						|
   unsigned char IOControl;
 | 
						|
   unsigned char BitBLTControl;
 | 
						|
   unsigned char ExtVertTotal;
 | 
						|
   unsigned char ExtVertDispEnd;
 | 
						|
   unsigned char ExtVertSyncStart;
 | 
						|
   unsigned char ExtVertBlankStart;
 | 
						|
   unsigned char ExtHorizTotal;
 | 
						|
   unsigned char ExtHorizBlank;
 | 
						|
   unsigned char ExtOffset;
 | 
						|
   unsigned char InterlaceControl;
 | 
						|
   unsigned int  LMI_FIFO_Watermark;
 | 
						|
 | 
						|
   unsigned int  LprbTail;
 | 
						|
   unsigned int  LprbHead;
 | 
						|
   unsigned int  LprbStart;
 | 
						|
   unsigned int  LprbLen;
 | 
						|
 | 
						|
   unsigned int Fence[8];
 | 
						|
 | 
						|
   unsigned short OverlayActiveStart;
 | 
						|
   unsigned short OverlayActiveEnd;
 | 
						|
 | 
						|
 | 
						|
} I810RegRec, *I810RegPtr;
 | 
						|
 | 
						|
#define minb(p) *(volatile CARD8 *)(i810c->MMIOBase + (p))
 | 
						|
#define moutb(p,v) *(volatile CARD8 *)(i810c->MMIOBase + (p)) = (v)
 | 
						|
 | 
						|
#define OUT_RING(n) {					\
 | 
						|
   if (I810_DEBUG & DEBUG_VERBOSE_RING)			\
 | 
						|
      ErrorF( "OUT_RING %x: %x\n", outring, n);	\
 | 
						|
   *(volatile unsigned int *)(virt + outring) = n;	\
 | 
						|
   outring += 4;					\
 | 
						|
   outring &= ringmask;					\
 | 
						|
}
 | 
						|
 | 
						|
#define ADVANCE_LP_RING() {					\
 | 
						|
    i810c->LpRing.tail = outring;					\
 | 
						|
    OUTREG(LP_RING + RING_TAIL, outring);	\
 | 
						|
}
 | 
						|
 | 
						|
#ifdef __GNUC__
 | 
						|
#define LP_RING_MESSAGE(n) \
 | 
						|
   ErrorF("BEGIN_LP_RING %d in %s\n", n, __FUNCTION__)
 | 
						|
#else
 | 
						|
#define LP_RING_MESSAGE(n) \
 | 
						|
   ErrorF("BEGIN_LP_RING %d in %s:%d\n", n, __FILE__, __LINE__)
 | 
						|
#endif
 | 
						|
 | 
						|
#define LP_RING_LOCALS \
 | 
						|
    unsigned int outring, ringmask;					\
 | 
						|
    volatile unsigned char *virt
 | 
						|
 | 
						|
#define BEGIN_LP_RING(n)						\
 | 
						|
    if (n>2 && (I810_DEBUG&DEBUG_ALWAYS_SYNC))				\
 | 
						|
	i810Sync(i810s);	\
 | 
						|
    if (i810c->LpRing.space < n*4) i810WaitLpRing(i810s, n*4, 0);	\
 | 
						|
    i810c->LpRing.space -= n*4;						\
 | 
						|
    if (I810_DEBUG & DEBUG_VERBOSE_RING) 				\
 | 
						|
	LP_RING_MESSAGE(n);						\
 | 
						|
    outring = i810c->LpRing.tail;					\
 | 
						|
    ringmask = i810c->LpRing.tail_mask;					\
 | 
						|
    virt = i810c->LpRing.virtual_start;			
 | 
						|
 | 
						|
/* Memory mapped register access macros */
 | 
						|
#define INREG8(addr)        *(volatile CARD8  *)(i810c->MMIOBase + (addr))
 | 
						|
#define INREG16(addr)       *(volatile CARD16 *)(i810c->MMIOBase + (addr))
 | 
						|
#define INREG(addr)         *(volatile CARD32 *)(i810c->MMIOBase + (addr))
 | 
						|
 | 
						|
#define OUTREG8(addr, val) do {				\
 | 
						|
   *(volatile CARD8 *)(i810c->MMIOBase  + (addr)) = (val);	\
 | 
						|
   if (I810_DEBUG&DEBUG_VERBOSE_OUTREG)			\
 | 
						|
     ErrorF( "OUTREG8(%x, %x)\n", addr, val);	\
 | 
						|
} while (0)
 | 
						|
 | 
						|
#define OUTREG16(addr, val) do {			\
 | 
						|
   *(volatile CARD16 *)(i810c->MMIOBase + (addr)) = (val);	\
 | 
						|
   if (I810_DEBUG&DEBUG_VERBOSE_OUTREG)			\
 | 
						|
     ErrorF( "OUTREG16(%x, %x)\n", addr, val);	\
 | 
						|
} while (0)
 | 
						|
 | 
						|
#define OUTREG(addr, val) do {				\
 | 
						|
   *(volatile CARD32 *)(i810c->MMIOBase + (addr)) = (val);	\
 | 
						|
   if (I810_DEBUG&DEBUG_VERBOSE_OUTREG)			\
 | 
						|
     ErrorF( "OUTREG(%x, %x)\n", addr, val);	\
 | 
						|
} while (0)
 | 
						|
 | 
						|
/* To remove all debugging, make sure I810_DEBUG is defined as a
 | 
						|
 * preprocessor symbol, and equal to zero.  
 | 
						|
 */
 | 
						|
 | 
						|
#define I810_DEBUG 0
 | 
						|
 | 
						|
#ifndef I810_DEBUG
 | 
						|
#warning "Debugging enabled - expect reduced performance"
 | 
						|
extern int I810_DEBUG;
 | 
						|
#endif
 | 
						|
 | 
						|
#define DEBUG_VERBOSE_ACCEL  0x1
 | 
						|
#define DEBUG_VERBOSE_SYNC   0x2
 | 
						|
#define DEBUG_VERBOSE_VGA    0x4
 | 
						|
#define DEBUG_VERBOSE_RING   0x8
 | 
						|
#define DEBUG_VERBOSE_OUTREG 0x10
 | 
						|
#define DEBUG_VERBOSE_MEMORY 0x20
 | 
						|
#define DEBUG_VERBOSE_CURSOR 0x40
 | 
						|
#define DEBUG_ALWAYS_SYNC    0x80
 | 
						|
#define DEBUG_VERBOSE_DRI    0x100
 | 
						|
 | 
						|
 | 
						|
/* Size of the mmio region.
 | 
						|
 */
 | 
						|
#define I810_REG_SIZE 0x80000
 | 
						|
 | 
						|
/* PCI identifiers */
 | 
						|
#ifndef PCI_CHIP_I810
 | 
						|
#define PCI_CHIP_I810              0x7121
 | 
						|
#define PCI_CHIP_I810_DC100        0x7123
 | 
						|
#define PCI_CHIP_I810_E            0x7125 
 | 
						|
#define PCI_CHIP_I815              0x1132 
 | 
						|
#define PCI_CHIP_I810_BRIDGE       0x7120
 | 
						|
#define PCI_CHIP_I810_DC100_BRIDGE 0x7122
 | 
						|
#define PCI_CHIP_I810_E_BRIDGE     0x7124
 | 
						|
#define PCI_CHIP_I815_BRIDGE       0x1130
 | 
						|
#define PCI_CHIP_I845G             0x2562
 | 
						|
#endif
 | 
						|
 | 
						|
 | 
						|
#define IS_I810(i810c) (i810c->PciInfo->chipType == PCI_CHIP_I810 ||	\
 | 
						|
			i810c->PciInfo->chipType == PCI_CHIP_I810_DC100 || \
 | 
						|
			i810c->PciInfo->chipType == PCI_CHIP_I810_E)
 | 
						|
#define IS_I815(i810c) (i810c->PciInfo->chipType == PCI_CHIP_I815)
 | 
						|
 | 
						|
 | 
						|
/* default number of VGA registers stored internally */
 | 
						|
#define VGA_NUM_CRTC 25 /* 0x19 */
 | 
						|
#define VGA_NUM_SEQ 5
 | 
						|
#define VGA_NUM_GFX 9
 | 
						|
#define VGA_NUM_ATTR 21
 | 
						|
 | 
						|
/*
 | 
						|
 * Settings of standard VGA registers.
 | 
						|
 */
 | 
						|
typedef struct {
 | 
						|
    unsigned char MiscOutReg;     /* */
 | 
						|
    unsigned char CRTC[VGA_NUM_CRTC];       /* Crtc Controller */
 | 
						|
    unsigned char Sequencer[VGA_NUM_SEQ];   /* Video Sequencer */
 | 
						|
    unsigned char Graphics[VGA_NUM_GFX];    /* Video Graphics */
 | 
						|
    unsigned char Attribute[VGA_NUM_ATTR];  /* Video Atribute */
 | 
						|
    unsigned char DAC[768];       /* Internal Colorlookuptable */
 | 
						|
} vgaRegRec, *vgaRegPtr;
 | 
						|
 | 
						|
 | 
						|
typedef struct _i810VGARec *i810VGAPtr;
 | 
						|
 | 
						|
/* VGA registers */
 | 
						|
typedef struct _i810VGARec {
 | 
						|
    int				IOBase;		/* I/O Base address */
 | 
						|
    CARD8 * 			MMIOBase;	/* Pointer to MMIO start */
 | 
						|
    vgaRegRec			SavedReg;	/* saved registers */
 | 
						|
    vgaRegRec			ModeReg;	/* register settings for
 | 
						|
							current mode */
 | 
						|
    Bool			ShowOverscan;
 | 
						|
    Bool			paletteEnabled;
 | 
						|
    Bool			cmapSaved;
 | 
						|
} i810VGARec;
 | 
						|
 | 
						|
typedef struct _i810CardInfo {
 | 
						|
    int videoRam;
 | 
						|
    int MaxClock;    
 | 
						|
    long FbMapSize;
 | 
						|
    int cpp;                    /* chars per pixel */
 | 
						|
 | 
						|
    unsigned long LinearAddr;
 | 
						|
    unsigned long MMIOAddr;
 | 
						|
    
 | 
						|
    unsigned char *MMIOBase;
 | 
						|
    unsigned char *FbBase;
 | 
						|
 | 
						|
    Bool GttBound;
 | 
						|
    Bool agpAcquired2d;
 | 
						|
    int VramKey;
 | 
						|
    unsigned long VramOffset;
 | 
						|
    int DcacheKey;
 | 
						|
    unsigned long DcacheOffset;
 | 
						|
    int HwcursKey; 
 | 
						|
    unsigned long HwcursOffset;
 | 
						|
 | 
						|
    I810MemRange DcacheMem;
 | 
						|
    I810MemRange SysMem;
 | 
						|
 | 
						|
    I810MemRange SavedDcacheMem;
 | 
						|
    I810MemRange SavedSysMem;
 | 
						|
 | 
						|
    unsigned int bufferOffset;	/* for I810SelectBuffer */
 | 
						|
    Bool DoneFrontAlloc;
 | 
						|
    BoxRec FbMemBox;
 | 
						|
    I810MemRange FrontBuffer;
 | 
						|
    I810MemRange Scratch;
 | 
						|
    I810MemRange XvMem;
 | 
						|
 | 
						|
    int  LmFreqSel;
 | 
						|
    
 | 
						|
    i810VGARec vga;
 | 
						|
 | 
						|
    I810RegRec SavedReg;
 | 
						|
    I810RegRec ModeReg;
 | 
						|
    I810RingBuffer LpRing;
 | 
						|
 | 
						|
    unsigned int BR[20]; 
 | 
						|
 | 
						|
    int CursorOffset;
 | 
						|
    unsigned long CursorPhysical;
 | 
						|
    unsigned long CursorStart;
 | 
						|
    unsigned long OverlayPhysical;
 | 
						|
    unsigned long OverlayStart;
 | 
						|
    int colorKey;
 | 
						|
 | 
						|
    int nextColorExpandBuf;
 | 
						|
 | 
						|
    ScreenBlockHandlerProcPtr BlockHandler;
 | 
						|
 | 
						|
#ifdef XV
 | 
						|
    KdVideoAdaptorPtr adaptor;
 | 
						|
#endif
 | 
						|
 | 
						|
} i810CardInfo;
 | 
						|
 | 
						|
typedef struct _i810CardInfo I810CardInfo;	/* compatibility */
 | 
						|
 | 
						|
#define getI810CardInfo(kd)	((I810CardInfo *) ((kd)->card->driver))
 | 
						|
#define i810CardInfo(kd)	I810CardInfo *i810c = getI810CardInfo(kd)
 | 
						|
 | 
						|
#define getI810ScreenInfo(kd)	((I810ScreenInfo *) ((kd)->screen->driver))
 | 
						|
#define i810ScreenInfo(kd)	I810ScreenInfo *i810s = getI810ScreenInfo(kd)
 | 
						|
 | 
						|
typedef struct _i810Cursor {
 | 
						|
    int		width, height;
 | 
						|
    int		xhot, yhot;
 | 
						|
    Bool	has_cursor;
 | 
						|
    CursorPtr	pCursor;
 | 
						|
} i810Cursor, *i810CursorPtr;
 | 
						|
 | 
						|
typedef struct _i810ScreenInfo {
 | 
						|
    i810CardInfo *i810c;
 | 
						|
    i810Cursor cursor;
 | 
						|
 | 
						|
    int pitch;
 | 
						|
    KaaScreenInfoRec kaa;
 | 
						|
} i810ScreenInfo;
 | 
						|
 | 
						|
typedef struct _i810ScreenInfo I810ScreenInfo;	/* compatibility */
 | 
						|
 | 
						|
#define I810_CURSOR_HEIGHT 64
 | 
						|
#define I810_CURSOR_WIDTH 64
 | 
						|
 | 
						|
/* init functions (i810.c) */
 | 
						|
 | 
						|
Bool 
 | 
						|
i810CardInit (KdCardInfo *card);
 | 
						|
 | 
						|
Bool 
 | 
						|
i810ScreenInit (KdScreenInfo *screen);
 | 
						|
 | 
						|
/* The cursor functions (i810_cursor.c) */
 | 
						|
 | 
						|
Bool
 | 
						|
i810CursorInit(ScreenPtr pScreen);
 | 
						|
 | 
						|
void
 | 
						|
i810CursorEnable (ScreenPtr pScreen);
 | 
						|
 | 
						|
void
 | 
						|
i810CursorDisable (ScreenPtr pScreen);
 | 
						|
 | 
						|
void
 | 
						|
i810CursorFini (ScreenPtr pScreen);
 | 
						|
 | 
						|
/* Accel functions (i810draw.c) */
 | 
						|
 | 
						|
Bool        
 | 
						|
i810InitAccel(ScreenPtr);
 | 
						|
 | 
						|
void        
 | 
						|
i810EnableAccel (ScreenPtr);
 | 
						|
 | 
						|
void        
 | 
						|
i810DisableAccel (ScreenPtr);
 | 
						|
 | 
						|
void        
 | 
						|
i810FiniAccel (ScreenPtr);
 | 
						|
 | 
						|
void
 | 
						|
i810FillBoxSolid (KdScreenInfo *screen, int nBox, BoxPtr pBox, 
 | 
						|
                  unsigned long pixel, int alu, unsigned long planemask);
 | 
						|
 | 
						|
 | 
						|
extern KdCardFuncs  i810Funcs;
 | 
						|
 | 
						|
/* Standard VGA registers */
 | 
						|
 | 
						|
#define VGA_ATTR_INDEX		0x3C0
 | 
						|
#define VGA_ATTR_DATA_W		0x3C0
 | 
						|
#define VGA_ATTR_DATA_R		0x3C1
 | 
						|
#define VGA_IN_STAT_0		0x3C2		/* read */
 | 
						|
#define VGA_MISC_OUT_W		0x3C2		/* write */
 | 
						|
#define VGA_ENABLE		0x3C3
 | 
						|
#define VGA_SEQ_INDEX		0x3C4
 | 
						|
#define VGA_SEQ_DATA		0x3C5
 | 
						|
#define VGA_DAC_MASK		0x3C6
 | 
						|
#define VGA_DAC_READ_ADDR	0x3C7
 | 
						|
#define VGA_DAC_WRITE_ADDR	0x3C8
 | 
						|
#define VGA_DAC_DATA		0x3C9
 | 
						|
#define VGA_FEATURE_R		0x3CA		/* read */
 | 
						|
#define VGA_MISC_OUT_R		0x3CC		/* read */
 | 
						|
#define VGA_GRAPH_INDEX		0x3CE
 | 
						|
#define VGA_GRAPH_DATA		0x3CF
 | 
						|
 | 
						|
#define VGA_IOBASE_MONO		0x3B0
 | 
						|
#define VGA_IOBASE_COLOR	0x3D0
 | 
						|
 | 
						|
#define VGA_CRTC_INDEX_OFFSET	0x04
 | 
						|
#define VGA_CRTC_DATA_OFFSET	0x05
 | 
						|
#define VGA_IN_STAT_1_OFFSET	0x0A		/* read */
 | 
						|
#define VGA_FEATURE_W_OFFSET	0x0A		/* write */
 | 
						|
 | 
						|
/* VGA stuff */
 | 
						|
#define BIT_PLANE 3		/* Which plane we write to in mono mode */
 | 
						|
 | 
						|
/* DAC indices for white and black */
 | 
						|
#define WHITE_VALUE 0x3F
 | 
						|
#define BLACK_VALUE 0x00
 | 
						|
#define OVERSCAN_VALUE 0x01
 | 
						|
 | 
						|
#define OVERSCAN 0x11		/* Index of OverScan register */
 | 
						|
 | 
						|
void 
 | 
						|
i810VGAUnlock(i810VGAPtr vgap);
 | 
						|
 | 
						|
void 
 | 
						|
i810VGALock(i810VGAPtr vgap);
 | 
						|
 | 
						|
Bool 
 | 
						|
i810VGAInit(KdScreenInfo *scrninfp, const KdMonitorTiming *t);
 | 
						|
 | 
						|
void
 | 
						|
i810VGABlankScreen(KdCardInfo *card, Bool on);
 | 
						|
 | 
						|
void
 | 
						|
i810AdjustFrame(KdScreenInfo *screen, int x, int y, int flags);
 | 
						|
 | 
						|
Bool
 | 
						|
i810VGAMapMem(KdCardInfo *card);
 | 
						|
 | 
						|
void
 | 
						|
i810VGASave(KdCardInfo *card, vgaRegPtr save, int flags);
 | 
						|
 | 
						|
void 
 | 
						|
i810PrintErrorState(i810CardInfo *i810c);
 | 
						|
 | 
						|
void
 | 
						|
i810VGAGetIOBase(i810VGAPtr vgap);
 | 
						|
 | 
						|
Bool
 | 
						|
i810InitVideo(ScreenPtr pScreen);
 | 
						|
 | 
						|
/*
 | 
						|
 * MMIO versions of the register access functions.  These require
 | 
						|
 * hwp->MemBase to be set in such a way that when the standard VGA port
 | 
						|
 * address is added the correct memory address results.
 | 
						|
 */
 | 
						|
 | 
						|
#define Vminb(p) ( *(volatile CARD8 *)(vgap->MMIOBase + (p)))
 | 
						|
#define Vmoutb(p,v) ( *(volatile CARD8 *)(vgap->MMIOBase + (p)) = (v))
 | 
						|
 | 
						|
#define mmioWriteCrtc(vgap, index, value) { \
 | 
						|
    Vmoutb(vgap->IOBase + VGA_CRTC_INDEX_OFFSET, index); \
 | 
						|
    Vmoutb(vgap->IOBase + VGA_CRTC_DATA_OFFSET, value); \
 | 
						|
}
 | 
						|
 | 
						|
#define mmioReadCrtc(vgap, index) ( \
 | 
						|
    Vmoutb(vgap->IOBase + VGA_CRTC_INDEX_OFFSET, index), \
 | 
						|
    Vminb(vgap->IOBase + VGA_CRTC_DATA_OFFSET) \
 | 
						|
)
 | 
						|
 | 
						|
#define mmioWriteGr(vgap, index, value) { \
 | 
						|
    Vmoutb(VGA_GRAPH_INDEX, index); \
 | 
						|
    Vmoutb(VGA_GRAPH_DATA, value); \
 | 
						|
}
 | 
						|
 | 
						|
#define mmioReadGr(vgap, index) ( \
 | 
						|
    Vmoutb(VGA_GRAPH_INDEX, index), \
 | 
						|
    Vminb(VGA_GRAPH_DATA) \
 | 
						|
)
 | 
						|
 | 
						|
#define mmioWriteSeq(vgap, index, value) {\
 | 
						|
    Vmoutb(VGA_SEQ_INDEX, index); \
 | 
						|
    Vmoutb(VGA_SEQ_DATA, value); \
 | 
						|
}
 | 
						|
 | 
						|
#define mmioReadSeq(vgap, index) ( \
 | 
						|
    Vmoutb(VGA_SEQ_INDEX, index), \
 | 
						|
    Vminb(VGA_SEQ_DATA) \
 | 
						|
)
 | 
						|
 | 
						|
#define mmioWriteAttr(vgap, index, value) { \
 | 
						|
    (void) Vminb(vgap->IOBase + VGA_IN_STAT_1_OFFSET); \
 | 
						|
    Vmoutb(VGA_ATTR_INDEX, index); \
 | 
						|
    Vmoutb(VGA_ATTR_DATA_W, value); \
 | 
						|
}
 | 
						|
 | 
						|
#define mmioReadAttr(vgap, index) ( \
 | 
						|
    (void) Vminb(vgap->IOBase + VGA_IN_STAT_1_OFFSET), \
 | 
						|
    Vmoutb(VGA_ATTR_INDEX, index), \
 | 
						|
    Vminb(VGA_ATTR_DATA_R) \
 | 
						|
)
 | 
						|
 | 
						|
#define mmioWriteMiscOut(vgap, value) Vmoutb(VGA_MISC_OUT_W, value)
 | 
						|
 | 
						|
 | 
						|
#define mmioReadMiscOut(vgap) Vminb(VGA_MISC_OUT_R)
 | 
						|
 | 
						|
#define mmioEnablePalette(vgap) { \
 | 
						|
    (void) Vminb(vgap->IOBase + VGA_IN_STAT_1_OFFSET); \
 | 
						|
    Vmoutb(VGA_ATTR_INDEX, 0x00); \
 | 
						|
    vgap->paletteEnabled = TRUE; \
 | 
						|
}
 | 
						|
 | 
						|
#define mmioDisablePalette(vgap) { \
 | 
						|
    (void) Vminb(vgap->IOBase + VGA_IN_STAT_1_OFFSET); \
 | 
						|
    Vmoutb(VGA_ATTR_INDEX, 0x20); \
 | 
						|
    vgap->paletteEnabled = FALSE; \
 | 
						|
}
 | 
						|
 | 
						|
#define mmioWriteDacWriteAddr(vgap, value) Vmoutb(VGA_DAC_WRITE_ADDR, value)
 | 
						|
 | 
						|
#define mmioWriteDacData(vgap, value) Vmoutb(VGA_DAC_DATA, value)
 | 
						|
 | 
						|
#endif /* _I810_H_ */
 |