geode.h revision 04007eba
1 /* 2 * (c) 2006-2008 Advanced Micro Devices, Inc. 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice shall be included in 12 * all copies or substantial portions of the Software. 13 * 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 19 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 20 * DEALINGS IN THE SOFTWARE. 21 * 22 * Neither the name of the Advanced Micro Devices, Inc. nor the names of its 23 * contributors may be used to endorse or promote products derived from this 24 * software without specific prior written permission. 25 */ 26 27#ifndef _GEODE_H_ 28#define _GEODE_H_ 29 30#include "geode_pcirename.h" 31#include "config.h" 32 33#ifdef HAVE_XAA_H 34#include "xaa.h" 35#endif 36#include "exa.h" 37#include "xf86Cursor.h" 38 39#include "vgaHW.h" 40#include "xf86int10.h" 41#include <X11/extensions/randr.h> 42#include "randrstr.h" 43 44#include "xf86xv.h" 45 46#include "compat-api.h" 47 48/* We only support EXA version >=2 */ 49 50#if (EXA_VERSION_MAJOR >= 2) 51#ifndef XF86EXA 52#define XF86EXA 1 53#endif 54#else 55#undef XF86EXA 56#endif 57 58#ifdef HAVE_XAA_H 59#define XF86XAA 1 60#else 61#undef XF86XAA 62#endif 63 64#define CFB 0 65#define INT10_SUPPORT 1 66 67/* Existing Processor Models */ 68#define GX1 0x01 69#define GX 0x10 70#define LX 0x20 71 72#define PCI_VENDOR_ID_CYRIX 0x1078 73#define PCI_VENDOR_ID_NS 0x100b 74#define PCI_VENDOR_ID_AMD 0x1022 75 76#define PCI_CHIP_5530 0x0104 77#define PCI_CHIP_SC1200 0x0504 78#define PCI_CHIP_SC1400 0x0104 79#define PCI_CHIP_GEODEGX 0x0030 80#define PCI_CHIP_GEODELX 0x2081 81 82#define GFX_CPU_GEODELX 4 83 84#if defined(HAVE_GX) && XF86XAA 85#define GX_FILL_RECT_SUPPORT 1 86#define GX_BRES_LINE_SUPPORT 1 87#define GX_DASH_LINE_SUPPORT 0 /* does not do dashed lines */ 88#define GX_MONO_8X8_PAT_SUPPORT 1 89#define GX_CLREXP_8X8_PAT_SUPPORT 1 90#define GX_SCR2SCREXP_SUPPORT 1 91#define GX_SCR2SCRCPY_SUPPORT 1 92#define GX_CPU2SCREXP_SUPPORT 1 93#define GX_SCANLINE_SUPPORT 1 94#define GX_USE_OFFSCRN_MEM 0 95#define GX_ONE_LINE_AT_A_TIME 1 96#define GX_WRITE_PIXMAP_SUPPORT 1 97#endif 98 99#define GFX(func) gfx_##func 100#define GFX2(func) gfx2_##func 101 102#define GEODEPTR(p) ((GeodeRec *)((p)->driverPrivate)) 103 104#define DEFAULT_EXA_SCRATCH_BFRSZ 0x40000 105 106/* the LX hardware (and Cimarron) require a cursor memory size of 48x64.. */ 107#define LX_CURSOR_HW_WIDTH 48 108#define LX_CURSOR_HW_HEIGHT 64 109 110/* ...but xorg requires the cursor width to be a multiple of 32. This is 111the size of the *actual* cursor. */ 112#define LX_CURSOR_MAX_WIDTH 32 113#define LX_CURSOR_MAX_HEIGHT 32 114 115/* FIXME: Get rid of this from GX */ 116 117#define DEBUGMSG(cond, drv_msg) 118 119#ifdef HAVE_LX 120extern unsigned char cim_inb(unsigned short port); 121extern void cim_outb(unsigned short port, unsigned char data); 122extern unsigned short cim_inw(unsigned short port); 123extern void cim_outw(unsigned short port, unsigned short data); 124extern unsigned long cim_ind(unsigned short port); 125extern void cim_outd(unsigned short port, unsigned long data); 126 127#include "cim_rtns.h" 128 129typedef struct _CIM_DISPLAYTIMING { 130 unsigned short wPitch; 131 unsigned short wBpp; 132 VG_DISPLAY_MODE vgDisplayMode; 133} CIM_DISPLAYTIMING; 134 135#endif 136 137#ifdef HAVE_GX 138extern void gfx_write_reg32(int offset, int data); 139extern void gfx_write_reg16(int offset, short data); 140extern void gfx_write_reg8(int offset, char data); 141extern int gfx_read_reg32(int offset); 142extern short gfx_read_reg16(int offset); 143extern void gfx_write_vid32(int offset, int data); 144extern int gfx_read_vid32(int offset); 145extern unsigned char gfx_inb(unsigned short port); 146extern void gfx_outb(unsigned short port, unsigned char data); 147extern unsigned short gfx_inw(unsigned short port); 148extern void gfx_outw(unsigned short port, unsigned short data); 149extern unsigned long gfx_ind(unsigned short port); 150extern void gfx_outd(unsigned short port, unsigned long data); 151 152#define Q_WORD QQ_WORD 153#include "gfx_rtns.h" 154#undef Q_WORD 155#include "panel.h" 156 157typedef struct tag_GFX_DISPLAYTIMING { 158 unsigned int dwDotClock; 159 unsigned short wPitch; 160 unsigned short wBpp; 161 unsigned short wHTotal; 162 unsigned short wHActive; 163 unsigned short wHSyncStart; 164 unsigned short wHSyncEnd; 165 unsigned short wHBlankStart; 166 unsigned short wHBlankEnd; 167 unsigned short wVTotal; 168 unsigned short wVActive; 169 unsigned short wVSyncStart; 170 unsigned short wVSyncEnd; 171 unsigned short wVBlankStart; 172 unsigned short wVBlankEnd; 173 unsigned short wPolarity; 174} GFX_DISPLAYTIMING; 175 176#endif 177 178typedef struct _VESARec { 179 xf86Int10InfoPtr pInt; 180} VESARec; 181 182typedef struct _GeodeMemRec { 183 struct _GeodeMemRec *next; 184 struct _GeodeMemRec *prev; 185 unsigned int offset; 186 int size; 187} GeodeMemRec, *GeodeMemPtr; 188 189#define OUTPUT_PANEL 0x01 190#define OUTPUT_CRT 0x02 191#define OUTPUT_TV 0x04 192#define OUTPUT_VOP 0x08 193#define OUTPUT_DCON 0x10 194 195typedef struct _geodeRec { 196 /* Common for both GX and LX */ 197 int Output; /* Bitmask indicating the valid output options */ 198 Bool HWCursor; 199 Bool NoAccel; 200 Bool useVGA; 201 Bool VGAActive; /* Flag indicating if LX VGA is active */ 202 Bool Compression; 203 Bool useEXA; 204 205 int rotation; 206 int displayWidth; 207 Bool starting; 208 Bool tryCompression; 209 Bool tryHWCursor; 210 211 int mm_width, mm_height; /* physical display size */ 212 213 unsigned long CursorStartOffset; 214 215 int Pitch; /* display FB pitch */ 216 int displaySize; /* The size of the visibile area */ 217 218 ExaOffscreenArea *shadowArea; 219 220 /* Framebuffer memory */ 221 222 unsigned char *FBBase; 223 unsigned int FBAvail; 224 225 /* EXA structures */ 226 227 ExaDriverPtr pExa; 228 unsigned int exaBfrOffset; 229 unsigned int exaBfrSz; 230 231 /* Other structures */ 232 233 EntityInfoPtr pEnt; 234 ScreenBlockHandlerProcPtr BlockHandler; /* needed for video */ 235 XF86VideoAdaptorPtr adaptor; 236 237 /* State save structures */ 238 unsigned long FBDisplayOffset; 239 unsigned long PrevDisplayOffset; 240 241 VESARec *vesa; 242 243 int FBCompressionEnable; 244 245 VG_CURSOR_DATA FBCursor; 246 247 /* Save the Cursor offset of the FB */ 248 unsigned long FBCursorOffset; 249 unsigned char FBBIOSMode; 250 251 /* Hooks */ 252 253 void (*PointerMoved) (POINTER_MOVED_ARGS_DECL); 254 CloseScreenProcPtr CloseScreen; 255 Bool (*CreateScreenResources) (ScreenPtr); 256 257 /* ===== LX specific items ===== */ 258 259 /* Flags */ 260 Bool Scale; 261 262 DisplayModePtr panelMode; /* The mode for the panel (if attached) */ 263 264 /* Command buffer information */ 265 unsigned long CmdBfrOffset; 266 unsigned long CmdBfrSize; 267 268 /* Memory Management */ 269 GeodeMemPtr offscreenList; 270 unsigned int offscreenStart; 271 unsigned int offscreenSize; 272 273 /* Save state */ 274 VG_COMPRESSION_DATA CBData; 275 VG_COMPRESSION_DATA FBCBData; 276 CIM_DISPLAYTIMING FBcimdisplaytiming; 277 278 /* ===== GX specific items ===== */ 279 280 /* Flags */ 281 Bool Panel; 282 283 int PanelX; 284 int PanelY; 285 286 int displayPitch; /* The pitch ofthe visible area */ 287 int displayOffset; /* The offset of the visible area */ 288 289 DisplayModePtr curMode; 290 291 unsigned int shadowSize; 292 unsigned int shadowOffset; 293 294 int FBVGAActive; 295 296 xf86CursorInfoPtr CursorInfo; 297 298 /* XAA structures */ 299 300 unsigned int cpySrcOffset; 301 int cpySrcPitch, cpySrcBpp; 302 int cpyDx, cpyDy; 303 unsigned int cmpSrcOffset; 304 int cmpSrcPitch, cmpSrcBpp; 305 unsigned int cmpSrcFmt, cmpDstFmt; 306 int cmpOp; 307 308 unsigned char **AccelImageWriteBuffers; 309 int NoOfImgBuffers; 310 unsigned char **AccelColorExpandBuffers; 311 int NoOfColorExpandLines; 312#if XF86XAA 313 XAAInfoRecPtr AccelInfoRec; 314#endif 315 316 /* Save state */ 317 unsigned long FBCompressionOffset; 318 unsigned short FBCompressionPitch; 319 unsigned short FBCompressionSize; 320 GFX_DISPLAYTIMING FBgfxdisplaytiming; 321 322 /* Hooks */ 323 void (*WritePixmap) (ScrnInfoPtr pScrni, int x, int y, int w, int h, 324 unsigned char *src, int srcwidth, int rop, 325 unsigned int planemask, int trans, int bpp, int depth); 326 327 /* Video information */ 328 int video_x; 329 int video_y; 330 short video_w; 331 short video_h; 332 short video_srcw; 333 short video_srch; 334 short video_dstw; 335 short video_dsth; 336 int video_id; 337 int video_offset; 338 ScrnInfoPtr video_scrnptr; 339 BOOL OverlayON; 340} GeodeRec, *GeodePtr; 341 342/* option flags are self-explanatory */ 343#ifdef HAVE_LX 344enum { 345 LX_OPTION_SW_CURSOR, 346 LX_OPTION_HW_CURSOR, 347 LX_OPTION_NOCOMPRESSION, 348 LX_OPTION_NOACCEL, 349 LX_OPTION_EXA_SCRATCH_BFRSZ, 350 LX_OPTION_TV_SUPPORT, 351 LX_OPTION_TV_OUTPUT, 352 LX_OPTION_TV_OVERSCAN, 353 LX_OPTION_ROTATE, 354 LX_OPTION_NOPANEL, 355 LX_OPTION_FBSIZE, 356 LX_OPTION_PANEL_MODE, 357 LX_OPTION_DONT_PROGRAM 358} LX_GeodeOpts; 359#endif 360 361#ifdef HAVE_GX 362enum { 363 GX_OPTION_SW_CURSOR, 364 GX_OPTION_HW_CURSOR, 365 GX_OPTION_NOCOMPRESSION, 366 GX_OPTION_NOACCEL, 367 GX_OPTION_ACCEL_METHOD, 368 GX_OPTION_EXA_SCRATCH_BFRSZ, 369 GX_OPTION_TV_SUPPORT, 370 GX_OPTION_TV_OUTPUT, 371 GX_OPTION_TV_OVERSCAN, 372 GX_OPTION_ROTATE, 373 GX_OPTION_NOPANEL, 374 GX_OPTION_OSM_IMG_BUFS, 375 GX_OPTION_OSM_CLR_BUFS, 376 GX_OPTION_FBSIZE, 377 GX_OPTION_PANEL_GEOMETRY, 378 GX_OPTION_DONT_PROGRAM 379} GX_GeodeOpts; 380#endif 381 382/* geode_dcon.c */ 383extern Bool dcon_init(ScrnInfoPtr pScrni); 384extern int DCONDPMSSet(ScrnInfoPtr pScrni, int mode); 385 386/* geode_common.c */ 387 388void geode_memory_to_screen_blt(unsigned long, unsigned long, 389 unsigned long, unsigned long, long, long, int); 390int GeodeGetRefreshRate(DisplayModePtr); 391void GeodeCopyGreyscale(unsigned char *, unsigned char *, int, int, int, int); 392int GeodeGetSizeFromFB(unsigned int *); 393 394/* gx_video.c */ 395 396int 397 398 399GeodeQueryImageAttributes(ScrnInfoPtr, int id, unsigned short *w, 400 unsigned short *h, int *pitches, int *offsets); 401 402Bool RegionsEqual(RegionPtr A, RegionPtr B); 403 404/* gx_driver.c */ 405 406void GeodeProbeDDC(ScrnInfoPtr pScrni, int index); 407xf86MonPtr GeodeDoDDC(ScrnInfoPtr pScrni, int index); 408Bool GeodeI2CInit(ScrnInfoPtr pScrni, I2CBusPtr * ptr, char *name); 409 410int GeodeGetFPGeometry(const char *str, int *width, int *height); 411void GeodePointerMoved(POINTER_MOVED_ARGS_DECL); 412void GeodeFreeScreen(FREE_SCREEN_ARGS_DECL); 413int GeodeCalculatePitchBytes(unsigned int width, unsigned int bpp); 414void GXSetupChipsetFPtr(ScrnInfoPtr pScrn); 415 416/* geode_msr.c */ 417int GeodeReadMSR(unsigned long addr, unsigned long *lo, unsigned long *hi); 418int GeodeWriteMSR(unsigned long addr, unsigned long lo, unsigned long hi); 419 420/* gx_cursor.c */ 421Bool GXHWCursorInit(ScreenPtr pScrn); 422void GXLoadCursorImage(ScrnInfoPtr pScrni, unsigned char *src); 423void GXHideCursor(ScrnInfoPtr pScrni); 424void GXShowCursor(ScrnInfoPtr pScrni); 425 426/* gx_randr.c */ 427Rotation GXGetRotation(ScreenPtr pScreen); 428Bool GXRandRInit(ScreenPtr pScreen, int rotation); 429extern _X_EXPORT Bool GXRandRSetConfig(ScreenPtr pScreen, Rotation rotation, 430 int rate, RRScreenSizePtr pSize); 431 432/* gx_rotate.c */ 433Bool GXRotate(ScrnInfoPtr pScrni, DisplayModePtr mode); 434 435/* gx_accel.c */ 436Bool GXAccelInit(ScreenPtr pScrn); 437void GXAccelSync(ScrnInfoPtr pScrni); 438 439/* gx_video.c */ 440void GXInitVideo(ScreenPtr pScrn); 441 442/* lx_driver.c */ 443void LXSetupChipsetFPtr(ScrnInfoPtr pScrn); 444 445/* lx_cursor.c */ 446Bool LXHWCursorInit(ScreenPtr pScrn); 447void LXLoadARGBCursorImage(ScrnInfoPtr pScrni, unsigned char *src); 448void LXHideCursor(ScrnInfoPtr pScrni); 449void LXShowCursor(ScrnInfoPtr pScrni); 450 451/* lx_exa.c */ 452Bool LXExaInit(ScreenPtr pScreen); 453 454/* lx_video.c */ 455void LXInitVideo(ScreenPtr pScrn); 456 457/* lx_output.c */ 458void LXSetupOutput(ScrnInfoPtr); 459 460/* lx_panel.c */ 461DisplayModePtr LXGetLegacyPanelMode(ScrnInfoPtr pScrni); 462DisplayModePtr LXGetManualPanelMode(char *modestr); 463 464void LXAdjustFrame(ADJUST_FRAME_ARGS_DECL); 465 466/* lx_display.c */ 467void LXSetupCrtc(ScrnInfoPtr pScrni); 468 469/* lx_memory.c */ 470GeodeMemPtr GeodeAllocOffscreen(GeodeRec * pGeode, int size, int align); 471void GeodeFreeOffscreen(GeodeRec * pGeode, GeodeMemPtr ptr); 472void LXInitOffscreen(ScrnInfoPtr pScrni); 473void GeodeCloseOffscreen(ScrnInfoPtr pScrni); 474unsigned int GeodeOffscreenFreeSize(GeodeRec * pGeode); 475 476/* lx_cursor.c */ 477Bool LXCursorInit(ScreenPtr pScrn); 478 479#endif 480