radeon.h revision b7e1c893
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 "dri.h" 76#include "GL/glxint.h" 77#include "xf86drm.h" 78 79#ifdef DAMAGE 80#include "damage.h" 81#include "globals.h" 82#endif 83#endif 84 85#include "xf86Crtc.h" 86#include "X11/Xatom.h" 87 88 /* Render support */ 89#ifdef RENDER 90#include "picturestr.h" 91#endif 92 93#include "atipcirename.h" 94 95#ifndef MAX 96#define MAX(a,b) ((a)>(b)?(a):(b)) 97#endif 98#ifndef MIN 99#define MIN(a,b) ((a)>(b)?(b):(a)) 100#endif 101 102#if HAVE_BYTESWAP_H 103#include <byteswap.h> 104#elif defined(USE_SYS_ENDIAN_H) 105#include <sys/endian.h> 106#else 107#define bswap_16(value) \ 108 ((((value) & 0xff) << 8) | ((value) >> 8)) 109 110#define bswap_32(value) \ 111 (((uint32_t)bswap_16((uint16_t)((value) & 0xffff)) << 16) | \ 112 (uint32_t)bswap_16((uint16_t)((value) >> 16))) 113 114#define bswap_64(value) \ 115 (((uint64_t)bswap_32((uint32_t)((value) & 0xffffffff)) \ 116 << 32) | \ 117 (uint64_t)bswap_32((uint32_t)((value) >> 32))) 118#endif 119 120#if X_BYTE_ORDER == X_BIG_ENDIAN 121#define le32_to_cpu(x) bswap_32(x) 122#define le16_to_cpu(x) bswap_16(x) 123#define cpu_to_le32(x) bswap_32(x) 124#define cpu_to_le16(x) bswap_16(x) 125#else 126#define le32_to_cpu(x) (x) 127#define le16_to_cpu(x) (x) 128#define cpu_to_le32(x) (x) 129#define cpu_to_le16(x) (x) 130#endif 131 132/* Provide substitutes for gcc's __FUNCTION__ on other compilers */ 133#if !defined(__GNUC__) && !defined(__FUNCTION__) 134# define __FUNCTION__ __func__ /* C99 */ 135#endif 136 137#ifndef HAVE_XF86MODEBANDWIDTH 138extern unsigned int xf86ModeBandwidth(DisplayModePtr mode, int depth); 139#define MODE_BANDWIDTH MODE_BAD 140#endif 141 142typedef enum { 143 OPTION_NOACCEL, 144 OPTION_SW_CURSOR, 145 OPTION_DAC_6BIT, 146 OPTION_DAC_8BIT, 147#ifdef XF86DRI 148 OPTION_BUS_TYPE, 149 OPTION_CP_PIO, 150 OPTION_USEC_TIMEOUT, 151 OPTION_AGP_MODE, 152 OPTION_AGP_FW, 153 OPTION_GART_SIZE, 154 OPTION_GART_SIZE_OLD, 155 OPTION_RING_SIZE, 156 OPTION_BUFFER_SIZE, 157 OPTION_DEPTH_MOVE, 158 OPTION_PAGE_FLIP, 159 OPTION_NO_BACKBUFFER, 160 OPTION_XV_DMA, 161 OPTION_FBTEX_PERCENT, 162 OPTION_DEPTH_BITS, 163 OPTION_PCIAPER_SIZE, 164#ifdef USE_EXA 165 OPTION_ACCEL_DFS, 166#endif 167#endif 168 OPTION_IGNORE_EDID, 169 OPTION_DISP_PRIORITY, 170 OPTION_PANEL_SIZE, 171 OPTION_MIN_DOTCLOCK, 172 OPTION_COLOR_TILING, 173#ifdef XvExtension 174 OPTION_VIDEO_KEY, 175 OPTION_RAGE_THEATRE_CRYSTAL, 176 OPTION_RAGE_THEATRE_TUNER_PORT, 177 OPTION_RAGE_THEATRE_COMPOSITE_PORT, 178 OPTION_RAGE_THEATRE_SVIDEO_PORT, 179 OPTION_TUNER_TYPE, 180 OPTION_RAGE_THEATRE_MICROC_PATH, 181 OPTION_RAGE_THEATRE_MICROC_TYPE, 182 OPTION_SCALER_WIDTH, 183#endif 184#ifdef RENDER 185 OPTION_RENDER_ACCEL, 186 OPTION_SUBPIXEL_ORDER, 187#endif 188 OPTION_SHOWCACHE, 189 OPTION_DYNAMIC_CLOCKS, 190 OPTION_BIOS_HOTKEYS, 191 OPTION_VGA_ACCESS, 192 OPTION_REVERSE_DDC, 193 OPTION_LVDS_PROBE_PLL, 194 OPTION_ACCELMETHOD, 195 OPTION_CONNECTORTABLE, 196 OPTION_DRI, 197 OPTION_DEFAULT_CONNECTOR_TABLE, 198#if defined(__powerpc__) 199 OPTION_MAC_MODEL, 200#endif 201 OPTION_DEFAULT_TMDS_PLL, 202 OPTION_TVDAC_LOAD_DETECT, 203 OPTION_FORCE_TVOUT, 204 OPTION_TVSTD, 205 OPTION_IGNORE_LID_STATUS, 206 OPTION_DEFAULT_TVDAC_ADJ, 207 OPTION_INT10, 208 OPTION_EXA_VSYNC, 209 OPTION_ATOM_TVOUT, 210 OPTION_R4XX_ATOM 211} RADEONOpts; 212 213 214#define RADEON_IDLE_RETRY 16 /* Fall out of idle loops after this count */ 215#define RADEON_TIMEOUT 2000000 /* Fall out of wait loops after this count */ 216 217#define RADEON_VSYNC_TIMEOUT 20000 /* Maximum wait for VSYNC (in usecs) */ 218 219/* Buffer are aligned on 4096 byte boundaries */ 220#define RADEON_BUFFER_ALIGN 0x00000fff 221#define RADEON_VBIOS_SIZE 0x00010000 222#define RADEON_USE_RMX 0x80000000 /* mode flag for using RMX 223 * Need to comfirm this is not used 224 * for something else. 225 */ 226 227#define xFixedToFloat(f) (((float) (f)) / 65536) 228 229#define RADEON_LOGLEVEL_DEBUG 4 230 231/* for Xv, outputs */ 232#define MAKE_ATOM(a) MakeAtom(a, sizeof(a) - 1, TRUE) 233 234/* Other macros */ 235#define RADEON_ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) 236#define RADEON_ALIGN(x,bytes) (((x) + ((bytes) - 1)) & ~((bytes) - 1)) 237#define RADEONPTR(pScrn) ((RADEONInfoPtr)(pScrn)->driverPrivate) 238 239typedef struct { 240 int revision; 241 uint16_t rr1_offset; 242 uint16_t rr2_offset; 243 uint16_t dyn_clk_offset; 244 uint16_t pll_offset; 245 uint16_t mem_config_offset; 246 uint16_t mem_reset_offset; 247 uint16_t short_mem_offset; 248 uint16_t rr3_offset; 249 uint16_t rr4_offset; 250} RADEONBIOSInitTable; 251 252#define RADEON_PLL_USE_BIOS_DIVS (1 << 0) 253#define RADEON_PLL_NO_ODD_POST_DIV (1 << 1) 254#define RADEON_PLL_USE_REF_DIV (1 << 2) 255#define RADEON_PLL_LEGACY (1 << 3) 256#define RADEON_PLL_PREFER_LOW_REF_DIV (1 << 4) 257#define RADEON_PLL_PREFER_HIGH_REF_DIV (1 << 5) 258#define RADEON_PLL_PREFER_LOW_FB_DIV (1 << 6) 259#define RADEON_PLL_PREFER_HIGH_FB_DIV (1 << 7) 260#define RADEON_PLL_PREFER_LOW_POST_DIV (1 << 8) 261#define RADEON_PLL_PREFER_HIGH_POST_DIV (1 << 9) 262 263typedef struct { 264 uint16_t reference_freq; 265 uint16_t reference_div; 266 uint32_t pll_in_min; 267 uint32_t pll_in_max; 268 uint32_t pll_out_min; 269 uint32_t pll_out_max; 270 uint16_t xclk; 271 272 uint32_t min_ref_div; 273 uint32_t max_ref_div; 274 uint32_t min_post_div; 275 uint32_t max_post_div; 276 uint32_t min_feedback_div; 277 uint32_t max_feedback_div; 278 uint32_t best_vco; 279} RADEONPLLRec, *RADEONPLLPtr; 280 281typedef struct { 282 int bitsPerPixel; 283 int depth; 284 int displayWidth; 285 int displayHeight; 286 int pixel_code; 287 int pixel_bytes; 288 DisplayModePtr mode; 289} RADEONFBLayout; 290 291typedef enum { 292 CHIP_FAMILY_UNKNOW, 293 CHIP_FAMILY_LEGACY, 294 CHIP_FAMILY_RADEON, 295 CHIP_FAMILY_RV100, 296 CHIP_FAMILY_RS100, /* U1 (IGP320M) or A3 (IGP320)*/ 297 CHIP_FAMILY_RV200, 298 CHIP_FAMILY_RS200, /* U2 (IGP330M/340M/350M) or A4 (IGP330/340/345/350), RS250 (IGP 7000) */ 299 CHIP_FAMILY_R200, 300 CHIP_FAMILY_RV250, 301 CHIP_FAMILY_RS300, /* RS300/RS350 */ 302 CHIP_FAMILY_RV280, 303 CHIP_FAMILY_R300, 304 CHIP_FAMILY_R350, 305 CHIP_FAMILY_RV350, 306 CHIP_FAMILY_RV380, /* RV370/RV380/M22/M24 */ 307 CHIP_FAMILY_R420, /* R420/R423/M18 */ 308 CHIP_FAMILY_RV410, /* RV410, M26 */ 309 CHIP_FAMILY_RS400, /* xpress 200, 200m (RS400) Intel */ 310 CHIP_FAMILY_RS480, /* xpress 200, 200m (RS410/480/482/485) AMD */ 311 CHIP_FAMILY_RV515, /* rv515 */ 312 CHIP_FAMILY_R520, /* r520 */ 313 CHIP_FAMILY_RV530, /* rv530 */ 314 CHIP_FAMILY_R580, /* r580 */ 315 CHIP_FAMILY_RV560, /* rv560 */ 316 CHIP_FAMILY_RV570, /* rv570 */ 317 CHIP_FAMILY_RS600, 318 CHIP_FAMILY_RS690, 319 CHIP_FAMILY_RS740, 320 CHIP_FAMILY_R600, /* r600 */ 321 CHIP_FAMILY_R630, 322 CHIP_FAMILY_RV610, 323 CHIP_FAMILY_RV630, 324 CHIP_FAMILY_RV670, 325 CHIP_FAMILY_RV620, 326 CHIP_FAMILY_RV635, 327 CHIP_FAMILY_RS780, 328 CHIP_FAMILY_RS880, 329 CHIP_FAMILY_RV770, 330 CHIP_FAMILY_RV730, 331 CHIP_FAMILY_RV710, 332 CHIP_FAMILY_LAST 333} RADEONChipFamily; 334 335#define IS_RV100_VARIANT ((info->ChipFamily == CHIP_FAMILY_RV100) || \ 336 (info->ChipFamily == CHIP_FAMILY_RV200) || \ 337 (info->ChipFamily == CHIP_FAMILY_RS100) || \ 338 (info->ChipFamily == CHIP_FAMILY_RS200) || \ 339 (info->ChipFamily == CHIP_FAMILY_RV250) || \ 340 (info->ChipFamily == CHIP_FAMILY_RV280) || \ 341 (info->ChipFamily == CHIP_FAMILY_RS300)) 342 343 344#define IS_R300_VARIANT ((info->ChipFamily == CHIP_FAMILY_R300) || \ 345 (info->ChipFamily == CHIP_FAMILY_RV350) || \ 346 (info->ChipFamily == CHIP_FAMILY_R350) || \ 347 (info->ChipFamily == CHIP_FAMILY_RV380) || \ 348 (info->ChipFamily == CHIP_FAMILY_R420) || \ 349 (info->ChipFamily == CHIP_FAMILY_RV410) || \ 350 (info->ChipFamily == CHIP_FAMILY_RS400) || \ 351 (info->ChipFamily == CHIP_FAMILY_RS480)) 352 353#define IS_AVIVO_VARIANT ((info->ChipFamily >= CHIP_FAMILY_RV515)) 354 355#define IS_DCE3_VARIANT ((info->ChipFamily >= CHIP_FAMILY_RV620)) 356 357#define IS_DCE32_VARIANT ((info->ChipFamily >= CHIP_FAMILY_RV730)) 358 359#define IS_R600_3D (info->ChipFamily >= CHIP_FAMILY_R600) 360 361#define IS_R500_3D ((info->ChipFamily == CHIP_FAMILY_RV515) || \ 362 (info->ChipFamily == CHIP_FAMILY_R520) || \ 363 (info->ChipFamily == CHIP_FAMILY_RV530) || \ 364 (info->ChipFamily == CHIP_FAMILY_R580) || \ 365 (info->ChipFamily == CHIP_FAMILY_RV560) || \ 366 (info->ChipFamily == CHIP_FAMILY_RV570)) 367 368#define IS_R300_3D ((info->ChipFamily == CHIP_FAMILY_R300) || \ 369 (info->ChipFamily == CHIP_FAMILY_RV350) || \ 370 (info->ChipFamily == CHIP_FAMILY_R350) || \ 371 (info->ChipFamily == CHIP_FAMILY_RV380) || \ 372 (info->ChipFamily == CHIP_FAMILY_R420) || \ 373 (info->ChipFamily == CHIP_FAMILY_RV410) || \ 374 (info->ChipFamily == CHIP_FAMILY_RS690) || \ 375 (info->ChipFamily == CHIP_FAMILY_RS600) || \ 376 (info->ChipFamily == CHIP_FAMILY_RS740) || \ 377 (info->ChipFamily == CHIP_FAMILY_RS400) || \ 378 (info->ChipFamily == CHIP_FAMILY_RS480)) 379 380/* 381 * Errata workarounds 382 */ 383typedef enum { 384 CHIP_ERRATA_R300_CG = 0x00000001, 385 CHIP_ERRATA_PLL_DUMMYREADS = 0x00000002, 386 CHIP_ERRATA_PLL_DELAY = 0x00000004 387} RADEONErrata; 388 389typedef enum { 390 RADEON_DVOCHIP_NONE, 391 RADEON_SIL_164, 392 RADEON_SIL_1178 393} RADEONExtTMDSChip; 394 395#if defined(__powerpc__) 396typedef enum { 397 RADEON_MAC_NONE, 398 RADEON_MAC_IBOOK, 399 RADEON_MAC_POWERBOOK_EXTERNAL, 400 RADEON_MAC_POWERBOOK_INTERNAL, 401 RADEON_MAC_POWERBOOK_VGA, 402 RADEON_MAC_MINI_EXTERNAL, 403 RADEON_MAC_MINI_INTERNAL, 404 RADEON_MAC_IMAC_G5_ISIGHT, 405 RADEON_MAC_EMAC 406} RADEONMacModel; 407#endif 408 409typedef enum { 410 CARD_PCI, 411 CARD_AGP, 412 CARD_PCIE 413} RADEONCardType; 414 415typedef struct _atomBiosHandle *atomBiosHandlePtr; 416 417typedef struct { 418 uint32_t pci_device_id; 419 RADEONChipFamily chip_family; 420 int mobility; 421 int igp; 422 int nocrtc2; 423 int nointtvout; 424 int singledac; 425} RADEONCardInfo; 426 427#ifdef XF86DRI 428struct radeon_cp { 429 Bool CPRuns; /* CP is running */ 430 Bool CPInUse; /* CP has been used by X server */ 431 Bool CPStarted; /* CP has started */ 432 int CPMode; /* CP mode that server/clients use */ 433 int CPFifoSize; /* Size of the CP command FIFO */ 434 int CPusecTimeout; /* CP timeout in usecs */ 435 Bool needCacheFlush; 436 437 /* CP accleration */ 438 drmBufPtr indirectBuffer; 439 int indirectStart; 440 441 /* Debugging info for BEGIN_RING/ADVANCE_RING pairs. */ 442 int dma_begin_count; 443 char *dma_debug_func; 444 int dma_debug_lineno; 445 446 }; 447 448typedef struct { 449 /* Nothing here yet */ 450 int dummy; 451} RADEONConfigPrivRec, *RADEONConfigPrivPtr; 452 453typedef struct { 454#ifdef PER_CONTEXT_SAREA 455 drm_context_t ctx_id; 456 drm_handle_t sarea_handle; 457#else 458 /* Nothing here yet */ 459 int dummy; 460#endif 461} RADEONDRIContextRec, *RADEONDRIContextPtr; 462 463struct radeon_dri { 464 Bool noBackBuffer; 465 466 Bool newMemoryMap; 467 drmVersionPtr pLibDRMVersion; 468 drmVersionPtr pKernelDRMVersion; 469 DRIInfoPtr pDRIInfo; 470 int drmFD; 471 int numVisualConfigs; 472 __GLXvisualConfig *pVisualConfigs; 473 RADEONConfigPrivPtr pVisualConfigsPriv; 474 Bool (*DRICloseScreen)(int, ScreenPtr); 475 476 drm_handle_t fbHandle; 477 478 drmSize registerSize; 479 drm_handle_t registerHandle; 480 481 drmSize pciSize; 482 drm_handle_t pciMemHandle; 483 unsigned char *PCI; /* Map */ 484 485 Bool depthMoves; /* Enable depth moves -- slow! */ 486 Bool allowPageFlip; /* Enable 3d page flipping */ 487#ifdef DAMAGE 488 DamagePtr pDamage; 489 RegionRec driRegion; 490#endif 491 Bool have3DWindows; /* Are there any 3d clients? */ 492 493 int pciAperSize; 494 drmSize gartSize; 495 drm_handle_t agpMemHandle; /* Handle from drmAgpAlloc */ 496 unsigned long gartOffset; 497 unsigned char *AGP; /* Map */ 498 int agpMode; 499 500 uint32_t pciCommand; 501 502 /* CP ring buffer data */ 503 unsigned long ringStart; /* Offset into GART space */ 504 drm_handle_t ringHandle; /* Handle from drmAddMap */ 505 drmSize ringMapSize; /* Size of map */ 506 int ringSize; /* Size of ring (in MB) */ 507 drmAddress ring; /* Map */ 508 int ringSizeLog2QW; 509 510 unsigned long ringReadOffset; /* Offset into GART space */ 511 drm_handle_t ringReadPtrHandle; /* Handle from drmAddMap */ 512 drmSize ringReadMapSize; /* Size of map */ 513 drmAddress ringReadPtr; /* Map */ 514 515 /* CP vertex/indirect buffer data */ 516 unsigned long bufStart; /* Offset into GART space */ 517 drm_handle_t bufHandle; /* Handle from drmAddMap */ 518 drmSize bufMapSize; /* Size of map */ 519 int bufSize; /* Size of buffers (in MB) */ 520 drmAddress buf; /* Map */ 521 int bufNumBufs; /* Number of buffers */ 522 drmBufMapPtr buffers; /* Buffer map */ 523 524 /* CP GART Texture data */ 525 unsigned long gartTexStart; /* Offset into GART space */ 526 drm_handle_t gartTexHandle; /* Handle from drmAddMap */ 527 drmSize gartTexMapSize; /* Size of map */ 528 int gartTexSize; /* Size of GART tex space (in MB) */ 529 drmAddress gartTex; /* Map */ 530 int log2GARTTexGran; 531 532 /* DRI screen private data */ 533 int fbX; 534 int fbY; 535 int backX; 536 int backY; 537 int depthX; 538 int depthY; 539 540 int frontOffset; 541 int frontPitch; 542 int backOffset; 543 int backPitch; 544 int depthOffset; 545 int depthPitch; 546 int depthBits; 547 int textureOffset; 548 int textureSize; 549 int log2TexGran; 550 551 int pciGartSize; 552 uint32_t pciGartOffset; 553 void *pciGartBackup; 554 555 int irq; 556 557#ifdef PER_CONTEXT_SAREA 558 int perctx_sarea_size; 559#endif 560 561#ifdef USE_XAA 562 uint32_t frontPitchOffset; 563 uint32_t backPitchOffset; 564 uint32_t depthPitchOffset; 565 566 /* offscreen memory management */ 567 int backLines; 568 FBAreaPtr backArea; 569 int depthTexLines; 570 FBAreaPtr depthTexArea; 571#endif 572 573}; 574#endif 575 576struct radeon_accel_state { 577 /* common accel data */ 578 int fifo_slots; /* Free slots in the FIFO (64 max) */ 579 /* Computed values for Radeon */ 580 uint32_t dp_gui_master_cntl; 581 uint32_t dp_gui_master_cntl_clip; 582 uint32_t trans_color; 583 /* Saved values for ScreenToScreenCopy */ 584 int xdir; 585 int ydir; 586 uint32_t dst_pitch_offset; 587 588 /* render accel */ 589 unsigned short texW[2]; 590 unsigned short texH[2]; 591 Bool XInited3D; /* X itself has the 3D context */ 592 int num_gb_pipes; 593 Bool has_tcl; 594 595#ifdef USE_EXA 596 /* EXA */ 597 ExaDriverPtr exa; 598 int exaSyncMarker; 599 int exaMarkerSynced; 600 int engineMode; 601#define EXA_ENGINEMODE_UNKNOWN 0 602#define EXA_ENGINEMODE_2D 1 603#define EXA_ENGINEMODE_3D 2 604 605 Bool is_transform[2]; 606 PictTransform *transform[2]; 607 Bool has_mask; 608 /* Whether we are tiling horizontally and vertically */ 609 Bool need_src_tile_x; 610 Bool need_src_tile_y; 611 /* Size of tiles ... set to 65536x65536 if not tiling in that direction */ 612 Bool src_tile_width; 613 Bool src_tile_height; 614 615 Bool vsync; 616 617 drmBufPtr ib; 618 int vb_index; 619 620 // shader storage 621 ExaOffscreenArea *shaders; 622 uint32_t solid_vs_offset; 623 uint32_t solid_ps_offset; 624 uint32_t copy_vs_offset; 625 uint32_t copy_ps_offset; 626 uint32_t comp_vs_offset; 627 uint32_t comp_ps_offset; 628 uint32_t comp_mask_ps_offset; 629 uint32_t xv_vs_offset; 630 uint32_t xv_ps_offset; 631 632 //size/addr stuff 633 uint32_t src_size[2]; 634 uint64_t src_mc_addr[2]; 635 uint32_t src_pitch[2]; 636 uint32_t src_width[2]; 637 uint32_t src_height[2]; 638 uint32_t src_bpp[2]; 639 uint32_t dst_size; 640 uint64_t dst_mc_addr; 641 uint32_t dst_pitch; 642 uint32_t dst_height; 643 uint32_t dst_bpp; 644 uint32_t vs_size; 645 uint64_t vs_mc_addr; 646 uint32_t ps_size; 647 uint64_t ps_mc_addr; 648 uint32_t vb_size; 649 uint64_t vb_mc_addr; 650 651 // UTS/DFS 652 drmBufPtr scratch; 653 654 // copy 655 ExaOffscreenArea *copy_area; 656 Bool same_surface; 657 int rop; 658 uint32_t planemask; 659 660 // composite 661 Bool component_alpha; 662 Bool src_alpha; 663#endif 664 665#ifdef USE_XAA 666 /* XAA */ 667 XAAInfoRecPtr accel; 668 /* ScanlineScreenToScreenColorExpand support */ 669 unsigned char *scratch_buffer[1]; 670 unsigned char *scratch_save; 671 int scanline_x; 672 int scanline_y; 673 int scanline_w; 674 int scanline_h; 675 int scanline_h_w; 676 int scanline_words; 677 int scanline_direct; 678 int scanline_bpp; /* Only used for ImageWrite */ 679 int scanline_fg; 680 int scanline_bg; 681 int scanline_hpass; 682 int scanline_x1clip; 683 int scanline_x2clip; 684 /* Saved values for DashedTwoPointLine */ 685 int dashLen; 686 uint32_t dashPattern; 687 int dash_fg; 688 int dash_bg; 689 690 FBLinearPtr RenderTex; 691 void (*RenderCallback)(ScrnInfoPtr); 692 Time RenderTimeout; 693 /* 694 * XAAForceTransBlit is used to change the behavior of the XAA 695 * SetupForScreenToScreenCopy function, to make it DGA-friendly. 696 */ 697 Bool XAAForceTransBlit; 698#endif 699 700}; 701 702typedef struct { 703 EntityInfoPtr pEnt; 704 pciVideoPtr PciInfo; 705 PCITAG PciTag; 706 int Chipset; 707 RADEONChipFamily ChipFamily; 708 RADEONErrata ChipErrata; 709 710 unsigned long long LinearAddr; /* Frame buffer physical address */ 711 unsigned long long MMIOAddr; /* MMIO region physical address */ 712 unsigned long long BIOSAddr; /* BIOS physical address */ 713 uint32_t fbLocation; 714 uint32_t gartLocation; 715 uint32_t mc_fb_location; 716 uint32_t mc_agp_location; 717 uint32_t mc_agp_location_hi; 718 719 void *MMIO; /* Map of MMIO region */ 720 void *FB; /* Map of frame buffer */ 721 uint8_t *VBIOS; /* Video BIOS pointer */ 722 723 Bool IsAtomBios; /* New BIOS used in R420 etc. */ 724 int ROMHeaderStart; /* Start of the ROM Info Table */ 725 int MasterDataStart; /* Offset for Master Data Table for ATOM BIOS */ 726 727 uint32_t MemCntl; 728 uint32_t BusCntl; 729 unsigned long MMIOSize; /* MMIO region physical address */ 730 unsigned long FbMapSize; /* Size of frame buffer, in bytes */ 731 unsigned long FbSecureSize; /* Size of secured fb area at end of 732 framebuffer */ 733 734 Bool IsMobility; /* Mobile chips for laptops */ 735 Bool IsIGP; /* IGP chips */ 736 Bool HasSingleDAC; /* only TVDAC on chip */ 737 Bool ddc_mode; /* Validate mode by matching exactly 738 * the modes supported in DDC data 739 */ 740 Bool R300CGWorkaround; 741 742 /* EDID or BIOS values for FPs */ 743 int RefDivider; 744 int FeedbackDivider; 745 int PostDivider; 746 Bool UseBiosDividers; 747 /* EDID data using DDC interface */ 748 Bool ddc_bios; 749 Bool ddc1; 750 Bool ddc2; 751 752 RADEONPLLRec pll; 753 754 int RamWidth; 755 float sclk; /* in MHz */ 756 float mclk; /* in MHz */ 757 Bool IsDDR; 758 int DispPriority; 759 760 RADEONSavePtr SavedReg; /* Original (text) mode */ 761 RADEONSavePtr ModeReg; /* Current mode */ 762 Bool (*CloseScreen)(int, ScreenPtr); 763 764 void (*BlockHandler)(int, pointer, pointer, pointer); 765 766 Bool PaletteSavedOnVT; /* Palette saved on last VT switch */ 767 768 xf86CursorInfoPtr cursor; 769#ifdef ARGB_CURSOR 770 Bool cursor_argb; 771#endif 772 int cursor_fg; 773 int cursor_bg; 774 775 int pix24bpp; /* Depth of pixmap for 24bpp fb */ 776 Bool dac6bits; /* Use 6 bit DAC? */ 777 778 DGAModePtr DGAModes; 779 int numDGAModes; 780 Bool DGAactive; 781 int DGAViewportStatus; 782 DGAFunctionRec DGAFuncs; 783 784 RADEONFBLayout CurrentLayout; 785 786#ifdef XF86DRI 787 Bool directRenderingEnabled; 788 Bool directRenderingInited; 789 RADEONCardType cardType; /* Current card is a PCI card */ 790 struct radeon_cp *cp; 791 struct radeon_dri *dri; 792#ifdef USE_EXA 793 Bool accelDFS; 794#endif 795 Bool DMAForXv; 796#endif /* XF86DRI */ 797 798 /* accel */ 799 Bool RenderAccel; /* Render */ 800 Bool allowColorTiling; 801 Bool tilingEnabled; /* mirror of sarea->tiling_enabled */ 802 struct radeon_accel_state *accel_state; 803 Bool accelOn; 804 Bool useEXA; 805#ifdef USE_EXA 806 XF86ModReqInfo exaReq; 807#endif 808#ifdef USE_XAA 809 XF86ModReqInfo xaaReq; 810#endif 811 812 /* XVideo */ 813 XF86VideoAdaptorPtr adaptor; 814 void (*VideoTimerCallback)(ScrnInfoPtr, Time); 815 int videoKey; 816 int RageTheatreCrystal; 817 int RageTheatreTunerPort; 818 int RageTheatreCompositePort; 819 int RageTheatreSVideoPort; 820 int tunerType; 821 char* RageTheatreMicrocPath; 822 char* RageTheatreMicrocType; 823 Bool MM_TABLE_valid; 824 struct { 825 uint8_t table_revision; 826 uint8_t table_size; 827 uint8_t tuner_type; 828 uint8_t audio_chip; 829 uint8_t product_id; 830 uint8_t tuner_voltage_teletext_fm; 831 uint8_t i2s_config; /* configuration of the sound chip */ 832 uint8_t video_decoder_type; 833 uint8_t video_decoder_host_config; 834 uint8_t input[5]; 835 } MM_TABLE; 836 uint16_t video_decoder_type; 837 int overlay_scaler_buffer_width; 838 int ecp_div; 839 840 /* general */ 841 Bool showCache; 842 OptionInfoPtr Options; 843 844 DisplayModePtr currentMode, savedCurrentMode; 845 846 /* special handlings for DELL triple-head server */ 847 Bool IsDellServer; 848 849 Bool VGAAccess; 850 851 int MaxSurfaceWidth; 852 int MaxLines; 853 854 Bool want_vblank_interrupts; 855 RADEONBIOSConnector BiosConnector[RADEON_MAX_BIOS_CONNECTOR]; 856 radeon_encoder_ptr encoders[RADEON_MAX_BIOS_CONNECTOR]; 857 RADEONBIOSInitTable BiosTable; 858 859 /* save crtc state for console restore */ 860 Bool crtc_on; 861 Bool crtc2_on; 862 863 Bool InternalTVOut; 864 865#if defined(__powerpc__) 866 RADEONMacModel MacModel; 867#endif 868 RADEONExtTMDSChip ext_tmds_chip; 869 870 atomBiosHandlePtr atomBIOS; 871 unsigned long FbFreeStart, FbFreeSize; 872 unsigned char* BIOSCopy; 873 874 Rotation rotation; 875 void (*PointerMoved)(int, int, int); 876 CreateScreenResourcesProcPtr CreateScreenResources; 877 878 /* if no devices are connected at server startup */ 879 Bool first_load_no_devices; 880 881 Bool IsSecondary; 882 Bool IsPrimary; 883 884 Bool r600_shadow_fb; 885 void *fb_shadow; 886 887 /* some server chips have a hardcoded edid in the bios so that they work with KVMs */ 888 Bool get_hardcoded_edid_from_bios; 889 890 int virtualX; 891 int virtualY; 892 893 Bool r4xx_atom; 894 895} RADEONInfoRec, *RADEONInfoPtr; 896 897#define RADEONWaitForFifo(pScrn, entries) \ 898do { \ 899 if (info->accel_state->fifo_slots < entries) \ 900 RADEONWaitForFifoFunction(pScrn, entries); \ 901 info->accel_state->fifo_slots -= entries; \ 902} while (0) 903 904/* legacy_crtc.c */ 905extern void legacy_crtc_dpms(xf86CrtcPtr crtc, int mode); 906extern void legacy_crtc_mode_set(xf86CrtcPtr crtc, DisplayModePtr mode, 907 DisplayModePtr adjusted_mode, int x, int y); 908extern void RADEONRestoreCommonRegisters(ScrnInfoPtr pScrn, 909 RADEONSavePtr restore); 910extern void RADEONRestoreCrtcRegisters(ScrnInfoPtr pScrn, 911 RADEONSavePtr restore); 912extern void RADEONRestoreCrtc2Registers(ScrnInfoPtr pScrn, 913 RADEONSavePtr restore); 914extern void RADEONRestorePLLRegisters(ScrnInfoPtr pScrn, 915 RADEONSavePtr restore); 916extern void RADEONRestorePLL2Registers(ScrnInfoPtr pScrn, 917 RADEONSavePtr restore); 918extern void RADEONSaveCommonRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save); 919extern void RADEONSaveCrtcRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save); 920extern void RADEONSaveCrtc2Registers(ScrnInfoPtr pScrn, RADEONSavePtr save); 921extern void RADEONSavePLLRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save); 922extern void RADEONSavePLL2Registers(ScrnInfoPtr pScrn, RADEONSavePtr save); 923 924/* legacy_output.c */ 925extern RADEONMonitorType legacy_dac_detect(xf86OutputPtr output); 926extern void legacy_output_dpms(xf86OutputPtr output, int mode); 927extern void legacy_output_mode_set(xf86OutputPtr output, DisplayModePtr mode, 928 DisplayModePtr adjusted_mode); 929extern I2CDevPtr RADEONDVODeviceInit(I2CBusPtr b, I2CSlaveAddr addr); 930extern Bool RADEONDVOReadByte(I2CDevPtr dvo, int addr, uint8_t *ch); 931extern Bool RADEONDVOWriteByte(I2CDevPtr dvo, int addr, uint8_t ch); 932extern void RADEONRestoreDACRegisters(ScrnInfoPtr pScrn, RADEONSavePtr restore); 933extern void RADEONRestoreFPRegisters(ScrnInfoPtr pScrn, RADEONSavePtr restore); 934extern void RADEONRestoreFP2Registers(ScrnInfoPtr pScrn, RADEONSavePtr restore); 935extern void RADEONRestoreLVDSRegisters(ScrnInfoPtr pScrn, RADEONSavePtr restore); 936extern void RADEONRestoreRMXRegisters(ScrnInfoPtr pScrn, RADEONSavePtr restore); 937extern void RADEONSaveDACRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save); 938extern void RADEONSaveFPRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save); 939 940extern void RADEONGetTVDacAdjInfo(ScrnInfoPtr pScrn, radeon_tvdac_ptr tvdac); 941extern void RADEONGetTMDSInfoFromTable(ScrnInfoPtr pScrn, radeon_tmds_ptr tmds); 942extern void RADEONGetTMDSInfo(ScrnInfoPtr pScrn, radeon_tmds_ptr tmds); 943extern void RADEONGetExtTMDSInfo(ScrnInfoPtr pScrn, radeon_dvo_ptr dvo); 944extern void RADEONGetLVDSInfo(ScrnInfoPtr pScrn, radeon_lvds_ptr lvds); 945 946/* radeon_accel.c */ 947extern Bool RADEONAccelInit(ScreenPtr pScreen); 948extern void RADEONEngineFlush(ScrnInfoPtr pScrn); 949extern void RADEONEngineInit(ScrnInfoPtr pScrn); 950extern void RADEONEngineReset(ScrnInfoPtr pScrn); 951extern void RADEONEngineRestore(ScrnInfoPtr pScrn); 952extern uint8_t *RADEONHostDataBlit(ScrnInfoPtr pScrn, unsigned int cpp, 953 unsigned int w, uint32_t dstPitchOff, 954 uint32_t *bufPitch, int x, int *y, 955 unsigned int *h, unsigned int *hpass); 956extern void RADEONHostDataBlitCopyPass(ScrnInfoPtr pScrn, 957 unsigned int bpp, 958 uint8_t *dst, uint8_t *src, 959 unsigned int hpass, 960 unsigned int dstPitch, 961 unsigned int srcPitch); 962extern void RADEONCopySwap(uint8_t *dst, uint8_t *src, unsigned int size, int swap); 963extern void RADEONHostDataParams(ScrnInfoPtr pScrn, uint8_t *dst, 964 uint32_t pitch, int cpp, 965 uint32_t *dstPitchOffset, int *x, int *y); 966extern void RADEONInit3DEngine(ScrnInfoPtr pScrn); 967extern void RADEONWaitForFifoFunction(ScrnInfoPtr pScrn, int entries); 968#ifdef XF86DRI 969extern drmBufPtr RADEONCPGetBuffer(ScrnInfoPtr pScrn); 970extern void RADEONCPFlushIndirect(ScrnInfoPtr pScrn, int discard); 971extern void RADEONCPReleaseIndirect(ScrnInfoPtr pScrn); 972extern int RADEONCPStop(ScrnInfoPtr pScrn, RADEONInfoPtr info); 973# ifdef USE_XAA 974extern Bool RADEONSetupMemXAA_DRI(int scrnIndex, ScreenPtr pScreen); 975# endif 976#endif 977 978#ifdef USE_XAA 979/* radeon_accelfuncs.c */ 980extern void RADEONAccelInitMMIO(ScreenPtr pScreen, XAAInfoRecPtr a); 981extern Bool RADEONSetupMemXAA(int scrnIndex, ScreenPtr pScreen); 982#endif 983 984/* radeon_bios.c */ 985extern Bool RADEONGetBIOSInfo(ScrnInfoPtr pScrn, xf86Int10InfoPtr pInt10); 986extern Bool RADEONGetClockInfoFromBIOS(ScrnInfoPtr pScrn); 987extern Bool RADEONGetConnectorInfoFromBIOS(ScrnInfoPtr pScrn); 988extern Bool RADEONGetDAC2InfoFromBIOS(ScrnInfoPtr pScrn, radeon_tvdac_ptr tvdac); 989extern Bool RADEONGetExtTMDSInfoFromBIOS (ScrnInfoPtr pScrn, radeon_dvo_ptr dvo); 990extern xf86MonPtr RADEONGetHardCodedEDIDFromBIOS(xf86OutputPtr output); 991extern Bool RADEONGetBIOSInitTableOffsets(ScrnInfoPtr pScrn); 992extern Bool RADEONGetLVDSInfoFromBIOS(ScrnInfoPtr pScrn, radeon_lvds_ptr lvds); 993extern Bool RADEONGetTMDSInfoFromBIOS(ScrnInfoPtr pScrn, radeon_tmds_ptr tmds); 994extern Bool RADEONGetTVInfoFromBIOS(xf86OutputPtr output); 995extern Bool RADEONInitExtTMDSInfoFromBIOS (xf86OutputPtr output); 996extern Bool RADEONPostCardFromBIOSTables(ScrnInfoPtr pScrn); 997extern Bool radeon_card_posted(ScrnInfoPtr pScrn); 998 999/* radeon_commonfuncs.c */ 1000#ifdef XF86DRI 1001extern void RADEONWaitForIdleCP(ScrnInfoPtr pScrn); 1002extern void RADEONWaitForVLineCP(ScrnInfoPtr pScrn, PixmapPtr pPix, 1003 int crtc, int start, int stop); 1004#endif 1005extern void RADEONWaitForIdleMMIO(ScrnInfoPtr pScrn); 1006extern void RADEONWaitForVLineMMIO(ScrnInfoPtr pScrn, PixmapPtr pPix, 1007 int crtc, int start, int stop); 1008 1009/* radeon_crtc.c */ 1010extern void radeon_crtc_dpms(xf86CrtcPtr crtc, int mode); 1011extern void radeon_crtc_load_lut(xf86CrtcPtr crtc); 1012extern void radeon_crtc_modeset_ioctl(xf86CrtcPtr crtc, Bool post); 1013extern Bool RADEONAllocateControllers(ScrnInfoPtr pScrn, int mask); 1014extern void RADEONBlank(ScrnInfoPtr pScrn); 1015extern void RADEONComputePLL(RADEONPLLPtr pll, unsigned long freq, 1016 uint32_t *chosen_dot_clock_freq, 1017 uint32_t *chosen_feedback_div, 1018 uint32_t *chosen_reference_div, 1019 uint32_t *chosen_post_div, int flags); 1020extern DisplayModePtr RADEONCrtcFindClosestMode(xf86CrtcPtr crtc, 1021 DisplayModePtr pMode); 1022extern void RADEONUnblank(ScrnInfoPtr pScrn); 1023extern Bool RADEONSetTiling(ScrnInfoPtr pScrn); 1024extern void RADEONInitDispBandwidth(ScrnInfoPtr pScrn); 1025 1026/* radeon_cursor.c */ 1027extern Bool RADEONCursorInit(ScreenPtr pScreen); 1028extern void radeon_crtc_hide_cursor(xf86CrtcPtr crtc); 1029extern void radeon_crtc_load_cursor_argb(xf86CrtcPtr crtc, CARD32 *image); 1030extern void radeon_crtc_set_cursor_colors(xf86CrtcPtr crtc, int bg, int fg); 1031extern void radeon_crtc_set_cursor_position(xf86CrtcPtr crtc, int x, int y); 1032extern void radeon_crtc_show_cursor(xf86CrtcPtr crtc); 1033 1034/* radeon_dga.c */ 1035extern Bool RADEONDGAInit(ScreenPtr pScreen); 1036 1037#ifdef XF86DRI 1038/* radeon_dri.c */ 1039extern void RADEONDRIAllocatePCIGARTTable(ScreenPtr pScreen); 1040extern void RADEONDRICloseScreen(ScreenPtr pScreen); 1041extern Bool RADEONDRIFinishScreenInit(ScreenPtr pScreen); 1042extern int RADEONDRIGetPciAperTableSize(ScrnInfoPtr pScrn); 1043extern Bool RADEONDRIGetVersion(ScrnInfoPtr pScrn); 1044extern void RADEONDRIResume(ScreenPtr pScreen); 1045extern Bool RADEONDRIScreenInit(ScreenPtr pScreen); 1046extern int RADEONDRISetParam(ScrnInfoPtr pScrn, 1047 unsigned int param, int64_t value); 1048extern Bool RADEONDRISetVBlankInterrupt(ScrnInfoPtr pScrn, Bool on); 1049extern void RADEONDRIStop(ScreenPtr pScreen); 1050#endif 1051 1052/* radeon_driver.c */ 1053extern void RADEONDoAdjustFrame(ScrnInfoPtr pScrn, int x, int y, Bool clone); 1054extern void RADEONChangeSurfaces(ScrnInfoPtr pScrn); 1055extern RADEONEntPtr RADEONEntPriv(ScrnInfoPtr pScrn); 1056extern int RADEONMinBits(int val); 1057extern unsigned RADEONINMC(ScrnInfoPtr pScrn, int addr); 1058extern unsigned RADEONINPLL(ScrnInfoPtr pScrn, int addr); 1059extern unsigned RADEONINPCIE(ScrnInfoPtr pScrn, int addr); 1060extern void RADEONOUTMC(ScrnInfoPtr pScrn, int addr, uint32_t data); 1061extern void RADEONOUTPLL(ScrnInfoPtr pScrn, int addr, uint32_t data); 1062extern void RADEONOUTPCIE(ScrnInfoPtr pScrn, int addr, uint32_t data); 1063extern void RADEONPllErrataAfterData(RADEONInfoPtr info); 1064extern void RADEONPllErrataAfterIndex(RADEONInfoPtr info); 1065extern void RADEONWaitForVerticalSync(ScrnInfoPtr pScrn); 1066extern void RADEONWaitForVerticalSync2(ScrnInfoPtr pScrn); 1067extern void RADEONInitMemMapRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save, 1068 RADEONInfoPtr info); 1069extern void RADEONRestoreMemMapRegisters(ScrnInfoPtr pScrn, 1070 RADEONSavePtr restore); 1071 1072#ifdef USE_EXA 1073/* radeon_exa.c */ 1074extern Bool RADEONSetupMemEXA(ScreenPtr pScreen); 1075 1076/* radeon_exa_funcs.c */ 1077extern void RADEONCopyCP(PixmapPtr pDst, int srcX, int srcY, int dstX, 1078 int dstY, int w, int h); 1079extern void RADEONCopyMMIO(PixmapPtr pDst, int srcX, int srcY, int dstX, 1080 int dstY, int w, int h); 1081extern Bool RADEONDrawInitCP(ScreenPtr pScreen); 1082extern Bool RADEONDrawInitMMIO(ScreenPtr pScreen); 1083extern void RADEONDoPrepareCopyCP(ScrnInfoPtr pScrn, 1084 uint32_t src_pitch_offset, 1085 uint32_t dst_pitch_offset, 1086 uint32_t datatype, int rop, 1087 Pixel planemask); 1088extern void RADEONDoPrepareCopyMMIO(ScrnInfoPtr pScrn, 1089 uint32_t src_pitch_offset, 1090 uint32_t dst_pitch_offset, 1091 uint32_t datatype, int rop, 1092 Pixel planemask); 1093extern Bool R600DrawInit(ScreenPtr pScreen); 1094extern Bool R600LoadShaders(ScrnInfoPtr pScrn); 1095#endif 1096 1097#if defined(XF86DRI) && defined(USE_EXA) 1098/* radeon_exa.c */ 1099extern Bool RADEONGetDatatypeBpp(int bpp, uint32_t *type); 1100extern Bool RADEONGetPixmapOffsetPitch(PixmapPtr pPix, 1101 uint32_t *pitch_offset); 1102extern unsigned long long RADEONTexOffsetStart(PixmapPtr pPix); 1103#endif 1104 1105/* radeon_modes.c */ 1106extern void RADEONSetPitch(ScrnInfoPtr pScrn); 1107extern DisplayModePtr RADEONProbeOutputModes(xf86OutputPtr output); 1108 1109/* radeon_output.c */ 1110extern RADEONI2CBusRec atom_setup_i2c_bus(int ddc_line); 1111extern RADEONI2CBusRec legacy_setup_i2c_bus(int ddc_line); 1112extern void RADEONGetPanelInfo(ScrnInfoPtr pScrn); 1113extern void RADEONInitConnector(xf86OutputPtr output); 1114extern void RADEONPrintPortMap(ScrnInfoPtr pScrn); 1115extern void RADEONSetOutputType(ScrnInfoPtr pScrn, 1116 RADEONOutputPrivatePtr radeon_output); 1117extern Bool RADEONSetupConnectors(ScrnInfoPtr pScrn); 1118extern Bool RADEONI2CDoLock(xf86OutputPtr output, Bool lock_state); 1119 1120 1121/* radeon_tv.c */ 1122extern void RADEONSaveTVRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save); 1123extern void RADEONAdjustCrtcRegistersForTV(ScrnInfoPtr pScrn, RADEONSavePtr save, 1124 DisplayModePtr mode, xf86OutputPtr output); 1125extern void RADEONAdjustPLLRegistersForTV(ScrnInfoPtr pScrn, RADEONSavePtr save, 1126 DisplayModePtr mode, xf86OutputPtr output); 1127extern void RADEONAdjustCrtc2RegistersForTV(ScrnInfoPtr pScrn, RADEONSavePtr save, 1128 DisplayModePtr mode, xf86OutputPtr output); 1129extern void RADEONAdjustPLL2RegistersForTV(ScrnInfoPtr pScrn, RADEONSavePtr save, 1130 DisplayModePtr mode, xf86OutputPtr output); 1131extern void RADEONInitTVRegisters(xf86OutputPtr output, RADEONSavePtr save, 1132 DisplayModePtr mode, BOOL IsPrimary); 1133extern void RADEONRestoreTVRegisters(ScrnInfoPtr pScrn, RADEONSavePtr restore); 1134extern void RADEONUpdateHVPosition(xf86OutputPtr output, DisplayModePtr mode); 1135 1136/* radeon_video.c */ 1137extern void RADEONInitVideo(ScreenPtr pScreen); 1138extern void RADEONResetVideo(ScrnInfoPtr pScrn); 1139 1140/* radeon_legacy_memory.c */ 1141extern uint32_t 1142radeon_legacy_allocate_memory(ScrnInfoPtr pScrn, 1143 void **mem_struct, 1144 int size, 1145 int align); 1146extern void 1147radeon_legacy_free_memory(ScrnInfoPtr pScrn, 1148 void *mem_struct); 1149 1150#ifdef XF86DRI 1151# ifdef USE_XAA 1152/* radeon_accelfuncs.c */ 1153extern void RADEONAccelInitCP(ScreenPtr pScreen, XAAInfoRecPtr a); 1154# endif 1155 1156#define RADEONCP_START(pScrn, info) \ 1157do { \ 1158 int _ret = drmCommandNone(info->dri->drmFD, DRM_RADEON_CP_START); \ 1159 if (_ret) { \ 1160 xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \ 1161 "%s: CP start %d\n", __FUNCTION__, _ret); \ 1162 } \ 1163 info->cp->CPStarted = TRUE; \ 1164} while (0) 1165 1166#define RADEONCP_RELEASE(pScrn, info) \ 1167do { \ 1168 if (info->cp->CPInUse) { \ 1169 RADEON_PURGE_CACHE(); \ 1170 RADEON_WAIT_UNTIL_IDLE(); \ 1171 RADEONCPReleaseIndirect(pScrn); \ 1172 info->cp->CPInUse = FALSE; \ 1173 } \ 1174} while (0) 1175 1176#define RADEONCP_STOP(pScrn, info) \ 1177do { \ 1178 int _ret; \ 1179 if (info->cp->CPStarted) { \ 1180 _ret = RADEONCPStop(pScrn, info); \ 1181 if (_ret) { \ 1182 xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \ 1183 "%s: CP stop %d\n", __FUNCTION__, _ret); \ 1184 } \ 1185 info->cp->CPStarted = FALSE; \ 1186 } \ 1187 if (info->ChipFamily < CHIP_FAMILY_R600) \ 1188 RADEONEngineRestore(pScrn); \ 1189 info->cp->CPRuns = FALSE; \ 1190} while (0) 1191 1192#define RADEONCP_RESET(pScrn, info) \ 1193do { \ 1194 int _ret = drmCommandNone(info->dri->drmFD, DRM_RADEON_CP_RESET); \ 1195 if (_ret) { \ 1196 xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \ 1197 "%s: CP reset %d\n", __FUNCTION__, _ret); \ 1198 } \ 1199} while (0) 1200 1201#define RADEONCP_REFRESH(pScrn, info) \ 1202do { \ 1203 if (!info->cp->CPInUse) { \ 1204 if (info->cp->needCacheFlush) { \ 1205 RADEON_PURGE_CACHE(); \ 1206 RADEON_PURGE_ZCACHE(); \ 1207 info->cp->needCacheFlush = FALSE; \ 1208 } \ 1209 RADEON_WAIT_UNTIL_IDLE(); \ 1210 info->cp->CPInUse = TRUE; \ 1211 } \ 1212} while (0) 1213 1214 1215#define CP_PACKET0(reg, n) \ 1216 (RADEON_CP_PACKET0 | ((n) << 16) | ((reg) >> 2)) 1217#define CP_PACKET1(reg0, reg1) \ 1218 (RADEON_CP_PACKET1 | (((reg1) >> 2) << 11) | ((reg0) >> 2)) 1219#define CP_PACKET2() \ 1220 (RADEON_CP_PACKET2) 1221#define CP_PACKET3(pkt, n) \ 1222 (RADEON_CP_PACKET3 | (pkt) | ((n) << 16)) 1223 1224 1225#define RADEON_VERBOSE 0 1226 1227#define RING_LOCALS uint32_t *__head = NULL; int __expected; int __count = 0 1228 1229#define BEGIN_RING(n) do { \ 1230 if (RADEON_VERBOSE) { \ 1231 xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ 1232 "BEGIN_RING(%d) in %s\n", (unsigned int)n, __FUNCTION__);\ 1233 } \ 1234 if (++info->cp->dma_begin_count != 1) { \ 1235 xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \ 1236 "BEGIN_RING without end at %s:%d\n", \ 1237 info->cp->dma_debug_func, info->cp->dma_debug_lineno); \ 1238 info->cp->dma_begin_count = 1; \ 1239 } \ 1240 info->cp->dma_debug_func = __FILE__; \ 1241 info->cp->dma_debug_lineno = __LINE__; \ 1242 if (!info->cp->indirectBuffer) { \ 1243 info->cp->indirectBuffer = RADEONCPGetBuffer(pScrn); \ 1244 info->cp->indirectStart = 0; \ 1245 } else if (info->cp->indirectBuffer->used + (n) * (int)sizeof(uint32_t) > \ 1246 info->cp->indirectBuffer->total) { \ 1247 RADEONCPFlushIndirect(pScrn, 1); \ 1248 } \ 1249 __expected = n; \ 1250 __head = (pointer)((char *)info->cp->indirectBuffer->address + \ 1251 info->cp->indirectBuffer->used); \ 1252 __count = 0; \ 1253} while (0) 1254 1255#define ADVANCE_RING() do { \ 1256 if (info->cp->dma_begin_count-- != 1) { \ 1257 xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \ 1258 "ADVANCE_RING without begin at %s:%d\n", \ 1259 __FILE__, __LINE__); \ 1260 info->cp->dma_begin_count = 0; \ 1261 } \ 1262 if (__count != __expected) { \ 1263 xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \ 1264 "ADVANCE_RING count != expected (%d vs %d) at %s:%d\n", \ 1265 __count, __expected, __FILE__, __LINE__); \ 1266 } \ 1267 if (RADEON_VERBOSE) { \ 1268 xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ 1269 "ADVANCE_RING() start: %d used: %d count: %d\n", \ 1270 info->cp->indirectStart, \ 1271 info->cp->indirectBuffer->used, \ 1272 __count * (int)sizeof(uint32_t)); \ 1273 } \ 1274 info->cp->indirectBuffer->used += __count * (int)sizeof(uint32_t); \ 1275} while (0) 1276 1277#define OUT_RING(x) do { \ 1278 if (RADEON_VERBOSE) { \ 1279 xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ 1280 " OUT_RING(0x%08x)\n", (unsigned int)(x)); \ 1281 } \ 1282 __head[__count++] = (x); \ 1283} while (0) 1284 1285#define OUT_RING_REG(reg, val) \ 1286do { \ 1287 OUT_RING(CP_PACKET0(reg, 0)); \ 1288 OUT_RING(val); \ 1289} while (0) 1290 1291#define FLUSH_RING() \ 1292do { \ 1293 if (RADEON_VERBOSE) \ 1294 xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ 1295 "FLUSH_RING in %s\n", __FUNCTION__); \ 1296 if (info->cp->indirectBuffer) \ 1297 RADEONCPFlushIndirect(pScrn, 0); \ 1298} while (0) 1299 1300 1301#define RADEON_WAIT_UNTIL_2D_IDLE() \ 1302do { \ 1303 if (info->ChipFamily < CHIP_FAMILY_R600) { \ 1304 BEGIN_RING(2); \ 1305 OUT_RING(CP_PACKET0(RADEON_WAIT_UNTIL, 0)); \ 1306 OUT_RING((RADEON_WAIT_2D_IDLECLEAN | \ 1307 RADEON_WAIT_HOST_IDLECLEAN)); \ 1308 ADVANCE_RING(); \ 1309 } \ 1310} while (0) 1311 1312#define RADEON_WAIT_UNTIL_3D_IDLE() \ 1313do { \ 1314 if (info->ChipFamily < CHIP_FAMILY_R600) { \ 1315 BEGIN_RING(2); \ 1316 OUT_RING(CP_PACKET0(RADEON_WAIT_UNTIL, 0)); \ 1317 OUT_RING((RADEON_WAIT_3D_IDLECLEAN | \ 1318 RADEON_WAIT_HOST_IDLECLEAN)); \ 1319 ADVANCE_RING(); \ 1320 } \ 1321} while (0) 1322 1323#define RADEON_WAIT_UNTIL_IDLE() \ 1324do { \ 1325 if (RADEON_VERBOSE) { \ 1326 xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ 1327 "WAIT_UNTIL_IDLE() in %s\n", __FUNCTION__); \ 1328 } \ 1329 if (info->ChipFamily < CHIP_FAMILY_R600) { \ 1330 BEGIN_RING(2); \ 1331 OUT_RING(CP_PACKET0(RADEON_WAIT_UNTIL, 0)); \ 1332 OUT_RING((RADEON_WAIT_2D_IDLECLEAN | \ 1333 RADEON_WAIT_3D_IDLECLEAN | \ 1334 RADEON_WAIT_HOST_IDLECLEAN)); \ 1335 ADVANCE_RING(); \ 1336 } \ 1337} while (0) 1338 1339#define RADEON_PURGE_CACHE() \ 1340do { \ 1341 if (info->ChipFamily < CHIP_FAMILY_R600) { \ 1342 BEGIN_RING(2); \ 1343 if (info->ChipFamily <= CHIP_FAMILY_RV280) { \ 1344 OUT_RING(CP_PACKET0(RADEON_RB3D_DSTCACHE_CTLSTAT, 0)); \ 1345 OUT_RING(RADEON_RB3D_DC_FLUSH_ALL); \ 1346 } else { \ 1347 OUT_RING(CP_PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0)); \ 1348 OUT_RING(R300_RB3D_DC_FLUSH_ALL); \ 1349 } \ 1350 ADVANCE_RING(); \ 1351 } \ 1352} while (0) 1353 1354#define RADEON_PURGE_ZCACHE() \ 1355do { \ 1356 if (info->ChipFamily < CHIP_FAMILY_R600) { \ 1357 BEGIN_RING(2); \ 1358 if (info->ChipFamily <= CHIP_FAMILY_RV280) { \ 1359 OUT_RING(CP_PACKET0(RADEON_RB3D_ZCACHE_CTLSTAT, 0)); \ 1360 OUT_RING(RADEON_RB3D_ZC_FLUSH_ALL); \ 1361 } else { \ 1362 OUT_RING(CP_PACKET0(R300_RB3D_ZCACHE_CTLSTAT, 0)); \ 1363 OUT_RING(R300_ZC_FLUSH_ALL); \ 1364 } \ 1365 ADVANCE_RING(); \ 1366 } \ 1367} while (0) 1368 1369#endif /* XF86DRI */ 1370 1371#if defined(XF86DRI) && defined(USE_EXA) 1372#define RADEON_SWITCH_TO_2D() \ 1373do { \ 1374 uint32_t flush = 0; \ 1375 switch (info->accel_state->engineMode) { \ 1376 case EXA_ENGINEMODE_UNKNOWN: \ 1377 case EXA_ENGINEMODE_3D: \ 1378 flush = 1; \ 1379 case EXA_ENGINEMODE_2D: \ 1380 break; \ 1381 } \ 1382 if (flush && info->directRenderingEnabled) \ 1383 RADEONCPFlushIndirect(pScrn, 1); \ 1384 info->accel_state->engineMode = EXA_ENGINEMODE_2D; \ 1385} while (0); 1386 1387#define RADEON_SWITCH_TO_3D() \ 1388do { \ 1389 uint32_t flush = 0; \ 1390 switch (info->accel_state->engineMode) { \ 1391 case EXA_ENGINEMODE_UNKNOWN: \ 1392 case EXA_ENGINEMODE_2D: \ 1393 flush = 1; \ 1394 case EXA_ENGINEMODE_3D: \ 1395 break; \ 1396 } \ 1397 if (flush) { \ 1398 if (info->directRenderingEnabled) \ 1399 RADEONCPFlushIndirect(pScrn, 1); \ 1400 RADEONInit3DEngine(pScrn); \ 1401 } \ 1402 info->accel_state->engineMode = EXA_ENGINEMODE_3D; \ 1403} while (0); 1404#else 1405#define RADEON_SWITCH_TO_2D() 1406#define RADEON_SWITCH_TO_3D() 1407#endif 1408 1409static __inline__ void RADEON_MARK_SYNC(RADEONInfoPtr info, ScrnInfoPtr pScrn) 1410{ 1411#ifdef USE_EXA 1412 if (info->useEXA) 1413 exaMarkSync(pScrn->pScreen); 1414#endif 1415#ifdef USE_XAA 1416 if (!info->useEXA) 1417 SET_SYNC_FLAG(info->accel_state->accel); 1418#endif 1419} 1420 1421static __inline__ void RADEON_SYNC(RADEONInfoPtr info, ScrnInfoPtr pScrn) 1422{ 1423#ifdef USE_EXA 1424 if (info->useEXA && pScrn->pScreen) 1425 exaWaitSync(pScrn->pScreen); 1426#endif 1427#ifdef USE_XAA 1428 if (!info->useEXA && info->accel_state->accel) 1429 info->accel_state->accel->Sync(pScrn); 1430#endif 1431} 1432 1433static __inline__ void radeon_init_timeout(struct timeval *endtime, 1434 unsigned int timeout) 1435{ 1436 gettimeofday(endtime, NULL); 1437 endtime->tv_usec += timeout; 1438 endtime->tv_sec += endtime->tv_usec / 1000000; 1439 endtime->tv_usec %= 1000000; 1440} 1441 1442static __inline__ int radeon_timedout(const struct timeval *endtime) 1443{ 1444 struct timeval now; 1445 gettimeofday(&now, NULL); 1446 return now.tv_sec == endtime->tv_sec ? 1447 now.tv_usec > endtime->tv_usec : now.tv_sec > endtime->tv_sec; 1448} 1449 1450#endif /* _RADEON_H_ */ 1451