radeon.h revision 209ff23f
1/* 2 * Copyright 2000 ATI Technologies Inc., Markham, Ontario, and 3 * VA Linux Systems Inc., Fremont, California. 4 * 5 * All Rights Reserved. 6 * 7 * Permission is hereby granted, free of charge, to any person obtaining 8 * a copy of this software and associated documentation files (the 9 * "Software"), to deal in the Software without restriction, including 10 * without limitation on the rights to use, copy, modify, merge, 11 * publish, distribute, sublicense, and/or sell copies of the Software, 12 * and to permit persons to whom the Software is furnished to do so, 13 * subject to the following conditions: 14 * 15 * The above copyright notice and this permission notice (including the 16 * next paragraph) shall be included in all copies or substantial 17 * portions of the Software. 18 * 19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 * NON-INFRINGEMENT. IN NO EVENT SHALL ATI, VA LINUX SYSTEMS AND/OR 23 * THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 26 * DEALINGS IN THE SOFTWARE. 27 */ 28 29/* 30 * Authors: 31 * Kevin E. Martin <martin@xfree86.org> 32 * Rickard E. Faith <faith@valinux.com> 33 * Alan Hourihane <alanh@fairlite.demon.co.uk> 34 * 35 */ 36 37#ifndef _RADEON_H_ 38#define _RADEON_H_ 39 40#include <stdlib.h> /* For abs() */ 41#include <unistd.h> /* For usleep() */ 42#include <sys/time.h> /* For gettimeofday() */ 43 44#include "config.h" 45#include "xf86str.h" 46#include "compiler.h" 47#include "xf86fbman.h" 48 49 /* PCI support */ 50#include "xf86Pci.h" 51 52#ifdef USE_EXA 53#include "exa.h" 54#endif 55#ifdef USE_XAA 56#include "xaa.h" 57#endif 58 59 /* Exa and Cursor Support */ 60#include "vbe.h" 61#include "xf86Cursor.h" 62 63 /* DDC support */ 64#include "xf86DDC.h" 65 66 /* Xv support */ 67#include "xf86xv.h" 68 69#include "radeon_probe.h" 70#include "radeon_tv.h" 71 72 /* DRI support */ 73#ifdef XF86DRI 74#define _XF86DRI_SERVER_ 75#include "radeon_dripriv.h" 76#include "dri.h" 77#include "GL/glxint.h" 78#ifdef DAMAGE 79#include "damage.h" 80#include "globals.h" 81#endif 82#endif 83 84#include "xf86Crtc.h" 85#include "X11/Xatom.h" 86 87 /* Render support */ 88#ifdef RENDER 89#include "picturestr.h" 90#endif 91 92#include "atipcirename.h" 93 94#ifndef MAX 95#define MAX(a,b) ((a)>(b)?(a):(b)) 96#endif 97#ifndef MIN 98#define MIN(a,b) ((a)>(b)?(b):(a)) 99#endif 100 101/* Provide substitutes for gcc's __FUNCTION__ on other compilers */ 102#if !defined(__GNUC__) && !defined(__FUNCTION__) 103# define __FUNCTION__ __func__ /* C99 */ 104#endif 105 106#ifndef HAVE_XF86MODEBANDWIDTH 107extern unsigned int xf86ModeBandwidth(DisplayModePtr mode, int depth); 108#define MODE_BANDWIDTH MODE_BAD 109#endif 110 111typedef enum { 112 OPTION_NOACCEL, 113 OPTION_SW_CURSOR, 114 OPTION_DAC_6BIT, 115 OPTION_DAC_8BIT, 116#ifdef XF86DRI 117 OPTION_BUS_TYPE, 118 OPTION_CP_PIO, 119 OPTION_USEC_TIMEOUT, 120 OPTION_AGP_MODE, 121 OPTION_AGP_FW, 122 OPTION_GART_SIZE, 123 OPTION_GART_SIZE_OLD, 124 OPTION_RING_SIZE, 125 OPTION_BUFFER_SIZE, 126 OPTION_DEPTH_MOVE, 127 OPTION_PAGE_FLIP, 128 OPTION_NO_BACKBUFFER, 129 OPTION_XV_DMA, 130 OPTION_FBTEX_PERCENT, 131 OPTION_DEPTH_BITS, 132 OPTION_PCIAPER_SIZE, 133#ifdef USE_EXA 134 OPTION_ACCEL_DFS, 135#endif 136#endif 137 OPTION_DDC_MODE, 138 OPTION_IGNORE_EDID, 139 OPTION_DISP_PRIORITY, 140 OPTION_PANEL_SIZE, 141 OPTION_MIN_DOTCLOCK, 142 OPTION_COLOR_TILING, 143#ifdef XvExtension 144 OPTION_VIDEO_KEY, 145 OPTION_RAGE_THEATRE_CRYSTAL, 146 OPTION_RAGE_THEATRE_TUNER_PORT, 147 OPTION_RAGE_THEATRE_COMPOSITE_PORT, 148 OPTION_RAGE_THEATRE_SVIDEO_PORT, 149 OPTION_TUNER_TYPE, 150 OPTION_RAGE_THEATRE_MICROC_PATH, 151 OPTION_RAGE_THEATRE_MICROC_TYPE, 152 OPTION_SCALER_WIDTH, 153#endif 154#ifdef RENDER 155 OPTION_RENDER_ACCEL, 156 OPTION_SUBPIXEL_ORDER, 157#endif 158 OPTION_SHOWCACHE, 159 OPTION_DYNAMIC_CLOCKS, 160 OPTION_BIOS_HOTKEYS, 161 OPTION_VGA_ACCESS, 162 OPTION_REVERSE_DDC, 163 OPTION_LVDS_PROBE_PLL, 164 OPTION_ACCELMETHOD, 165 OPTION_CONNECTORTABLE, 166 OPTION_DRI, 167 OPTION_DEFAULT_CONNECTOR_TABLE, 168#if defined(__powerpc__) 169 OPTION_MAC_MODEL, 170#endif 171 OPTION_DEFAULT_TMDS_PLL, 172 OPTION_TVDAC_LOAD_DETECT, 173 OPTION_FORCE_TVOUT, 174 OPTION_TVSTD, 175 OPTION_IGNORE_LID_STATUS, 176 OPTION_DEFAULT_TVDAC_ADJ, 177 OPTION_INT10 178} RADEONOpts; 179 180 181#define RADEON_IDLE_RETRY 16 /* Fall out of idle loops after this count */ 182#define RADEON_TIMEOUT 2000000 /* Fall out of wait loops after this count */ 183 184#define RADEON_VSYNC_TIMEOUT 20000 /* Maximum wait for VSYNC (in usecs) */ 185 186/* Buffer are aligned on 4096 byte boundaries */ 187#define RADEON_BUFFER_ALIGN 0x00000fff 188#define RADEON_VBIOS_SIZE 0x00010000 189#define RADEON_USE_RMX 0x80000000 /* mode flag for using RMX 190 * Need to comfirm this is not used 191 * for something else. 192 */ 193 194#define xFixedToFloat(f) (((float) (f)) / 65536) 195 196#define RADEON_LOGLEVEL_DEBUG 4 197 198/* for Xv, outputs */ 199#define MAKE_ATOM(a) MakeAtom(a, sizeof(a) - 1, TRUE) 200 201/* Other macros */ 202#define RADEON_ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) 203#define RADEON_ALIGN(x,bytes) (((x) + ((bytes) - 1)) & ~((bytes) - 1)) 204#define RADEONPTR(pScrn) ((RADEONInfoPtr)(pScrn)->driverPrivate) 205 206typedef struct { 207 int revision; 208 uint16_t rr1_offset; 209 uint16_t rr2_offset; 210 uint16_t dyn_clk_offset; 211 uint16_t pll_offset; 212 uint16_t mem_config_offset; 213 uint16_t mem_reset_offset; 214 uint16_t short_mem_offset; 215 uint16_t rr3_offset; 216 uint16_t rr4_offset; 217} RADEONBIOSInitTable; 218 219#define RADEON_PLL_USE_BIOS_DIVS (1 << 0) 220#define RADEON_PLL_NO_ODD_POST_DIV (1 << 1) 221#define RADEON_PLL_USE_REF_DIV (1 << 2) 222#define RADEON_PLL_LEGACY (1 << 3) 223#define RADEON_PLL_PREFER_LOW_REF_DIV (1 << 4) 224 225typedef struct { 226 uint16_t reference_freq; 227 uint16_t reference_div; 228 uint32_t pll_in_min; 229 uint32_t pll_in_max; 230 uint32_t pll_out_min; 231 uint32_t pll_out_max; 232 uint16_t xclk; 233 234 uint32_t min_ref_div; 235 uint32_t max_ref_div; 236 uint32_t min_post_div; 237 uint32_t max_post_div; 238 uint32_t min_feedback_div; 239 uint32_t max_feedback_div; 240 uint32_t best_vco; 241} RADEONPLLRec, *RADEONPLLPtr; 242 243typedef struct { 244 int bitsPerPixel; 245 int depth; 246 int displayWidth; 247 int displayHeight; 248 int pixel_code; 249 int pixel_bytes; 250 DisplayModePtr mode; 251} RADEONFBLayout; 252 253typedef enum { 254 CHIP_FAMILY_UNKNOW, 255 CHIP_FAMILY_LEGACY, 256 CHIP_FAMILY_RADEON, 257 CHIP_FAMILY_RV100, 258 CHIP_FAMILY_RS100, /* U1 (IGP320M) or A3 (IGP320)*/ 259 CHIP_FAMILY_RV200, 260 CHIP_FAMILY_RS200, /* U2 (IGP330M/340M/350M) or A4 (IGP330/340/345/350), RS250 (IGP 7000) */ 261 CHIP_FAMILY_R200, 262 CHIP_FAMILY_RV250, 263 CHIP_FAMILY_RS300, /* RS300/RS350 */ 264 CHIP_FAMILY_RV280, 265 CHIP_FAMILY_R300, 266 CHIP_FAMILY_R350, 267 CHIP_FAMILY_RV350, 268 CHIP_FAMILY_RV380, /* RV370/RV380/M22/M24 */ 269 CHIP_FAMILY_R420, /* R420/R423/M18 */ 270 CHIP_FAMILY_RV410, /* RV410, M26 */ 271 CHIP_FAMILY_RS400, /* xpress 200, 200m (RS400) Intel */ 272 CHIP_FAMILY_RS480, /* xpress 200, 200m (RS410/480/482/485) AMD */ 273 CHIP_FAMILY_RV515, /* rv515 */ 274 CHIP_FAMILY_R520, /* r520 */ 275 CHIP_FAMILY_RV530, /* rv530 */ 276 CHIP_FAMILY_R580, /* r580 */ 277 CHIP_FAMILY_RV560, /* rv560 */ 278 CHIP_FAMILY_RV570, /* rv570 */ 279 CHIP_FAMILY_RS600, 280 CHIP_FAMILY_RS690, 281 CHIP_FAMILY_RS740, 282 CHIP_FAMILY_R600, /* r600 */ 283 CHIP_FAMILY_R630, 284 CHIP_FAMILY_RV610, 285 CHIP_FAMILY_RV630, 286 CHIP_FAMILY_RV670, 287 CHIP_FAMILY_RV620, 288 CHIP_FAMILY_RV635, 289 CHIP_FAMILY_RS780, 290 CHIP_FAMILY_LAST 291} RADEONChipFamily; 292 293#define IS_RV100_VARIANT ((info->ChipFamily == CHIP_FAMILY_RV100) || \ 294 (info->ChipFamily == CHIP_FAMILY_RV200) || \ 295 (info->ChipFamily == CHIP_FAMILY_RS100) || \ 296 (info->ChipFamily == CHIP_FAMILY_RS200) || \ 297 (info->ChipFamily == CHIP_FAMILY_RV250) || \ 298 (info->ChipFamily == CHIP_FAMILY_RV280) || \ 299 (info->ChipFamily == CHIP_FAMILY_RS300)) 300 301 302#define IS_R300_VARIANT ((info->ChipFamily == CHIP_FAMILY_R300) || \ 303 (info->ChipFamily == CHIP_FAMILY_RV350) || \ 304 (info->ChipFamily == CHIP_FAMILY_R350) || \ 305 (info->ChipFamily == CHIP_FAMILY_RV380) || \ 306 (info->ChipFamily == CHIP_FAMILY_R420) || \ 307 (info->ChipFamily == CHIP_FAMILY_RV410) || \ 308 (info->ChipFamily == CHIP_FAMILY_RS400) || \ 309 (info->ChipFamily == CHIP_FAMILY_RS480)) 310 311#define IS_AVIVO_VARIANT ((info->ChipFamily >= CHIP_FAMILY_RV515)) 312 313#define IS_DCE3_VARIANT ((info->ChipFamily >= CHIP_FAMILY_RV620)) 314 315#define IS_R500_3D ((info->ChipFamily == CHIP_FAMILY_RV515) || \ 316 (info->ChipFamily == CHIP_FAMILY_R520) || \ 317 (info->ChipFamily == CHIP_FAMILY_RV530) || \ 318 (info->ChipFamily == CHIP_FAMILY_R580) || \ 319 (info->ChipFamily == CHIP_FAMILY_RV560) || \ 320 (info->ChipFamily == CHIP_FAMILY_RV570)) 321 322#define IS_R300_3D ((info->ChipFamily == CHIP_FAMILY_R300) || \ 323 (info->ChipFamily == CHIP_FAMILY_RV350) || \ 324 (info->ChipFamily == CHIP_FAMILY_R350) || \ 325 (info->ChipFamily == CHIP_FAMILY_RV380) || \ 326 (info->ChipFamily == CHIP_FAMILY_R420) || \ 327 (info->ChipFamily == CHIP_FAMILY_RV410) || \ 328 (info->ChipFamily == CHIP_FAMILY_RS690) || \ 329 (info->ChipFamily == CHIP_FAMILY_RS600) || \ 330 (info->ChipFamily == CHIP_FAMILY_RS740) || \ 331 (info->ChipFamily == CHIP_FAMILY_RS400) || \ 332 (info->ChipFamily == CHIP_FAMILY_RS480)) 333 334/* 335 * Errata workarounds 336 */ 337typedef enum { 338 CHIP_ERRATA_R300_CG = 0x00000001, 339 CHIP_ERRATA_PLL_DUMMYREADS = 0x00000002, 340 CHIP_ERRATA_PLL_DELAY = 0x00000004 341} RADEONErrata; 342 343typedef enum { 344 RADEON_DVOCHIP_NONE, 345 RADEON_SIL_164, 346 RADEON_SIL_1178 347} RADEONExtTMDSChip; 348 349#if defined(__powerpc__) 350typedef enum { 351 RADEON_MAC_NONE, 352 RADEON_MAC_IBOOK, 353 RADEON_MAC_POWERBOOK_EXTERNAL, 354 RADEON_MAC_POWERBOOK_INTERNAL, 355 RADEON_MAC_POWERBOOK_VGA, 356 RADEON_MAC_MINI_EXTERNAL, 357 RADEON_MAC_MINI_INTERNAL, 358 RADEON_MAC_IMAC_G5_ISIGHT 359} RADEONMacModel; 360#endif 361 362typedef enum { 363 CARD_PCI, 364 CARD_AGP, 365 CARD_PCIE 366} RADEONCardType; 367 368typedef struct _atomBiosHandle *atomBiosHandlePtr; 369 370typedef struct { 371 uint32_t pci_device_id; 372 RADEONChipFamily chip_family; 373 int mobility; 374 int igp; 375 int nocrtc2; 376 int nointtvout; 377 int singledac; 378} RADEONCardInfo; 379 380typedef struct { 381 EntityInfoPtr pEnt; 382 pciVideoPtr PciInfo; 383 PCITAG PciTag; 384 int Chipset; 385 RADEONChipFamily ChipFamily; 386 RADEONErrata ChipErrata; 387 388 unsigned long LinearAddr; /* Frame buffer physical address */ 389 unsigned long MMIOAddr; /* MMIO region physical address */ 390 unsigned long BIOSAddr; /* BIOS physical address */ 391 uint32_t fbLocation; 392 uint32_t gartLocation; 393 uint32_t mc_fb_location; 394 uint32_t mc_agp_location; 395 uint32_t mc_agp_location_hi; 396 397 void *MMIO; /* Map of MMIO region */ 398 void *FB; /* Map of frame buffer */ 399 uint8_t *VBIOS; /* Video BIOS pointer */ 400 401 Bool IsAtomBios; /* New BIOS used in R420 etc. */ 402 int ROMHeaderStart; /* Start of the ROM Info Table */ 403 int MasterDataStart; /* Offset for Master Data Table for ATOM BIOS */ 404 405 uint32_t MemCntl; 406 uint32_t BusCntl; 407 unsigned long MMIOSize; /* MMIO region physical address */ 408 unsigned long FbMapSize; /* Size of frame buffer, in bytes */ 409 unsigned long FbSecureSize; /* Size of secured fb area at end of 410 framebuffer */ 411 412 Bool IsMobility; /* Mobile chips for laptops */ 413 Bool IsIGP; /* IGP chips */ 414 Bool HasSingleDAC; /* only TVDAC on chip */ 415 Bool ddc_mode; /* Validate mode by matching exactly 416 * the modes supported in DDC data 417 */ 418 Bool R300CGWorkaround; 419 420 /* EDID or BIOS values for FPs */ 421 int RefDivider; 422 int FeedbackDivider; 423 int PostDivider; 424 Bool UseBiosDividers; 425 /* EDID data using DDC interface */ 426 Bool ddc_bios; 427 Bool ddc1; 428 Bool ddc2; 429 430 RADEONPLLRec pll; 431 432 int RamWidth; 433 float sclk; /* in MHz */ 434 float mclk; /* in MHz */ 435 Bool IsDDR; 436 int DispPriority; 437 438 RADEONSavePtr SavedReg; /* Original (text) mode */ 439 RADEONSavePtr ModeReg; /* Current mode */ 440 Bool (*CloseScreen)(int, ScreenPtr); 441 442 void (*BlockHandler)(int, pointer, pointer, pointer); 443 444 Bool PaletteSavedOnVT; /* Palette saved on last VT switch */ 445 446#ifdef USE_EXA 447 ExaDriverPtr exa; 448 int exaSyncMarker; 449 int exaMarkerSynced; 450 int engineMode; 451#define EXA_ENGINEMODE_UNKNOWN 0 452#define EXA_ENGINEMODE_2D 1 453#define EXA_ENGINEMODE_3D 2 454#ifdef XF86DRI 455 Bool accelDFS; 456#endif 457#endif 458#ifdef USE_XAA 459 XAAInfoRecPtr accel; 460#endif 461 Bool accelOn; 462 xf86CursorInfoPtr cursor; 463 Bool allowColorTiling; 464 Bool tilingEnabled; /* mirror of sarea->tiling_enabled */ 465#ifdef ARGB_CURSOR 466 Bool cursor_argb; 467#endif 468 int cursor_fg; 469 int cursor_bg; 470 471#ifdef USE_XAA 472 /* 473 * XAAForceTransBlit is used to change the behavior of the XAA 474 * SetupForScreenToScreenCopy function, to make it DGA-friendly. 475 */ 476 Bool XAAForceTransBlit; 477#endif 478 479 int fifo_slots; /* Free slots in the FIFO (64 max) */ 480 int pix24bpp; /* Depth of pixmap for 24bpp fb */ 481 Bool dac6bits; /* Use 6 bit DAC? */ 482 483 /* Computed values for Radeon */ 484 int pitch; 485 int datatype; 486 uint32_t dp_gui_master_cntl; 487 uint32_t dp_gui_master_cntl_clip; 488 uint32_t trans_color; 489 490 /* Saved values for ScreenToScreenCopy */ 491 int xdir; 492 int ydir; 493 494#ifdef USE_XAA 495 /* ScanlineScreenToScreenColorExpand support */ 496 unsigned char *scratch_buffer[1]; 497 unsigned char *scratch_save; 498 int scanline_x; 499 int scanline_y; 500 int scanline_w; 501 int scanline_h; 502 int scanline_h_w; 503 int scanline_words; 504 int scanline_direct; 505 int scanline_bpp; /* Only used for ImageWrite */ 506 int scanline_fg; 507 int scanline_bg; 508 int scanline_hpass; 509 int scanline_x1clip; 510 int scanline_x2clip; 511#endif 512 /* Saved values for DashedTwoPointLine */ 513 int dashLen; 514 uint32_t dashPattern; 515 int dash_fg; 516 int dash_bg; 517 518 DGAModePtr DGAModes; 519 int numDGAModes; 520 Bool DGAactive; 521 int DGAViewportStatus; 522 DGAFunctionRec DGAFuncs; 523 524 RADEONFBLayout CurrentLayout; 525 uint32_t dst_pitch_offset; 526#ifdef XF86DRI 527 Bool noBackBuffer; 528 Bool directRenderingEnabled; 529 Bool directRenderingInited; 530 Bool newMemoryMap; 531 drmVersionPtr pLibDRMVersion; 532 drmVersionPtr pKernelDRMVersion; 533 DRIInfoPtr pDRIInfo; 534 int drmFD; 535 int numVisualConfigs; 536 __GLXvisualConfig *pVisualConfigs; 537 RADEONConfigPrivPtr pVisualConfigsPriv; 538 Bool (*DRICloseScreen)(int, ScreenPtr); 539 540 drm_handle_t fbHandle; 541 542 drmSize registerSize; 543 drm_handle_t registerHandle; 544 545 RADEONCardType cardType; /* Current card is a PCI card */ 546 drmSize pciSize; 547 drm_handle_t pciMemHandle; 548 unsigned char *PCI; /* Map */ 549 550 Bool depthMoves; /* Enable depth moves -- slow! */ 551 Bool allowPageFlip; /* Enable 3d page flipping */ 552#ifdef DAMAGE 553 DamagePtr pDamage; 554 RegionRec driRegion; 555#endif 556 Bool have3DWindows; /* Are there any 3d clients? */ 557 558 int pciAperSize; 559 drmSize gartSize; 560 drm_handle_t agpMemHandle; /* Handle from drmAgpAlloc */ 561 unsigned long gartOffset; 562 unsigned char *AGP; /* Map */ 563 int agpMode; 564 565 uint32_t pciCommand; 566 567 Bool CPRuns; /* CP is running */ 568 Bool CPInUse; /* CP has been used by X server */ 569 Bool CPStarted; /* CP has started */ 570 int CPMode; /* CP mode that server/clients use */ 571 int CPFifoSize; /* Size of the CP command FIFO */ 572 int CPusecTimeout; /* CP timeout in usecs */ 573 Bool needCacheFlush; 574 575 /* CP ring buffer data */ 576 unsigned long ringStart; /* Offset into GART space */ 577 drm_handle_t ringHandle; /* Handle from drmAddMap */ 578 drmSize ringMapSize; /* Size of map */ 579 int ringSize; /* Size of ring (in MB) */ 580 drmAddress ring; /* Map */ 581 int ringSizeLog2QW; 582 583 unsigned long ringReadOffset; /* Offset into GART space */ 584 drm_handle_t ringReadPtrHandle; /* Handle from drmAddMap */ 585 drmSize ringReadMapSize; /* Size of map */ 586 drmAddress ringReadPtr; /* Map */ 587 588 /* CP vertex/indirect buffer data */ 589 unsigned long bufStart; /* Offset into GART space */ 590 drm_handle_t bufHandle; /* Handle from drmAddMap */ 591 drmSize bufMapSize; /* Size of map */ 592 int bufSize; /* Size of buffers (in MB) */ 593 drmAddress buf; /* Map */ 594 int bufNumBufs; /* Number of buffers */ 595 drmBufMapPtr buffers; /* Buffer map */ 596 597 /* CP GART Texture data */ 598 unsigned long gartTexStart; /* Offset into GART space */ 599 drm_handle_t gartTexHandle; /* Handle from drmAddMap */ 600 drmSize gartTexMapSize; /* Size of map */ 601 int gartTexSize; /* Size of GART tex space (in MB) */ 602 drmAddress gartTex; /* Map */ 603 int log2GARTTexGran; 604 605 /* CP accleration */ 606 drmBufPtr indirectBuffer; 607 int indirectStart; 608 609 /* DRI screen private data */ 610 int fbX; 611 int fbY; 612 int backX; 613 int backY; 614 int depthX; 615 int depthY; 616 617 int frontOffset; 618 int frontPitch; 619 int backOffset; 620 int backPitch; 621 int depthOffset; 622 int depthPitch; 623 int depthBits; 624 int textureOffset; 625 int textureSize; 626 int log2TexGran; 627 628 int pciGartSize; 629 uint32_t pciGartOffset; 630 void *pciGartBackup; 631#ifdef USE_XAA 632 uint32_t frontPitchOffset; 633 uint32_t backPitchOffset; 634 uint32_t depthPitchOffset; 635 636 /* offscreen memory management */ 637 int backLines; 638 FBAreaPtr backArea; 639 int depthTexLines; 640 FBAreaPtr depthTexArea; 641#endif 642 643 /* Saved scissor values */ 644 uint32_t sc_left; 645 uint32_t sc_right; 646 uint32_t sc_top; 647 uint32_t sc_bottom; 648 649 uint32_t re_top_left; 650 uint32_t re_width_height; 651 652 uint32_t aux_sc_cntl; 653 654 int irq; 655 656 Bool DMAForXv; 657 658#ifdef PER_CONTEXT_SAREA 659 int perctx_sarea_size; 660#endif 661 662 /* Debugging info for BEGIN_RING/ADVANCE_RING pairs. */ 663 int dma_begin_count; 664 char *dma_debug_func; 665 int dma_debug_lineno; 666#endif /* XF86DRI */ 667 668 /* XVideo */ 669 XF86VideoAdaptorPtr adaptor; 670 void (*VideoTimerCallback)(ScrnInfoPtr, Time); 671 int videoKey; 672 int RageTheatreCrystal; 673 int RageTheatreTunerPort; 674 int RageTheatreCompositePort; 675 int RageTheatreSVideoPort; 676 int tunerType; 677 char* RageTheatreMicrocPath; 678 char* RageTheatreMicrocType; 679 Bool MM_TABLE_valid; 680 struct { 681 uint8_t table_revision; 682 uint8_t table_size; 683 uint8_t tuner_type; 684 uint8_t audio_chip; 685 uint8_t product_id; 686 uint8_t tuner_voltage_teletext_fm; 687 uint8_t i2s_config; /* configuration of the sound chip */ 688 uint8_t video_decoder_type; 689 uint8_t video_decoder_host_config; 690 uint8_t input[5]; 691 } MM_TABLE; 692 uint16_t video_decoder_type; 693 int overlay_scaler_buffer_width; 694 int ecp_div; 695 696 /* Render */ 697 Bool RenderAccel; 698 unsigned short texW[2]; 699 unsigned short texH[2]; 700#ifdef USE_XAA 701 FBLinearPtr RenderTex; 702 void (*RenderCallback)(ScrnInfoPtr); 703 Time RenderTimeout; 704#endif 705 706 /* general */ 707 Bool showCache; 708 OptionInfoPtr Options; 709 710 Bool useEXA; 711#ifdef USE_EXA 712 XF86ModReqInfo exaReq; 713#endif 714#ifdef USE_XAA 715 XF86ModReqInfo xaaReq; 716#endif 717 718 /* X itself has the 3D context */ 719 Bool XInited3D; 720 721 DisplayModePtr currentMode, savedCurrentMode; 722 723 /* special handlings for DELL triple-head server */ 724 Bool IsDellServer; 725 726 Bool VGAAccess; 727 728 int MaxSurfaceWidth; 729 int MaxLines; 730 731 uint32_t tv_dac_adj; 732 uint32_t tv_dac_enable_mask; 733 734 Bool want_vblank_interrupts; 735 RADEONBIOSConnector BiosConnector[RADEON_MAX_BIOS_CONNECTOR]; 736 RADEONBIOSInitTable BiosTable; 737 738 /* save crtc state for console restore */ 739 Bool crtc_on; 740 Bool crtc2_on; 741 742 Bool InternalTVOut; 743 int tvdac_use_count; 744 745#if defined(__powerpc__) 746 RADEONMacModel MacModel; 747#endif 748 RADEONExtTMDSChip ext_tmds_chip; 749 750 atomBiosHandlePtr atomBIOS; 751 unsigned long FbFreeStart, FbFreeSize; 752 unsigned char* BIOSCopy; 753 754 /* output enable masks for outputs shared across connectors */ 755 int output_crt1; 756 int output_crt2; 757 int output_dfp1; 758 int output_dfp2; 759 int output_lcd1; 760 int output_tv1; 761 762 Rotation rotation; 763 void (*PointerMoved)(int, int, int); 764 CreateScreenResourcesProcPtr CreateScreenResources; 765 766 /* if no devices are connected at server startup */ 767 Bool first_load_no_devices; 768 769 Bool IsSecondary; 770 Bool IsPrimary; 771 772 Bool r600_shadow_fb; 773 void *fb_shadow; 774 775 int num_gb_pipes; 776 Bool has_tcl; 777} RADEONInfoRec, *RADEONInfoPtr; 778 779#define RADEONWaitForFifo(pScrn, entries) \ 780do { \ 781 if (info->fifo_slots < entries) \ 782 RADEONWaitForFifoFunction(pScrn, entries); \ 783 info->fifo_slots -= entries; \ 784} while (0) 785 786/* legacy_crtc.c */ 787extern void legacy_crtc_dpms(xf86CrtcPtr crtc, int mode); 788extern void legacy_crtc_mode_set(xf86CrtcPtr crtc, DisplayModePtr mode, 789 DisplayModePtr adjusted_mode, int x, int y); 790extern void RADEONInitDispBandwidth(ScrnInfoPtr pScrn); 791extern void RADEONRestoreCommonRegisters(ScrnInfoPtr pScrn, 792 RADEONSavePtr restore); 793extern void RADEONRestoreCrtcRegisters(ScrnInfoPtr pScrn, 794 RADEONSavePtr restore); 795extern void RADEONRestoreCrtc2Registers(ScrnInfoPtr pScrn, 796 RADEONSavePtr restore); 797extern void RADEONRestorePLLRegisters(ScrnInfoPtr pScrn, 798 RADEONSavePtr restore); 799extern void RADEONRestorePLL2Registers(ScrnInfoPtr pScrn, 800 RADEONSavePtr restore); 801extern void RADEONSaveCommonRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save); 802extern void RADEONSaveCrtcRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save); 803extern void RADEONSaveCrtc2Registers(ScrnInfoPtr pScrn, RADEONSavePtr save); 804extern void RADEONSavePLLRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save); 805extern void RADEONSavePLL2Registers(ScrnInfoPtr pScrn, RADEONSavePtr save); 806 807/* legacy_output.c */ 808extern RADEONMonitorType legacy_dac_detect(ScrnInfoPtr pScrn, 809 xf86OutputPtr output); 810extern void legacy_output_dpms(xf86OutputPtr output, int mode); 811extern void legacy_output_mode_set(xf86OutputPtr output, DisplayModePtr mode, 812 DisplayModePtr adjusted_mode); 813extern I2CDevPtr RADEONDVODeviceInit(I2CBusPtr b, I2CSlaveAddr addr); 814extern Bool RADEONDVOReadByte(I2CDevPtr dvo, int addr, uint8_t *ch); 815extern Bool RADEONDVOWriteByte(I2CDevPtr dvo, int addr, uint8_t ch); 816extern void RADEONRestoreDACRegisters(ScrnInfoPtr pScrn, RADEONSavePtr restore); 817extern void RADEONRestoreFPRegisters(ScrnInfoPtr pScrn, RADEONSavePtr restore); 818extern void RADEONRestoreFP2Registers(ScrnInfoPtr pScrn, RADEONSavePtr restore); 819extern void RADEONRestoreLVDSRegisters(ScrnInfoPtr pScrn, RADEONSavePtr restore); 820extern void RADEONRestoreRMXRegisters(ScrnInfoPtr pScrn, RADEONSavePtr restore); 821extern void RADEONSaveDACRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save); 822extern void RADEONSaveFPRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save); 823 824/* radeon_accel.c */ 825extern Bool RADEONAccelInit(ScreenPtr pScreen); 826extern void RADEONEngineFlush(ScrnInfoPtr pScrn); 827extern void RADEONEngineInit(ScrnInfoPtr pScrn); 828extern void RADEONEngineReset(ScrnInfoPtr pScrn); 829extern void RADEONEngineRestore(ScrnInfoPtr pScrn); 830extern uint8_t *RADEONHostDataBlit(ScrnInfoPtr pScrn, unsigned int cpp, 831 unsigned int w, uint32_t dstPitchOff, 832 uint32_t *bufPitch, int x, int *y, 833 unsigned int *h, unsigned int *hpass); 834extern void RADEONHostDataBlitCopyPass(ScrnInfoPtr pScrn, 835 unsigned int bpp, 836 uint8_t *dst, uint8_t *src, 837 unsigned int hpass, 838 unsigned int dstPitch, 839 unsigned int srcPitch); 840extern void RADEONCopySwap(uint8_t *dst, uint8_t *src, unsigned int size, int swap); 841extern void RADEONHostDataParams(ScrnInfoPtr pScrn, uint8_t *dst, 842 uint32_t pitch, int cpp, 843 uint32_t *dstPitchOffset, int *x, int *y); 844extern void RADEONInit3DEngine(ScrnInfoPtr pScrn); 845extern void RADEONWaitForFifoFunction(ScrnInfoPtr pScrn, int entries); 846#ifdef XF86DRI 847extern drmBufPtr RADEONCPGetBuffer(ScrnInfoPtr pScrn); 848extern void RADEONCPFlushIndirect(ScrnInfoPtr pScrn, int discard); 849extern void RADEONCPReleaseIndirect(ScrnInfoPtr pScrn); 850extern int RADEONCPStop(ScrnInfoPtr pScrn, RADEONInfoPtr info); 851# ifdef USE_XAA 852extern Bool RADEONSetupMemXAA_DRI(int scrnIndex, ScreenPtr pScreen); 853# endif 854#endif 855 856#ifdef USE_XAA 857/* radeon_accelfuncs.c */ 858extern void RADEONAccelInitMMIO(ScreenPtr pScreen, XAAInfoRecPtr a); 859extern Bool RADEONSetupMemXAA(int scrnIndex, ScreenPtr pScreen); 860#endif 861 862/* radeon_bios.c */ 863extern Bool RADEONGetBIOSInfo(ScrnInfoPtr pScrn, xf86Int10InfoPtr pInt10); 864extern Bool RADEONGetClockInfoFromBIOS(ScrnInfoPtr pScrn); 865extern Bool RADEONGetConnectorInfoFromBIOS(ScrnInfoPtr pScrn); 866extern Bool RADEONGetDAC2InfoFromBIOS(xf86OutputPtr output); 867extern Bool RADEONGetExtTMDSInfoFromBIOS(xf86OutputPtr output); 868extern Bool RADEONGetHardCodedEDIDFromBIOS(xf86OutputPtr output); 869extern Bool RADEONGetBIOSInitTableOffsets(ScrnInfoPtr pScrn); 870extern Bool RADEONGetLVDSInfoFromBIOS(xf86OutputPtr output); 871extern Bool RADEONGetTMDSInfoFromBIOS(xf86OutputPtr output); 872extern Bool RADEONGetTVInfoFromBIOS(xf86OutputPtr output); 873extern Bool RADEONInitExtTMDSInfoFromBIOS (xf86OutputPtr output); 874extern Bool RADEONPostCardFromBIOSTables(ScrnInfoPtr pScrn); 875 876/* radeon_commonfuncs.c */ 877#ifdef XF86DRI 878extern void RADEONWaitForIdleCP(ScrnInfoPtr pScrn); 879#endif 880extern void RADEONWaitForIdleMMIO(ScrnInfoPtr pScrn); 881 882/* radeon_crtc.c */ 883extern void radeon_crtc_dpms(xf86CrtcPtr crtc, int mode); 884extern void radeon_crtc_load_lut(xf86CrtcPtr crtc); 885extern void radeon_crtc_modeset_ioctl(xf86CrtcPtr crtc, Bool post); 886extern Bool RADEONAllocateControllers(ScrnInfoPtr pScrn, int mask); 887extern void RADEONBlank(ScrnInfoPtr pScrn); 888extern void RADEONComputePLL(RADEONPLLPtr pll, unsigned long freq, 889 uint32_t *chosen_dot_clock_freq, 890 uint32_t *chosen_feedback_div, 891 uint32_t *chosen_reference_div, 892 uint32_t *chosen_post_div, int flags); 893extern DisplayModePtr RADEONCrtcFindClosestMode(xf86CrtcPtr crtc, 894 DisplayModePtr pMode); 895extern void RADEONUnblank(ScrnInfoPtr pScrn); 896extern Bool RADEONSetTiling(ScrnInfoPtr pScrn); 897 898/* radeon_cursor.c */ 899extern Bool RADEONCursorInit(ScreenPtr pScreen); 900extern void radeon_crtc_hide_cursor(xf86CrtcPtr crtc); 901extern void radeon_crtc_load_cursor_argb(xf86CrtcPtr crtc, CARD32 *image); 902extern void radeon_crtc_set_cursor_colors(xf86CrtcPtr crtc, int bg, int fg); 903extern void radeon_crtc_set_cursor_position(xf86CrtcPtr crtc, int x, int y); 904extern void radeon_crtc_show_cursor(xf86CrtcPtr crtc); 905 906/* radeon_dga.c */ 907extern Bool RADEONDGAInit(ScreenPtr pScreen); 908 909#ifdef XF86DRI 910/* radeon_dri.c */ 911extern void RADEONDRIAllocatePCIGARTTable(ScreenPtr pScreen); 912extern void RADEONDRICloseScreen(ScreenPtr pScreen); 913extern Bool RADEONDRIFinishScreenInit(ScreenPtr pScreen); 914extern int RADEONDRIGetPciAperTableSize(ScrnInfoPtr pScrn); 915extern Bool RADEONDRIGetVersion(ScrnInfoPtr pScrn); 916extern void RADEONDRIResume(ScreenPtr pScreen); 917extern Bool RADEONDRIScreenInit(ScreenPtr pScreen); 918extern int RADEONDRISetParam(ScrnInfoPtr pScrn, 919 unsigned int param, int64_t value); 920extern Bool RADEONDRISetVBlankInterrupt(ScrnInfoPtr pScrn, Bool on); 921extern void RADEONDRIStop(ScreenPtr pScreen); 922#endif 923 924/* radeon_driver.c */ 925extern void RADEONDoAdjustFrame(ScrnInfoPtr pScrn, int x, int y, Bool clone); 926extern void RADEONChangeSurfaces(ScrnInfoPtr pScrn); 927extern RADEONEntPtr RADEONEntPriv(ScrnInfoPtr pScrn); 928extern int RADEONMinBits(int val); 929extern unsigned RADEONINMC(ScrnInfoPtr pScrn, int addr); 930extern unsigned RADEONINPLL(ScrnInfoPtr pScrn, int addr); 931extern void RADEONOUTMC(ScrnInfoPtr pScrn, int addr, uint32_t data); 932extern void RADEONOUTPLL(ScrnInfoPtr pScrn, int addr, uint32_t data); 933extern void RADEONPllErrataAfterData(RADEONInfoPtr info); 934extern void RADEONPllErrataAfterIndex(RADEONInfoPtr info); 935extern void RADEONWaitForVerticalSync(ScrnInfoPtr pScrn); 936extern void RADEONWaitForVerticalSync2(ScrnInfoPtr pScrn); 937extern void RADEONInitMemMapRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save, 938 RADEONInfoPtr info); 939extern void RADEONRestoreMemMapRegisters(ScrnInfoPtr pScrn, 940 RADEONSavePtr restore); 941 942#ifdef USE_EXA 943/* radeon_exa.c */ 944extern Bool RADEONSetupMemEXA(ScreenPtr pScreen); 945 946/* radeon_exa_funcs.c */ 947extern void RADEONCopyCP(PixmapPtr pDst, int srcX, int srcY, int dstX, 948 int dstY, int w, int h); 949extern void RADEONCopyMMIO(PixmapPtr pDst, int srcX, int srcY, int dstX, 950 int dstY, int w, int h); 951extern Bool RADEONDrawInitCP(ScreenPtr pScreen); 952extern Bool RADEONDrawInitMMIO(ScreenPtr pScreen); 953extern void RADEONDoPrepareCopyCP(ScrnInfoPtr pScrn, 954 uint32_t src_pitch_offset, 955 uint32_t dst_pitch_offset, 956 uint32_t datatype, int rop, 957 Pixel planemask); 958extern void RADEONDoPrepareCopyMMIO(ScrnInfoPtr pScrn, 959 uint32_t src_pitch_offset, 960 uint32_t dst_pitch_offset, 961 uint32_t datatype, int rop, 962 Pixel planemask); 963#endif 964 965#if defined(XF86DRI) && defined(USE_EXA) 966/* radeon_exa.c */ 967extern Bool RADEONGetDatatypeBpp(int bpp, uint32_t *type); 968extern Bool RADEONGetPixmapOffsetPitch(PixmapPtr pPix, 969 uint32_t *pitch_offset); 970extern unsigned long long RADEONTexOffsetStart(PixmapPtr pPix); 971#endif 972 973/* radeon_modes.c */ 974extern void RADEONSetPitch(ScrnInfoPtr pScrn); 975extern DisplayModePtr RADEONProbeOutputModes(xf86OutputPtr output); 976 977/* radeon_output.c */ 978extern RADEONI2CBusRec atom_setup_i2c_bus(int ddc_line); 979extern RADEONI2CBusRec legacy_setup_i2c_bus(int ddc_line); 980extern void RADEONGetPanelInfo(ScrnInfoPtr pScrn); 981extern void RADEONInitConnector(xf86OutputPtr output); 982extern void RADEONPrintPortMap(ScrnInfoPtr pScrn); 983extern void RADEONSetOutputType(ScrnInfoPtr pScrn, 984 RADEONOutputPrivatePtr radeon_output); 985extern Bool RADEONSetupConnectors(ScrnInfoPtr pScrn); 986 987/* radeon_tv.c */ 988extern void RADEONSaveTVRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save); 989extern void RADEONAdjustCrtcRegistersForTV(ScrnInfoPtr pScrn, RADEONSavePtr save, 990 DisplayModePtr mode, xf86OutputPtr output); 991extern void RADEONAdjustPLLRegistersForTV(ScrnInfoPtr pScrn, RADEONSavePtr save, 992 DisplayModePtr mode, xf86OutputPtr output); 993extern void RADEONAdjustCrtc2RegistersForTV(ScrnInfoPtr pScrn, RADEONSavePtr save, 994 DisplayModePtr mode, xf86OutputPtr output); 995extern void RADEONAdjustPLL2RegistersForTV(ScrnInfoPtr pScrn, RADEONSavePtr save, 996 DisplayModePtr mode, xf86OutputPtr output); 997extern void RADEONInitTVRegisters(xf86OutputPtr output, RADEONSavePtr save, 998 DisplayModePtr mode, BOOL IsPrimary); 999extern void RADEONRestoreTVRegisters(ScrnInfoPtr pScrn, RADEONSavePtr restore); 1000extern void RADEONUpdateHVPosition(xf86OutputPtr output, DisplayModePtr mode); 1001 1002/* radeon_video.c */ 1003extern void RADEONInitVideo(ScreenPtr pScreen); 1004extern void RADEONResetVideo(ScrnInfoPtr pScrn); 1005 1006#ifdef XF86DRI 1007# ifdef USE_XAA 1008/* radeon_accelfuncs.c */ 1009extern void RADEONAccelInitCP(ScreenPtr pScreen, XAAInfoRecPtr a); 1010# endif 1011 1012#define RADEONCP_START(pScrn, info) \ 1013do { \ 1014 int _ret = drmCommandNone(info->drmFD, DRM_RADEON_CP_START); \ 1015 if (_ret) { \ 1016 xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \ 1017 "%s: CP start %d\n", __FUNCTION__, _ret); \ 1018 } \ 1019 info->CPStarted = TRUE; \ 1020} while (0) 1021 1022#define RADEONCP_RELEASE(pScrn, info) \ 1023do { \ 1024 if (info->CPInUse) { \ 1025 RADEON_PURGE_CACHE(); \ 1026 RADEON_WAIT_UNTIL_IDLE(); \ 1027 RADEONCPReleaseIndirect(pScrn); \ 1028 info->CPInUse = FALSE; \ 1029 } \ 1030} while (0) 1031 1032#define RADEONCP_STOP(pScrn, info) \ 1033do { \ 1034 int _ret; \ 1035 if (info->CPStarted) { \ 1036 _ret = RADEONCPStop(pScrn, info); \ 1037 if (_ret) { \ 1038 xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \ 1039 "%s: CP stop %d\n", __FUNCTION__, _ret); \ 1040 } \ 1041 info->CPStarted = FALSE; \ 1042 } \ 1043 RADEONEngineRestore(pScrn); \ 1044 info->CPRuns = FALSE; \ 1045} while (0) 1046 1047#define RADEONCP_RESET(pScrn, info) \ 1048do { \ 1049 if (RADEONCP_USE_RING_BUFFER(info->CPMode)) { \ 1050 int _ret = drmCommandNone(info->drmFD, DRM_RADEON_CP_RESET); \ 1051 if (_ret) { \ 1052 xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \ 1053 "%s: CP reset %d\n", __FUNCTION__, _ret); \ 1054 } \ 1055 } \ 1056} while (0) 1057 1058#define RADEONCP_REFRESH(pScrn, info) \ 1059do { \ 1060 if (!info->CPInUse) { \ 1061 if (info->needCacheFlush) { \ 1062 RADEON_PURGE_CACHE(); \ 1063 RADEON_PURGE_ZCACHE(); \ 1064 info->needCacheFlush = FALSE; \ 1065 } \ 1066 RADEON_WAIT_UNTIL_IDLE(); \ 1067 if (info->ChipFamily <= CHIP_FAMILY_RV280) { \ 1068 BEGIN_RING(6); \ 1069 OUT_RING_REG(RADEON_RE_TOP_LEFT, info->re_top_left); \ 1070 OUT_RING_REG(RADEON_RE_WIDTH_HEIGHT, info->re_width_height); \ 1071 OUT_RING_REG(RADEON_AUX_SC_CNTL, info->aux_sc_cntl); \ 1072 ADVANCE_RING(); \ 1073 } else { \ 1074 BEGIN_RING(4); \ 1075 OUT_RING_REG(R300_SC_SCISSOR0, info->re_top_left); \ 1076 OUT_RING_REG(R300_SC_SCISSOR1, info->re_width_height); \ 1077 ADVANCE_RING(); \ 1078 } \ 1079 info->CPInUse = TRUE; \ 1080 } \ 1081} while (0) 1082 1083 1084#define CP_PACKET0(reg, n) \ 1085 (RADEON_CP_PACKET0 | ((n) << 16) | ((reg) >> 2)) 1086#define CP_PACKET1(reg0, reg1) \ 1087 (RADEON_CP_PACKET1 | (((reg1) >> 2) << 11) | ((reg0) >> 2)) 1088#define CP_PACKET2() \ 1089 (RADEON_CP_PACKET2) 1090#define CP_PACKET3(pkt, n) \ 1091 (RADEON_CP_PACKET3 | (pkt) | ((n) << 16)) 1092 1093 1094#define RADEON_VERBOSE 0 1095 1096#define RING_LOCALS uint32_t *__head = NULL; int __expected; int __count = 0 1097 1098#define BEGIN_RING(n) do { \ 1099 if (RADEON_VERBOSE) { \ 1100 xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ 1101 "BEGIN_RING(%d) in %s\n", (unsigned int)n, __FUNCTION__);\ 1102 } \ 1103 if (++info->dma_begin_count != 1) { \ 1104 xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \ 1105 "BEGIN_RING without end at %s:%d\n", \ 1106 info->dma_debug_func, info->dma_debug_lineno); \ 1107 info->dma_begin_count = 1; \ 1108 } \ 1109 info->dma_debug_func = __FILE__; \ 1110 info->dma_debug_lineno = __LINE__; \ 1111 if (!info->indirectBuffer) { \ 1112 info->indirectBuffer = RADEONCPGetBuffer(pScrn); \ 1113 info->indirectStart = 0; \ 1114 } else if (info->indirectBuffer->used + (n) * (int)sizeof(uint32_t) > \ 1115 info->indirectBuffer->total) { \ 1116 RADEONCPFlushIndirect(pScrn, 1); \ 1117 } \ 1118 __expected = n; \ 1119 __head = (pointer)((char *)info->indirectBuffer->address + \ 1120 info->indirectBuffer->used); \ 1121 __count = 0; \ 1122} while (0) 1123 1124#define ADVANCE_RING() do { \ 1125 if (info->dma_begin_count-- != 1) { \ 1126 xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \ 1127 "ADVANCE_RING without begin at %s:%d\n", \ 1128 __FILE__, __LINE__); \ 1129 info->dma_begin_count = 0; \ 1130 } \ 1131 if (__count != __expected) { \ 1132 xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \ 1133 "ADVANCE_RING count != expected (%d vs %d) at %s:%d\n", \ 1134 __count, __expected, __FILE__, __LINE__); \ 1135 } \ 1136 if (RADEON_VERBOSE) { \ 1137 xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ 1138 "ADVANCE_RING() start: %d used: %d count: %d\n", \ 1139 info->indirectStart, \ 1140 info->indirectBuffer->used, \ 1141 __count * (int)sizeof(uint32_t)); \ 1142 } \ 1143 info->indirectBuffer->used += __count * (int)sizeof(uint32_t); \ 1144} while (0) 1145 1146#define OUT_RING(x) do { \ 1147 if (RADEON_VERBOSE) { \ 1148 xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ 1149 " OUT_RING(0x%08x)\n", (unsigned int)(x)); \ 1150 } \ 1151 __head[__count++] = (x); \ 1152} while (0) 1153 1154#define OUT_RING_REG(reg, val) \ 1155do { \ 1156 OUT_RING(CP_PACKET0(reg, 0)); \ 1157 OUT_RING(val); \ 1158} while (0) 1159 1160#define FLUSH_RING() \ 1161do { \ 1162 if (RADEON_VERBOSE) \ 1163 xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ 1164 "FLUSH_RING in %s\n", __FUNCTION__); \ 1165 if (info->indirectBuffer) { \ 1166 RADEONCPFlushIndirect(pScrn, 0); \ 1167 } \ 1168} while (0) 1169 1170 1171#define RADEON_WAIT_UNTIL_2D_IDLE() \ 1172do { \ 1173 BEGIN_RING(2); \ 1174 OUT_RING(CP_PACKET0(RADEON_WAIT_UNTIL, 0)); \ 1175 OUT_RING((RADEON_WAIT_2D_IDLECLEAN | \ 1176 RADEON_WAIT_HOST_IDLECLEAN)); \ 1177 ADVANCE_RING(); \ 1178} while (0) 1179 1180#define RADEON_WAIT_UNTIL_3D_IDLE() \ 1181do { \ 1182 BEGIN_RING(2); \ 1183 OUT_RING(CP_PACKET0(RADEON_WAIT_UNTIL, 0)); \ 1184 OUT_RING((RADEON_WAIT_3D_IDLECLEAN | \ 1185 RADEON_WAIT_HOST_IDLECLEAN)); \ 1186 ADVANCE_RING(); \ 1187} while (0) 1188 1189#define RADEON_WAIT_UNTIL_IDLE() \ 1190do { \ 1191 if (RADEON_VERBOSE) { \ 1192 xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ 1193 "WAIT_UNTIL_IDLE() in %s\n", __FUNCTION__); \ 1194 } \ 1195 BEGIN_RING(2); \ 1196 OUT_RING(CP_PACKET0(RADEON_WAIT_UNTIL, 0)); \ 1197 OUT_RING((RADEON_WAIT_2D_IDLECLEAN | \ 1198 RADEON_WAIT_3D_IDLECLEAN | \ 1199 RADEON_WAIT_HOST_IDLECLEAN)); \ 1200 ADVANCE_RING(); \ 1201} while (0) 1202 1203#define RADEON_PURGE_CACHE() \ 1204do { \ 1205 BEGIN_RING(2); \ 1206 if (info->ChipFamily <= CHIP_FAMILY_RV280) { \ 1207 OUT_RING(CP_PACKET0(RADEON_RB3D_DSTCACHE_CTLSTAT, 0)); \ 1208 OUT_RING(RADEON_RB3D_DC_FLUSH_ALL); \ 1209 } else { \ 1210 OUT_RING(CP_PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0)); \ 1211 OUT_RING(R300_RB3D_DC_FLUSH_ALL); \ 1212 } \ 1213 ADVANCE_RING(); \ 1214} while (0) 1215 1216#define RADEON_PURGE_ZCACHE() \ 1217do { \ 1218 BEGIN_RING(2); \ 1219 if (info->ChipFamily <= CHIP_FAMILY_RV280) { \ 1220 OUT_RING(CP_PACKET0(RADEON_RB3D_ZCACHE_CTLSTAT, 0)); \ 1221 OUT_RING(RADEON_RB3D_ZC_FLUSH_ALL); \ 1222 } else { \ 1223 OUT_RING(CP_PACKET0(R300_RB3D_ZCACHE_CTLSTAT, 0)); \ 1224 OUT_RING(R300_ZC_FLUSH_ALL); \ 1225 } \ 1226 ADVANCE_RING(); \ 1227} while (0) 1228 1229#endif /* XF86DRI */ 1230 1231static __inline__ void RADEON_MARK_SYNC(RADEONInfoPtr info, ScrnInfoPtr pScrn) 1232{ 1233#ifdef USE_EXA 1234 if (info->useEXA) 1235 exaMarkSync(pScrn->pScreen); 1236#endif 1237#ifdef USE_XAA 1238 if (!info->useEXA) 1239 SET_SYNC_FLAG(info->accel); 1240#endif 1241} 1242 1243static __inline__ void RADEON_SYNC(RADEONInfoPtr info, ScrnInfoPtr pScrn) 1244{ 1245#ifdef USE_EXA 1246 if (info->useEXA) 1247 exaWaitSync(pScrn->pScreen); 1248#endif 1249#ifdef USE_XAA 1250 if (!info->useEXA && info->accel) 1251 info->accel->Sync(pScrn); 1252#endif 1253} 1254 1255static __inline__ void radeon_init_timeout(struct timeval *endtime, 1256 unsigned int timeout) 1257{ 1258 gettimeofday(endtime, NULL); 1259 endtime->tv_usec += timeout; 1260 endtime->tv_sec += endtime->tv_usec / 1000000; 1261 endtime->tv_usec %= 1000000; 1262} 1263 1264static __inline__ int radeon_timedout(const struct timeval *endtime) 1265{ 1266 struct timeval now; 1267 gettimeofday(&now, NULL); 1268 return now.tv_sec == endtime->tv_sec ? 1269 now.tv_usec > endtime->tv_usec : now.tv_sec > endtime->tv_sec; 1270} 1271 1272#endif /* _RADEON_H_ */ 1273