radeon.h revision c503f109
1209ff23fSmrg/* 2209ff23fSmrg * Copyright 2000 ATI Technologies Inc., Markham, Ontario, and 3209ff23fSmrg * VA Linux Systems Inc., Fremont, California. 4209ff23fSmrg * 5209ff23fSmrg * All Rights Reserved. 6209ff23fSmrg * 7209ff23fSmrg * Permission is hereby granted, free of charge, to any person obtaining 8209ff23fSmrg * a copy of this software and associated documentation files (the 9209ff23fSmrg * "Software"), to deal in the Software without restriction, including 10209ff23fSmrg * without limitation on the rights to use, copy, modify, merge, 11209ff23fSmrg * publish, distribute, sublicense, and/or sell copies of the Software, 12209ff23fSmrg * and to permit persons to whom the Software is furnished to do so, 13209ff23fSmrg * subject to the following conditions: 14209ff23fSmrg * 15209ff23fSmrg * The above copyright notice and this permission notice (including the 16209ff23fSmrg * next paragraph) shall be included in all copies or substantial 17209ff23fSmrg * portions of the Software. 18209ff23fSmrg * 19209ff23fSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20209ff23fSmrg * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21209ff23fSmrg * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22209ff23fSmrg * NON-INFRINGEMENT. IN NO EVENT SHALL ATI, VA LINUX SYSTEMS AND/OR 23209ff23fSmrg * THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24209ff23fSmrg * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25209ff23fSmrg * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 26209ff23fSmrg * DEALINGS IN THE SOFTWARE. 27209ff23fSmrg */ 28209ff23fSmrg 29209ff23fSmrg/* 30209ff23fSmrg * Authors: 31209ff23fSmrg * Kevin E. Martin <martin@xfree86.org> 32209ff23fSmrg * Rickard E. Faith <faith@valinux.com> 33209ff23fSmrg * Alan Hourihane <alanh@fairlite.demon.co.uk> 34209ff23fSmrg * 35209ff23fSmrg */ 36209ff23fSmrg 37209ff23fSmrg#ifndef _RADEON_H_ 38209ff23fSmrg#define _RADEON_H_ 39209ff23fSmrg 40209ff23fSmrg#include <stdlib.h> /* For abs() */ 41209ff23fSmrg#include <unistd.h> /* For usleep() */ 42209ff23fSmrg#include <sys/time.h> /* For gettimeofday() */ 43209ff23fSmrg 44209ff23fSmrg#include "config.h" 45209ff23fSmrg#include "xf86str.h" 46209ff23fSmrg#include "compiler.h" 47209ff23fSmrg#include "xf86fbman.h" 48209ff23fSmrg 49209ff23fSmrg /* PCI support */ 50209ff23fSmrg#include "xf86Pci.h" 51209ff23fSmrg 52209ff23fSmrg#ifdef USE_EXA 53209ff23fSmrg#include "exa.h" 54209ff23fSmrg#endif 55209ff23fSmrg#ifdef USE_XAA 56209ff23fSmrg#include "xaa.h" 57209ff23fSmrg#endif 58209ff23fSmrg 59209ff23fSmrg /* Exa and Cursor Support */ 60209ff23fSmrg#include "vbe.h" 61209ff23fSmrg#include "xf86Cursor.h" 62209ff23fSmrg 63209ff23fSmrg /* DDC support */ 64209ff23fSmrg#include "xf86DDC.h" 65209ff23fSmrg 66209ff23fSmrg /* Xv support */ 67209ff23fSmrg#include "xf86xv.h" 68209ff23fSmrg 69209ff23fSmrg#include "radeon_probe.h" 70209ff23fSmrg#include "radeon_tv.h" 71209ff23fSmrg 72209ff23fSmrg /* DRI support */ 73209ff23fSmrg#ifdef XF86DRI 74209ff23fSmrg#define _XF86DRI_SERVER_ 75209ff23fSmrg#include "dri.h" 76209ff23fSmrg#include "GL/glxint.h" 77b7e1c893Smrg#include "xf86drm.h" 78b7e1c893Smrg 79209ff23fSmrg#ifdef DAMAGE 80209ff23fSmrg#include "damage.h" 81209ff23fSmrg#include "globals.h" 82209ff23fSmrg#endif 83209ff23fSmrg#endif 84209ff23fSmrg 85209ff23fSmrg#include "xf86Crtc.h" 86209ff23fSmrg#include "X11/Xatom.h" 87209ff23fSmrg 88209ff23fSmrg /* Render support */ 89209ff23fSmrg#ifdef RENDER 90209ff23fSmrg#include "picturestr.h" 91209ff23fSmrg#endif 92209ff23fSmrg 93209ff23fSmrg#include "atipcirename.h" 94209ff23fSmrg 95209ff23fSmrg#ifndef MAX 96209ff23fSmrg#define MAX(a,b) ((a)>(b)?(a):(b)) 97209ff23fSmrg#endif 98209ff23fSmrg#ifndef MIN 99209ff23fSmrg#define MIN(a,b) ((a)>(b)?(b):(a)) 100209ff23fSmrg#endif 101209ff23fSmrg 102b7e1c893Smrg#if HAVE_BYTESWAP_H 103b7e1c893Smrg#include <byteswap.h> 104b7e1c893Smrg#elif defined(USE_SYS_ENDIAN_H) 105b7e1c893Smrg#include <sys/endian.h> 106b7e1c893Smrg#else 107b7e1c893Smrg#define bswap_16(value) \ 108b7e1c893Smrg ((((value) & 0xff) << 8) | ((value) >> 8)) 109b7e1c893Smrg 110b7e1c893Smrg#define bswap_32(value) \ 111b7e1c893Smrg (((uint32_t)bswap_16((uint16_t)((value) & 0xffff)) << 16) | \ 112b7e1c893Smrg (uint32_t)bswap_16((uint16_t)((value) >> 16))) 113b7e1c893Smrg 114b7e1c893Smrg#define bswap_64(value) \ 115b7e1c893Smrg (((uint64_t)bswap_32((uint32_t)((value) & 0xffffffff)) \ 116b7e1c893Smrg << 32) | \ 117b7e1c893Smrg (uint64_t)bswap_32((uint32_t)((value) >> 32))) 118b7e1c893Smrg#endif 119b7e1c893Smrg 120b7e1c893Smrg#if X_BYTE_ORDER == X_BIG_ENDIAN 121b7e1c893Smrg#define le32_to_cpu(x) bswap_32(x) 122b7e1c893Smrg#define le16_to_cpu(x) bswap_16(x) 123b7e1c893Smrg#define cpu_to_le32(x) bswap_32(x) 124b7e1c893Smrg#define cpu_to_le16(x) bswap_16(x) 125b7e1c893Smrg#else 126b7e1c893Smrg#define le32_to_cpu(x) (x) 127b7e1c893Smrg#define le16_to_cpu(x) (x) 128b7e1c893Smrg#define cpu_to_le32(x) (x) 129b7e1c893Smrg#define cpu_to_le16(x) (x) 130b7e1c893Smrg#endif 131b7e1c893Smrg 132209ff23fSmrg/* Provide substitutes for gcc's __FUNCTION__ on other compilers */ 133209ff23fSmrg#if !defined(__GNUC__) && !defined(__FUNCTION__) 134209ff23fSmrg# define __FUNCTION__ __func__ /* C99 */ 135209ff23fSmrg#endif 136209ff23fSmrg 137209ff23fSmrg#ifndef HAVE_XF86MODEBANDWIDTH 138209ff23fSmrgextern unsigned int xf86ModeBandwidth(DisplayModePtr mode, int depth); 139209ff23fSmrg#define MODE_BANDWIDTH MODE_BAD 140209ff23fSmrg#endif 141209ff23fSmrg 142209ff23fSmrgtypedef enum { 143209ff23fSmrg OPTION_NOACCEL, 144209ff23fSmrg OPTION_SW_CURSOR, 145209ff23fSmrg OPTION_DAC_6BIT, 146209ff23fSmrg OPTION_DAC_8BIT, 147209ff23fSmrg#ifdef XF86DRI 148209ff23fSmrg OPTION_BUS_TYPE, 149209ff23fSmrg OPTION_CP_PIO, 150209ff23fSmrg OPTION_USEC_TIMEOUT, 151209ff23fSmrg OPTION_AGP_MODE, 152209ff23fSmrg OPTION_AGP_FW, 153209ff23fSmrg OPTION_GART_SIZE, 154209ff23fSmrg OPTION_GART_SIZE_OLD, 155209ff23fSmrg OPTION_RING_SIZE, 156209ff23fSmrg OPTION_BUFFER_SIZE, 157209ff23fSmrg OPTION_DEPTH_MOVE, 158209ff23fSmrg OPTION_PAGE_FLIP, 159209ff23fSmrg OPTION_NO_BACKBUFFER, 160209ff23fSmrg OPTION_XV_DMA, 161209ff23fSmrg OPTION_FBTEX_PERCENT, 162209ff23fSmrg OPTION_DEPTH_BITS, 163209ff23fSmrg OPTION_PCIAPER_SIZE, 164209ff23fSmrg#ifdef USE_EXA 165209ff23fSmrg OPTION_ACCEL_DFS, 166209ff23fSmrg#endif 167209ff23fSmrg#endif 168209ff23fSmrg OPTION_IGNORE_EDID, 169209ff23fSmrg OPTION_DISP_PRIORITY, 170209ff23fSmrg OPTION_PANEL_SIZE, 171209ff23fSmrg OPTION_MIN_DOTCLOCK, 172209ff23fSmrg OPTION_COLOR_TILING, 173209ff23fSmrg#ifdef XvExtension 174209ff23fSmrg OPTION_VIDEO_KEY, 175209ff23fSmrg OPTION_RAGE_THEATRE_CRYSTAL, 176209ff23fSmrg OPTION_RAGE_THEATRE_TUNER_PORT, 177209ff23fSmrg OPTION_RAGE_THEATRE_COMPOSITE_PORT, 178209ff23fSmrg OPTION_RAGE_THEATRE_SVIDEO_PORT, 179209ff23fSmrg OPTION_TUNER_TYPE, 180209ff23fSmrg OPTION_RAGE_THEATRE_MICROC_PATH, 181209ff23fSmrg OPTION_RAGE_THEATRE_MICROC_TYPE, 182209ff23fSmrg OPTION_SCALER_WIDTH, 183209ff23fSmrg#endif 184209ff23fSmrg#ifdef RENDER 185209ff23fSmrg OPTION_RENDER_ACCEL, 186209ff23fSmrg OPTION_SUBPIXEL_ORDER, 187209ff23fSmrg#endif 188209ff23fSmrg OPTION_SHOWCACHE, 189209ff23fSmrg OPTION_DYNAMIC_CLOCKS, 190209ff23fSmrg OPTION_BIOS_HOTKEYS, 191209ff23fSmrg OPTION_VGA_ACCESS, 192209ff23fSmrg OPTION_REVERSE_DDC, 193209ff23fSmrg OPTION_LVDS_PROBE_PLL, 194209ff23fSmrg OPTION_ACCELMETHOD, 195209ff23fSmrg OPTION_CONNECTORTABLE, 196209ff23fSmrg OPTION_DRI, 197209ff23fSmrg OPTION_DEFAULT_CONNECTOR_TABLE, 198209ff23fSmrg#if defined(__powerpc__) 199209ff23fSmrg OPTION_MAC_MODEL, 200209ff23fSmrg#endif 201209ff23fSmrg OPTION_DEFAULT_TMDS_PLL, 202209ff23fSmrg OPTION_TVDAC_LOAD_DETECT, 203209ff23fSmrg OPTION_FORCE_TVOUT, 204209ff23fSmrg OPTION_TVSTD, 205209ff23fSmrg OPTION_IGNORE_LID_STATUS, 206209ff23fSmrg OPTION_DEFAULT_TVDAC_ADJ, 207b7e1c893Smrg OPTION_INT10, 208b7e1c893Smrg OPTION_EXA_VSYNC, 209b7e1c893Smrg OPTION_ATOM_TVOUT, 210b7e1c893Smrg OPTION_R4XX_ATOM 211209ff23fSmrg} RADEONOpts; 212209ff23fSmrg 213209ff23fSmrg 214209ff23fSmrg#define RADEON_IDLE_RETRY 16 /* Fall out of idle loops after this count */ 215209ff23fSmrg#define RADEON_TIMEOUT 2000000 /* Fall out of wait loops after this count */ 216209ff23fSmrg 217209ff23fSmrg#define RADEON_VSYNC_TIMEOUT 20000 /* Maximum wait for VSYNC (in usecs) */ 218209ff23fSmrg 219209ff23fSmrg/* Buffer are aligned on 4096 byte boundaries */ 220209ff23fSmrg#define RADEON_BUFFER_ALIGN 0x00000fff 221209ff23fSmrg#define RADEON_VBIOS_SIZE 0x00010000 222209ff23fSmrg#define RADEON_USE_RMX 0x80000000 /* mode flag for using RMX 223209ff23fSmrg * Need to comfirm this is not used 224209ff23fSmrg * for something else. 225209ff23fSmrg */ 226209ff23fSmrg 227209ff23fSmrg#define xFixedToFloat(f) (((float) (f)) / 65536) 228209ff23fSmrg 229209ff23fSmrg#define RADEON_LOGLEVEL_DEBUG 4 230209ff23fSmrg 231209ff23fSmrg/* for Xv, outputs */ 232209ff23fSmrg#define MAKE_ATOM(a) MakeAtom(a, sizeof(a) - 1, TRUE) 233209ff23fSmrg 234209ff23fSmrg/* Other macros */ 235209ff23fSmrg#define RADEON_ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) 236209ff23fSmrg#define RADEON_ALIGN(x,bytes) (((x) + ((bytes) - 1)) & ~((bytes) - 1)) 237209ff23fSmrg#define RADEONPTR(pScrn) ((RADEONInfoPtr)(pScrn)->driverPrivate) 238209ff23fSmrg 239209ff23fSmrgtypedef struct { 240209ff23fSmrg int revision; 241209ff23fSmrg uint16_t rr1_offset; 242209ff23fSmrg uint16_t rr2_offset; 243209ff23fSmrg uint16_t dyn_clk_offset; 244209ff23fSmrg uint16_t pll_offset; 245209ff23fSmrg uint16_t mem_config_offset; 246209ff23fSmrg uint16_t mem_reset_offset; 247209ff23fSmrg uint16_t short_mem_offset; 248209ff23fSmrg uint16_t rr3_offset; 249209ff23fSmrg uint16_t rr4_offset; 250209ff23fSmrg} RADEONBIOSInitTable; 251209ff23fSmrg 252209ff23fSmrg#define RADEON_PLL_USE_BIOS_DIVS (1 << 0) 253209ff23fSmrg#define RADEON_PLL_NO_ODD_POST_DIV (1 << 1) 254209ff23fSmrg#define RADEON_PLL_USE_REF_DIV (1 << 2) 255209ff23fSmrg#define RADEON_PLL_LEGACY (1 << 3) 256b7e1c893Smrg#define RADEON_PLL_PREFER_LOW_REF_DIV (1 << 4) 257b7e1c893Smrg#define RADEON_PLL_PREFER_HIGH_REF_DIV (1 << 5) 258b7e1c893Smrg#define RADEON_PLL_PREFER_LOW_FB_DIV (1 << 6) 259b7e1c893Smrg#define RADEON_PLL_PREFER_HIGH_FB_DIV (1 << 7) 260b7e1c893Smrg#define RADEON_PLL_PREFER_LOW_POST_DIV (1 << 8) 261b7e1c893Smrg#define RADEON_PLL_PREFER_HIGH_POST_DIV (1 << 9) 262209ff23fSmrg 263209ff23fSmrgtypedef struct { 264209ff23fSmrg uint16_t reference_freq; 265209ff23fSmrg uint16_t reference_div; 266209ff23fSmrg uint32_t pll_in_min; 267209ff23fSmrg uint32_t pll_in_max; 268209ff23fSmrg uint32_t pll_out_min; 269209ff23fSmrg uint32_t pll_out_max; 270209ff23fSmrg uint16_t xclk; 271209ff23fSmrg 272209ff23fSmrg uint32_t min_ref_div; 273209ff23fSmrg uint32_t max_ref_div; 274209ff23fSmrg uint32_t min_post_div; 275209ff23fSmrg uint32_t max_post_div; 276209ff23fSmrg uint32_t min_feedback_div; 277209ff23fSmrg uint32_t max_feedback_div; 278209ff23fSmrg uint32_t best_vco; 279209ff23fSmrg} RADEONPLLRec, *RADEONPLLPtr; 280209ff23fSmrg 281209ff23fSmrgtypedef struct { 282209ff23fSmrg int bitsPerPixel; 283209ff23fSmrg int depth; 284209ff23fSmrg int displayWidth; 285209ff23fSmrg int displayHeight; 286209ff23fSmrg int pixel_code; 287209ff23fSmrg int pixel_bytes; 288209ff23fSmrg DisplayModePtr mode; 289209ff23fSmrg} RADEONFBLayout; 290209ff23fSmrg 291209ff23fSmrgtypedef enum { 292209ff23fSmrg CHIP_FAMILY_UNKNOW, 293209ff23fSmrg CHIP_FAMILY_LEGACY, 294209ff23fSmrg CHIP_FAMILY_RADEON, 295209ff23fSmrg CHIP_FAMILY_RV100, 296209ff23fSmrg CHIP_FAMILY_RS100, /* U1 (IGP320M) or A3 (IGP320)*/ 297209ff23fSmrg CHIP_FAMILY_RV200, 298209ff23fSmrg CHIP_FAMILY_RS200, /* U2 (IGP330M/340M/350M) or A4 (IGP330/340/345/350), RS250 (IGP 7000) */ 299209ff23fSmrg CHIP_FAMILY_R200, 300209ff23fSmrg CHIP_FAMILY_RV250, 301209ff23fSmrg CHIP_FAMILY_RS300, /* RS300/RS350 */ 302209ff23fSmrg CHIP_FAMILY_RV280, 303209ff23fSmrg CHIP_FAMILY_R300, 304209ff23fSmrg CHIP_FAMILY_R350, 305209ff23fSmrg CHIP_FAMILY_RV350, 306209ff23fSmrg CHIP_FAMILY_RV380, /* RV370/RV380/M22/M24 */ 307209ff23fSmrg CHIP_FAMILY_R420, /* R420/R423/M18 */ 308209ff23fSmrg CHIP_FAMILY_RV410, /* RV410, M26 */ 309209ff23fSmrg CHIP_FAMILY_RS400, /* xpress 200, 200m (RS400) Intel */ 310209ff23fSmrg CHIP_FAMILY_RS480, /* xpress 200, 200m (RS410/480/482/485) AMD */ 311209ff23fSmrg CHIP_FAMILY_RV515, /* rv515 */ 312209ff23fSmrg CHIP_FAMILY_R520, /* r520 */ 313209ff23fSmrg CHIP_FAMILY_RV530, /* rv530 */ 314209ff23fSmrg CHIP_FAMILY_R580, /* r580 */ 315209ff23fSmrg CHIP_FAMILY_RV560, /* rv560 */ 316209ff23fSmrg CHIP_FAMILY_RV570, /* rv570 */ 317209ff23fSmrg CHIP_FAMILY_RS600, 318209ff23fSmrg CHIP_FAMILY_RS690, 319209ff23fSmrg CHIP_FAMILY_RS740, 320209ff23fSmrg CHIP_FAMILY_R600, /* r600 */ 321209ff23fSmrg CHIP_FAMILY_RV610, 322209ff23fSmrg CHIP_FAMILY_RV630, 323209ff23fSmrg CHIP_FAMILY_RV670, 324209ff23fSmrg CHIP_FAMILY_RV620, 325209ff23fSmrg CHIP_FAMILY_RV635, 326209ff23fSmrg CHIP_FAMILY_RS780, 327b7e1c893Smrg CHIP_FAMILY_RS880, 328b7e1c893Smrg CHIP_FAMILY_RV770, 329b7e1c893Smrg CHIP_FAMILY_RV730, 330b7e1c893Smrg CHIP_FAMILY_RV710, 331c503f109Smrg CHIP_FAMILY_RV740, 332209ff23fSmrg CHIP_FAMILY_LAST 333209ff23fSmrg} RADEONChipFamily; 334209ff23fSmrg 335209ff23fSmrg#define IS_RV100_VARIANT ((info->ChipFamily == CHIP_FAMILY_RV100) || \ 336209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RV200) || \ 337209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RS100) || \ 338209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RS200) || \ 339209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RV250) || \ 340209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RV280) || \ 341209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RS300)) 342209ff23fSmrg 343209ff23fSmrg 344209ff23fSmrg#define IS_R300_VARIANT ((info->ChipFamily == CHIP_FAMILY_R300) || \ 345209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RV350) || \ 346209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_R350) || \ 347209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RV380) || \ 348209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_R420) || \ 349209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RV410) || \ 350209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RS400) || \ 351209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RS480)) 352209ff23fSmrg 353209ff23fSmrg#define IS_AVIVO_VARIANT ((info->ChipFamily >= CHIP_FAMILY_RV515)) 354209ff23fSmrg 355209ff23fSmrg#define IS_DCE3_VARIANT ((info->ChipFamily >= CHIP_FAMILY_RV620)) 356209ff23fSmrg 357b7e1c893Smrg#define IS_DCE32_VARIANT ((info->ChipFamily >= CHIP_FAMILY_RV730)) 358b7e1c893Smrg 359b7e1c893Smrg#define IS_R600_3D (info->ChipFamily >= CHIP_FAMILY_R600) 360b7e1c893Smrg 361209ff23fSmrg#define IS_R500_3D ((info->ChipFamily == CHIP_FAMILY_RV515) || \ 362209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_R520) || \ 363209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RV530) || \ 364209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_R580) || \ 365209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RV560) || \ 366209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RV570)) 367209ff23fSmrg 368209ff23fSmrg#define IS_R300_3D ((info->ChipFamily == CHIP_FAMILY_R300) || \ 369209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RV350) || \ 370209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_R350) || \ 371209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RV380) || \ 372209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_R420) || \ 373209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RV410) || \ 374209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RS690) || \ 375209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RS600) || \ 376209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RS740) || \ 377209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RS400) || \ 378209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RS480)) 379209ff23fSmrg 380209ff23fSmrg/* 381209ff23fSmrg * Errata workarounds 382209ff23fSmrg */ 383209ff23fSmrgtypedef enum { 384209ff23fSmrg CHIP_ERRATA_R300_CG = 0x00000001, 385209ff23fSmrg CHIP_ERRATA_PLL_DUMMYREADS = 0x00000002, 386209ff23fSmrg CHIP_ERRATA_PLL_DELAY = 0x00000004 387209ff23fSmrg} RADEONErrata; 388209ff23fSmrg 389209ff23fSmrgtypedef enum { 390209ff23fSmrg RADEON_DVOCHIP_NONE, 391209ff23fSmrg RADEON_SIL_164, 392209ff23fSmrg RADEON_SIL_1178 393209ff23fSmrg} RADEONExtTMDSChip; 394209ff23fSmrg 395209ff23fSmrg#if defined(__powerpc__) 396209ff23fSmrgtypedef enum { 397209ff23fSmrg RADEON_MAC_NONE, 398209ff23fSmrg RADEON_MAC_IBOOK, 399209ff23fSmrg RADEON_MAC_POWERBOOK_EXTERNAL, 400209ff23fSmrg RADEON_MAC_POWERBOOK_INTERNAL, 401209ff23fSmrg RADEON_MAC_POWERBOOK_VGA, 402209ff23fSmrg RADEON_MAC_MINI_EXTERNAL, 403209ff23fSmrg RADEON_MAC_MINI_INTERNAL, 404b7e1c893Smrg RADEON_MAC_IMAC_G5_ISIGHT, 405b7e1c893Smrg RADEON_MAC_EMAC 406209ff23fSmrg} RADEONMacModel; 407209ff23fSmrg#endif 408209ff23fSmrg 409209ff23fSmrgtypedef enum { 410209ff23fSmrg CARD_PCI, 411209ff23fSmrg CARD_AGP, 412209ff23fSmrg CARD_PCIE 413209ff23fSmrg} RADEONCardType; 414209ff23fSmrg 415209ff23fSmrgtypedef struct _atomBiosHandle *atomBiosHandlePtr; 416209ff23fSmrg 417209ff23fSmrgtypedef struct { 418209ff23fSmrg uint32_t pci_device_id; 419209ff23fSmrg RADEONChipFamily chip_family; 420209ff23fSmrg int mobility; 421209ff23fSmrg int igp; 422209ff23fSmrg int nocrtc2; 423209ff23fSmrg int nointtvout; 424209ff23fSmrg int singledac; 425209ff23fSmrg} RADEONCardInfo; 426209ff23fSmrg 427209ff23fSmrg#ifdef XF86DRI 428b7e1c893Smrgstruct radeon_cp { 429b7e1c893Smrg Bool CPRuns; /* CP is running */ 430b7e1c893Smrg Bool CPInUse; /* CP has been used by X server */ 431b7e1c893Smrg Bool CPStarted; /* CP has started */ 432b7e1c893Smrg int CPMode; /* CP mode that server/clients use */ 433b7e1c893Smrg int CPFifoSize; /* Size of the CP command FIFO */ 434b7e1c893Smrg int CPusecTimeout; /* CP timeout in usecs */ 435b7e1c893Smrg Bool needCacheFlush; 436209ff23fSmrg 437b7e1c893Smrg /* CP accleration */ 438b7e1c893Smrg drmBufPtr indirectBuffer; 439b7e1c893Smrg int indirectStart; 440209ff23fSmrg 441b7e1c893Smrg /* Debugging info for BEGIN_RING/ADVANCE_RING pairs. */ 442b7e1c893Smrg int dma_begin_count; 443b7e1c893Smrg char *dma_debug_func; 444b7e1c893Smrg int dma_debug_lineno; 445209ff23fSmrg 446b7e1c893Smrg }; 447209ff23fSmrg 448b7e1c893Smrgtypedef struct { 449b7e1c893Smrg /* Nothing here yet */ 450b7e1c893Smrg int dummy; 451b7e1c893Smrg} RADEONConfigPrivRec, *RADEONConfigPrivPtr; 452209ff23fSmrg 453b7e1c893Smrgtypedef struct { 454b7e1c893Smrg#ifdef PER_CONTEXT_SAREA 455b7e1c893Smrg drm_context_t ctx_id; 456b7e1c893Smrg drm_handle_t sarea_handle; 457b7e1c893Smrg#else 458b7e1c893Smrg /* Nothing here yet */ 459b7e1c893Smrg int dummy; 460209ff23fSmrg#endif 461b7e1c893Smrg} RADEONDRIContextRec, *RADEONDRIContextPtr; 462209ff23fSmrg 463b7e1c893Smrgstruct radeon_dri { 464b7e1c893Smrg Bool noBackBuffer; 465209ff23fSmrg 466209ff23fSmrg Bool newMemoryMap; 467209ff23fSmrg drmVersionPtr pLibDRMVersion; 468209ff23fSmrg drmVersionPtr pKernelDRMVersion; 469209ff23fSmrg DRIInfoPtr pDRIInfo; 470209ff23fSmrg int drmFD; 471209ff23fSmrg int numVisualConfigs; 472209ff23fSmrg __GLXvisualConfig *pVisualConfigs; 473209ff23fSmrg RADEONConfigPrivPtr pVisualConfigsPriv; 474209ff23fSmrg Bool (*DRICloseScreen)(int, ScreenPtr); 475209ff23fSmrg 476209ff23fSmrg drm_handle_t fbHandle; 477209ff23fSmrg 478209ff23fSmrg drmSize registerSize; 479209ff23fSmrg drm_handle_t registerHandle; 480209ff23fSmrg 481209ff23fSmrg drmSize pciSize; 482209ff23fSmrg drm_handle_t pciMemHandle; 483209ff23fSmrg unsigned char *PCI; /* Map */ 484209ff23fSmrg 485209ff23fSmrg Bool depthMoves; /* Enable depth moves -- slow! */ 486209ff23fSmrg Bool allowPageFlip; /* Enable 3d page flipping */ 487209ff23fSmrg#ifdef DAMAGE 488209ff23fSmrg DamagePtr pDamage; 489209ff23fSmrg RegionRec driRegion; 490209ff23fSmrg#endif 491209ff23fSmrg Bool have3DWindows; /* Are there any 3d clients? */ 492209ff23fSmrg 493209ff23fSmrg int pciAperSize; 494209ff23fSmrg drmSize gartSize; 495209ff23fSmrg drm_handle_t agpMemHandle; /* Handle from drmAgpAlloc */ 496209ff23fSmrg unsigned long gartOffset; 497209ff23fSmrg unsigned char *AGP; /* Map */ 498209ff23fSmrg int agpMode; 499209ff23fSmrg 500209ff23fSmrg uint32_t pciCommand; 501209ff23fSmrg 502b7e1c893Smrg /* CP ring buffer data */ 503209ff23fSmrg unsigned long ringStart; /* Offset into GART space */ 504209ff23fSmrg drm_handle_t ringHandle; /* Handle from drmAddMap */ 505209ff23fSmrg drmSize ringMapSize; /* Size of map */ 506209ff23fSmrg int ringSize; /* Size of ring (in MB) */ 507209ff23fSmrg drmAddress ring; /* Map */ 508209ff23fSmrg int ringSizeLog2QW; 509209ff23fSmrg 510209ff23fSmrg unsigned long ringReadOffset; /* Offset into GART space */ 511209ff23fSmrg drm_handle_t ringReadPtrHandle; /* Handle from drmAddMap */ 512209ff23fSmrg drmSize ringReadMapSize; /* Size of map */ 513209ff23fSmrg drmAddress ringReadPtr; /* Map */ 514209ff23fSmrg 515b7e1c893Smrg /* CP vertex/indirect buffer data */ 516209ff23fSmrg unsigned long bufStart; /* Offset into GART space */ 517209ff23fSmrg drm_handle_t bufHandle; /* Handle from drmAddMap */ 518209ff23fSmrg drmSize bufMapSize; /* Size of map */ 519209ff23fSmrg int bufSize; /* Size of buffers (in MB) */ 520209ff23fSmrg drmAddress buf; /* Map */ 521209ff23fSmrg int bufNumBufs; /* Number of buffers */ 522209ff23fSmrg drmBufMapPtr buffers; /* Buffer map */ 523209ff23fSmrg 524b7e1c893Smrg /* CP GART Texture data */ 525209ff23fSmrg unsigned long gartTexStart; /* Offset into GART space */ 526209ff23fSmrg drm_handle_t gartTexHandle; /* Handle from drmAddMap */ 527209ff23fSmrg drmSize gartTexMapSize; /* Size of map */ 528209ff23fSmrg int gartTexSize; /* Size of GART tex space (in MB) */ 529209ff23fSmrg drmAddress gartTex; /* Map */ 530209ff23fSmrg int log2GARTTexGran; 531209ff23fSmrg 532b7e1c893Smrg /* DRI screen private data */ 533209ff23fSmrg int fbX; 534209ff23fSmrg int fbY; 535209ff23fSmrg int backX; 536209ff23fSmrg int backY; 537209ff23fSmrg int depthX; 538209ff23fSmrg int depthY; 539209ff23fSmrg 540209ff23fSmrg int frontOffset; 541209ff23fSmrg int frontPitch; 542209ff23fSmrg int backOffset; 543209ff23fSmrg int backPitch; 544209ff23fSmrg int depthOffset; 545209ff23fSmrg int depthPitch; 546209ff23fSmrg int depthBits; 547209ff23fSmrg int textureOffset; 548209ff23fSmrg int textureSize; 549209ff23fSmrg int log2TexGran; 550209ff23fSmrg 551209ff23fSmrg int pciGartSize; 552209ff23fSmrg uint32_t pciGartOffset; 553209ff23fSmrg void *pciGartBackup; 554b7e1c893Smrg 555b7e1c893Smrg int irq; 556b7e1c893Smrg 557b7e1c893Smrg#ifdef PER_CONTEXT_SAREA 558b7e1c893Smrg int perctx_sarea_size; 559b7e1c893Smrg#endif 560b7e1c893Smrg 561209ff23fSmrg#ifdef USE_XAA 562209ff23fSmrg uint32_t frontPitchOffset; 563209ff23fSmrg uint32_t backPitchOffset; 564209ff23fSmrg uint32_t depthPitchOffset; 565209ff23fSmrg 566b7e1c893Smrg /* offscreen memory management */ 567209ff23fSmrg int backLines; 568209ff23fSmrg FBAreaPtr backArea; 569209ff23fSmrg int depthTexLines; 570209ff23fSmrg FBAreaPtr depthTexArea; 571209ff23fSmrg#endif 572209ff23fSmrg 573b7e1c893Smrg}; 574b7e1c893Smrg#endif 575209ff23fSmrg 576b7e1c893Smrgstruct radeon_accel_state { 577b7e1c893Smrg /* common accel data */ 578b7e1c893Smrg int fifo_slots; /* Free slots in the FIFO (64 max) */ 579b7e1c893Smrg /* Computed values for Radeon */ 580b7e1c893Smrg uint32_t dp_gui_master_cntl; 581b7e1c893Smrg uint32_t dp_gui_master_cntl_clip; 582b7e1c893Smrg uint32_t trans_color; 583b7e1c893Smrg /* Saved values for ScreenToScreenCopy */ 584b7e1c893Smrg int xdir; 585b7e1c893Smrg int ydir; 586b7e1c893Smrg uint32_t dst_pitch_offset; 587209ff23fSmrg 588b7e1c893Smrg /* render accel */ 589b7e1c893Smrg unsigned short texW[2]; 590b7e1c893Smrg unsigned short texH[2]; 591b7e1c893Smrg Bool XInited3D; /* X itself has the 3D context */ 592b7e1c893Smrg int num_gb_pipes; 593b7e1c893Smrg Bool has_tcl; 594209ff23fSmrg 595b7e1c893Smrg#ifdef USE_EXA 596b7e1c893Smrg /* EXA */ 597b7e1c893Smrg ExaDriverPtr exa; 598b7e1c893Smrg int exaSyncMarker; 599b7e1c893Smrg int exaMarkerSynced; 600b7e1c893Smrg int engineMode; 601b7e1c893Smrg#define EXA_ENGINEMODE_UNKNOWN 0 602b7e1c893Smrg#define EXA_ENGINEMODE_2D 1 603b7e1c893Smrg#define EXA_ENGINEMODE_3D 2 604209ff23fSmrg 605b7e1c893Smrg Bool is_transform[2]; 606b7e1c893Smrg PictTransform *transform[2]; 607b7e1c893Smrg Bool has_mask; 608b7e1c893Smrg /* Whether we are tiling horizontally and vertically */ 609b7e1c893Smrg Bool need_src_tile_x; 610b7e1c893Smrg Bool need_src_tile_y; 611b7e1c893Smrg /* Size of tiles ... set to 65536x65536 if not tiling in that direction */ 612b7e1c893Smrg Bool src_tile_width; 613b7e1c893Smrg Bool src_tile_height; 614b7e1c893Smrg 615b7e1c893Smrg Bool vsync; 616b7e1c893Smrg 617b7e1c893Smrg drmBufPtr ib; 618b7e1c893Smrg int vb_index; 619b7e1c893Smrg 620b7e1c893Smrg // shader storage 621b7e1c893Smrg ExaOffscreenArea *shaders; 622b7e1c893Smrg uint32_t solid_vs_offset; 623b7e1c893Smrg uint32_t solid_ps_offset; 624b7e1c893Smrg uint32_t copy_vs_offset; 625b7e1c893Smrg uint32_t copy_ps_offset; 626b7e1c893Smrg uint32_t comp_vs_offset; 627b7e1c893Smrg uint32_t comp_ps_offset; 628b7e1c893Smrg uint32_t comp_mask_ps_offset; 629b7e1c893Smrg uint32_t xv_vs_offset; 630b7e1c893Smrg uint32_t xv_ps_offset; 631b7e1c893Smrg 632b7e1c893Smrg //size/addr stuff 633b7e1c893Smrg uint32_t src_size[2]; 634b7e1c893Smrg uint64_t src_mc_addr[2]; 635b7e1c893Smrg uint32_t src_pitch[2]; 636b7e1c893Smrg uint32_t src_width[2]; 637b7e1c893Smrg uint32_t src_height[2]; 638b7e1c893Smrg uint32_t src_bpp[2]; 639b7e1c893Smrg uint32_t dst_size; 640b7e1c893Smrg uint64_t dst_mc_addr; 641b7e1c893Smrg uint32_t dst_pitch; 642b7e1c893Smrg uint32_t dst_height; 643b7e1c893Smrg uint32_t dst_bpp; 644b7e1c893Smrg uint32_t vs_size; 645b7e1c893Smrg uint64_t vs_mc_addr; 646b7e1c893Smrg uint32_t ps_size; 647b7e1c893Smrg uint64_t ps_mc_addr; 648b7e1c893Smrg uint32_t vb_size; 649b7e1c893Smrg uint64_t vb_mc_addr; 650b7e1c893Smrg 651b7e1c893Smrg // UTS/DFS 652b7e1c893Smrg drmBufPtr scratch; 653b7e1c893Smrg 654b7e1c893Smrg // copy 655b7e1c893Smrg ExaOffscreenArea *copy_area; 656b7e1c893Smrg Bool same_surface; 657b7e1c893Smrg int rop; 658b7e1c893Smrg uint32_t planemask; 659b7e1c893Smrg 660b7e1c893Smrg // composite 661b7e1c893Smrg Bool component_alpha; 662b7e1c893Smrg Bool src_alpha; 663b7e1c893Smrg#endif 664209ff23fSmrg 665b7e1c893Smrg#ifdef USE_XAA 666b7e1c893Smrg /* XAA */ 667b7e1c893Smrg XAAInfoRecPtr accel; 668b7e1c893Smrg /* ScanlineScreenToScreenColorExpand support */ 669b7e1c893Smrg unsigned char *scratch_buffer[1]; 670b7e1c893Smrg unsigned char *scratch_save; 671b7e1c893Smrg int scanline_x; 672b7e1c893Smrg int scanline_y; 673b7e1c893Smrg int scanline_w; 674b7e1c893Smrg int scanline_h; 675b7e1c893Smrg int scanline_h_w; 676b7e1c893Smrg int scanline_words; 677b7e1c893Smrg int scanline_direct; 678b7e1c893Smrg int scanline_bpp; /* Only used for ImageWrite */ 679b7e1c893Smrg int scanline_fg; 680b7e1c893Smrg int scanline_bg; 681b7e1c893Smrg int scanline_hpass; 682b7e1c893Smrg int scanline_x1clip; 683b7e1c893Smrg int scanline_x2clip; 684b7e1c893Smrg /* Saved values for DashedTwoPointLine */ 685b7e1c893Smrg int dashLen; 686b7e1c893Smrg uint32_t dashPattern; 687b7e1c893Smrg int dash_fg; 688b7e1c893Smrg int dash_bg; 689b7e1c893Smrg 690b7e1c893Smrg FBLinearPtr RenderTex; 691b7e1c893Smrg void (*RenderCallback)(ScrnInfoPtr); 692b7e1c893Smrg Time RenderTimeout; 693b7e1c893Smrg /* 694b7e1c893Smrg * XAAForceTransBlit is used to change the behavior of the XAA 695b7e1c893Smrg * SetupForScreenToScreenCopy function, to make it DGA-friendly. 696b7e1c893Smrg */ 697b7e1c893Smrg Bool XAAForceTransBlit; 698209ff23fSmrg#endif 699209ff23fSmrg 700b7e1c893Smrg}; 701b7e1c893Smrg 702b7e1c893Smrgtypedef struct { 703b7e1c893Smrg EntityInfoPtr pEnt; 704b7e1c893Smrg pciVideoPtr PciInfo; 705b7e1c893Smrg PCITAG PciTag; 706b7e1c893Smrg int Chipset; 707b7e1c893Smrg RADEONChipFamily ChipFamily; 708b7e1c893Smrg RADEONErrata ChipErrata; 709b7e1c893Smrg 710b7e1c893Smrg unsigned long long LinearAddr; /* Frame buffer physical address */ 711b7e1c893Smrg unsigned long long MMIOAddr; /* MMIO region physical address */ 712b7e1c893Smrg unsigned long long BIOSAddr; /* BIOS physical address */ 713b7e1c893Smrg uint32_t fbLocation; 714b7e1c893Smrg uint32_t gartLocation; 715b7e1c893Smrg uint32_t mc_fb_location; 716b7e1c893Smrg uint32_t mc_agp_location; 717b7e1c893Smrg uint32_t mc_agp_location_hi; 718b7e1c893Smrg 719b7e1c893Smrg void *MMIO; /* Map of MMIO region */ 720b7e1c893Smrg void *FB; /* Map of frame buffer */ 721b7e1c893Smrg uint8_t *VBIOS; /* Video BIOS pointer */ 722b7e1c893Smrg 723b7e1c893Smrg Bool IsAtomBios; /* New BIOS used in R420 etc. */ 724b7e1c893Smrg int ROMHeaderStart; /* Start of the ROM Info Table */ 725b7e1c893Smrg int MasterDataStart; /* Offset for Master Data Table for ATOM BIOS */ 726b7e1c893Smrg 727b7e1c893Smrg uint32_t MemCntl; 728b7e1c893Smrg uint32_t BusCntl; 729b7e1c893Smrg unsigned long MMIOSize; /* MMIO region physical address */ 730b7e1c893Smrg unsigned long FbMapSize; /* Size of frame buffer, in bytes */ 731b7e1c893Smrg unsigned long FbSecureSize; /* Size of secured fb area at end of 732b7e1c893Smrg framebuffer */ 733b7e1c893Smrg 734b7e1c893Smrg Bool IsMobility; /* Mobile chips for laptops */ 735b7e1c893Smrg Bool IsIGP; /* IGP chips */ 736b7e1c893Smrg Bool HasSingleDAC; /* only TVDAC on chip */ 737b7e1c893Smrg Bool ddc_mode; /* Validate mode by matching exactly 738b7e1c893Smrg * the modes supported in DDC data 739b7e1c893Smrg */ 740b7e1c893Smrg Bool R300CGWorkaround; 741b7e1c893Smrg 742b7e1c893Smrg /* EDID or BIOS values for FPs */ 743b7e1c893Smrg int RefDivider; 744b7e1c893Smrg int FeedbackDivider; 745b7e1c893Smrg int PostDivider; 746b7e1c893Smrg Bool UseBiosDividers; 747b7e1c893Smrg /* EDID data using DDC interface */ 748b7e1c893Smrg Bool ddc_bios; 749b7e1c893Smrg Bool ddc1; 750b7e1c893Smrg Bool ddc2; 751b7e1c893Smrg 752b7e1c893Smrg RADEONPLLRec pll; 753b7e1c893Smrg 754b7e1c893Smrg int RamWidth; 755b7e1c893Smrg float sclk; /* in MHz */ 756b7e1c893Smrg float mclk; /* in MHz */ 757b7e1c893Smrg Bool IsDDR; 758b7e1c893Smrg int DispPriority; 759b7e1c893Smrg 760b7e1c893Smrg RADEONSavePtr SavedReg; /* Original (text) mode */ 761b7e1c893Smrg RADEONSavePtr ModeReg; /* Current mode */ 762b7e1c893Smrg Bool (*CloseScreen)(int, ScreenPtr); 763b7e1c893Smrg 764b7e1c893Smrg void (*BlockHandler)(int, pointer, pointer, pointer); 765b7e1c893Smrg 766b7e1c893Smrg Bool PaletteSavedOnVT; /* Palette saved on last VT switch */ 767b7e1c893Smrg 768b7e1c893Smrg xf86CursorInfoPtr cursor; 769b7e1c893Smrg#ifdef ARGB_CURSOR 770b7e1c893Smrg Bool cursor_argb; 771b7e1c893Smrg#endif 772b7e1c893Smrg int cursor_fg; 773b7e1c893Smrg int cursor_bg; 774b7e1c893Smrg 775b7e1c893Smrg int pix24bpp; /* Depth of pixmap for 24bpp fb */ 776b7e1c893Smrg Bool dac6bits; /* Use 6 bit DAC? */ 777b7e1c893Smrg 778b7e1c893Smrg DGAModePtr DGAModes; 779b7e1c893Smrg int numDGAModes; 780b7e1c893Smrg Bool DGAactive; 781b7e1c893Smrg int DGAViewportStatus; 782b7e1c893Smrg DGAFunctionRec DGAFuncs; 783b7e1c893Smrg 784b7e1c893Smrg RADEONFBLayout CurrentLayout; 785b7e1c893Smrg 786b7e1c893Smrg#ifdef XF86DRI 787b7e1c893Smrg Bool directRenderingEnabled; 788b7e1c893Smrg Bool directRenderingInited; 789b7e1c893Smrg RADEONCardType cardType; /* Current card is a PCI card */ 790b7e1c893Smrg struct radeon_cp *cp; 791b7e1c893Smrg struct radeon_dri *dri; 792b7e1c893Smrg#ifdef USE_EXA 793b7e1c893Smrg Bool accelDFS; 794b7e1c893Smrg#endif 795b7e1c893Smrg Bool DMAForXv; 796209ff23fSmrg#endif /* XF86DRI */ 797209ff23fSmrg 798b7e1c893Smrg /* accel */ 799b7e1c893Smrg Bool RenderAccel; /* Render */ 800b7e1c893Smrg Bool allowColorTiling; 801b7e1c893Smrg Bool tilingEnabled; /* mirror of sarea->tiling_enabled */ 802b7e1c893Smrg struct radeon_accel_state *accel_state; 803b7e1c893Smrg Bool accelOn; 804b7e1c893Smrg Bool useEXA; 805b7e1c893Smrg#ifdef USE_EXA 806b7e1c893Smrg XF86ModReqInfo exaReq; 807b7e1c893Smrg#endif 808b7e1c893Smrg#ifdef USE_XAA 809b7e1c893Smrg XF86ModReqInfo xaaReq; 810b7e1c893Smrg#endif 811b7e1c893Smrg 812209ff23fSmrg /* XVideo */ 813209ff23fSmrg XF86VideoAdaptorPtr adaptor; 814209ff23fSmrg void (*VideoTimerCallback)(ScrnInfoPtr, Time); 815209ff23fSmrg int videoKey; 816209ff23fSmrg int RageTheatreCrystal; 817209ff23fSmrg int RageTheatreTunerPort; 818209ff23fSmrg int RageTheatreCompositePort; 819209ff23fSmrg int RageTheatreSVideoPort; 820209ff23fSmrg int tunerType; 821209ff23fSmrg char* RageTheatreMicrocPath; 822209ff23fSmrg char* RageTheatreMicrocType; 823209ff23fSmrg Bool MM_TABLE_valid; 824209ff23fSmrg struct { 825209ff23fSmrg uint8_t table_revision; 826209ff23fSmrg uint8_t table_size; 827209ff23fSmrg uint8_t tuner_type; 828209ff23fSmrg uint8_t audio_chip; 829209ff23fSmrg uint8_t product_id; 830209ff23fSmrg uint8_t tuner_voltage_teletext_fm; 831209ff23fSmrg uint8_t i2s_config; /* configuration of the sound chip */ 832209ff23fSmrg uint8_t video_decoder_type; 833209ff23fSmrg uint8_t video_decoder_host_config; 834209ff23fSmrg uint8_t input[5]; 835209ff23fSmrg } MM_TABLE; 836209ff23fSmrg uint16_t video_decoder_type; 837209ff23fSmrg int overlay_scaler_buffer_width; 838209ff23fSmrg int ecp_div; 839209ff23fSmrg 840209ff23fSmrg /* general */ 841209ff23fSmrg Bool showCache; 842209ff23fSmrg OptionInfoPtr Options; 843209ff23fSmrg 844209ff23fSmrg DisplayModePtr currentMode, savedCurrentMode; 845209ff23fSmrg 846209ff23fSmrg /* special handlings for DELL triple-head server */ 847b7e1c893Smrg Bool IsDellServer; 848209ff23fSmrg 849209ff23fSmrg Bool VGAAccess; 850209ff23fSmrg 851209ff23fSmrg int MaxSurfaceWidth; 852209ff23fSmrg int MaxLines; 853209ff23fSmrg 854209ff23fSmrg Bool want_vblank_interrupts; 855209ff23fSmrg RADEONBIOSConnector BiosConnector[RADEON_MAX_BIOS_CONNECTOR]; 856b7e1c893Smrg radeon_encoder_ptr encoders[RADEON_MAX_BIOS_CONNECTOR]; 857209ff23fSmrg RADEONBIOSInitTable BiosTable; 858209ff23fSmrg 859209ff23fSmrg /* save crtc state for console restore */ 860209ff23fSmrg Bool crtc_on; 861209ff23fSmrg Bool crtc2_on; 862209ff23fSmrg 863209ff23fSmrg Bool InternalTVOut; 864209ff23fSmrg 865209ff23fSmrg#if defined(__powerpc__) 866209ff23fSmrg RADEONMacModel MacModel; 867209ff23fSmrg#endif 868209ff23fSmrg RADEONExtTMDSChip ext_tmds_chip; 869209ff23fSmrg 870209ff23fSmrg atomBiosHandlePtr atomBIOS; 871209ff23fSmrg unsigned long FbFreeStart, FbFreeSize; 872209ff23fSmrg unsigned char* BIOSCopy; 873209ff23fSmrg 874209ff23fSmrg Rotation rotation; 875209ff23fSmrg void (*PointerMoved)(int, int, int); 876209ff23fSmrg CreateScreenResourcesProcPtr CreateScreenResources; 877209ff23fSmrg 878209ff23fSmrg /* if no devices are connected at server startup */ 879209ff23fSmrg Bool first_load_no_devices; 880209ff23fSmrg 881209ff23fSmrg Bool IsSecondary; 882209ff23fSmrg Bool IsPrimary; 883209ff23fSmrg 884209ff23fSmrg Bool r600_shadow_fb; 885209ff23fSmrg void *fb_shadow; 886209ff23fSmrg 887b7e1c893Smrg /* some server chips have a hardcoded edid in the bios so that they work with KVMs */ 888b7e1c893Smrg Bool get_hardcoded_edid_from_bios; 889b7e1c893Smrg 890b7e1c893Smrg int virtualX; 891b7e1c893Smrg int virtualY; 892b7e1c893Smrg 893b7e1c893Smrg Bool r4xx_atom; 894b7e1c893Smrg 895209ff23fSmrg} RADEONInfoRec, *RADEONInfoPtr; 896209ff23fSmrg 897209ff23fSmrg#define RADEONWaitForFifo(pScrn, entries) \ 898209ff23fSmrgdo { \ 899b7e1c893Smrg if (info->accel_state->fifo_slots < entries) \ 900209ff23fSmrg RADEONWaitForFifoFunction(pScrn, entries); \ 901b7e1c893Smrg info->accel_state->fifo_slots -= entries; \ 902209ff23fSmrg} while (0) 903209ff23fSmrg 904209ff23fSmrg/* legacy_crtc.c */ 905209ff23fSmrgextern void legacy_crtc_dpms(xf86CrtcPtr crtc, int mode); 906209ff23fSmrgextern void legacy_crtc_mode_set(xf86CrtcPtr crtc, DisplayModePtr mode, 907209ff23fSmrg DisplayModePtr adjusted_mode, int x, int y); 908209ff23fSmrgextern void RADEONRestoreCommonRegisters(ScrnInfoPtr pScrn, 909209ff23fSmrg RADEONSavePtr restore); 910209ff23fSmrgextern void RADEONRestoreCrtcRegisters(ScrnInfoPtr pScrn, 911209ff23fSmrg RADEONSavePtr restore); 912209ff23fSmrgextern void RADEONRestoreCrtc2Registers(ScrnInfoPtr pScrn, 913209ff23fSmrg RADEONSavePtr restore); 914209ff23fSmrgextern void RADEONRestorePLLRegisters(ScrnInfoPtr pScrn, 915209ff23fSmrg RADEONSavePtr restore); 916209ff23fSmrgextern void RADEONRestorePLL2Registers(ScrnInfoPtr pScrn, 917209ff23fSmrg RADEONSavePtr restore); 918209ff23fSmrgextern void RADEONSaveCommonRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save); 919209ff23fSmrgextern void RADEONSaveCrtcRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save); 920209ff23fSmrgextern void RADEONSaveCrtc2Registers(ScrnInfoPtr pScrn, RADEONSavePtr save); 921209ff23fSmrgextern void RADEONSavePLLRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save); 922209ff23fSmrgextern void RADEONSavePLL2Registers(ScrnInfoPtr pScrn, RADEONSavePtr save); 923209ff23fSmrg 924209ff23fSmrg/* legacy_output.c */ 925b7e1c893Smrgextern RADEONMonitorType legacy_dac_detect(xf86OutputPtr output); 926209ff23fSmrgextern void legacy_output_dpms(xf86OutputPtr output, int mode); 927209ff23fSmrgextern void legacy_output_mode_set(xf86OutputPtr output, DisplayModePtr mode, 928209ff23fSmrg DisplayModePtr adjusted_mode); 929209ff23fSmrgextern I2CDevPtr RADEONDVODeviceInit(I2CBusPtr b, I2CSlaveAddr addr); 930209ff23fSmrgextern Bool RADEONDVOReadByte(I2CDevPtr dvo, int addr, uint8_t *ch); 931209ff23fSmrgextern Bool RADEONDVOWriteByte(I2CDevPtr dvo, int addr, uint8_t ch); 932209ff23fSmrgextern void RADEONRestoreDACRegisters(ScrnInfoPtr pScrn, RADEONSavePtr restore); 933209ff23fSmrgextern void RADEONRestoreFPRegisters(ScrnInfoPtr pScrn, RADEONSavePtr restore); 934209ff23fSmrgextern void RADEONRestoreFP2Registers(ScrnInfoPtr pScrn, RADEONSavePtr restore); 935209ff23fSmrgextern void RADEONRestoreLVDSRegisters(ScrnInfoPtr pScrn, RADEONSavePtr restore); 936209ff23fSmrgextern void RADEONRestoreRMXRegisters(ScrnInfoPtr pScrn, RADEONSavePtr restore); 937209ff23fSmrgextern void RADEONSaveDACRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save); 938209ff23fSmrgextern void RADEONSaveFPRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save); 939209ff23fSmrg 940b7e1c893Smrgextern void RADEONGetTVDacAdjInfo(ScrnInfoPtr pScrn, radeon_tvdac_ptr tvdac); 941b7e1c893Smrgextern void RADEONGetTMDSInfoFromTable(ScrnInfoPtr pScrn, radeon_tmds_ptr tmds); 942b7e1c893Smrgextern void RADEONGetTMDSInfo(ScrnInfoPtr pScrn, radeon_tmds_ptr tmds); 943b7e1c893Smrgextern void RADEONGetExtTMDSInfo(ScrnInfoPtr pScrn, radeon_dvo_ptr dvo); 944b7e1c893Smrgextern void RADEONGetLVDSInfo(ScrnInfoPtr pScrn, radeon_lvds_ptr lvds); 945b7e1c893Smrg 946209ff23fSmrg/* radeon_accel.c */ 947209ff23fSmrgextern Bool RADEONAccelInit(ScreenPtr pScreen); 948209ff23fSmrgextern void RADEONEngineFlush(ScrnInfoPtr pScrn); 949209ff23fSmrgextern void RADEONEngineInit(ScrnInfoPtr pScrn); 950209ff23fSmrgextern void RADEONEngineReset(ScrnInfoPtr pScrn); 951209ff23fSmrgextern void RADEONEngineRestore(ScrnInfoPtr pScrn); 952209ff23fSmrgextern uint8_t *RADEONHostDataBlit(ScrnInfoPtr pScrn, unsigned int cpp, 953209ff23fSmrg unsigned int w, uint32_t dstPitchOff, 954209ff23fSmrg uint32_t *bufPitch, int x, int *y, 955209ff23fSmrg unsigned int *h, unsigned int *hpass); 956209ff23fSmrgextern void RADEONHostDataBlitCopyPass(ScrnInfoPtr pScrn, 957209ff23fSmrg unsigned int bpp, 958209ff23fSmrg uint8_t *dst, uint8_t *src, 959209ff23fSmrg unsigned int hpass, 960209ff23fSmrg unsigned int dstPitch, 961209ff23fSmrg unsigned int srcPitch); 962209ff23fSmrgextern void RADEONCopySwap(uint8_t *dst, uint8_t *src, unsigned int size, int swap); 963209ff23fSmrgextern void RADEONHostDataParams(ScrnInfoPtr pScrn, uint8_t *dst, 964209ff23fSmrg uint32_t pitch, int cpp, 965209ff23fSmrg uint32_t *dstPitchOffset, int *x, int *y); 966209ff23fSmrgextern void RADEONInit3DEngine(ScrnInfoPtr pScrn); 967209ff23fSmrgextern void RADEONWaitForFifoFunction(ScrnInfoPtr pScrn, int entries); 968209ff23fSmrg#ifdef XF86DRI 969209ff23fSmrgextern drmBufPtr RADEONCPGetBuffer(ScrnInfoPtr pScrn); 970209ff23fSmrgextern void RADEONCPFlushIndirect(ScrnInfoPtr pScrn, int discard); 971209ff23fSmrgextern void RADEONCPReleaseIndirect(ScrnInfoPtr pScrn); 972209ff23fSmrgextern int RADEONCPStop(ScrnInfoPtr pScrn, RADEONInfoPtr info); 973209ff23fSmrg# ifdef USE_XAA 974209ff23fSmrgextern Bool RADEONSetupMemXAA_DRI(int scrnIndex, ScreenPtr pScreen); 975209ff23fSmrg# endif 976209ff23fSmrg#endif 977209ff23fSmrg 978209ff23fSmrg#ifdef USE_XAA 979209ff23fSmrg/* radeon_accelfuncs.c */ 980209ff23fSmrgextern void RADEONAccelInitMMIO(ScreenPtr pScreen, XAAInfoRecPtr a); 981209ff23fSmrgextern Bool RADEONSetupMemXAA(int scrnIndex, ScreenPtr pScreen); 982209ff23fSmrg#endif 983209ff23fSmrg 984209ff23fSmrg/* radeon_bios.c */ 985209ff23fSmrgextern Bool RADEONGetBIOSInfo(ScrnInfoPtr pScrn, xf86Int10InfoPtr pInt10); 986209ff23fSmrgextern Bool RADEONGetClockInfoFromBIOS(ScrnInfoPtr pScrn); 987209ff23fSmrgextern Bool RADEONGetConnectorInfoFromBIOS(ScrnInfoPtr pScrn); 988b7e1c893Smrgextern Bool RADEONGetDAC2InfoFromBIOS(ScrnInfoPtr pScrn, radeon_tvdac_ptr tvdac); 989b7e1c893Smrgextern Bool RADEONGetExtTMDSInfoFromBIOS (ScrnInfoPtr pScrn, radeon_dvo_ptr dvo); 990b7e1c893Smrgextern xf86MonPtr RADEONGetHardCodedEDIDFromBIOS(xf86OutputPtr output); 991209ff23fSmrgextern Bool RADEONGetBIOSInitTableOffsets(ScrnInfoPtr pScrn); 992b7e1c893Smrgextern Bool RADEONGetLVDSInfoFromBIOS(ScrnInfoPtr pScrn, radeon_lvds_ptr lvds); 993b7e1c893Smrgextern Bool RADEONGetTMDSInfoFromBIOS(ScrnInfoPtr pScrn, radeon_tmds_ptr tmds); 994209ff23fSmrgextern Bool RADEONGetTVInfoFromBIOS(xf86OutputPtr output); 995209ff23fSmrgextern Bool RADEONInitExtTMDSInfoFromBIOS (xf86OutputPtr output); 996209ff23fSmrgextern Bool RADEONPostCardFromBIOSTables(ScrnInfoPtr pScrn); 997b7e1c893Smrgextern Bool radeon_card_posted(ScrnInfoPtr pScrn); 998209ff23fSmrg 999209ff23fSmrg/* radeon_commonfuncs.c */ 1000209ff23fSmrg#ifdef XF86DRI 1001209ff23fSmrgextern void RADEONWaitForIdleCP(ScrnInfoPtr pScrn); 1002b7e1c893Smrgextern void RADEONWaitForVLineCP(ScrnInfoPtr pScrn, PixmapPtr pPix, 1003b7e1c893Smrg int crtc, int start, int stop); 1004209ff23fSmrg#endif 1005209ff23fSmrgextern void RADEONWaitForIdleMMIO(ScrnInfoPtr pScrn); 1006b7e1c893Smrgextern void RADEONWaitForVLineMMIO(ScrnInfoPtr pScrn, PixmapPtr pPix, 1007b7e1c893Smrg int crtc, int start, int stop); 1008209ff23fSmrg 1009209ff23fSmrg/* radeon_crtc.c */ 1010209ff23fSmrgextern void radeon_crtc_dpms(xf86CrtcPtr crtc, int mode); 1011209ff23fSmrgextern void radeon_crtc_load_lut(xf86CrtcPtr crtc); 1012209ff23fSmrgextern void radeon_crtc_modeset_ioctl(xf86CrtcPtr crtc, Bool post); 1013209ff23fSmrgextern Bool RADEONAllocateControllers(ScrnInfoPtr pScrn, int mask); 1014209ff23fSmrgextern void RADEONBlank(ScrnInfoPtr pScrn); 1015209ff23fSmrgextern void RADEONComputePLL(RADEONPLLPtr pll, unsigned long freq, 1016209ff23fSmrg uint32_t *chosen_dot_clock_freq, 1017209ff23fSmrg uint32_t *chosen_feedback_div, 1018209ff23fSmrg uint32_t *chosen_reference_div, 1019209ff23fSmrg uint32_t *chosen_post_div, int flags); 1020209ff23fSmrgextern DisplayModePtr RADEONCrtcFindClosestMode(xf86CrtcPtr crtc, 1021209ff23fSmrg DisplayModePtr pMode); 1022209ff23fSmrgextern void RADEONUnblank(ScrnInfoPtr pScrn); 1023209ff23fSmrgextern Bool RADEONSetTiling(ScrnInfoPtr pScrn); 1024b7e1c893Smrgextern void RADEONInitDispBandwidth(ScrnInfoPtr pScrn); 1025209ff23fSmrg 1026209ff23fSmrg/* radeon_cursor.c */ 1027209ff23fSmrgextern Bool RADEONCursorInit(ScreenPtr pScreen); 1028209ff23fSmrgextern void radeon_crtc_hide_cursor(xf86CrtcPtr crtc); 1029209ff23fSmrgextern void radeon_crtc_load_cursor_argb(xf86CrtcPtr crtc, CARD32 *image); 1030209ff23fSmrgextern void radeon_crtc_set_cursor_colors(xf86CrtcPtr crtc, int bg, int fg); 1031209ff23fSmrgextern void radeon_crtc_set_cursor_position(xf86CrtcPtr crtc, int x, int y); 1032209ff23fSmrgextern void radeon_crtc_show_cursor(xf86CrtcPtr crtc); 1033209ff23fSmrg 1034209ff23fSmrg/* radeon_dga.c */ 1035209ff23fSmrgextern Bool RADEONDGAInit(ScreenPtr pScreen); 1036209ff23fSmrg 1037209ff23fSmrg#ifdef XF86DRI 1038209ff23fSmrg/* radeon_dri.c */ 1039209ff23fSmrgextern void RADEONDRIAllocatePCIGARTTable(ScreenPtr pScreen); 1040209ff23fSmrgextern void RADEONDRICloseScreen(ScreenPtr pScreen); 1041209ff23fSmrgextern Bool RADEONDRIFinishScreenInit(ScreenPtr pScreen); 1042209ff23fSmrgextern int RADEONDRIGetPciAperTableSize(ScrnInfoPtr pScrn); 1043209ff23fSmrgextern Bool RADEONDRIGetVersion(ScrnInfoPtr pScrn); 1044209ff23fSmrgextern void RADEONDRIResume(ScreenPtr pScreen); 1045209ff23fSmrgextern Bool RADEONDRIScreenInit(ScreenPtr pScreen); 1046209ff23fSmrgextern int RADEONDRISetParam(ScrnInfoPtr pScrn, 1047209ff23fSmrg unsigned int param, int64_t value); 1048209ff23fSmrgextern Bool RADEONDRISetVBlankInterrupt(ScrnInfoPtr pScrn, Bool on); 1049209ff23fSmrgextern void RADEONDRIStop(ScreenPtr pScreen); 1050209ff23fSmrg#endif 1051209ff23fSmrg 1052209ff23fSmrg/* radeon_driver.c */ 1053209ff23fSmrgextern void RADEONDoAdjustFrame(ScrnInfoPtr pScrn, int x, int y, Bool clone); 1054209ff23fSmrgextern void RADEONChangeSurfaces(ScrnInfoPtr pScrn); 1055209ff23fSmrgextern RADEONEntPtr RADEONEntPriv(ScrnInfoPtr pScrn); 1056209ff23fSmrgextern int RADEONMinBits(int val); 1057209ff23fSmrgextern unsigned RADEONINMC(ScrnInfoPtr pScrn, int addr); 1058209ff23fSmrgextern unsigned RADEONINPLL(ScrnInfoPtr pScrn, int addr); 1059b7e1c893Smrgextern unsigned RADEONINPCIE(ScrnInfoPtr pScrn, int addr); 1060209ff23fSmrgextern void RADEONOUTMC(ScrnInfoPtr pScrn, int addr, uint32_t data); 1061209ff23fSmrgextern void RADEONOUTPLL(ScrnInfoPtr pScrn, int addr, uint32_t data); 1062b7e1c893Smrgextern void RADEONOUTPCIE(ScrnInfoPtr pScrn, int addr, uint32_t data); 1063209ff23fSmrgextern void RADEONPllErrataAfterData(RADEONInfoPtr info); 1064209ff23fSmrgextern void RADEONPllErrataAfterIndex(RADEONInfoPtr info); 1065209ff23fSmrgextern void RADEONWaitForVerticalSync(ScrnInfoPtr pScrn); 1066209ff23fSmrgextern void RADEONWaitForVerticalSync2(ScrnInfoPtr pScrn); 1067209ff23fSmrgextern void RADEONInitMemMapRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save, 1068209ff23fSmrg RADEONInfoPtr info); 1069209ff23fSmrgextern void RADEONRestoreMemMapRegisters(ScrnInfoPtr pScrn, 1070209ff23fSmrg RADEONSavePtr restore); 1071209ff23fSmrg 1072209ff23fSmrg#ifdef USE_EXA 1073209ff23fSmrg/* radeon_exa.c */ 1074209ff23fSmrgextern Bool RADEONSetupMemEXA(ScreenPtr pScreen); 1075209ff23fSmrg 1076209ff23fSmrg/* radeon_exa_funcs.c */ 1077209ff23fSmrgextern void RADEONCopyCP(PixmapPtr pDst, int srcX, int srcY, int dstX, 1078209ff23fSmrg int dstY, int w, int h); 1079209ff23fSmrgextern void RADEONCopyMMIO(PixmapPtr pDst, int srcX, int srcY, int dstX, 1080209ff23fSmrg int dstY, int w, int h); 1081209ff23fSmrgextern Bool RADEONDrawInitCP(ScreenPtr pScreen); 1082209ff23fSmrgextern Bool RADEONDrawInitMMIO(ScreenPtr pScreen); 1083209ff23fSmrgextern void RADEONDoPrepareCopyCP(ScrnInfoPtr pScrn, 1084209ff23fSmrg uint32_t src_pitch_offset, 1085209ff23fSmrg uint32_t dst_pitch_offset, 1086209ff23fSmrg uint32_t datatype, int rop, 1087209ff23fSmrg Pixel planemask); 1088209ff23fSmrgextern void RADEONDoPrepareCopyMMIO(ScrnInfoPtr pScrn, 1089209ff23fSmrg uint32_t src_pitch_offset, 1090209ff23fSmrg uint32_t dst_pitch_offset, 1091209ff23fSmrg uint32_t datatype, int rop, 1092209ff23fSmrg Pixel planemask); 1093b7e1c893Smrgextern Bool R600DrawInit(ScreenPtr pScreen); 1094b7e1c893Smrgextern Bool R600LoadShaders(ScrnInfoPtr pScrn); 1095209ff23fSmrg#endif 1096209ff23fSmrg 1097209ff23fSmrg#if defined(XF86DRI) && defined(USE_EXA) 1098209ff23fSmrg/* radeon_exa.c */ 1099209ff23fSmrgextern Bool RADEONGetDatatypeBpp(int bpp, uint32_t *type); 1100209ff23fSmrgextern Bool RADEONGetPixmapOffsetPitch(PixmapPtr pPix, 1101209ff23fSmrg uint32_t *pitch_offset); 1102209ff23fSmrgextern unsigned long long RADEONTexOffsetStart(PixmapPtr pPix); 1103209ff23fSmrg#endif 1104209ff23fSmrg 1105209ff23fSmrg/* radeon_modes.c */ 1106209ff23fSmrgextern void RADEONSetPitch(ScrnInfoPtr pScrn); 1107209ff23fSmrgextern DisplayModePtr RADEONProbeOutputModes(xf86OutputPtr output); 1108209ff23fSmrg 1109209ff23fSmrg/* radeon_output.c */ 1110209ff23fSmrgextern RADEONI2CBusRec atom_setup_i2c_bus(int ddc_line); 1111209ff23fSmrgextern RADEONI2CBusRec legacy_setup_i2c_bus(int ddc_line); 1112209ff23fSmrgextern void RADEONGetPanelInfo(ScrnInfoPtr pScrn); 1113209ff23fSmrgextern void RADEONInitConnector(xf86OutputPtr output); 1114209ff23fSmrgextern void RADEONPrintPortMap(ScrnInfoPtr pScrn); 1115209ff23fSmrgextern void RADEONSetOutputType(ScrnInfoPtr pScrn, 1116209ff23fSmrg RADEONOutputPrivatePtr radeon_output); 1117209ff23fSmrgextern Bool RADEONSetupConnectors(ScrnInfoPtr pScrn); 1118c503f109Smrgextern Bool RADEONI2CDoLock(xf86OutputPtr output, I2CBusPtr b, Bool lock_state); 1119b7e1c893Smrg 1120209ff23fSmrg 1121209ff23fSmrg/* radeon_tv.c */ 1122209ff23fSmrgextern void RADEONSaveTVRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save); 1123209ff23fSmrgextern void RADEONAdjustCrtcRegistersForTV(ScrnInfoPtr pScrn, RADEONSavePtr save, 1124209ff23fSmrg DisplayModePtr mode, xf86OutputPtr output); 1125209ff23fSmrgextern void RADEONAdjustPLLRegistersForTV(ScrnInfoPtr pScrn, RADEONSavePtr save, 1126209ff23fSmrg DisplayModePtr mode, xf86OutputPtr output); 1127209ff23fSmrgextern void RADEONAdjustCrtc2RegistersForTV(ScrnInfoPtr pScrn, RADEONSavePtr save, 1128209ff23fSmrg DisplayModePtr mode, xf86OutputPtr output); 1129209ff23fSmrgextern void RADEONAdjustPLL2RegistersForTV(ScrnInfoPtr pScrn, RADEONSavePtr save, 1130209ff23fSmrg DisplayModePtr mode, xf86OutputPtr output); 1131209ff23fSmrgextern void RADEONInitTVRegisters(xf86OutputPtr output, RADEONSavePtr save, 1132209ff23fSmrg DisplayModePtr mode, BOOL IsPrimary); 1133209ff23fSmrgextern void RADEONRestoreTVRegisters(ScrnInfoPtr pScrn, RADEONSavePtr restore); 1134209ff23fSmrgextern void RADEONUpdateHVPosition(xf86OutputPtr output, DisplayModePtr mode); 1135209ff23fSmrg 1136209ff23fSmrg/* radeon_video.c */ 1137209ff23fSmrgextern void RADEONInitVideo(ScreenPtr pScreen); 1138209ff23fSmrgextern void RADEONResetVideo(ScrnInfoPtr pScrn); 1139209ff23fSmrg 1140b7e1c893Smrg/* radeon_legacy_memory.c */ 1141b7e1c893Smrgextern uint32_t 1142b7e1c893Smrgradeon_legacy_allocate_memory(ScrnInfoPtr pScrn, 1143b7e1c893Smrg void **mem_struct, 1144b7e1c893Smrg int size, 1145b7e1c893Smrg int align); 1146b7e1c893Smrgextern void 1147b7e1c893Smrgradeon_legacy_free_memory(ScrnInfoPtr pScrn, 1148b7e1c893Smrg void *mem_struct); 1149b7e1c893Smrg 1150209ff23fSmrg#ifdef XF86DRI 1151209ff23fSmrg# ifdef USE_XAA 1152209ff23fSmrg/* radeon_accelfuncs.c */ 1153209ff23fSmrgextern void RADEONAccelInitCP(ScreenPtr pScreen, XAAInfoRecPtr a); 1154209ff23fSmrg# endif 1155209ff23fSmrg 1156209ff23fSmrg#define RADEONCP_START(pScrn, info) \ 1157209ff23fSmrgdo { \ 1158b7e1c893Smrg int _ret = drmCommandNone(info->dri->drmFD, DRM_RADEON_CP_START); \ 1159209ff23fSmrg if (_ret) { \ 1160209ff23fSmrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \ 1161209ff23fSmrg "%s: CP start %d\n", __FUNCTION__, _ret); \ 1162209ff23fSmrg } \ 1163b7e1c893Smrg info->cp->CPStarted = TRUE; \ 1164209ff23fSmrg} while (0) 1165209ff23fSmrg 1166209ff23fSmrg#define RADEONCP_RELEASE(pScrn, info) \ 1167209ff23fSmrgdo { \ 1168b7e1c893Smrg if (info->cp->CPInUse) { \ 1169209ff23fSmrg RADEON_PURGE_CACHE(); \ 1170209ff23fSmrg RADEON_WAIT_UNTIL_IDLE(); \ 1171209ff23fSmrg RADEONCPReleaseIndirect(pScrn); \ 1172b7e1c893Smrg info->cp->CPInUse = FALSE; \ 1173209ff23fSmrg } \ 1174209ff23fSmrg} while (0) 1175209ff23fSmrg 1176209ff23fSmrg#define RADEONCP_STOP(pScrn, info) \ 1177209ff23fSmrgdo { \ 1178209ff23fSmrg int _ret; \ 1179b7e1c893Smrg if (info->cp->CPStarted) { \ 1180209ff23fSmrg _ret = RADEONCPStop(pScrn, info); \ 1181209ff23fSmrg if (_ret) { \ 1182209ff23fSmrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \ 1183209ff23fSmrg "%s: CP stop %d\n", __FUNCTION__, _ret); \ 1184209ff23fSmrg } \ 1185b7e1c893Smrg info->cp->CPStarted = FALSE; \ 1186b7e1c893Smrg } \ 1187b7e1c893Smrg if (info->ChipFamily < CHIP_FAMILY_R600) \ 1188b7e1c893Smrg RADEONEngineRestore(pScrn); \ 1189b7e1c893Smrg info->cp->CPRuns = FALSE; \ 1190209ff23fSmrg} while (0) 1191209ff23fSmrg 1192209ff23fSmrg#define RADEONCP_RESET(pScrn, info) \ 1193209ff23fSmrgdo { \ 1194b7e1c893Smrg int _ret = drmCommandNone(info->dri->drmFD, DRM_RADEON_CP_RESET); \ 1195209ff23fSmrg if (_ret) { \ 1196209ff23fSmrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \ 1197209ff23fSmrg "%s: CP reset %d\n", __FUNCTION__, _ret); \ 1198209ff23fSmrg } \ 1199209ff23fSmrg} while (0) 1200209ff23fSmrg 1201209ff23fSmrg#define RADEONCP_REFRESH(pScrn, info) \ 1202209ff23fSmrgdo { \ 1203b7e1c893Smrg if (!info->cp->CPInUse) { \ 1204b7e1c893Smrg if (info->cp->needCacheFlush) { \ 1205209ff23fSmrg RADEON_PURGE_CACHE(); \ 1206209ff23fSmrg RADEON_PURGE_ZCACHE(); \ 1207b7e1c893Smrg info->cp->needCacheFlush = FALSE; \ 1208209ff23fSmrg } \ 1209209ff23fSmrg RADEON_WAIT_UNTIL_IDLE(); \ 1210b7e1c893Smrg info->cp->CPInUse = TRUE; \ 1211209ff23fSmrg } \ 1212209ff23fSmrg} while (0) 1213209ff23fSmrg 1214209ff23fSmrg 1215209ff23fSmrg#define CP_PACKET0(reg, n) \ 1216209ff23fSmrg (RADEON_CP_PACKET0 | ((n) << 16) | ((reg) >> 2)) 1217209ff23fSmrg#define CP_PACKET1(reg0, reg1) \ 1218209ff23fSmrg (RADEON_CP_PACKET1 | (((reg1) >> 2) << 11) | ((reg0) >> 2)) 1219209ff23fSmrg#define CP_PACKET2() \ 1220209ff23fSmrg (RADEON_CP_PACKET2) 1221209ff23fSmrg#define CP_PACKET3(pkt, n) \ 1222209ff23fSmrg (RADEON_CP_PACKET3 | (pkt) | ((n) << 16)) 1223209ff23fSmrg 1224209ff23fSmrg 1225209ff23fSmrg#define RADEON_VERBOSE 0 1226209ff23fSmrg 1227209ff23fSmrg#define RING_LOCALS uint32_t *__head = NULL; int __expected; int __count = 0 1228209ff23fSmrg 1229209ff23fSmrg#define BEGIN_RING(n) do { \ 1230209ff23fSmrg if (RADEON_VERBOSE) { \ 1231209ff23fSmrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ 1232209ff23fSmrg "BEGIN_RING(%d) in %s\n", (unsigned int)n, __FUNCTION__);\ 1233209ff23fSmrg } \ 1234b7e1c893Smrg if (++info->cp->dma_begin_count != 1) { \ 1235209ff23fSmrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \ 1236209ff23fSmrg "BEGIN_RING without end at %s:%d\n", \ 1237b7e1c893Smrg info->cp->dma_debug_func, info->cp->dma_debug_lineno); \ 1238b7e1c893Smrg info->cp->dma_begin_count = 1; \ 1239209ff23fSmrg } \ 1240b7e1c893Smrg info->cp->dma_debug_func = __FILE__; \ 1241b7e1c893Smrg info->cp->dma_debug_lineno = __LINE__; \ 1242b7e1c893Smrg if (!info->cp->indirectBuffer) { \ 1243b7e1c893Smrg info->cp->indirectBuffer = RADEONCPGetBuffer(pScrn); \ 1244b7e1c893Smrg info->cp->indirectStart = 0; \ 1245b7e1c893Smrg } else if (info->cp->indirectBuffer->used + (n) * (int)sizeof(uint32_t) > \ 1246b7e1c893Smrg info->cp->indirectBuffer->total) { \ 1247209ff23fSmrg RADEONCPFlushIndirect(pScrn, 1); \ 1248209ff23fSmrg } \ 1249209ff23fSmrg __expected = n; \ 1250b7e1c893Smrg __head = (pointer)((char *)info->cp->indirectBuffer->address + \ 1251b7e1c893Smrg info->cp->indirectBuffer->used); \ 1252209ff23fSmrg __count = 0; \ 1253209ff23fSmrg} while (0) 1254209ff23fSmrg 1255209ff23fSmrg#define ADVANCE_RING() do { \ 1256b7e1c893Smrg if (info->cp->dma_begin_count-- != 1) { \ 1257209ff23fSmrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \ 1258209ff23fSmrg "ADVANCE_RING without begin at %s:%d\n", \ 1259209ff23fSmrg __FILE__, __LINE__); \ 1260b7e1c893Smrg info->cp->dma_begin_count = 0; \ 1261209ff23fSmrg } \ 1262209ff23fSmrg if (__count != __expected) { \ 1263209ff23fSmrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \ 1264209ff23fSmrg "ADVANCE_RING count != expected (%d vs %d) at %s:%d\n", \ 1265209ff23fSmrg __count, __expected, __FILE__, __LINE__); \ 1266209ff23fSmrg } \ 1267209ff23fSmrg if (RADEON_VERBOSE) { \ 1268209ff23fSmrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ 1269209ff23fSmrg "ADVANCE_RING() start: %d used: %d count: %d\n", \ 1270b7e1c893Smrg info->cp->indirectStart, \ 1271b7e1c893Smrg info->cp->indirectBuffer->used, \ 1272209ff23fSmrg __count * (int)sizeof(uint32_t)); \ 1273209ff23fSmrg } \ 1274b7e1c893Smrg info->cp->indirectBuffer->used += __count * (int)sizeof(uint32_t); \ 1275209ff23fSmrg} while (0) 1276209ff23fSmrg 1277209ff23fSmrg#define OUT_RING(x) do { \ 1278209ff23fSmrg if (RADEON_VERBOSE) { \ 1279209ff23fSmrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ 1280209ff23fSmrg " OUT_RING(0x%08x)\n", (unsigned int)(x)); \ 1281209ff23fSmrg } \ 1282209ff23fSmrg __head[__count++] = (x); \ 1283209ff23fSmrg} while (0) 1284209ff23fSmrg 1285209ff23fSmrg#define OUT_RING_REG(reg, val) \ 1286209ff23fSmrgdo { \ 1287209ff23fSmrg OUT_RING(CP_PACKET0(reg, 0)); \ 1288209ff23fSmrg OUT_RING(val); \ 1289209ff23fSmrg} while (0) 1290209ff23fSmrg 1291209ff23fSmrg#define FLUSH_RING() \ 1292209ff23fSmrgdo { \ 1293209ff23fSmrg if (RADEON_VERBOSE) \ 1294209ff23fSmrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ 1295209ff23fSmrg "FLUSH_RING in %s\n", __FUNCTION__); \ 1296b7e1c893Smrg if (info->cp->indirectBuffer) \ 1297209ff23fSmrg RADEONCPFlushIndirect(pScrn, 0); \ 1298209ff23fSmrg} while (0) 1299209ff23fSmrg 1300209ff23fSmrg 1301209ff23fSmrg#define RADEON_WAIT_UNTIL_2D_IDLE() \ 1302209ff23fSmrgdo { \ 1303b7e1c893Smrg if (info->ChipFamily < CHIP_FAMILY_R600) { \ 1304b7e1c893Smrg BEGIN_RING(2); \ 1305b7e1c893Smrg OUT_RING(CP_PACKET0(RADEON_WAIT_UNTIL, 0)); \ 1306b7e1c893Smrg OUT_RING((RADEON_WAIT_2D_IDLECLEAN | \ 1307b7e1c893Smrg RADEON_WAIT_HOST_IDLECLEAN)); \ 1308b7e1c893Smrg ADVANCE_RING(); \ 1309b7e1c893Smrg } \ 1310209ff23fSmrg} while (0) 1311209ff23fSmrg 1312209ff23fSmrg#define RADEON_WAIT_UNTIL_3D_IDLE() \ 1313209ff23fSmrgdo { \ 1314b7e1c893Smrg if (info->ChipFamily < CHIP_FAMILY_R600) { \ 1315b7e1c893Smrg BEGIN_RING(2); \ 1316b7e1c893Smrg OUT_RING(CP_PACKET0(RADEON_WAIT_UNTIL, 0)); \ 1317b7e1c893Smrg OUT_RING((RADEON_WAIT_3D_IDLECLEAN | \ 1318b7e1c893Smrg RADEON_WAIT_HOST_IDLECLEAN)); \ 1319b7e1c893Smrg ADVANCE_RING(); \ 1320b7e1c893Smrg } \ 1321209ff23fSmrg} while (0) 1322209ff23fSmrg 1323209ff23fSmrg#define RADEON_WAIT_UNTIL_IDLE() \ 1324209ff23fSmrgdo { \ 1325209ff23fSmrg if (RADEON_VERBOSE) { \ 1326209ff23fSmrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ 1327209ff23fSmrg "WAIT_UNTIL_IDLE() in %s\n", __FUNCTION__); \ 1328209ff23fSmrg } \ 1329b7e1c893Smrg if (info->ChipFamily < CHIP_FAMILY_R600) { \ 1330b7e1c893Smrg BEGIN_RING(2); \ 1331b7e1c893Smrg OUT_RING(CP_PACKET0(RADEON_WAIT_UNTIL, 0)); \ 1332b7e1c893Smrg OUT_RING((RADEON_WAIT_2D_IDLECLEAN | \ 1333b7e1c893Smrg RADEON_WAIT_3D_IDLECLEAN | \ 1334b7e1c893Smrg RADEON_WAIT_HOST_IDLECLEAN)); \ 1335b7e1c893Smrg ADVANCE_RING(); \ 1336b7e1c893Smrg } \ 1337209ff23fSmrg} while (0) 1338209ff23fSmrg 1339209ff23fSmrg#define RADEON_PURGE_CACHE() \ 1340209ff23fSmrgdo { \ 1341b7e1c893Smrg if (info->ChipFamily < CHIP_FAMILY_R600) { \ 1342b7e1c893Smrg BEGIN_RING(2); \ 1343b7e1c893Smrg if (info->ChipFamily <= CHIP_FAMILY_RV280) { \ 1344b7e1c893Smrg OUT_RING(CP_PACKET0(RADEON_RB3D_DSTCACHE_CTLSTAT, 0)); \ 1345b7e1c893Smrg OUT_RING(RADEON_RB3D_DC_FLUSH_ALL); \ 1346b7e1c893Smrg } else { \ 1347b7e1c893Smrg OUT_RING(CP_PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0)); \ 1348b7e1c893Smrg OUT_RING(R300_RB3D_DC_FLUSH_ALL); \ 1349b7e1c893Smrg } \ 1350b7e1c893Smrg ADVANCE_RING(); \ 1351b7e1c893Smrg } \ 1352209ff23fSmrg} while (0) 1353209ff23fSmrg 1354209ff23fSmrg#define RADEON_PURGE_ZCACHE() \ 1355209ff23fSmrgdo { \ 1356b7e1c893Smrg if (info->ChipFamily < CHIP_FAMILY_R600) { \ 1357b7e1c893Smrg BEGIN_RING(2); \ 1358b7e1c893Smrg if (info->ChipFamily <= CHIP_FAMILY_RV280) { \ 1359b7e1c893Smrg OUT_RING(CP_PACKET0(RADEON_RB3D_ZCACHE_CTLSTAT, 0)); \ 1360b7e1c893Smrg OUT_RING(RADEON_RB3D_ZC_FLUSH_ALL); \ 1361b7e1c893Smrg } else { \ 1362b7e1c893Smrg OUT_RING(CP_PACKET0(R300_RB3D_ZCACHE_CTLSTAT, 0)); \ 1363b7e1c893Smrg OUT_RING(R300_ZC_FLUSH_ALL); \ 1364b7e1c893Smrg } \ 1365b7e1c893Smrg ADVANCE_RING(); \ 1366209ff23fSmrg } \ 1367209ff23fSmrg} while (0) 1368209ff23fSmrg 1369209ff23fSmrg#endif /* XF86DRI */ 1370209ff23fSmrg 1371b7e1c893Smrg#if defined(XF86DRI) && defined(USE_EXA) 1372b7e1c893Smrg#define RADEON_SWITCH_TO_2D() \ 1373b7e1c893Smrgdo { \ 1374b7e1c893Smrg uint32_t flush = 0; \ 1375b7e1c893Smrg switch (info->accel_state->engineMode) { \ 1376b7e1c893Smrg case EXA_ENGINEMODE_UNKNOWN: \ 1377b7e1c893Smrg case EXA_ENGINEMODE_3D: \ 1378b7e1c893Smrg flush = 1; \ 1379b7e1c893Smrg case EXA_ENGINEMODE_2D: \ 1380b7e1c893Smrg break; \ 1381b7e1c893Smrg } \ 1382b7e1c893Smrg if (flush && info->directRenderingEnabled) \ 1383b7e1c893Smrg RADEONCPFlushIndirect(pScrn, 1); \ 1384b7e1c893Smrg info->accel_state->engineMode = EXA_ENGINEMODE_2D; \ 1385b7e1c893Smrg} while (0); 1386b7e1c893Smrg 1387b7e1c893Smrg#define RADEON_SWITCH_TO_3D() \ 1388b7e1c893Smrgdo { \ 1389b7e1c893Smrg uint32_t flush = 0; \ 1390b7e1c893Smrg switch (info->accel_state->engineMode) { \ 1391b7e1c893Smrg case EXA_ENGINEMODE_UNKNOWN: \ 1392b7e1c893Smrg case EXA_ENGINEMODE_2D: \ 1393b7e1c893Smrg flush = 1; \ 1394b7e1c893Smrg case EXA_ENGINEMODE_3D: \ 1395b7e1c893Smrg break; \ 1396b7e1c893Smrg } \ 1397b7e1c893Smrg if (flush) { \ 1398b7e1c893Smrg if (info->directRenderingEnabled) \ 1399b7e1c893Smrg RADEONCPFlushIndirect(pScrn, 1); \ 1400b7e1c893Smrg RADEONInit3DEngine(pScrn); \ 1401b7e1c893Smrg } \ 1402b7e1c893Smrg info->accel_state->engineMode = EXA_ENGINEMODE_3D; \ 1403b7e1c893Smrg} while (0); 1404b7e1c893Smrg#else 1405b7e1c893Smrg#define RADEON_SWITCH_TO_2D() 1406b7e1c893Smrg#define RADEON_SWITCH_TO_3D() 1407b7e1c893Smrg#endif 1408b7e1c893Smrg 1409209ff23fSmrgstatic __inline__ void RADEON_MARK_SYNC(RADEONInfoPtr info, ScrnInfoPtr pScrn) 1410209ff23fSmrg{ 1411209ff23fSmrg#ifdef USE_EXA 1412209ff23fSmrg if (info->useEXA) 1413209ff23fSmrg exaMarkSync(pScrn->pScreen); 1414209ff23fSmrg#endif 1415209ff23fSmrg#ifdef USE_XAA 1416209ff23fSmrg if (!info->useEXA) 1417b7e1c893Smrg SET_SYNC_FLAG(info->accel_state->accel); 1418209ff23fSmrg#endif 1419209ff23fSmrg} 1420209ff23fSmrg 1421209ff23fSmrgstatic __inline__ void RADEON_SYNC(RADEONInfoPtr info, ScrnInfoPtr pScrn) 1422209ff23fSmrg{ 1423209ff23fSmrg#ifdef USE_EXA 1424b7e1c893Smrg if (info->useEXA && pScrn->pScreen) 1425209ff23fSmrg exaWaitSync(pScrn->pScreen); 1426209ff23fSmrg#endif 1427209ff23fSmrg#ifdef USE_XAA 1428b7e1c893Smrg if (!info->useEXA && info->accel_state->accel) 1429b7e1c893Smrg info->accel_state->accel->Sync(pScrn); 1430209ff23fSmrg#endif 1431209ff23fSmrg} 1432209ff23fSmrg 1433209ff23fSmrgstatic __inline__ void radeon_init_timeout(struct timeval *endtime, 1434209ff23fSmrg unsigned int timeout) 1435209ff23fSmrg{ 1436209ff23fSmrg gettimeofday(endtime, NULL); 1437209ff23fSmrg endtime->tv_usec += timeout; 1438209ff23fSmrg endtime->tv_sec += endtime->tv_usec / 1000000; 1439209ff23fSmrg endtime->tv_usec %= 1000000; 1440209ff23fSmrg} 1441209ff23fSmrg 1442209ff23fSmrgstatic __inline__ int radeon_timedout(const struct timeval *endtime) 1443209ff23fSmrg{ 1444209ff23fSmrg struct timeval now; 1445209ff23fSmrg gettimeofday(&now, NULL); 1446209ff23fSmrg return now.tv_sec == endtime->tv_sec ? 1447209ff23fSmrg now.tv_usec > endtime->tv_usec : now.tv_sec > endtime->tv_sec; 1448209ff23fSmrg} 1449209ff23fSmrg 1450209ff23fSmrg#endif /* _RADEON_H_ */ 1451