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_ */
|