/* * (c) 2006 Advanced Micro Devices, Inc. * * 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, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * 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. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. * * Neither the name of the Advanced Micro Devices, Inc. nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. */ #ifndef _AMD_GEODE_H_ #define _AMD_GEODE_H_ #include "xaa.h" #include "exa.h" #include "xf86Cursor.h" #include "vgaHW.h" #include "xf86int10.h" #include #include "xf86xv.h" #include "randrstr.h" /* We only support EXA version >=2 */ #if (EXA_VERSION_MAJOR >= 2) #ifndef XF86EXA #define XF86EXA 1 #endif #else #undef XF86EXA #endif #define CFB 0 #define INT10_SUPPORT 1 /* Existing Processor Models */ #define GX1 0x1 #define GX2 0x10 #define GX2_CRT 0x11 #define GX2_TFT 0x12 #define LX 0x20 #define LX_CRT 0x21 #define LX_TFT 0x22 #define PCI_VENDOR_ID_CYRIX 0x1078 #define PCI_VENDOR_ID_NS 0x100B #define PCI_VENDOR_ID_AMD 0x1022 #define PCI_CHIP_5530 0x0104 #define PCI_CHIP_SC1200 0x0504 #define PCI_CHIP_SC1400 0x0104 #define PCI_CHIP_REDCLOUD 0x0030 #define PCI_CHIP_GEODELX 0x2081 #define GFX_CPU_GEODELX 4 #ifdef HAVE_GX #define GX_FILL_RECT_SUPPORT 1 #define GX_BRES_LINE_SUPPORT 1 #define GX_DASH_LINE_SUPPORT 0 /* does not do dashed lines */ #define GX_MONO_8X8_PAT_SUPPORT 1 #define GX_CLREXP_8X8_PAT_SUPPORT 1 #define GX_SCR2SCREXP_SUPPORT 1 #define GX_SCR2SCRCPY_SUPPORT 1 #define GX_CPU2SCREXP_SUPPORT 1 #define GX_SCANLINE_SUPPORT 1 #define GX_USE_OFFSCRN_MEM 0 #define GX_ONE_LINE_AT_A_TIME 1 #define GX_WRITE_PIXMAP_SUPPORT 1 #define GFX(func) gfx_##func #define GFX2(func) gfx2_##func #endif #ifdef HAVE_LX #define LX_FILL_RECT_SUPPORT 1 #define LX_BRES_LINE_SUPPORT 1 #define LX_DASH_LINE_SUPPORT 1 #define LX_MONO_8X8_PAT_SUPPORT 1 #define LX_CLREXP_8X8_PAT_SUPPORT 1 #define LX_SCR2SCREXP_SUPPORT 1 #define LX_SCR2SCRCPY_SUPPORT 1 #define LX_CPU2SCREXP_SUPPORT 1 #define LX_SCANLINE_SUPPORT 1 #define LX_USE_OFFSCRN_MEM 1 #define LX_WRITE_PIXMAP_SUPPORT 1 #endif #define DEBUGTIM 0 #define DEBUGLVL 0 #ifndef DEBUGTIM #define DEBUGTIM 0 #endif #ifndef DEBUGLVL #define DEBUGLVL 0 #endif #define GEODEPTR(p) ((GeodeRec *)((p)->driverPrivate)) #define DEFAULT_IMG_LINE_BUFS 20 #define DEFAULT_CLR_LINE_BUFS 20 #define DEFAULT_EXA_SCRATCH_BFRSZ 0x40000 /* 64x64 cursor used as 32x32 */ #define HW_CURSOR_W 64 #define HW_CURSOR_H 64 #define MYDBG 1 #if defined(MYDBG) #define DEBUGMSG(cond, drv_msg) if((cond)) xf86DrvMsg drv_msg #else #define DEBUGMSG(cond, drv_msg) #endif #ifdef HAVE_LX extern unsigned char cim_inb(unsigned short port); extern void cim_outb(unsigned short port, unsigned char data); extern unsigned short cim_inw(unsigned short port); extern void cim_outw(unsigned short port, unsigned short data); extern unsigned long cim_ind(unsigned short port); extern void cim_outd(unsigned short port, unsigned long data); #include "cim_rtns.h" #define CIM_CMD_BFR_SZ 0x200000L #define CIM_CMD_BFR_MIN 0x20000L typedef struct tag_CIM_DISPLAYTIMING { unsigned short wPitch; unsigned short wBpp; VG_DISPLAY_MODE vgDisplayMode; } CIM_DISPLAYTIMING; #endif #ifdef HAVE_GX extern void gfx_write_reg32(int offset, int data); extern void gfx_write_reg16(int offset, short data); extern void gfx_write_reg8(int offset, char data); extern int gfx_read_reg32(int offset); extern short gfx_read_reg16(int offset); extern void gfx_write_vid32(int offset, int data); extern int gfx_read_vid32(int offset); extern unsigned char gfx_inb(unsigned short port); extern void gfx_outb(unsigned short port, unsigned char data); extern unsigned short gfx_inw(unsigned short port); extern void gfx_outw(unsigned short port, unsigned short data); extern unsigned long gfx_ind(unsigned short port); extern void gfx_outd(unsigned short port, unsigned long data); void gfx_reset_pitch(unsigned short pitch); #define Q_WORD QQ_WORD #include "gfx_rtns.h" #undef Q_WORD #include "panel.h" typedef struct __TVPARAMS { unsigned int dwFlags; unsigned short wWidth; unsigned short wHeight; unsigned short wStandard; unsigned short wType; unsigned short wOutput; unsigned short wResolution; Bool bState; } TVPARAMS; typedef struct tag_GFX_DISPLAYTIMING { unsigned int dwDotClock; unsigned short wPitch; unsigned short wBpp; unsigned short wHTotal; unsigned short wHActive; unsigned short wHSyncStart; unsigned short wHSyncEnd; unsigned short wHBlankStart; unsigned short wHBlankEnd; unsigned short wVTotal; unsigned short wVActive; unsigned short wVSyncStart; unsigned short wVSyncEnd; unsigned short wVBlankStart; unsigned short wVBlankEnd; unsigned short wPolarity; } GFX_DISPLAYTIMING; /* TV Timings */ typedef struct __TVTIMING { unsigned long HorzTim; unsigned long HorzSync; unsigned long VertSync; unsigned long LineEnd; unsigned long VertDownscale; unsigned long HorzScaling; unsigned long TimCtrl1; unsigned long TimCtrl2; unsigned long Subfreq; unsigned long DispPos; unsigned long DispSize; unsigned long Debug; unsigned long DacCtrl; unsigned int DotClock; } TVTIMING; #endif typedef struct _VESARec { xf86Int10InfoPtr pInt; } VESARec; #define OUTPUT_PANEL 0x01 #define OUTPUT_CRT 0x02 #define OUTPUT_TV 0x04 #define OUTPUT_VOP 0x08 typedef struct _geodeRec { /* Common */ int Output; /* Bitmask indicating the valid output options */ Bool HWCursor; Bool NoAccel; Bool useVGA; Bool VGAActive; /* Flag indicating if LX VGA is active */ Bool Compression; Bool useEXA; int rotation; int displayWidth; Bool starting; Bool tryCompression; Bool tryHWCursor; unsigned int shadowSize; unsigned int shadowOffset; ExaOffscreenArea *shadowArea; DisplayModePtr curMode; VG_COMPRESSION_DATA CBData; unsigned long CursorStartOffset; unsigned int CursorSize; xf86CursorInfoPtr CursorInfo; int CursorXHot; int CursorYHot; /* Geometry information */ unsigned int maxWidth; /* Maximum possible width of the screen */ unsigned int maxHeight; /* Maximum possible height of the screen */ int Pitch; /* display FB pitch */ int displayPitch; /* The pitch ofthe visible area */ int displayOffset; /* The offset of the visible area */ int displaySize; /* The size of the visibile area */ int PanelX; int PanelY; /* Framebuffer memory */ unsigned long FBLinearAddr; unsigned char *FBBase; int FBAvail; unsigned int FBOffset; unsigned int FBSize; /* Video information */ int video_x; int video_y; short video_w; short video_h; short video_srcw; short video_srch; short video_dstw; short video_dsth; int video_id; int video_offset; ScrnInfoPtr video_scrnptr; BOOL OverlayON; int videoKey; /* EXA structures */ ExaDriverPtr pExa; unsigned int exaBfrOffset; int exaBfrSz; /* XAA structures */ unsigned char **AccelImageWriteBuffers; int NoOfImgBuffers; unsigned char **AccelColorExpandBuffers; int NoOfColorExpandLines; XAAInfoRecPtr AccelInfoRec; /* Other structures */ EntityInfoPtr pEnt; ScreenBlockHandlerProcPtr BlockHandler; /* needed for video */ XF86VideoAdaptorPtr adaptor; /* State save structures */ gfx_vga_struct FBgfxVgaRegs; TVTIMING FBtvtiming; GFX_DISPLAYTIMING FBgfxdisplaytiming; CIM_DISPLAYTIMING FBcimdisplaytiming; unsigned int FBTVActive; unsigned int FBSupport; unsigned long FBDisplayOffset; unsigned long PrevDisplayOffset; VESARec *vesa; int FBCompressionEnable; VG_COMPRESSION_DATA FBCBData; VG_CURSOR_DATA FBCursor; unsigned long FBCompressionOffset; unsigned short FBCompressionPitch; unsigned short FBCompressionSize; /* Save the Cursor offset of the FB */ unsigned long FBCursorOffset; unsigned char FBBIOSMode; /* Hooks */ void (*WritePixmap) (ScrnInfoPtr pScrni, int x, int y, int w, int h, unsigned char *src, int srcwidth, int rop, unsigned int planemask, int trans, int bpp, int depth); void (*PointerMoved) (int index, int x, int y); CloseScreenProcPtr CloseScreen; Bool (*CreateScreenResources)(ScreenPtr); /* LX only */ unsigned long CmdBfrOffset; unsigned long CmdBfrSize; #ifdef HAVE_TVSUPPORT Bool TVSupport; int tv_encoder; int tv_bus_fmt; int tv_flags; int tv_601_fmt; int tv_601_flags; int tv_conversion; int tv_vsync_shift; int tv_vsync_shift_count; int tv_vsync_select; int tvox, tvoy; TVPARAMS TvParam; int TVOx, TVOy, TVOw, TVOh; Bool TV_Overscan_On; #endif /* To be killed! */ int FBVGAActive; unsigned int cpySrcOffset; int cpySrcPitch, cpySrcBpp; int cpyDx, cpyDy; unsigned int cmpSrcOffset; int cmpSrcPitch, cmpSrcBpp; unsigned int cmpSrcFmt, cmpDstFmt; int cmpOp; Bool Panel; } GeodeRec, *GeodePtr; /* option flags are self-explanatory */ #ifdef HAVE_LX enum { LX_OPTION_SW_CURSOR, LX_OPTION_HW_CURSOR, LX_OPTION_NOCOMPRESSION, LX_OPTION_NOACCEL, LX_OPTION_ACCEL_METHOD, LX_OPTION_EXA_SCRATCH_BFRSZ, LX_OPTION_TV_SUPPORT, LX_OPTION_TV_OUTPUT, LX_OPTION_TV_OVERSCAN, LX_OPTION_ROTATE, LX_OPTION_NOPANEL, LX_OPTION_COLOR_KEY, LX_OPTION_FBSIZE, LX_OPTION_PANEL_GEOMETRY, LX_OPTION_DONT_PROGRAM } LX_GeodeOpts; #endif #ifdef HAVE_GX enum { GX_OPTION_SW_CURSOR, GX_OPTION_HW_CURSOR, GX_OPTION_NOCOMPRESSION, GX_OPTION_NOACCEL, GX_OPTION_ACCEL_METHOD, GX_OPTION_EXA_SCRATCH_BFRSZ, GX_OPTION_TV_SUPPORT, GX_OPTION_TV_OUTPUT, GX_OPTION_TV_OVERSCAN, GX_OPTION_ROTATE, GX_OPTION_NOPANEL, GX_OPTION_FLATPANEL_INFO, GX_OPTION_FLATPANEL_IN_BIOS, GX_OPTION_COLOR_KEY, GX_OPTION_OSM, GX_OPTION_OSM_IMG_BUFS, GX_OPTION_OSM_CLR_BUFS, GX_OPTION_FBSIZE, GX_OPTION_PANEL_GEOMETRY, GX_OPTION_DONT_PROGRAM } GX_GeodeOpts; #endif /* OLPC defines */ #define DCON_DEFAULT_XRES 1200 #define DCON_DEFAULT_YRES 900 #define DCON_DEFAULT_BPP 16 #define DCON_DEFAULT_REFRESH 50 /* amd_dcon.c */ extern Bool dcon_init(ScrnInfoPtr pScrni); /* amd_common.c */ void geode_memory_to_screen_blt(unsigned long, unsigned long, unsigned long, unsigned long, long, long, int); int GeodeGetRefreshRate(DisplayModePtr); void GeodeCopyGreyscale(unsigned char *, unsigned char *, int, int, int, int); /* amd_gx_video.c */ int GeodeQueryImageAttributes(ScrnInfoPtr, int id, unsigned short *w, unsigned short *h, int *pitches, int *offsets); Bool RegionsEqual(RegionPtr A, RegionPtr B); /* amd_gx_driver.c */ void GeodeProbeDDC(ScrnInfoPtr pScrni, int index); xf86MonPtr GeodeDoDDC(ScrnInfoPtr pScrni, int index); int GeodeGetFPGeometry(const char *str, int *width, int *height); void GeodePointerMoved(int index, int x, int y); void GeodeFreeScreen(int scrnIndex, int flags); int GeodeCalculatePitchBytes(unsigned int width, unsigned int bpp); void GXSetupChipsetFPtr(ScrnInfoPtr pScrn); /* amd_msr.c */ int GeodeReadMSR(unsigned long addr, unsigned long *lo, unsigned long *hi); int GeodeWriteMSR(unsigned long addr, unsigned long lo, unsigned long hi); /* amd_gx_cursor.c */ Bool GXHWCursorInit(ScreenPtr pScrn); void GXLoadCursorImage(ScrnInfoPtr pScrni, unsigned char *src); void GXHideCursor(ScrnInfoPtr pScrni); void GXShowCursor(ScrnInfoPtr pScrni); /* amd_gx_randr.c */ Rotation GXGetRotation(ScreenPtr pScreen); Bool GXRandRInit(ScreenPtr pScreen, int rotation); Bool GXRandRSetConfig(ScreenPtr, Rotation, int, RRScreenSizePtr); /* amd_gx_rotate.c */ Bool GXRotate(ScrnInfoPtr pScrni, DisplayModePtr mode); /* amd_gx_accel.c */ Bool GXAccelInit(ScreenPtr pScrn); void GXAccelSync(ScrnInfoPtr pScrni); /* amd_gx_video.c */ void GXInitVideo(ScreenPtr pScrn); /* amd_lx_driver.c */ void LXSetupChipsetFPtr(ScrnInfoPtr pScrn); /* amd_lx_cursor.c */ Bool LXHWCursorInit(ScreenPtr pScrn); void LXLoadCursorImage(ScrnInfoPtr pScrni, unsigned char *src); void LXHideCursor(ScrnInfoPtr pScrni); void LXShowCursor(ScrnInfoPtr pScrni); /* amd_lx_randr.c */ Rotation LXGetRotation(ScreenPtr pScreen); Bool LXRandRInit(ScreenPtr pScreen, int rotation); Bool LXRandRSetConfig(ScreenPtr, Rotation, int, RRScreenSizePtr); /* amd_lx_rotate.c */ Bool LXSetRotatePitch(ScrnInfoPtr pScrni); Bool LXRotate(ScrnInfoPtr pScrni, DisplayModePtr mode); /* amd_lx_exa.c */ Bool LXExaInit(ScreenPtr pScreen); /* amd_lx_video.c */ void LXInitVideo(ScreenPtr pScrn); void LXDisplayVideo(ScrnInfoPtr pScrni, int id, short width, short height, BoxPtr dstBox, short srcW, short srcH, short drawW, short drawH); void LXStopVideo(ScrnInfoPtr pScrni, pointer data, Bool exit); void LXResetVideo(ScrnInfoPtr pScrni); #endif /* _AMD_GEODE_H_ */