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