radeon.h revision b13dfe66
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" 78ad43ddacSmrg#include "radeon_drm.h" 79b7e1c893Smrg 80209ff23fSmrg#ifdef DAMAGE 81209ff23fSmrg#include "damage.h" 82209ff23fSmrg#include "globals.h" 83209ff23fSmrg#endif 84209ff23fSmrg#endif 85209ff23fSmrg 86209ff23fSmrg#include "xf86Crtc.h" 87209ff23fSmrg#include "X11/Xatom.h" 88209ff23fSmrg 89ad43ddacSmrg#ifdef XF86DRM_MODE 90ad43ddacSmrg#include "radeon_bo.h" 91ad43ddacSmrg#include "radeon_cs.h" 92ad43ddacSmrg#include "radeon_dri2.h" 93ad43ddacSmrg#include "drmmode_display.h" 94ad43ddacSmrg#else 95ad43ddacSmrg#include "radeon_dummy_bufmgr.h" 96ad43ddacSmrg#endif 97ad43ddacSmrg 98209ff23fSmrg /* Render support */ 99209ff23fSmrg#ifdef RENDER 100209ff23fSmrg#include "picturestr.h" 101209ff23fSmrg#endif 102209ff23fSmrg 103ad43ddacSmrg#include "simple_list.h" 104209ff23fSmrg#include "atipcirename.h" 105209ff23fSmrg 106209ff23fSmrg#ifndef MAX 107209ff23fSmrg#define MAX(a,b) ((a)>(b)?(a):(b)) 108209ff23fSmrg#endif 109209ff23fSmrg#ifndef MIN 110209ff23fSmrg#define MIN(a,b) ((a)>(b)?(b):(a)) 111209ff23fSmrg#endif 112209ff23fSmrg 113b7e1c893Smrg#if HAVE_BYTESWAP_H 114b7e1c893Smrg#include <byteswap.h> 115b7e1c893Smrg#elif defined(USE_SYS_ENDIAN_H) 116b7e1c893Smrg#include <sys/endian.h> 117b7e1c893Smrg#else 118b7e1c893Smrg#define bswap_16(value) \ 119b7e1c893Smrg ((((value) & 0xff) << 8) | ((value) >> 8)) 120b7e1c893Smrg 121b7e1c893Smrg#define bswap_32(value) \ 122b7e1c893Smrg (((uint32_t)bswap_16((uint16_t)((value) & 0xffff)) << 16) | \ 123b7e1c893Smrg (uint32_t)bswap_16((uint16_t)((value) >> 16))) 124b7e1c893Smrg 125b7e1c893Smrg#define bswap_64(value) \ 126b7e1c893Smrg (((uint64_t)bswap_32((uint32_t)((value) & 0xffffffff)) \ 127b7e1c893Smrg << 32) | \ 128b7e1c893Smrg (uint64_t)bswap_32((uint32_t)((value) >> 32))) 129b7e1c893Smrg#endif 130b7e1c893Smrg 131b7e1c893Smrg#if X_BYTE_ORDER == X_BIG_ENDIAN 132b7e1c893Smrg#define le32_to_cpu(x) bswap_32(x) 133b7e1c893Smrg#define le16_to_cpu(x) bswap_16(x) 134b7e1c893Smrg#define cpu_to_le32(x) bswap_32(x) 135b7e1c893Smrg#define cpu_to_le16(x) bswap_16(x) 136b7e1c893Smrg#else 137b7e1c893Smrg#define le32_to_cpu(x) (x) 138b7e1c893Smrg#define le16_to_cpu(x) (x) 139b7e1c893Smrg#define cpu_to_le32(x) (x) 140b7e1c893Smrg#define cpu_to_le16(x) (x) 141b7e1c893Smrg#endif 142b7e1c893Smrg 143209ff23fSmrg/* Provide substitutes for gcc's __FUNCTION__ on other compilers */ 144209ff23fSmrg#if !defined(__GNUC__) && !defined(__FUNCTION__) 145209ff23fSmrg# define __FUNCTION__ __func__ /* C99 */ 146209ff23fSmrg#endif 147209ff23fSmrg 148209ff23fSmrg#ifndef HAVE_XF86MODEBANDWIDTH 149209ff23fSmrgextern unsigned int xf86ModeBandwidth(DisplayModePtr mode, int depth); 150209ff23fSmrg#define MODE_BANDWIDTH MODE_BAD 151209ff23fSmrg#endif 152209ff23fSmrg 153209ff23fSmrgtypedef enum { 154209ff23fSmrg OPTION_NOACCEL, 155209ff23fSmrg OPTION_SW_CURSOR, 156209ff23fSmrg OPTION_DAC_6BIT, 157209ff23fSmrg OPTION_DAC_8BIT, 158209ff23fSmrg#ifdef XF86DRI 159209ff23fSmrg OPTION_BUS_TYPE, 160209ff23fSmrg OPTION_CP_PIO, 161209ff23fSmrg OPTION_USEC_TIMEOUT, 162209ff23fSmrg OPTION_AGP_MODE, 163209ff23fSmrg OPTION_AGP_FW, 164209ff23fSmrg OPTION_GART_SIZE, 165209ff23fSmrg OPTION_GART_SIZE_OLD, 166209ff23fSmrg OPTION_RING_SIZE, 167209ff23fSmrg OPTION_BUFFER_SIZE, 168209ff23fSmrg OPTION_DEPTH_MOVE, 169209ff23fSmrg OPTION_PAGE_FLIP, 170209ff23fSmrg OPTION_NO_BACKBUFFER, 171209ff23fSmrg OPTION_XV_DMA, 172209ff23fSmrg OPTION_FBTEX_PERCENT, 173209ff23fSmrg OPTION_DEPTH_BITS, 174209ff23fSmrg OPTION_PCIAPER_SIZE, 175209ff23fSmrg#ifdef USE_EXA 176209ff23fSmrg OPTION_ACCEL_DFS, 177ad43ddacSmrg OPTION_EXA_PIXMAPS, 178209ff23fSmrg#endif 179209ff23fSmrg#endif 180209ff23fSmrg OPTION_IGNORE_EDID, 181ad43ddacSmrg OPTION_CUSTOM_EDID, 182209ff23fSmrg OPTION_DISP_PRIORITY, 183209ff23fSmrg OPTION_PANEL_SIZE, 184209ff23fSmrg OPTION_MIN_DOTCLOCK, 185209ff23fSmrg OPTION_COLOR_TILING, 186209ff23fSmrg#ifdef XvExtension 187209ff23fSmrg OPTION_VIDEO_KEY, 188209ff23fSmrg OPTION_RAGE_THEATRE_CRYSTAL, 189209ff23fSmrg OPTION_RAGE_THEATRE_TUNER_PORT, 190209ff23fSmrg OPTION_RAGE_THEATRE_COMPOSITE_PORT, 191209ff23fSmrg OPTION_RAGE_THEATRE_SVIDEO_PORT, 192209ff23fSmrg OPTION_TUNER_TYPE, 193209ff23fSmrg OPTION_RAGE_THEATRE_MICROC_PATH, 194209ff23fSmrg OPTION_RAGE_THEATRE_MICROC_TYPE, 195209ff23fSmrg OPTION_SCALER_WIDTH, 196209ff23fSmrg#endif 197209ff23fSmrg#ifdef RENDER 198209ff23fSmrg OPTION_RENDER_ACCEL, 199209ff23fSmrg OPTION_SUBPIXEL_ORDER, 200209ff23fSmrg#endif 201209ff23fSmrg OPTION_SHOWCACHE, 202ad43ddacSmrg OPTION_CLOCK_GATING, 203209ff23fSmrg OPTION_BIOS_HOTKEYS, 204209ff23fSmrg OPTION_VGA_ACCESS, 205209ff23fSmrg OPTION_REVERSE_DDC, 206209ff23fSmrg OPTION_LVDS_PROBE_PLL, 207209ff23fSmrg OPTION_ACCELMETHOD, 208209ff23fSmrg OPTION_CONNECTORTABLE, 209209ff23fSmrg OPTION_DRI, 210209ff23fSmrg OPTION_DEFAULT_CONNECTOR_TABLE, 211209ff23fSmrg#if defined(__powerpc__) 212209ff23fSmrg OPTION_MAC_MODEL, 213209ff23fSmrg#endif 214209ff23fSmrg OPTION_DEFAULT_TMDS_PLL, 215209ff23fSmrg OPTION_TVDAC_LOAD_DETECT, 216209ff23fSmrg OPTION_FORCE_TVOUT, 217209ff23fSmrg OPTION_TVSTD, 218209ff23fSmrg OPTION_IGNORE_LID_STATUS, 219209ff23fSmrg OPTION_DEFAULT_TVDAC_ADJ, 220b7e1c893Smrg OPTION_INT10, 221b7e1c893Smrg OPTION_EXA_VSYNC, 222b7e1c893Smrg OPTION_ATOM_TVOUT, 223ad43ddacSmrg OPTION_R4XX_ATOM, 224ad43ddacSmrg OPTION_FORCE_LOW_POWER, 225ad43ddacSmrg OPTION_DYNAMIC_PM, 226ad43ddacSmrg OPTION_NEW_PLL, 227921a55d8Smrg OPTION_ZAPHOD_HEADS, 228921a55d8Smrg OPTION_SWAPBUFFERS_WAIT 229209ff23fSmrg} RADEONOpts; 230209ff23fSmrg 231209ff23fSmrg 232209ff23fSmrg#define RADEON_IDLE_RETRY 16 /* Fall out of idle loops after this count */ 233209ff23fSmrg#define RADEON_TIMEOUT 2000000 /* Fall out of wait loops after this count */ 234209ff23fSmrg 235209ff23fSmrg#define RADEON_VSYNC_TIMEOUT 20000 /* Maximum wait for VSYNC (in usecs) */ 236209ff23fSmrg 237209ff23fSmrg/* Buffer are aligned on 4096 byte boundaries */ 238ad43ddacSmrg#define RADEON_GPU_PAGE_SIZE 4096 239ad43ddacSmrg#define RADEON_BUFFER_ALIGN (RADEON_GPU_PAGE_SIZE - 1) 240209ff23fSmrg#define RADEON_VBIOS_SIZE 0x00010000 241209ff23fSmrg#define RADEON_USE_RMX 0x80000000 /* mode flag for using RMX 242209ff23fSmrg * Need to comfirm this is not used 243209ff23fSmrg * for something else. 244209ff23fSmrg */ 245209ff23fSmrg 246209ff23fSmrg#define xFixedToFloat(f) (((float) (f)) / 65536) 247209ff23fSmrg 248209ff23fSmrg#define RADEON_LOGLEVEL_DEBUG 4 249209ff23fSmrg 250209ff23fSmrg/* for Xv, outputs */ 251209ff23fSmrg#define MAKE_ATOM(a) MakeAtom(a, sizeof(a) - 1, TRUE) 252209ff23fSmrg 253209ff23fSmrg/* Other macros */ 254209ff23fSmrg#define RADEON_ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) 255209ff23fSmrg#define RADEON_ALIGN(x,bytes) (((x) + ((bytes) - 1)) & ~((bytes) - 1)) 256209ff23fSmrg#define RADEONPTR(pScrn) ((RADEONInfoPtr)(pScrn)->driverPrivate) 257209ff23fSmrg 258209ff23fSmrgtypedef struct { 259209ff23fSmrg int revision; 260209ff23fSmrg uint16_t rr1_offset; 261209ff23fSmrg uint16_t rr2_offset; 262209ff23fSmrg uint16_t dyn_clk_offset; 263209ff23fSmrg uint16_t pll_offset; 264209ff23fSmrg uint16_t mem_config_offset; 265209ff23fSmrg uint16_t mem_reset_offset; 266209ff23fSmrg uint16_t short_mem_offset; 267209ff23fSmrg uint16_t rr3_offset; 268209ff23fSmrg uint16_t rr4_offset; 269209ff23fSmrg} RADEONBIOSInitTable; 270209ff23fSmrg 271209ff23fSmrg#define RADEON_PLL_USE_BIOS_DIVS (1 << 0) 272209ff23fSmrg#define RADEON_PLL_NO_ODD_POST_DIV (1 << 1) 273209ff23fSmrg#define RADEON_PLL_USE_REF_DIV (1 << 2) 274209ff23fSmrg#define RADEON_PLL_LEGACY (1 << 3) 275b7e1c893Smrg#define RADEON_PLL_PREFER_LOW_REF_DIV (1 << 4) 276b7e1c893Smrg#define RADEON_PLL_PREFER_HIGH_REF_DIV (1 << 5) 277b7e1c893Smrg#define RADEON_PLL_PREFER_LOW_FB_DIV (1 << 6) 278b7e1c893Smrg#define RADEON_PLL_PREFER_HIGH_FB_DIV (1 << 7) 279b7e1c893Smrg#define RADEON_PLL_PREFER_LOW_POST_DIV (1 << 8) 280b7e1c893Smrg#define RADEON_PLL_PREFER_HIGH_POST_DIV (1 << 9) 281ad43ddacSmrg#define RADEON_PLL_USE_FRAC_FB_DIV (1 << 10) 282ad43ddacSmrg#define RADEON_PLL_PREFER_CLOSEST_LOWER (1 << 11) 283ad43ddacSmrg#define RADEON_PLL_USE_POST_DIV (1 << 12) 284209ff23fSmrg 285209ff23fSmrgtypedef struct { 286ad43ddacSmrg uint32_t reference_freq; 287ad43ddacSmrg uint32_t reference_div; 288ad43ddacSmrg uint32_t post_div; 289209ff23fSmrg uint32_t pll_in_min; 290209ff23fSmrg uint32_t pll_in_max; 291209ff23fSmrg uint32_t pll_out_min; 292209ff23fSmrg uint32_t pll_out_max; 293209ff23fSmrg uint16_t xclk; 294209ff23fSmrg 295209ff23fSmrg uint32_t min_ref_div; 296209ff23fSmrg uint32_t max_ref_div; 297209ff23fSmrg uint32_t min_post_div; 298209ff23fSmrg uint32_t max_post_div; 299209ff23fSmrg uint32_t min_feedback_div; 300209ff23fSmrg uint32_t max_feedback_div; 301ad43ddacSmrg uint32_t min_frac_feedback_div; 302ad43ddacSmrg uint32_t max_frac_feedback_div; 303209ff23fSmrg uint32_t best_vco; 304209ff23fSmrg} RADEONPLLRec, *RADEONPLLPtr; 305209ff23fSmrg 306209ff23fSmrgtypedef struct { 307209ff23fSmrg int bitsPerPixel; 308209ff23fSmrg int depth; 309209ff23fSmrg int displayWidth; 310209ff23fSmrg int displayHeight; 311209ff23fSmrg int pixel_code; 312209ff23fSmrg int pixel_bytes; 313209ff23fSmrg DisplayModePtr mode; 314209ff23fSmrg} RADEONFBLayout; 315209ff23fSmrg 316209ff23fSmrgtypedef enum { 317209ff23fSmrg CHIP_FAMILY_UNKNOW, 318209ff23fSmrg CHIP_FAMILY_LEGACY, 319209ff23fSmrg CHIP_FAMILY_RADEON, 320209ff23fSmrg CHIP_FAMILY_RV100, 321209ff23fSmrg CHIP_FAMILY_RS100, /* U1 (IGP320M) or A3 (IGP320)*/ 322209ff23fSmrg CHIP_FAMILY_RV200, 323209ff23fSmrg CHIP_FAMILY_RS200, /* U2 (IGP330M/340M/350M) or A4 (IGP330/340/345/350), RS250 (IGP 7000) */ 324209ff23fSmrg CHIP_FAMILY_R200, 325209ff23fSmrg CHIP_FAMILY_RV250, 326209ff23fSmrg CHIP_FAMILY_RS300, /* RS300/RS350 */ 327209ff23fSmrg CHIP_FAMILY_RV280, 328209ff23fSmrg CHIP_FAMILY_R300, 329209ff23fSmrg CHIP_FAMILY_R350, 330209ff23fSmrg CHIP_FAMILY_RV350, 331209ff23fSmrg CHIP_FAMILY_RV380, /* RV370/RV380/M22/M24 */ 332209ff23fSmrg CHIP_FAMILY_R420, /* R420/R423/M18 */ 333209ff23fSmrg CHIP_FAMILY_RV410, /* RV410, M26 */ 334209ff23fSmrg CHIP_FAMILY_RS400, /* xpress 200, 200m (RS400) Intel */ 335209ff23fSmrg CHIP_FAMILY_RS480, /* xpress 200, 200m (RS410/480/482/485) AMD */ 336209ff23fSmrg CHIP_FAMILY_RV515, /* rv515 */ 337209ff23fSmrg CHIP_FAMILY_R520, /* r520 */ 338209ff23fSmrg CHIP_FAMILY_RV530, /* rv530 */ 339209ff23fSmrg CHIP_FAMILY_R580, /* r580 */ 340209ff23fSmrg CHIP_FAMILY_RV560, /* rv560 */ 341209ff23fSmrg CHIP_FAMILY_RV570, /* rv570 */ 342209ff23fSmrg CHIP_FAMILY_RS600, 343209ff23fSmrg CHIP_FAMILY_RS690, 344209ff23fSmrg CHIP_FAMILY_RS740, 345209ff23fSmrg CHIP_FAMILY_R600, /* r600 */ 346209ff23fSmrg CHIP_FAMILY_RV610, 347209ff23fSmrg CHIP_FAMILY_RV630, 348209ff23fSmrg CHIP_FAMILY_RV670, 349209ff23fSmrg CHIP_FAMILY_RV620, 350209ff23fSmrg CHIP_FAMILY_RV635, 351209ff23fSmrg CHIP_FAMILY_RS780, 352b7e1c893Smrg CHIP_FAMILY_RS880, 353ad43ddacSmrg CHIP_FAMILY_RV770, /* r700 */ 354b7e1c893Smrg CHIP_FAMILY_RV730, 355b7e1c893Smrg CHIP_FAMILY_RV710, 356c503f109Smrg CHIP_FAMILY_RV740, 357ad43ddacSmrg CHIP_FAMILY_CEDAR, /* evergreen */ 358ad43ddacSmrg CHIP_FAMILY_REDWOOD, 359ad43ddacSmrg CHIP_FAMILY_JUNIPER, 360ad43ddacSmrg CHIP_FAMILY_CYPRESS, 361ad43ddacSmrg CHIP_FAMILY_HEMLOCK, 362921a55d8Smrg CHIP_FAMILY_PALM, 363921a55d8Smrg CHIP_FAMILY_BARTS, 364921a55d8Smrg CHIP_FAMILY_TURKS, 365921a55d8Smrg CHIP_FAMILY_CAICOS, 366b13dfe66Smrg CHIP_FAMILY_CAYMAN, 367209ff23fSmrg CHIP_FAMILY_LAST 368209ff23fSmrg} RADEONChipFamily; 369209ff23fSmrg 370209ff23fSmrg#define IS_RV100_VARIANT ((info->ChipFamily == CHIP_FAMILY_RV100) || \ 371209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RV200) || \ 372209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RS100) || \ 373209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RS200) || \ 374209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RV250) || \ 375209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RV280) || \ 376209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RS300)) 377209ff23fSmrg 378209ff23fSmrg 379209ff23fSmrg#define IS_R300_VARIANT ((info->ChipFamily == CHIP_FAMILY_R300) || \ 380209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RV350) || \ 381209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_R350) || \ 382209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RV380) || \ 383209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_R420) || \ 384209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RV410) || \ 385209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RS400) || \ 386209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RS480)) 387209ff23fSmrg 388209ff23fSmrg#define IS_AVIVO_VARIANT ((info->ChipFamily >= CHIP_FAMILY_RV515)) 389209ff23fSmrg 390209ff23fSmrg#define IS_DCE3_VARIANT ((info->ChipFamily >= CHIP_FAMILY_RV620)) 391209ff23fSmrg 392b7e1c893Smrg#define IS_DCE32_VARIANT ((info->ChipFamily >= CHIP_FAMILY_RV730)) 393b7e1c893Smrg 394ad43ddacSmrg#define IS_DCE4_VARIANT ((info->ChipFamily >= CHIP_FAMILY_CEDAR)) 395ad43ddacSmrg 396921a55d8Smrg#define IS_DCE41_VARIANT ((info->ChipFamily >= CHIP_FAMILY_PALM)) 397921a55d8Smrg 398921a55d8Smrg#define IS_DCE5_VARIANT ((info->ChipFamily >= CHIP_FAMILY_BARTS)) 399921a55d8Smrg 400921a55d8Smrg#define IS_EVERGREEN_3D (info->ChipFamily >= CHIP_FAMILY_CEDAR) 401921a55d8Smrg 402b7e1c893Smrg#define IS_R600_3D (info->ChipFamily >= CHIP_FAMILY_R600) 403b7e1c893Smrg 404209ff23fSmrg#define IS_R500_3D ((info->ChipFamily == CHIP_FAMILY_RV515) || \ 405209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_R520) || \ 406209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RV530) || \ 407209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_R580) || \ 408209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RV560) || \ 409209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RV570)) 410209ff23fSmrg 411ad43ddacSmrg#define IS_R400_3D ((info->ChipFamily == CHIP_FAMILY_R420) || \ 412ad43ddacSmrg (info->ChipFamily == CHIP_FAMILY_RV410) || \ 413ad43ddacSmrg (info->ChipFamily == CHIP_FAMILY_RS690) || \ 414ad43ddacSmrg (info->ChipFamily == CHIP_FAMILY_RS600) || \ 415ad43ddacSmrg (info->ChipFamily == CHIP_FAMILY_RS740)) 416ad43ddacSmrg 417209ff23fSmrg#define IS_R300_3D ((info->ChipFamily == CHIP_FAMILY_R300) || \ 418209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RV350) || \ 419209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_R350) || \ 420209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RV380) || \ 421209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_R420) || \ 422209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RV410) || \ 423209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RS690) || \ 424209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RS600) || \ 425209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RS740) || \ 426209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RS400) || \ 427209ff23fSmrg (info->ChipFamily == CHIP_FAMILY_RS480)) 428209ff23fSmrg 429ad43ddacSmrg#define IS_R200_3D ((info->ChipFamily == CHIP_FAMILY_RV250) || \ 430ad43ddacSmrg (info->ChipFamily == CHIP_FAMILY_RV280) || \ 431ad43ddacSmrg (info->ChipFamily == CHIP_FAMILY_RS300) || \ 432ad43ddacSmrg (info->ChipFamily == CHIP_FAMILY_R200)) 433ad43ddacSmrg 434209ff23fSmrg/* 435209ff23fSmrg * Errata workarounds 436209ff23fSmrg */ 437209ff23fSmrgtypedef enum { 438209ff23fSmrg CHIP_ERRATA_R300_CG = 0x00000001, 439209ff23fSmrg CHIP_ERRATA_PLL_DUMMYREADS = 0x00000002, 440209ff23fSmrg CHIP_ERRATA_PLL_DELAY = 0x00000004 441209ff23fSmrg} RADEONErrata; 442209ff23fSmrg 443209ff23fSmrgtypedef enum { 444209ff23fSmrg RADEON_DVOCHIP_NONE, 445209ff23fSmrg RADEON_SIL_164, 446209ff23fSmrg RADEON_SIL_1178 447209ff23fSmrg} RADEONExtTMDSChip; 448209ff23fSmrg 449209ff23fSmrg#if defined(__powerpc__) 450209ff23fSmrgtypedef enum { 451209ff23fSmrg RADEON_MAC_NONE, 452209ff23fSmrg RADEON_MAC_IBOOK, 453209ff23fSmrg RADEON_MAC_POWERBOOK_EXTERNAL, 454209ff23fSmrg RADEON_MAC_POWERBOOK_INTERNAL, 455209ff23fSmrg RADEON_MAC_POWERBOOK_VGA, 456209ff23fSmrg RADEON_MAC_MINI_EXTERNAL, 457209ff23fSmrg RADEON_MAC_MINI_INTERNAL, 458b7e1c893Smrg RADEON_MAC_IMAC_G5_ISIGHT, 459b7e1c893Smrg RADEON_MAC_EMAC 460209ff23fSmrg} RADEONMacModel; 461209ff23fSmrg#endif 462209ff23fSmrg 463209ff23fSmrgtypedef enum { 464209ff23fSmrg CARD_PCI, 465209ff23fSmrg CARD_AGP, 466209ff23fSmrg CARD_PCIE 467209ff23fSmrg} RADEONCardType; 468209ff23fSmrg 469ad43ddacSmrgtypedef enum { 470ad43ddacSmrg POWER_DEFAULT, 471ad43ddacSmrg POWER_LOW, 472ad43ddacSmrg POWER_HIGH 473ad43ddacSmrg} RADEONPMType; 474ad43ddacSmrg 475ad43ddacSmrgtypedef struct { 476ad43ddacSmrg RADEONPMType type; 477ad43ddacSmrg uint32_t sclk; 478ad43ddacSmrg uint32_t mclk; 479ad43ddacSmrg uint32_t pcie_lanes; 480ad43ddacSmrg uint32_t flags; 481ad43ddacSmrg} RADEONPowerMode; 482ad43ddacSmrg 483ad43ddacSmrgtypedef struct { 484ad43ddacSmrg /* power modes */ 485ad43ddacSmrg int num_modes; 486ad43ddacSmrg int current_mode; 487ad43ddacSmrg RADEONPowerMode mode[3]; 488ad43ddacSmrg 489ad43ddacSmrg Bool clock_gating_enabled; 490ad43ddacSmrg Bool dynamic_mode_enabled; 491ad43ddacSmrg Bool force_low_power_enabled; 492ad43ddacSmrg} RADEONPowerManagement; 493ad43ddacSmrg 494209ff23fSmrgtypedef struct _atomBiosHandle *atomBiosHandlePtr; 495209ff23fSmrg 496ad43ddacSmrgstruct radeon_exa_pixmap_priv { 497ad43ddacSmrg struct radeon_bo *bo; 498ad43ddacSmrg int flags; 499ad43ddacSmrg Bool bo_mapped; 500ad43ddacSmrg}; 501ad43ddacSmrg 502209ff23fSmrgtypedef struct { 503209ff23fSmrg uint32_t pci_device_id; 504209ff23fSmrg RADEONChipFamily chip_family; 505209ff23fSmrg int mobility; 506209ff23fSmrg int igp; 507209ff23fSmrg int nocrtc2; 508209ff23fSmrg int nointtvout; 509209ff23fSmrg int singledac; 510209ff23fSmrg} RADEONCardInfo; 511209ff23fSmrg 512ad43ddacSmrg#define RADEON_2D_EXA_COPY 1 513ad43ddacSmrg#define RADEON_2D_EXA_SOLID 2 514ad43ddacSmrg 515ad43ddacSmrgstruct radeon_2d_state { 516ad43ddacSmrg int op; // 517ad43ddacSmrg uint32_t dst_pitch_offset; 518ad43ddacSmrg uint32_t src_pitch_offset; 519ad43ddacSmrg uint32_t dp_gui_master_cntl; 520ad43ddacSmrg uint32_t dp_cntl; 521ad43ddacSmrg uint32_t dp_write_mask; 522ad43ddacSmrg uint32_t dp_brush_frgd_clr; 523ad43ddacSmrg uint32_t dp_brush_bkgd_clr; 524ad43ddacSmrg uint32_t dp_src_frgd_clr; 525ad43ddacSmrg uint32_t dp_src_bkgd_clr; 526ad43ddacSmrg uint32_t default_sc_bottom_right; 527ad43ddacSmrg struct radeon_bo *dst_bo; 528ad43ddacSmrg struct radeon_bo *src_bo; 529ad43ddacSmrg}; 530ad43ddacSmrg 531209ff23fSmrg#ifdef XF86DRI 532b7e1c893Smrgstruct radeon_cp { 533b7e1c893Smrg Bool CPRuns; /* CP is running */ 534b7e1c893Smrg Bool CPInUse; /* CP has been used by X server */ 535b7e1c893Smrg Bool CPStarted; /* CP has started */ 536b7e1c893Smrg int CPMode; /* CP mode that server/clients use */ 537b7e1c893Smrg int CPFifoSize; /* Size of the CP command FIFO */ 538b7e1c893Smrg int CPusecTimeout; /* CP timeout in usecs */ 539b7e1c893Smrg Bool needCacheFlush; 540209ff23fSmrg 541b7e1c893Smrg /* CP accleration */ 542b7e1c893Smrg drmBufPtr indirectBuffer; 543b7e1c893Smrg int indirectStart; 544209ff23fSmrg 545b7e1c893Smrg /* Debugging info for BEGIN_RING/ADVANCE_RING pairs. */ 546b7e1c893Smrg int dma_begin_count; 547b7e1c893Smrg char *dma_debug_func; 548b7e1c893Smrg int dma_debug_lineno; 549209ff23fSmrg 550b7e1c893Smrg }; 551209ff23fSmrg 552b7e1c893Smrgtypedef struct { 553b7e1c893Smrg /* Nothing here yet */ 554b7e1c893Smrg int dummy; 555b7e1c893Smrg} RADEONConfigPrivRec, *RADEONConfigPrivPtr; 556209ff23fSmrg 557b7e1c893Smrgtypedef struct { 558b7e1c893Smrg /* Nothing here yet */ 559b7e1c893Smrg int dummy; 560b7e1c893Smrg} RADEONDRIContextRec, *RADEONDRIContextPtr; 561209ff23fSmrg 562b7e1c893Smrgstruct radeon_dri { 563b7e1c893Smrg Bool noBackBuffer; 564209ff23fSmrg 565209ff23fSmrg Bool newMemoryMap; 566209ff23fSmrg drmVersionPtr pLibDRMVersion; 567209ff23fSmrg drmVersionPtr pKernelDRMVersion; 568209ff23fSmrg DRIInfoPtr pDRIInfo; 569209ff23fSmrg int drmFD; 570209ff23fSmrg int numVisualConfigs; 571209ff23fSmrg __GLXvisualConfig *pVisualConfigs; 572209ff23fSmrg RADEONConfigPrivPtr pVisualConfigsPriv; 573209ff23fSmrg Bool (*DRICloseScreen)(int, ScreenPtr); 574209ff23fSmrg 575209ff23fSmrg drm_handle_t fbHandle; 576209ff23fSmrg 577209ff23fSmrg drmSize registerSize; 578209ff23fSmrg drm_handle_t registerHandle; 579209ff23fSmrg 580209ff23fSmrg drmSize pciSize; 581209ff23fSmrg drm_handle_t pciMemHandle; 582209ff23fSmrg unsigned char *PCI; /* Map */ 583209ff23fSmrg 584209ff23fSmrg Bool depthMoves; /* Enable depth moves -- slow! */ 585209ff23fSmrg Bool allowPageFlip; /* Enable 3d page flipping */ 586209ff23fSmrg#ifdef DAMAGE 587209ff23fSmrg DamagePtr pDamage; 588209ff23fSmrg RegionRec driRegion; 589209ff23fSmrg#endif 590209ff23fSmrg Bool have3DWindows; /* Are there any 3d clients? */ 591209ff23fSmrg 592209ff23fSmrg int pciAperSize; 593209ff23fSmrg drmSize gartSize; 594209ff23fSmrg drm_handle_t agpMemHandle; /* Handle from drmAgpAlloc */ 595209ff23fSmrg unsigned long gartOffset; 596209ff23fSmrg unsigned char *AGP; /* Map */ 597209ff23fSmrg int agpMode; 598209ff23fSmrg 599209ff23fSmrg uint32_t pciCommand; 600209ff23fSmrg 601b7e1c893Smrg /* CP ring buffer data */ 602209ff23fSmrg unsigned long ringStart; /* Offset into GART space */ 603209ff23fSmrg drm_handle_t ringHandle; /* Handle from drmAddMap */ 604209ff23fSmrg drmSize ringMapSize; /* Size of map */ 605209ff23fSmrg int ringSize; /* Size of ring (in MB) */ 606209ff23fSmrg drmAddress ring; /* Map */ 607209ff23fSmrg int ringSizeLog2QW; 608209ff23fSmrg 609209ff23fSmrg unsigned long ringReadOffset; /* Offset into GART space */ 610209ff23fSmrg drm_handle_t ringReadPtrHandle; /* Handle from drmAddMap */ 611209ff23fSmrg drmSize ringReadMapSize; /* Size of map */ 612209ff23fSmrg drmAddress ringReadPtr; /* Map */ 613209ff23fSmrg 614b7e1c893Smrg /* CP vertex/indirect buffer data */ 615209ff23fSmrg unsigned long bufStart; /* Offset into GART space */ 616209ff23fSmrg drm_handle_t bufHandle; /* Handle from drmAddMap */ 617209ff23fSmrg drmSize bufMapSize; /* Size of map */ 618209ff23fSmrg int bufSize; /* Size of buffers (in MB) */ 619209ff23fSmrg drmAddress buf; /* Map */ 620209ff23fSmrg int bufNumBufs; /* Number of buffers */ 621209ff23fSmrg drmBufMapPtr buffers; /* Buffer map */ 622209ff23fSmrg 623b7e1c893Smrg /* CP GART Texture data */ 624209ff23fSmrg unsigned long gartTexStart; /* Offset into GART space */ 625209ff23fSmrg drm_handle_t gartTexHandle; /* Handle from drmAddMap */ 626209ff23fSmrg drmSize gartTexMapSize; /* Size of map */ 627209ff23fSmrg int gartTexSize; /* Size of GART tex space (in MB) */ 628209ff23fSmrg drmAddress gartTex; /* Map */ 629209ff23fSmrg int log2GARTTexGran; 630209ff23fSmrg 631b7e1c893Smrg /* DRI screen private data */ 632209ff23fSmrg int fbX; 633209ff23fSmrg int fbY; 634209ff23fSmrg int backX; 635209ff23fSmrg int backY; 636209ff23fSmrg int depthX; 637209ff23fSmrg int depthY; 638209ff23fSmrg 639209ff23fSmrg int frontOffset; 640209ff23fSmrg int frontPitch; 641209ff23fSmrg int backOffset; 642209ff23fSmrg int backPitch; 643209ff23fSmrg int depthOffset; 644209ff23fSmrg int depthPitch; 645209ff23fSmrg int depthBits; 646209ff23fSmrg int textureOffset; 647209ff23fSmrg int textureSize; 648209ff23fSmrg int log2TexGran; 649209ff23fSmrg 650209ff23fSmrg int pciGartSize; 651209ff23fSmrg uint32_t pciGartOffset; 652209ff23fSmrg void *pciGartBackup; 653b7e1c893Smrg 654b7e1c893Smrg int irq; 655b7e1c893Smrg 656209ff23fSmrg#ifdef USE_XAA 657209ff23fSmrg uint32_t frontPitchOffset; 658209ff23fSmrg uint32_t backPitchOffset; 659209ff23fSmrg uint32_t depthPitchOffset; 660209ff23fSmrg 661b7e1c893Smrg /* offscreen memory management */ 662209ff23fSmrg int backLines; 663209ff23fSmrg FBAreaPtr backArea; 664209ff23fSmrg int depthTexLines; 665209ff23fSmrg FBAreaPtr depthTexArea; 666209ff23fSmrg#endif 667209ff23fSmrg 668b7e1c893Smrg}; 669b7e1c893Smrg#endif 670209ff23fSmrg 671ad43ddacSmrg#define DMA_BO_FREE_TIME 1000 672ad43ddacSmrg 673ad43ddacSmrgstruct radeon_dma_bo { 674ad43ddacSmrg struct radeon_dma_bo *next, *prev; 675ad43ddacSmrg struct radeon_bo *bo; 676ad43ddacSmrg int expire_counter; 677ad43ddacSmrg}; 678ad43ddacSmrg 679ad43ddacSmrgstruct r600_accel_object { 680ad43ddacSmrg uint32_t pitch; 681ad43ddacSmrg uint32_t width; 682ad43ddacSmrg uint32_t height; 683ad43ddacSmrg uint32_t offset; 684ad43ddacSmrg int bpp; 685ad43ddacSmrg uint32_t domain; 686ad43ddacSmrg struct radeon_bo *bo; 687b13dfe66Smrg uint32_t tiling_flags; 688ad43ddacSmrg}; 689ad43ddacSmrg 690921a55d8Smrgstruct radeon_vbo_object { 691921a55d8Smrg int vb_offset; 692921a55d8Smrg uint64_t vb_mc_addr; 693921a55d8Smrg int vb_total; 694921a55d8Smrg void *vb_ptr; 695921a55d8Smrg uint32_t vb_size; 696921a55d8Smrg uint32_t vb_op_vert_size; 697921a55d8Smrg int32_t vb_start_op; 698921a55d8Smrg struct radeon_bo *vb_bo; 699921a55d8Smrg unsigned verts_per_op; 700921a55d8Smrg}; 701921a55d8Smrg 702b7e1c893Smrgstruct radeon_accel_state { 703b7e1c893Smrg /* common accel data */ 704b7e1c893Smrg int fifo_slots; /* Free slots in the FIFO (64 max) */ 705b7e1c893Smrg /* Computed values for Radeon */ 706b7e1c893Smrg uint32_t dp_gui_master_cntl; 707b7e1c893Smrg uint32_t dp_gui_master_cntl_clip; 708b7e1c893Smrg uint32_t trans_color; 709b7e1c893Smrg /* Saved values for ScreenToScreenCopy */ 710b7e1c893Smrg int xdir; 711b7e1c893Smrg int ydir; 712b7e1c893Smrg uint32_t dst_pitch_offset; 713209ff23fSmrg 714b7e1c893Smrg /* render accel */ 715b7e1c893Smrg unsigned short texW[2]; 716b7e1c893Smrg unsigned short texH[2]; 717b7e1c893Smrg Bool XInited3D; /* X itself has the 3D context */ 718b7e1c893Smrg int num_gb_pipes; 719b7e1c893Smrg Bool has_tcl; 720209ff23fSmrg 721b7e1c893Smrg#ifdef USE_EXA 722b7e1c893Smrg /* EXA */ 723b7e1c893Smrg ExaDriverPtr exa; 724b7e1c893Smrg int exaSyncMarker; 725b7e1c893Smrg int exaMarkerSynced; 726b7e1c893Smrg int engineMode; 727b7e1c893Smrg#define EXA_ENGINEMODE_UNKNOWN 0 728b7e1c893Smrg#define EXA_ENGINEMODE_2D 1 729b7e1c893Smrg#define EXA_ENGINEMODE_3D 2 730209ff23fSmrg 731ad43ddacSmrg int composite_op; 732ad43ddacSmrg PicturePtr dst_pic; 733ad43ddacSmrg PicturePtr msk_pic; 734ad43ddacSmrg PicturePtr src_pic; 735ad43ddacSmrg PixmapPtr dst_pix; 736ad43ddacSmrg PixmapPtr msk_pix; 737ad43ddacSmrg PixmapPtr src_pix; 738b7e1c893Smrg Bool is_transform[2]; 739b7e1c893Smrg PictTransform *transform[2]; 740b7e1c893Smrg /* Whether we are tiling horizontally and vertically */ 741b7e1c893Smrg Bool need_src_tile_x; 742b7e1c893Smrg Bool need_src_tile_y; 743b7e1c893Smrg /* Size of tiles ... set to 65536x65536 if not tiling in that direction */ 744b7e1c893Smrg Bool src_tile_width; 745b7e1c893Smrg Bool src_tile_height; 746ad43ddacSmrg uint32_t *draw_header; 747ad43ddacSmrg unsigned vtx_count; 748ad43ddacSmrg unsigned num_vtx; 749b7e1c893Smrg Bool vsync; 750b7e1c893Smrg 751b7e1c893Smrg drmBufPtr ib; 752921a55d8Smrg 753921a55d8Smrg struct radeon_vbo_object vbo; 754921a55d8Smrg struct radeon_vbo_object cbuf; 755921a55d8Smrg 756ad43ddacSmrg /* where to discard IB from if we cancel operation */ 757ad43ddacSmrg uint32_t ib_reset_op; 758ad43ddacSmrg#ifdef XF86DRM_MODE 759ad43ddacSmrg struct radeon_dma_bo bo_free; 760ad43ddacSmrg struct radeon_dma_bo bo_wait; 761ad43ddacSmrg struct radeon_dma_bo bo_reserved; 762ad43ddacSmrg Bool use_vbos; 763ad43ddacSmrg#endif 7640974d292Smrg void (*finish_op)(ScrnInfoPtr, int); 765b7e1c893Smrg // shader storage 766b7e1c893Smrg ExaOffscreenArea *shaders; 767ad43ddacSmrg struct radeon_bo *shaders_bo; 768b7e1c893Smrg uint32_t solid_vs_offset; 769b7e1c893Smrg uint32_t solid_ps_offset; 770b7e1c893Smrg uint32_t copy_vs_offset; 771b7e1c893Smrg uint32_t copy_ps_offset; 772b7e1c893Smrg uint32_t comp_vs_offset; 773b7e1c893Smrg uint32_t comp_ps_offset; 774b7e1c893Smrg uint32_t xv_vs_offset; 775b7e1c893Smrg uint32_t xv_ps_offset; 776921a55d8Smrg // shader consts 777921a55d8Smrg uint32_t solid_vs_const_offset; 778921a55d8Smrg uint32_t solid_ps_const_offset; 779921a55d8Smrg uint32_t copy_vs_const_offset; 780921a55d8Smrg uint32_t copy_ps_const_offset; 781921a55d8Smrg uint32_t comp_vs_const_offset; 782921a55d8Smrg uint32_t comp_ps_const_offset; 783921a55d8Smrg uint32_t comp_mask_ps_const_offset; 784921a55d8Smrg uint32_t xv_vs_const_offset; 785921a55d8Smrg uint32_t xv_ps_const_offset; 786b7e1c893Smrg 787b7e1c893Smrg //size/addr stuff 788ad43ddacSmrg struct r600_accel_object src_obj[2]; 789ad43ddacSmrg struct r600_accel_object dst_obj; 790b7e1c893Smrg uint32_t src_size[2]; 791b7e1c893Smrg uint32_t dst_size; 792ad43ddacSmrg 793b7e1c893Smrg uint32_t vs_size; 794b7e1c893Smrg uint64_t vs_mc_addr; 795b7e1c893Smrg uint32_t ps_size; 796b7e1c893Smrg uint64_t ps_mc_addr; 797b7e1c893Smrg 798b7e1c893Smrg // UTS/DFS 799b7e1c893Smrg drmBufPtr scratch; 800b7e1c893Smrg 801b7e1c893Smrg // copy 802b7e1c893Smrg ExaOffscreenArea *copy_area; 803ad43ddacSmrg struct radeon_bo *copy_area_bo; 804b7e1c893Smrg Bool same_surface; 805b7e1c893Smrg int rop; 806b7e1c893Smrg uint32_t planemask; 807b7e1c893Smrg 808b7e1c893Smrg // composite 809b7e1c893Smrg Bool component_alpha; 810b7e1c893Smrg Bool src_alpha; 811ad43ddacSmrg // vline 812ad43ddacSmrg xf86CrtcPtr vline_crtc; 813ad43ddacSmrg int vline_y1; 814ad43ddacSmrg int vline_y2; 815b7e1c893Smrg#endif 816209ff23fSmrg 817b7e1c893Smrg#ifdef USE_XAA 818b7e1c893Smrg /* XAA */ 819b7e1c893Smrg XAAInfoRecPtr accel; 820b7e1c893Smrg /* ScanlineScreenToScreenColorExpand support */ 821b7e1c893Smrg unsigned char *scratch_buffer[1]; 822b7e1c893Smrg unsigned char *scratch_save; 823b7e1c893Smrg int scanline_x; 824b7e1c893Smrg int scanline_y; 825b7e1c893Smrg int scanline_w; 826b7e1c893Smrg int scanline_h; 827b7e1c893Smrg int scanline_h_w; 828b7e1c893Smrg int scanline_words; 829b7e1c893Smrg int scanline_direct; 830b7e1c893Smrg int scanline_bpp; /* Only used for ImageWrite */ 831b7e1c893Smrg int scanline_fg; 832b7e1c893Smrg int scanline_bg; 833b7e1c893Smrg int scanline_hpass; 834b7e1c893Smrg int scanline_x1clip; 835b7e1c893Smrg int scanline_x2clip; 836b7e1c893Smrg /* Saved values for DashedTwoPointLine */ 837b7e1c893Smrg int dashLen; 838b7e1c893Smrg uint32_t dashPattern; 839b7e1c893Smrg int dash_fg; 840b7e1c893Smrg int dash_bg; 841b7e1c893Smrg 842b7e1c893Smrg FBLinearPtr RenderTex; 843b7e1c893Smrg void (*RenderCallback)(ScrnInfoPtr); 844b7e1c893Smrg Time RenderTimeout; 845b7e1c893Smrg /* 846b7e1c893Smrg * XAAForceTransBlit is used to change the behavior of the XAA 847b7e1c893Smrg * SetupForScreenToScreenCopy function, to make it DGA-friendly. 848b7e1c893Smrg */ 849b7e1c893Smrg Bool XAAForceTransBlit; 850209ff23fSmrg#endif 851209ff23fSmrg 852b7e1c893Smrg}; 853b7e1c893Smrg 854b7e1c893Smrgtypedef struct { 855b7e1c893Smrg EntityInfoPtr pEnt; 856b7e1c893Smrg pciVideoPtr PciInfo; 857b7e1c893Smrg PCITAG PciTag; 858b7e1c893Smrg int Chipset; 859b7e1c893Smrg RADEONChipFamily ChipFamily; 860b7e1c893Smrg RADEONErrata ChipErrata; 861b7e1c893Smrg 862b7e1c893Smrg unsigned long long LinearAddr; /* Frame buffer physical address */ 863b7e1c893Smrg unsigned long long MMIOAddr; /* MMIO region physical address */ 864b7e1c893Smrg unsigned long long BIOSAddr; /* BIOS physical address */ 865921a55d8Smrg uint64_t fbLocation; 866b7e1c893Smrg uint32_t gartLocation; 867b7e1c893Smrg uint32_t mc_fb_location; 868b7e1c893Smrg uint32_t mc_agp_location; 869b7e1c893Smrg uint32_t mc_agp_location_hi; 870b7e1c893Smrg 871b7e1c893Smrg void *MMIO; /* Map of MMIO region */ 872b7e1c893Smrg void *FB; /* Map of frame buffer */ 873b7e1c893Smrg uint8_t *VBIOS; /* Video BIOS pointer */ 874b7e1c893Smrg 875b7e1c893Smrg Bool IsAtomBios; /* New BIOS used in R420 etc. */ 876b7e1c893Smrg int ROMHeaderStart; /* Start of the ROM Info Table */ 877b7e1c893Smrg int MasterDataStart; /* Offset for Master Data Table for ATOM BIOS */ 878b7e1c893Smrg 879b7e1c893Smrg uint32_t MemCntl; 880b7e1c893Smrg uint32_t BusCntl; 881b7e1c893Smrg unsigned long MMIOSize; /* MMIO region physical address */ 882b7e1c893Smrg unsigned long FbMapSize; /* Size of frame buffer, in bytes */ 883b7e1c893Smrg unsigned long FbSecureSize; /* Size of secured fb area at end of 884b7e1c893Smrg framebuffer */ 885b7e1c893Smrg 886b7e1c893Smrg Bool IsMobility; /* Mobile chips for laptops */ 887b7e1c893Smrg Bool IsIGP; /* IGP chips */ 888b7e1c893Smrg Bool HasSingleDAC; /* only TVDAC on chip */ 889b7e1c893Smrg Bool ddc_mode; /* Validate mode by matching exactly 890b7e1c893Smrg * the modes supported in DDC data 891b7e1c893Smrg */ 892b7e1c893Smrg Bool R300CGWorkaround; 893b7e1c893Smrg 894b7e1c893Smrg /* EDID or BIOS values for FPs */ 895b7e1c893Smrg int RefDivider; 896b7e1c893Smrg int FeedbackDivider; 897b7e1c893Smrg int PostDivider; 898b7e1c893Smrg Bool UseBiosDividers; 899b7e1c893Smrg /* EDID data using DDC interface */ 900b7e1c893Smrg Bool ddc_bios; 901b7e1c893Smrg Bool ddc1; 902b7e1c893Smrg Bool ddc2; 903b7e1c893Smrg 904b7e1c893Smrg RADEONPLLRec pll; 9050974d292Smrg int default_dispclk; 9060974d292Smrg int dp_extclk; 907b7e1c893Smrg 908b7e1c893Smrg int RamWidth; 909b7e1c893Smrg float sclk; /* in MHz */ 910b7e1c893Smrg float mclk; /* in MHz */ 911b7e1c893Smrg Bool IsDDR; 912b7e1c893Smrg int DispPriority; 913b7e1c893Smrg 914b7e1c893Smrg RADEONSavePtr SavedReg; /* Original (text) mode */ 915b7e1c893Smrg RADEONSavePtr ModeReg; /* Current mode */ 916b7e1c893Smrg Bool (*CloseScreen)(int, ScreenPtr); 917b7e1c893Smrg 918b7e1c893Smrg void (*BlockHandler)(int, pointer, pointer, pointer); 919b7e1c893Smrg 920b7e1c893Smrg Bool PaletteSavedOnVT; /* Palette saved on last VT switch */ 921b7e1c893Smrg 922b7e1c893Smrg xf86CursorInfoPtr cursor; 923b7e1c893Smrg#ifdef ARGB_CURSOR 924b7e1c893Smrg Bool cursor_argb; 925b7e1c893Smrg#endif 926b7e1c893Smrg int cursor_fg; 927b7e1c893Smrg int cursor_bg; 928b7e1c893Smrg 929b7e1c893Smrg int pix24bpp; /* Depth of pixmap for 24bpp fb */ 930b7e1c893Smrg Bool dac6bits; /* Use 6 bit DAC? */ 931b7e1c893Smrg 932b7e1c893Smrg RADEONFBLayout CurrentLayout; 933b7e1c893Smrg 934b7e1c893Smrg#ifdef XF86DRI 935b7e1c893Smrg Bool directRenderingEnabled; 936b7e1c893Smrg Bool directRenderingInited; 937b7e1c893Smrg RADEONCardType cardType; /* Current card is a PCI card */ 938b7e1c893Smrg struct radeon_cp *cp; 939b7e1c893Smrg struct radeon_dri *dri; 940ad43ddacSmrg#ifdef XF86DRM_MODE 941ad43ddacSmrg struct radeon_dri2 dri2; 942ad43ddacSmrg#endif 943b7e1c893Smrg#ifdef USE_EXA 944b7e1c893Smrg Bool accelDFS; 945b7e1c893Smrg#endif 946b7e1c893Smrg Bool DMAForXv; 947209ff23fSmrg#endif /* XF86DRI */ 948209ff23fSmrg 949b7e1c893Smrg /* accel */ 950b7e1c893Smrg Bool RenderAccel; /* Render */ 951b7e1c893Smrg Bool allowColorTiling; 952b7e1c893Smrg Bool tilingEnabled; /* mirror of sarea->tiling_enabled */ 953b7e1c893Smrg struct radeon_accel_state *accel_state; 954b7e1c893Smrg Bool accelOn; 955b7e1c893Smrg Bool useEXA; 956b7e1c893Smrg#ifdef USE_EXA 957ad43ddacSmrg Bool exa_pixmaps; 958ad43ddacSmrg Bool exa_force_create; 959b7e1c893Smrg XF86ModReqInfo exaReq; 960b7e1c893Smrg#endif 961b7e1c893Smrg#ifdef USE_XAA 962b7e1c893Smrg XF86ModReqInfo xaaReq; 963b7e1c893Smrg#endif 964b7e1c893Smrg 965209ff23fSmrg /* XVideo */ 966209ff23fSmrg XF86VideoAdaptorPtr adaptor; 967209ff23fSmrg void (*VideoTimerCallback)(ScrnInfoPtr, Time); 968209ff23fSmrg int videoKey; 969209ff23fSmrg int RageTheatreCrystal; 970209ff23fSmrg int RageTheatreTunerPort; 971209ff23fSmrg int RageTheatreCompositePort; 972209ff23fSmrg int RageTheatreSVideoPort; 973209ff23fSmrg int tunerType; 974209ff23fSmrg char* RageTheatreMicrocPath; 975209ff23fSmrg char* RageTheatreMicrocType; 976209ff23fSmrg Bool MM_TABLE_valid; 977209ff23fSmrg struct { 978209ff23fSmrg uint8_t table_revision; 979209ff23fSmrg uint8_t table_size; 980209ff23fSmrg uint8_t tuner_type; 981209ff23fSmrg uint8_t audio_chip; 982209ff23fSmrg uint8_t product_id; 983209ff23fSmrg uint8_t tuner_voltage_teletext_fm; 984209ff23fSmrg uint8_t i2s_config; /* configuration of the sound chip */ 985209ff23fSmrg uint8_t video_decoder_type; 986209ff23fSmrg uint8_t video_decoder_host_config; 987209ff23fSmrg uint8_t input[5]; 988209ff23fSmrg } MM_TABLE; 989209ff23fSmrg uint16_t video_decoder_type; 990209ff23fSmrg int overlay_scaler_buffer_width; 991209ff23fSmrg int ecp_div; 992ad43ddacSmrg unsigned int xv_max_width; 993ad43ddacSmrg unsigned int xv_max_height; 994209ff23fSmrg 995209ff23fSmrg /* general */ 996209ff23fSmrg OptionInfoPtr Options; 997209ff23fSmrg 998209ff23fSmrg DisplayModePtr currentMode, savedCurrentMode; 999209ff23fSmrg 1000209ff23fSmrg /* special handlings for DELL triple-head server */ 1001b7e1c893Smrg Bool IsDellServer; 1002209ff23fSmrg 1003209ff23fSmrg Bool VGAAccess; 1004209ff23fSmrg 1005209ff23fSmrg int MaxSurfaceWidth; 1006209ff23fSmrg int MaxLines; 1007209ff23fSmrg 1008209ff23fSmrg Bool want_vblank_interrupts; 1009209ff23fSmrg RADEONBIOSConnector BiosConnector[RADEON_MAX_BIOS_CONNECTOR]; 1010b7e1c893Smrg radeon_encoder_ptr encoders[RADEON_MAX_BIOS_CONNECTOR]; 1011209ff23fSmrg RADEONBIOSInitTable BiosTable; 1012209ff23fSmrg 1013209ff23fSmrg /* save crtc state for console restore */ 1014209ff23fSmrg Bool crtc_on; 1015209ff23fSmrg Bool crtc2_on; 1016209ff23fSmrg 1017209ff23fSmrg Bool InternalTVOut; 1018209ff23fSmrg 1019209ff23fSmrg#if defined(__powerpc__) 1020209ff23fSmrg RADEONMacModel MacModel; 1021209ff23fSmrg#endif 1022209ff23fSmrg RADEONExtTMDSChip ext_tmds_chip; 1023209ff23fSmrg 1024209ff23fSmrg atomBiosHandlePtr atomBIOS; 1025209ff23fSmrg unsigned long FbFreeStart, FbFreeSize; 1026209ff23fSmrg unsigned char* BIOSCopy; 1027209ff23fSmrg 1028209ff23fSmrg CreateScreenResourcesProcPtr CreateScreenResources; 1029209ff23fSmrg 1030209ff23fSmrg /* if no devices are connected at server startup */ 1031209ff23fSmrg Bool first_load_no_devices; 1032209ff23fSmrg 1033209ff23fSmrg Bool IsSecondary; 1034209ff23fSmrg Bool IsPrimary; 1035209ff23fSmrg 1036209ff23fSmrg Bool r600_shadow_fb; 1037209ff23fSmrg void *fb_shadow; 1038209ff23fSmrg 1039b7e1c893Smrg /* some server chips have a hardcoded edid in the bios so that they work with KVMs */ 1040b7e1c893Smrg Bool get_hardcoded_edid_from_bios; 1041b7e1c893Smrg 1042b7e1c893Smrg int virtualX; 1043b7e1c893Smrg int virtualY; 1044b7e1c893Smrg 1045b7e1c893Smrg Bool r4xx_atom; 1046b7e1c893Smrg 1047ad43ddacSmrg /* pm */ 1048ad43ddacSmrg RADEONPowerManagement pm; 1049ad43ddacSmrg 1050ad43ddacSmrg /* igp info */ 1051ad43ddacSmrg float igp_sideport_mclk; 1052ad43ddacSmrg float igp_system_mclk; 1053ad43ddacSmrg float igp_ht_link_clk; 1054ad43ddacSmrg float igp_ht_link_width; 1055ad43ddacSmrg 1056ad43ddacSmrg int can_resize; 1057ad43ddacSmrg void (*reemit_current2d)(ScrnInfoPtr pScrn, int op); // emit the current 2D state into the IB 1058ad43ddacSmrg struct radeon_2d_state state_2d; 1059ad43ddacSmrg Bool kms_enabled; 1060ad43ddacSmrg struct radeon_bo *front_bo; 1061ad43ddacSmrg#ifdef XF86DRM_MODE 1062ad43ddacSmrg struct radeon_bo_manager *bufmgr; 1063ad43ddacSmrg struct radeon_cs_manager *csm; 1064ad43ddacSmrg struct radeon_cs *cs; 1065ad43ddacSmrg 10662f39173dSmrg struct radeon_bo *cursor_bo[6]; 1067ad43ddacSmrg uint64_t vram_size; 1068ad43ddacSmrg uint64_t gart_size; 1069ad43ddacSmrg drmmode_rec drmmode; 10700974d292Smrg /* r6xx+ tile config */ 1071b13dfe66Smrg Bool have_tiling_info; 10720974d292Smrg uint32_t tile_config; 10730974d292Smrg int group_bytes; 10740974d292Smrg int num_channels; 10750974d292Smrg int num_banks; 10760974d292Smrg int r7xx_bank_op; 1077ad43ddacSmrg#else 1078ad43ddacSmrg /* fake bool */ 1079ad43ddacSmrg Bool cs; 1080ad43ddacSmrg#endif 1081ad43ddacSmrg 1082ad43ddacSmrg /* Xv bicubic filtering */ 1083ad43ddacSmrg struct radeon_bo *bicubic_bo; 1084ad43ddacSmrg void *bicubic_memory; 1085ad43ddacSmrg int bicubic_offset; 1086921a55d8Smrg /* kms pageflipping */ 1087921a55d8Smrg Bool allowPageFlip; 1088921a55d8Smrg 1089921a55d8Smrg /* Perform vsync'ed SwapBuffers? */ 1090921a55d8Smrg Bool swapBuffersWait; 1091209ff23fSmrg} RADEONInfoRec, *RADEONInfoPtr; 1092209ff23fSmrg 1093209ff23fSmrg#define RADEONWaitForFifo(pScrn, entries) \ 1094209ff23fSmrgdo { \ 1095b7e1c893Smrg if (info->accel_state->fifo_slots < entries) \ 1096209ff23fSmrg RADEONWaitForFifoFunction(pScrn, entries); \ 1097b7e1c893Smrg info->accel_state->fifo_slots -= entries; \ 1098209ff23fSmrg} while (0) 1099209ff23fSmrg 1100209ff23fSmrg/* legacy_crtc.c */ 1101209ff23fSmrgextern void legacy_crtc_dpms(xf86CrtcPtr crtc, int mode); 1102209ff23fSmrgextern void legacy_crtc_mode_set(xf86CrtcPtr crtc, DisplayModePtr mode, 1103209ff23fSmrg DisplayModePtr adjusted_mode, int x, int y); 1104209ff23fSmrgextern void RADEONRestoreCommonRegisters(ScrnInfoPtr pScrn, 1105209ff23fSmrg RADEONSavePtr restore); 1106209ff23fSmrgextern void RADEONRestoreCrtcRegisters(ScrnInfoPtr pScrn, 1107209ff23fSmrg RADEONSavePtr restore); 1108209ff23fSmrgextern void RADEONRestoreCrtc2Registers(ScrnInfoPtr pScrn, 1109209ff23fSmrg RADEONSavePtr restore); 1110209ff23fSmrgextern void RADEONRestorePLLRegisters(ScrnInfoPtr pScrn, 1111209ff23fSmrg RADEONSavePtr restore); 1112209ff23fSmrgextern void RADEONRestorePLL2Registers(ScrnInfoPtr pScrn, 1113209ff23fSmrg RADEONSavePtr restore); 1114209ff23fSmrgextern void RADEONSaveCommonRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save); 1115209ff23fSmrgextern void RADEONSaveCrtcRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save); 1116209ff23fSmrgextern void RADEONSaveCrtc2Registers(ScrnInfoPtr pScrn, RADEONSavePtr save); 1117209ff23fSmrgextern void RADEONSavePLLRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save); 1118209ff23fSmrgextern void RADEONSavePLL2Registers(ScrnInfoPtr pScrn, RADEONSavePtr save); 1119209ff23fSmrg 1120209ff23fSmrg/* legacy_output.c */ 1121b7e1c893Smrgextern RADEONMonitorType legacy_dac_detect(xf86OutputPtr output); 1122209ff23fSmrgextern void legacy_output_dpms(xf86OutputPtr output, int mode); 1123209ff23fSmrgextern void legacy_output_mode_set(xf86OutputPtr output, DisplayModePtr mode, 1124209ff23fSmrg DisplayModePtr adjusted_mode); 1125209ff23fSmrgextern I2CDevPtr RADEONDVODeviceInit(I2CBusPtr b, I2CSlaveAddr addr); 1126209ff23fSmrgextern Bool RADEONDVOReadByte(I2CDevPtr dvo, int addr, uint8_t *ch); 1127209ff23fSmrgextern Bool RADEONDVOWriteByte(I2CDevPtr dvo, int addr, uint8_t ch); 1128209ff23fSmrgextern void RADEONRestoreDACRegisters(ScrnInfoPtr pScrn, RADEONSavePtr restore); 1129209ff23fSmrgextern void RADEONRestoreFPRegisters(ScrnInfoPtr pScrn, RADEONSavePtr restore); 1130209ff23fSmrgextern void RADEONRestoreFP2Registers(ScrnInfoPtr pScrn, RADEONSavePtr restore); 1131209ff23fSmrgextern void RADEONRestoreLVDSRegisters(ScrnInfoPtr pScrn, RADEONSavePtr restore); 1132209ff23fSmrgextern void RADEONRestoreRMXRegisters(ScrnInfoPtr pScrn, RADEONSavePtr restore); 1133209ff23fSmrgextern void RADEONSaveDACRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save); 1134209ff23fSmrgextern void RADEONSaveFPRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save); 1135209ff23fSmrg 1136b7e1c893Smrgextern void RADEONGetTVDacAdjInfo(ScrnInfoPtr pScrn, radeon_tvdac_ptr tvdac); 1137b7e1c893Smrgextern void RADEONGetTMDSInfoFromTable(ScrnInfoPtr pScrn, radeon_tmds_ptr tmds); 1138b7e1c893Smrgextern void RADEONGetTMDSInfo(ScrnInfoPtr pScrn, radeon_tmds_ptr tmds); 1139b7e1c893Smrgextern void RADEONGetExtTMDSInfo(ScrnInfoPtr pScrn, radeon_dvo_ptr dvo); 1140b7e1c893Smrgextern void RADEONGetLVDSInfo(ScrnInfoPtr pScrn, radeon_lvds_ptr lvds); 1141b7e1c893Smrg 1142209ff23fSmrg/* radeon_accel.c */ 1143209ff23fSmrgextern Bool RADEONAccelInit(ScreenPtr pScreen); 1144209ff23fSmrgextern void RADEONEngineFlush(ScrnInfoPtr pScrn); 1145209ff23fSmrgextern void RADEONEngineInit(ScrnInfoPtr pScrn); 1146209ff23fSmrgextern void RADEONEngineReset(ScrnInfoPtr pScrn); 1147209ff23fSmrgextern void RADEONEngineRestore(ScrnInfoPtr pScrn); 1148209ff23fSmrgextern uint8_t *RADEONHostDataBlit(ScrnInfoPtr pScrn, unsigned int cpp, 1149209ff23fSmrg unsigned int w, uint32_t dstPitchOff, 1150209ff23fSmrg uint32_t *bufPitch, int x, int *y, 1151209ff23fSmrg unsigned int *h, unsigned int *hpass); 1152209ff23fSmrgextern void RADEONHostDataBlitCopyPass(ScrnInfoPtr pScrn, 1153209ff23fSmrg unsigned int bpp, 1154209ff23fSmrg uint8_t *dst, uint8_t *src, 1155209ff23fSmrg unsigned int hpass, 1156209ff23fSmrg unsigned int dstPitch, 1157209ff23fSmrg unsigned int srcPitch); 1158209ff23fSmrgextern void RADEONCopySwap(uint8_t *dst, uint8_t *src, unsigned int size, int swap); 1159209ff23fSmrgextern void RADEONHostDataParams(ScrnInfoPtr pScrn, uint8_t *dst, 1160209ff23fSmrg uint32_t pitch, int cpp, 1161209ff23fSmrg uint32_t *dstPitchOffset, int *x, int *y); 1162209ff23fSmrgextern void RADEONInit3DEngine(ScrnInfoPtr pScrn); 1163209ff23fSmrgextern void RADEONWaitForFifoFunction(ScrnInfoPtr pScrn, int entries); 1164209ff23fSmrg#ifdef XF86DRI 1165209ff23fSmrgextern drmBufPtr RADEONCPGetBuffer(ScrnInfoPtr pScrn); 1166209ff23fSmrgextern void RADEONCPFlushIndirect(ScrnInfoPtr pScrn, int discard); 1167209ff23fSmrgextern void RADEONCPReleaseIndirect(ScrnInfoPtr pScrn); 1168209ff23fSmrgextern int RADEONCPStop(ScrnInfoPtr pScrn, RADEONInfoPtr info); 1169209ff23fSmrg# ifdef USE_XAA 1170209ff23fSmrgextern Bool RADEONSetupMemXAA_DRI(int scrnIndex, ScreenPtr pScreen); 1171209ff23fSmrg# endif 1172ad43ddacSmrguint32_t radeonGetPixmapOffset(PixmapPtr pPix); 1173209ff23fSmrg#endif 11742f39173dSmrgextern int radeon_cs_space_remaining(ScrnInfoPtr pScrn); 1175209ff23fSmrg 1176209ff23fSmrg#ifdef USE_XAA 1177209ff23fSmrg/* radeon_accelfuncs.c */ 1178209ff23fSmrgextern void RADEONAccelInitMMIO(ScreenPtr pScreen, XAAInfoRecPtr a); 1179209ff23fSmrgextern Bool RADEONSetupMemXAA(int scrnIndex, ScreenPtr pScreen); 1180209ff23fSmrg#endif 1181209ff23fSmrg 1182209ff23fSmrg/* radeon_bios.c */ 1183209ff23fSmrgextern Bool RADEONGetBIOSInfo(ScrnInfoPtr pScrn, xf86Int10InfoPtr pInt10); 1184209ff23fSmrgextern Bool RADEONGetClockInfoFromBIOS(ScrnInfoPtr pScrn); 1185209ff23fSmrgextern Bool RADEONGetConnectorInfoFromBIOS(ScrnInfoPtr pScrn); 1186b7e1c893Smrgextern Bool RADEONGetDAC2InfoFromBIOS(ScrnInfoPtr pScrn, radeon_tvdac_ptr tvdac); 1187b7e1c893Smrgextern Bool RADEONGetExtTMDSInfoFromBIOS (ScrnInfoPtr pScrn, radeon_dvo_ptr dvo); 1188b7e1c893Smrgextern xf86MonPtr RADEONGetHardCodedEDIDFromBIOS(xf86OutputPtr output); 1189209ff23fSmrgextern Bool RADEONGetBIOSInitTableOffsets(ScrnInfoPtr pScrn); 1190b7e1c893Smrgextern Bool RADEONGetLVDSInfoFromBIOS(ScrnInfoPtr pScrn, radeon_lvds_ptr lvds); 1191b7e1c893Smrgextern Bool RADEONGetTMDSInfoFromBIOS(ScrnInfoPtr pScrn, radeon_tmds_ptr tmds); 1192209ff23fSmrgextern Bool RADEONGetTVInfoFromBIOS(xf86OutputPtr output); 1193209ff23fSmrgextern Bool RADEONInitExtTMDSInfoFromBIOS (xf86OutputPtr output); 1194209ff23fSmrgextern Bool RADEONPostCardFromBIOSTables(ScrnInfoPtr pScrn); 1195b7e1c893Smrgextern Bool radeon_card_posted(ScrnInfoPtr pScrn); 1196209ff23fSmrg 1197209ff23fSmrg/* radeon_commonfuncs.c */ 1198209ff23fSmrg#ifdef XF86DRI 1199209ff23fSmrgextern void RADEONWaitForIdleCP(ScrnInfoPtr pScrn); 1200b7e1c893Smrgextern void RADEONWaitForVLineCP(ScrnInfoPtr pScrn, PixmapPtr pPix, 1201ad43ddacSmrg xf86CrtcPtr crtc, int start, int stop); 1202209ff23fSmrg#endif 1203209ff23fSmrgextern void RADEONWaitForIdleMMIO(ScrnInfoPtr pScrn); 1204b7e1c893Smrgextern void RADEONWaitForVLineMMIO(ScrnInfoPtr pScrn, PixmapPtr pPix, 1205ad43ddacSmrg xf86CrtcPtr crtc, int start, int stop); 1206209ff23fSmrg 1207209ff23fSmrg/* radeon_crtc.c */ 1208209ff23fSmrgextern void radeon_crtc_dpms(xf86CrtcPtr crtc, int mode); 1209209ff23fSmrgextern void radeon_crtc_load_lut(xf86CrtcPtr crtc); 1210209ff23fSmrgextern void radeon_crtc_modeset_ioctl(xf86CrtcPtr crtc, Bool post); 1211209ff23fSmrgextern Bool RADEONAllocateControllers(ScrnInfoPtr pScrn, int mask); 1212209ff23fSmrgextern void RADEONBlank(ScrnInfoPtr pScrn); 12132f39173dSmrgextern void RADEONComputePLL(xf86CrtcPtr crtc, 1214ad43ddacSmrg RADEONPLLPtr pll, unsigned long freq, 1215209ff23fSmrg uint32_t *chosen_dot_clock_freq, 1216209ff23fSmrg uint32_t *chosen_feedback_div, 1217ad43ddacSmrg uint32_t *chosen_frac_feedback_div, 1218209ff23fSmrg uint32_t *chosen_reference_div, 1219209ff23fSmrg uint32_t *chosen_post_div, int flags); 1220209ff23fSmrgextern DisplayModePtr RADEONCrtcFindClosestMode(xf86CrtcPtr crtc, 1221209ff23fSmrg DisplayModePtr pMode); 1222209ff23fSmrgextern void RADEONUnblank(ScrnInfoPtr pScrn); 1223209ff23fSmrgextern Bool RADEONSetTiling(ScrnInfoPtr pScrn); 1224b7e1c893Smrgextern void RADEONInitDispBandwidth(ScrnInfoPtr pScrn); 1225209ff23fSmrg 1226209ff23fSmrg/* radeon_cursor.c */ 1227209ff23fSmrgextern Bool RADEONCursorInit(ScreenPtr pScreen); 1228209ff23fSmrgextern void radeon_crtc_hide_cursor(xf86CrtcPtr crtc); 1229209ff23fSmrgextern void radeon_crtc_load_cursor_argb(xf86CrtcPtr crtc, CARD32 *image); 1230209ff23fSmrgextern void radeon_crtc_set_cursor_colors(xf86CrtcPtr crtc, int bg, int fg); 1231209ff23fSmrgextern void radeon_crtc_set_cursor_position(xf86CrtcPtr crtc, int x, int y); 1232209ff23fSmrgextern void radeon_crtc_show_cursor(xf86CrtcPtr crtc); 1233209ff23fSmrg 1234209ff23fSmrg#ifdef XF86DRI 1235209ff23fSmrg/* radeon_dri.c */ 1236209ff23fSmrgextern void RADEONDRIAllocatePCIGARTTable(ScreenPtr pScreen); 1237209ff23fSmrgextern void RADEONDRICloseScreen(ScreenPtr pScreen); 1238209ff23fSmrgextern Bool RADEONDRIFinishScreenInit(ScreenPtr pScreen); 1239209ff23fSmrgextern int RADEONDRIGetPciAperTableSize(ScrnInfoPtr pScrn); 1240209ff23fSmrgextern Bool RADEONDRIGetVersion(ScrnInfoPtr pScrn); 1241209ff23fSmrgextern void RADEONDRIResume(ScreenPtr pScreen); 1242209ff23fSmrgextern Bool RADEONDRIScreenInit(ScreenPtr pScreen); 1243209ff23fSmrgextern int RADEONDRISetParam(ScrnInfoPtr pScrn, 1244209ff23fSmrg unsigned int param, int64_t value); 1245209ff23fSmrgextern Bool RADEONDRISetVBlankInterrupt(ScrnInfoPtr pScrn, Bool on); 1246209ff23fSmrgextern void RADEONDRIStop(ScreenPtr pScreen); 1247209ff23fSmrg#endif 1248209ff23fSmrg 1249209ff23fSmrg/* radeon_driver.c */ 1250209ff23fSmrgextern void RADEONDoAdjustFrame(ScrnInfoPtr pScrn, int x, int y, Bool clone); 1251209ff23fSmrgextern void RADEONChangeSurfaces(ScrnInfoPtr pScrn); 1252209ff23fSmrgextern RADEONEntPtr RADEONEntPriv(ScrnInfoPtr pScrn); 1253209ff23fSmrgextern int RADEONMinBits(int val); 1254209ff23fSmrgextern unsigned RADEONINMC(ScrnInfoPtr pScrn, int addr); 1255209ff23fSmrgextern unsigned RADEONINPLL(ScrnInfoPtr pScrn, int addr); 1256b7e1c893Smrgextern unsigned RADEONINPCIE(ScrnInfoPtr pScrn, int addr); 1257ad43ddacSmrgextern unsigned R600INPCIE_PORT(ScrnInfoPtr pScrn, int addr); 1258209ff23fSmrgextern void RADEONOUTMC(ScrnInfoPtr pScrn, int addr, uint32_t data); 1259209ff23fSmrgextern void RADEONOUTPLL(ScrnInfoPtr pScrn, int addr, uint32_t data); 1260b7e1c893Smrgextern void RADEONOUTPCIE(ScrnInfoPtr pScrn, int addr, uint32_t data); 1261ad43ddacSmrgextern void R600OUTPCIE_PORT(ScrnInfoPtr pScrn, int addr, uint32_t data); 1262209ff23fSmrgextern void RADEONPllErrataAfterData(RADEONInfoPtr info); 1263209ff23fSmrgextern void RADEONPllErrataAfterIndex(RADEONInfoPtr info); 1264209ff23fSmrgextern void RADEONWaitForVerticalSync(ScrnInfoPtr pScrn); 1265209ff23fSmrgextern void RADEONWaitForVerticalSync2(ScrnInfoPtr pScrn); 1266209ff23fSmrgextern void RADEONInitMemMapRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save, 1267209ff23fSmrg RADEONInfoPtr info); 1268209ff23fSmrgextern void RADEONRestoreMemMapRegisters(ScrnInfoPtr pScrn, 1269209ff23fSmrg RADEONSavePtr restore); 1270ad43ddacSmrgextern Bool 1271ad43ddacSmrgRADEONZaphodStringMatches(ScrnInfoPtr pScrn, const char *s, char *output_name); 1272ad43ddacSmrg 1273ad43ddacSmrgBool RADEONGetRec(ScrnInfoPtr pScrn); 1274ad43ddacSmrgvoid RADEONFreeRec(ScrnInfoPtr pScrn); 1275ad43ddacSmrgBool RADEONPreInitVisual(ScrnInfoPtr pScrn); 1276ad43ddacSmrgBool RADEONPreInitWeight(ScrnInfoPtr pScrn); 1277ad43ddacSmrg 1278ad43ddacSmrgextern Bool RADEON_DP_I2CInit(ScrnInfoPtr pScrn, I2CBusPtr *bus_ptr, 1279ad43ddacSmrg char *name, xf86OutputPtr output); 1280ad43ddacSmrgextern void RADEON_DP_GetDPCD(xf86OutputPtr output); 1281ad43ddacSmrgextern int RADEON_DP_GetSinkType(xf86OutputPtr output); 1282ad43ddacSmrg 1283ad43ddacSmrg/* radeon_pm.c */ 1284ad43ddacSmrgextern void RADEONPMInit(ScrnInfoPtr pScrn); 1285ad43ddacSmrgextern void RADEONPMBlockHandler(ScrnInfoPtr pScrn); 1286ad43ddacSmrgextern void RADEONPMEnterVT(ScrnInfoPtr pScrn); 1287ad43ddacSmrgextern void RADEONPMLeaveVT(ScrnInfoPtr pScrn); 1288ad43ddacSmrgextern void RADEONPMFini(ScrnInfoPtr pScrn); 1289209ff23fSmrg 1290209ff23fSmrg#ifdef USE_EXA 1291209ff23fSmrg/* radeon_exa.c */ 1292209ff23fSmrgextern Bool RADEONSetupMemEXA(ScreenPtr pScreen); 1293b13dfe66Smrgextern Bool radeon_transform_is_affine_or_scaled(PictTransformPtr t); 1294209ff23fSmrg 1295209ff23fSmrg/* radeon_exa_funcs.c */ 1296209ff23fSmrgextern void RADEONCopyCP(PixmapPtr pDst, int srcX, int srcY, int dstX, 1297209ff23fSmrg int dstY, int w, int h); 1298209ff23fSmrgextern void RADEONCopyMMIO(PixmapPtr pDst, int srcX, int srcY, int dstX, 1299209ff23fSmrg int dstY, int w, int h); 1300209ff23fSmrgextern Bool RADEONDrawInitCP(ScreenPtr pScreen); 1301209ff23fSmrgextern Bool RADEONDrawInitMMIO(ScreenPtr pScreen); 1302209ff23fSmrgextern void RADEONDoPrepareCopyCP(ScrnInfoPtr pScrn, 1303209ff23fSmrg uint32_t src_pitch_offset, 1304209ff23fSmrg uint32_t dst_pitch_offset, 1305209ff23fSmrg uint32_t datatype, int rop, 1306209ff23fSmrg Pixel planemask); 1307209ff23fSmrgextern void RADEONDoPrepareCopyMMIO(ScrnInfoPtr pScrn, 1308209ff23fSmrg uint32_t src_pitch_offset, 1309209ff23fSmrg uint32_t dst_pitch_offset, 1310209ff23fSmrg uint32_t datatype, int rop, 1311209ff23fSmrg Pixel planemask); 1312b7e1c893Smrgextern Bool R600DrawInit(ScreenPtr pScreen); 1313b7e1c893Smrgextern Bool R600LoadShaders(ScrnInfoPtr pScrn); 1314921a55d8Smrg#ifdef XF86DRM_MODE 1315921a55d8Smrgextern Bool EVERGREENDrawInit(ScreenPtr pScreen); 1316921a55d8Smrgextern Bool EVERGREENLoadShaders(ScrnInfoPtr pScrn); 1317921a55d8Smrg#endif 1318209ff23fSmrg#endif 1319209ff23fSmrg 1320209ff23fSmrg#if defined(XF86DRI) && defined(USE_EXA) 1321209ff23fSmrg/* radeon_exa.c */ 1322209ff23fSmrgextern Bool RADEONGetDatatypeBpp(int bpp, uint32_t *type); 1323209ff23fSmrgextern Bool RADEONGetPixmapOffsetPitch(PixmapPtr pPix, 1324209ff23fSmrg uint32_t *pitch_offset); 1325209ff23fSmrgextern unsigned long long RADEONTexOffsetStart(PixmapPtr pPix); 1326209ff23fSmrg#endif 1327209ff23fSmrg 1328209ff23fSmrg/* radeon_modes.c */ 1329209ff23fSmrgextern void RADEONSetPitch(ScrnInfoPtr pScrn); 1330209ff23fSmrgextern DisplayModePtr RADEONProbeOutputModes(xf86OutputPtr output); 1331209ff23fSmrg 1332209ff23fSmrg/* radeon_output.c */ 1333209ff23fSmrgextern RADEONI2CBusRec atom_setup_i2c_bus(int ddc_line); 1334209ff23fSmrgextern RADEONI2CBusRec legacy_setup_i2c_bus(int ddc_line); 1335209ff23fSmrgextern void RADEONGetPanelInfo(ScrnInfoPtr pScrn); 1336209ff23fSmrgextern void RADEONInitConnector(xf86OutputPtr output); 1337209ff23fSmrgextern void RADEONPrintPortMap(ScrnInfoPtr pScrn); 1338209ff23fSmrgextern void RADEONSetOutputType(ScrnInfoPtr pScrn, 1339209ff23fSmrg RADEONOutputPrivatePtr radeon_output); 1340209ff23fSmrgextern Bool RADEONSetupConnectors(ScrnInfoPtr pScrn); 1341c503f109Smrgextern Bool RADEONI2CDoLock(xf86OutputPtr output, I2CBusPtr b, Bool lock_state); 1342b7e1c893Smrg 1343ad43ddacSmrgextern Bool radeon_dp_mode_fixup(xf86OutputPtr output, DisplayModePtr mode, DisplayModePtr adjusted_mode); 1344209ff23fSmrg 1345209ff23fSmrg/* radeon_tv.c */ 1346209ff23fSmrgextern void RADEONSaveTVRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save); 1347209ff23fSmrgextern void RADEONAdjustCrtcRegistersForTV(ScrnInfoPtr pScrn, RADEONSavePtr save, 1348209ff23fSmrg DisplayModePtr mode, xf86OutputPtr output); 1349209ff23fSmrgextern void RADEONAdjustPLLRegistersForTV(ScrnInfoPtr pScrn, RADEONSavePtr save, 1350209ff23fSmrg DisplayModePtr mode, xf86OutputPtr output); 1351209ff23fSmrgextern void RADEONAdjustCrtc2RegistersForTV(ScrnInfoPtr pScrn, RADEONSavePtr save, 1352209ff23fSmrg DisplayModePtr mode, xf86OutputPtr output); 1353209ff23fSmrgextern void RADEONAdjustPLL2RegistersForTV(ScrnInfoPtr pScrn, RADEONSavePtr save, 1354209ff23fSmrg DisplayModePtr mode, xf86OutputPtr output); 1355209ff23fSmrgextern void RADEONInitTVRegisters(xf86OutputPtr output, RADEONSavePtr save, 1356209ff23fSmrg DisplayModePtr mode, BOOL IsPrimary); 1357209ff23fSmrgextern void RADEONRestoreTVRegisters(ScrnInfoPtr pScrn, RADEONSavePtr restore); 1358209ff23fSmrgextern void RADEONUpdateHVPosition(xf86OutputPtr output, DisplayModePtr mode); 1359209ff23fSmrg 1360209ff23fSmrg/* radeon_video.c */ 1361209ff23fSmrgextern void RADEONInitVideo(ScreenPtr pScreen); 1362209ff23fSmrgextern void RADEONResetVideo(ScrnInfoPtr pScrn); 1363ad43ddacSmrgextern Bool radeon_load_bicubic_texture(ScrnInfoPtr pScrn); 1364ad43ddacSmrgextern xf86CrtcPtr radeon_pick_best_crtc(ScrnInfoPtr pScrn, 1365ad43ddacSmrg int x1, int x2, int y1, int y2); 1366209ff23fSmrg 1367b7e1c893Smrg/* radeon_legacy_memory.c */ 1368b7e1c893Smrgextern uint32_t 1369b7e1c893Smrgradeon_legacy_allocate_memory(ScrnInfoPtr pScrn, 1370b7e1c893Smrg void **mem_struct, 1371b7e1c893Smrg int size, 1372ad43ddacSmrg int align, 1373ad43ddacSmrg int domain); 1374b7e1c893Smrgextern void 1375b7e1c893Smrgradeon_legacy_free_memory(ScrnInfoPtr pScrn, 1376b7e1c893Smrg void *mem_struct); 1377b7e1c893Smrg 1378ad43ddacSmrg#ifdef XF86DRM_MODE 1379ad43ddacSmrgextern void radeon_cs_flush_indirect(ScrnInfoPtr pScrn); 1380ad43ddacSmrgextern void radeon_ddx_cs_start(ScrnInfoPtr pScrn, 1381ad43ddacSmrg int num, const char *file, 1382ad43ddacSmrg const char *func, int line); 1383ad43ddacSmrgvoid radeon_kms_update_vram_limit(ScrnInfoPtr pScrn, int new_fb_size); 1384ad43ddacSmrg#endif 1385ad43ddacSmrgstruct radeon_bo *radeon_get_pixmap_bo(PixmapPtr pPix); 1386ad43ddacSmrgvoid radeon_set_pixmap_bo(PixmapPtr pPix, struct radeon_bo *bo); 1387ad43ddacSmrg 1388209ff23fSmrg#ifdef XF86DRI 1389209ff23fSmrg# ifdef USE_XAA 1390209ff23fSmrg/* radeon_accelfuncs.c */ 1391209ff23fSmrgextern void RADEONAccelInitCP(ScreenPtr pScreen, XAAInfoRecPtr a); 1392209ff23fSmrg# endif 1393209ff23fSmrg 1394209ff23fSmrg#define RADEONCP_START(pScrn, info) \ 1395209ff23fSmrgdo { \ 1396b7e1c893Smrg int _ret = drmCommandNone(info->dri->drmFD, DRM_RADEON_CP_START); \ 1397209ff23fSmrg if (_ret) { \ 1398209ff23fSmrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \ 1399209ff23fSmrg "%s: CP start %d\n", __FUNCTION__, _ret); \ 1400209ff23fSmrg } \ 1401b7e1c893Smrg info->cp->CPStarted = TRUE; \ 1402209ff23fSmrg} while (0) 1403209ff23fSmrg 1404209ff23fSmrg#define RADEONCP_RELEASE(pScrn, info) \ 1405209ff23fSmrgdo { \ 1406ad43ddacSmrg if (info->cs) { \ 1407ad43ddacSmrg radeon_cs_flush_indirect(pScrn); \ 1408ad43ddacSmrg } else if (info->cp->CPInUse) { \ 1409209ff23fSmrg RADEON_PURGE_CACHE(); \ 1410209ff23fSmrg RADEON_WAIT_UNTIL_IDLE(); \ 1411209ff23fSmrg RADEONCPReleaseIndirect(pScrn); \ 1412b7e1c893Smrg info->cp->CPInUse = FALSE; \ 1413209ff23fSmrg } \ 1414209ff23fSmrg} while (0) 1415209ff23fSmrg 1416209ff23fSmrg#define RADEONCP_STOP(pScrn, info) \ 1417209ff23fSmrgdo { \ 1418209ff23fSmrg int _ret; \ 1419b7e1c893Smrg if (info->cp->CPStarted) { \ 1420209ff23fSmrg _ret = RADEONCPStop(pScrn, info); \ 1421209ff23fSmrg if (_ret) { \ 1422209ff23fSmrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \ 1423209ff23fSmrg "%s: CP stop %d\n", __FUNCTION__, _ret); \ 1424209ff23fSmrg } \ 1425b7e1c893Smrg info->cp->CPStarted = FALSE; \ 1426b7e1c893Smrg } \ 1427b7e1c893Smrg if (info->ChipFamily < CHIP_FAMILY_R600) \ 1428b7e1c893Smrg RADEONEngineRestore(pScrn); \ 1429b7e1c893Smrg info->cp->CPRuns = FALSE; \ 1430209ff23fSmrg} while (0) 1431209ff23fSmrg 1432209ff23fSmrg#define RADEONCP_RESET(pScrn, info) \ 1433209ff23fSmrgdo { \ 1434b7e1c893Smrg int _ret = drmCommandNone(info->dri->drmFD, DRM_RADEON_CP_RESET); \ 1435209ff23fSmrg if (_ret) { \ 1436209ff23fSmrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \ 1437209ff23fSmrg "%s: CP reset %d\n", __FUNCTION__, _ret); \ 1438209ff23fSmrg } \ 1439209ff23fSmrg} while (0) 1440209ff23fSmrg 1441209ff23fSmrg#define RADEONCP_REFRESH(pScrn, info) \ 1442209ff23fSmrgdo { \ 1443ad43ddacSmrg if (!info->cp->CPInUse && !info->cs) { \ 1444b7e1c893Smrg if (info->cp->needCacheFlush) { \ 1445209ff23fSmrg RADEON_PURGE_CACHE(); \ 1446209ff23fSmrg RADEON_PURGE_ZCACHE(); \ 1447b7e1c893Smrg info->cp->needCacheFlush = FALSE; \ 1448209ff23fSmrg } \ 1449209ff23fSmrg RADEON_WAIT_UNTIL_IDLE(); \ 1450b7e1c893Smrg info->cp->CPInUse = TRUE; \ 1451209ff23fSmrg } \ 1452209ff23fSmrg} while (0) 1453209ff23fSmrg 1454209ff23fSmrg 1455209ff23fSmrg#define CP_PACKET0(reg, n) \ 1456209ff23fSmrg (RADEON_CP_PACKET0 | ((n) << 16) | ((reg) >> 2)) 1457209ff23fSmrg#define CP_PACKET1(reg0, reg1) \ 1458209ff23fSmrg (RADEON_CP_PACKET1 | (((reg1) >> 2) << 11) | ((reg0) >> 2)) 1459209ff23fSmrg#define CP_PACKET2() \ 1460209ff23fSmrg (RADEON_CP_PACKET2) 1461209ff23fSmrg#define CP_PACKET3(pkt, n) \ 1462209ff23fSmrg (RADEON_CP_PACKET3 | (pkt) | ((n) << 16)) 1463209ff23fSmrg 1464209ff23fSmrg 1465209ff23fSmrg#define RADEON_VERBOSE 0 1466209ff23fSmrg 1467209ff23fSmrg#define RING_LOCALS uint32_t *__head = NULL; int __expected; int __count = 0 1468209ff23fSmrg 1469209ff23fSmrg#define BEGIN_RING(n) do { \ 1470209ff23fSmrg if (RADEON_VERBOSE) { \ 1471209ff23fSmrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ 1472209ff23fSmrg "BEGIN_RING(%d) in %s\n", (unsigned int)n, __FUNCTION__);\ 1473209ff23fSmrg } \ 1474ad43ddacSmrg if (info->cs) { radeon_ddx_cs_start(pScrn, n, __FILE__, __func__, __LINE__); } else { \ 1475ad43ddacSmrg if (++info->cp->dma_begin_count != 1) { \ 1476209ff23fSmrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \ 1477209ff23fSmrg "BEGIN_RING without end at %s:%d\n", \ 1478ad43ddacSmrg info->cp->dma_debug_func, info->cp->dma_debug_lineno); \ 1479b7e1c893Smrg info->cp->dma_begin_count = 1; \ 1480ad43ddacSmrg } \ 1481ad43ddacSmrg info->cp->dma_debug_func = __FILE__; \ 1482ad43ddacSmrg info->cp->dma_debug_lineno = __LINE__; \ 1483ad43ddacSmrg if (!info->cp->indirectBuffer) { \ 1484b7e1c893Smrg info->cp->indirectBuffer = RADEONCPGetBuffer(pScrn); \ 1485b7e1c893Smrg info->cp->indirectStart = 0; \ 1486ad43ddacSmrg } else if (info->cp->indirectBuffer->used + (n) * (int)sizeof(uint32_t) > \ 1487ad43ddacSmrg info->cp->indirectBuffer->total) { \ 1488209ff23fSmrg RADEONCPFlushIndirect(pScrn, 1); \ 1489ad43ddacSmrg } \ 1490ad43ddacSmrg __expected = n; \ 1491ad43ddacSmrg __head = (pointer)((char *)info->cp->indirectBuffer->address + \ 1492ad43ddacSmrg info->cp->indirectBuffer->used); \ 1493ad43ddacSmrg __count = 0; \ 1494209ff23fSmrg } \ 1495209ff23fSmrg} while (0) 1496209ff23fSmrg 1497209ff23fSmrg#define ADVANCE_RING() do { \ 1498ad43ddacSmrg if (info->cs) radeon_cs_end(info->cs, __FILE__, __func__, __LINE__); else { \ 1499ad43ddacSmrg if (info->cp->dma_begin_count-- != 1) { \ 1500209ff23fSmrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \ 1501209ff23fSmrg "ADVANCE_RING without begin at %s:%d\n", \ 1502209ff23fSmrg __FILE__, __LINE__); \ 1503b7e1c893Smrg info->cp->dma_begin_count = 0; \ 1504ad43ddacSmrg } \ 1505ad43ddacSmrg if (__count != __expected) { \ 1506209ff23fSmrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \ 1507209ff23fSmrg "ADVANCE_RING count != expected (%d vs %d) at %s:%d\n", \ 1508209ff23fSmrg __count, __expected, __FILE__, __LINE__); \ 1509ad43ddacSmrg } \ 1510ad43ddacSmrg if (RADEON_VERBOSE) { \ 1511209ff23fSmrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ 1512209ff23fSmrg "ADVANCE_RING() start: %d used: %d count: %d\n", \ 1513b7e1c893Smrg info->cp->indirectStart, \ 1514b7e1c893Smrg info->cp->indirectBuffer->used, \ 1515209ff23fSmrg __count * (int)sizeof(uint32_t)); \ 1516ad43ddacSmrg } \ 1517ad43ddacSmrg info->cp->indirectBuffer->used += __count * (int)sizeof(uint32_t); \ 1518209ff23fSmrg } \ 1519ad43ddacSmrg } while (0) 1520209ff23fSmrg 1521209ff23fSmrg#define OUT_RING(x) do { \ 1522209ff23fSmrg if (RADEON_VERBOSE) { \ 1523209ff23fSmrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ 1524209ff23fSmrg " OUT_RING(0x%08x)\n", (unsigned int)(x)); \ 1525209ff23fSmrg } \ 1526ad43ddacSmrg if (info->cs) radeon_cs_write_dword(info->cs, (x)); else \ 1527209ff23fSmrg __head[__count++] = (x); \ 1528209ff23fSmrg} while (0) 1529209ff23fSmrg 1530209ff23fSmrg#define OUT_RING_REG(reg, val) \ 1531209ff23fSmrgdo { \ 1532209ff23fSmrg OUT_RING(CP_PACKET0(reg, 0)); \ 1533209ff23fSmrg OUT_RING(val); \ 1534209ff23fSmrg} while (0) 1535209ff23fSmrg 1536ad43ddacSmrg#define OUT_RING_RELOC(x, read_domains, write_domain) \ 1537ad43ddacSmrg do { \ 1538ad43ddacSmrg int _ret; \ 1539ad43ddacSmrg _ret = radeon_cs_write_reloc(info->cs, x, read_domains, write_domain, 0); \ 1540ad43ddacSmrg if (_ret) ErrorF("reloc emit failure %d\n", _ret); \ 1541ad43ddacSmrg } while(0) 1542ad43ddacSmrg 1543ad43ddacSmrg 1544209ff23fSmrg#define FLUSH_RING() \ 1545209ff23fSmrgdo { \ 1546209ff23fSmrg if (RADEON_VERBOSE) \ 1547209ff23fSmrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ 1548209ff23fSmrg "FLUSH_RING in %s\n", __FUNCTION__); \ 1549ad43ddacSmrg if (info->cs) \ 1550ad43ddacSmrg radeon_cs_flush_indirect(pScrn); \ 1551ad43ddacSmrg else if (info->cp->indirectBuffer) \ 1552209ff23fSmrg RADEONCPFlushIndirect(pScrn, 0); \ 1553209ff23fSmrg} while (0) 1554209ff23fSmrg 1555209ff23fSmrg 1556209ff23fSmrg#define RADEON_WAIT_UNTIL_2D_IDLE() \ 1557209ff23fSmrgdo { \ 1558b7e1c893Smrg if (info->ChipFamily < CHIP_FAMILY_R600) { \ 1559b7e1c893Smrg BEGIN_RING(2); \ 1560b7e1c893Smrg OUT_RING(CP_PACKET0(RADEON_WAIT_UNTIL, 0)); \ 1561b7e1c893Smrg OUT_RING((RADEON_WAIT_2D_IDLECLEAN | \ 1562b7e1c893Smrg RADEON_WAIT_HOST_IDLECLEAN)); \ 1563b7e1c893Smrg ADVANCE_RING(); \ 1564b7e1c893Smrg } \ 1565209ff23fSmrg} while (0) 1566209ff23fSmrg 1567209ff23fSmrg#define RADEON_WAIT_UNTIL_3D_IDLE() \ 1568209ff23fSmrgdo { \ 1569b7e1c893Smrg if (info->ChipFamily < CHIP_FAMILY_R600) { \ 1570b7e1c893Smrg BEGIN_RING(2); \ 1571b7e1c893Smrg OUT_RING(CP_PACKET0(RADEON_WAIT_UNTIL, 0)); \ 1572b7e1c893Smrg OUT_RING((RADEON_WAIT_3D_IDLECLEAN | \ 1573b7e1c893Smrg RADEON_WAIT_HOST_IDLECLEAN)); \ 1574b7e1c893Smrg ADVANCE_RING(); \ 1575b7e1c893Smrg } \ 1576209ff23fSmrg} while (0) 1577209ff23fSmrg 1578209ff23fSmrg#define RADEON_WAIT_UNTIL_IDLE() \ 1579209ff23fSmrgdo { \ 1580209ff23fSmrg if (RADEON_VERBOSE) { \ 1581209ff23fSmrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ 1582209ff23fSmrg "WAIT_UNTIL_IDLE() in %s\n", __FUNCTION__); \ 1583209ff23fSmrg } \ 1584b7e1c893Smrg if (info->ChipFamily < CHIP_FAMILY_R600) { \ 1585b7e1c893Smrg BEGIN_RING(2); \ 1586b7e1c893Smrg OUT_RING(CP_PACKET0(RADEON_WAIT_UNTIL, 0)); \ 1587b7e1c893Smrg OUT_RING((RADEON_WAIT_2D_IDLECLEAN | \ 1588b7e1c893Smrg RADEON_WAIT_3D_IDLECLEAN | \ 1589b7e1c893Smrg RADEON_WAIT_HOST_IDLECLEAN)); \ 1590b7e1c893Smrg ADVANCE_RING(); \ 1591b7e1c893Smrg } \ 1592209ff23fSmrg} while (0) 1593209ff23fSmrg 1594209ff23fSmrg#define RADEON_PURGE_CACHE() \ 1595209ff23fSmrgdo { \ 1596b7e1c893Smrg if (info->ChipFamily < CHIP_FAMILY_R600) { \ 1597b7e1c893Smrg BEGIN_RING(2); \ 1598b7e1c893Smrg if (info->ChipFamily <= CHIP_FAMILY_RV280) { \ 1599b7e1c893Smrg OUT_RING(CP_PACKET0(RADEON_RB3D_DSTCACHE_CTLSTAT, 0)); \ 1600b7e1c893Smrg OUT_RING(RADEON_RB3D_DC_FLUSH_ALL); \ 1601b7e1c893Smrg } else { \ 1602b7e1c893Smrg OUT_RING(CP_PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0)); \ 1603b7e1c893Smrg OUT_RING(R300_RB3D_DC_FLUSH_ALL); \ 1604b7e1c893Smrg } \ 1605b7e1c893Smrg ADVANCE_RING(); \ 1606b7e1c893Smrg } \ 1607209ff23fSmrg} while (0) 1608209ff23fSmrg 1609209ff23fSmrg#define RADEON_PURGE_ZCACHE() \ 1610209ff23fSmrgdo { \ 1611b7e1c893Smrg if (info->ChipFamily < CHIP_FAMILY_R600) { \ 1612b7e1c893Smrg BEGIN_RING(2); \ 1613b7e1c893Smrg if (info->ChipFamily <= CHIP_FAMILY_RV280) { \ 1614b7e1c893Smrg OUT_RING(CP_PACKET0(RADEON_RB3D_ZCACHE_CTLSTAT, 0)); \ 1615b7e1c893Smrg OUT_RING(RADEON_RB3D_ZC_FLUSH_ALL); \ 1616b7e1c893Smrg } else { \ 1617b7e1c893Smrg OUT_RING(CP_PACKET0(R300_RB3D_ZCACHE_CTLSTAT, 0)); \ 1618b7e1c893Smrg OUT_RING(R300_ZC_FLUSH_ALL); \ 1619b7e1c893Smrg } \ 1620b7e1c893Smrg ADVANCE_RING(); \ 1621209ff23fSmrg } \ 1622209ff23fSmrg} while (0) 1623209ff23fSmrg 1624209ff23fSmrg#endif /* XF86DRI */ 1625209ff23fSmrg 1626b7e1c893Smrg#if defined(XF86DRI) && defined(USE_EXA) 1627ad43ddacSmrg 1628ad43ddacSmrg#ifdef XF86DRM_MODE 1629ad43ddacSmrg#define CS_FULL(cs) ((cs)->cdw > 15 * 1024) 1630ad43ddacSmrg#else 1631ad43ddacSmrg#define CS_FULL(cs) FALSE 1632ad43ddacSmrg#endif 1633ad43ddacSmrg 1634b7e1c893Smrg#define RADEON_SWITCH_TO_2D() \ 1635b7e1c893Smrgdo { \ 1636b7e1c893Smrg uint32_t flush = 0; \ 1637b7e1c893Smrg switch (info->accel_state->engineMode) { \ 1638b7e1c893Smrg case EXA_ENGINEMODE_UNKNOWN: \ 1639b7e1c893Smrg flush = 1; \ 1640ad43ddacSmrg break; \ 1641ad43ddacSmrg case EXA_ENGINEMODE_3D: \ 1642ad43ddacSmrg flush = !info->cs || CS_FULL(info->cs); \ 1643ad43ddacSmrg break; \ 1644b7e1c893Smrg case EXA_ENGINEMODE_2D: \ 1645ad43ddacSmrg flush = info->cs && CS_FULL(info->cs); \ 1646b7e1c893Smrg break; \ 1647b7e1c893Smrg } \ 1648ad43ddacSmrg if (flush) { \ 1649ad43ddacSmrg if (info->cs) \ 1650ad43ddacSmrg radeon_cs_flush_indirect(pScrn); \ 1651ad43ddacSmrg else if (info->directRenderingEnabled) \ 1652ad43ddacSmrg RADEONCPFlushIndirect(pScrn, 1); \ 1653ad43ddacSmrg } \ 1654b7e1c893Smrg info->accel_state->engineMode = EXA_ENGINEMODE_2D; \ 1655b7e1c893Smrg} while (0); 1656b7e1c893Smrg 1657b7e1c893Smrg#define RADEON_SWITCH_TO_3D() \ 1658b7e1c893Smrgdo { \ 1659b7e1c893Smrg uint32_t flush = 0; \ 1660b7e1c893Smrg switch (info->accel_state->engineMode) { \ 1661b7e1c893Smrg case EXA_ENGINEMODE_UNKNOWN: \ 1662b7e1c893Smrg flush = 1; \ 1663ad43ddacSmrg break; \ 1664ad43ddacSmrg case EXA_ENGINEMODE_2D: \ 1665ad43ddacSmrg flush = !info->cs || CS_FULL(info->cs); \ 1666ad43ddacSmrg break; \ 1667b7e1c893Smrg case EXA_ENGINEMODE_3D: \ 1668ad43ddacSmrg flush = info->cs && CS_FULL(info->cs); \ 1669b7e1c893Smrg break; \ 1670b7e1c893Smrg } \ 1671b7e1c893Smrg if (flush) { \ 1672ad43ddacSmrg if (info->cs) \ 1673ad43ddacSmrg radeon_cs_flush_indirect(pScrn); \ 1674ad43ddacSmrg else if (info->directRenderingEnabled) \ 1675b7e1c893Smrg RADEONCPFlushIndirect(pScrn, 1); \ 1676b7e1c893Smrg } \ 1677ad43ddacSmrg if (!info->accel_state->XInited3D) \ 1678ad43ddacSmrg RADEONInit3DEngine(pScrn); \ 1679b7e1c893Smrg info->accel_state->engineMode = EXA_ENGINEMODE_3D; \ 1680b7e1c893Smrg} while (0); 1681b7e1c893Smrg#else 1682b7e1c893Smrg#define RADEON_SWITCH_TO_2D() 1683b7e1c893Smrg#define RADEON_SWITCH_TO_3D() 1684b7e1c893Smrg#endif 1685b7e1c893Smrg 1686209ff23fSmrgstatic __inline__ void RADEON_MARK_SYNC(RADEONInfoPtr info, ScrnInfoPtr pScrn) 1687209ff23fSmrg{ 1688209ff23fSmrg#ifdef USE_EXA 1689209ff23fSmrg if (info->useEXA) 1690209ff23fSmrg exaMarkSync(pScrn->pScreen); 1691209ff23fSmrg#endif 1692209ff23fSmrg#ifdef USE_XAA 1693209ff23fSmrg if (!info->useEXA) 1694b7e1c893Smrg SET_SYNC_FLAG(info->accel_state->accel); 1695209ff23fSmrg#endif 1696209ff23fSmrg} 1697209ff23fSmrg 1698209ff23fSmrgstatic __inline__ void RADEON_SYNC(RADEONInfoPtr info, ScrnInfoPtr pScrn) 1699209ff23fSmrg{ 1700209ff23fSmrg#ifdef USE_EXA 1701b7e1c893Smrg if (info->useEXA && pScrn->pScreen) 1702209ff23fSmrg exaWaitSync(pScrn->pScreen); 1703209ff23fSmrg#endif 1704209ff23fSmrg#ifdef USE_XAA 1705b7e1c893Smrg if (!info->useEXA && info->accel_state->accel) 1706b7e1c893Smrg info->accel_state->accel->Sync(pScrn); 1707209ff23fSmrg#endif 1708209ff23fSmrg} 1709209ff23fSmrg 1710209ff23fSmrgstatic __inline__ void radeon_init_timeout(struct timeval *endtime, 1711209ff23fSmrg unsigned int timeout) 1712209ff23fSmrg{ 1713209ff23fSmrg gettimeofday(endtime, NULL); 1714209ff23fSmrg endtime->tv_usec += timeout; 1715209ff23fSmrg endtime->tv_sec += endtime->tv_usec / 1000000; 1716209ff23fSmrg endtime->tv_usec %= 1000000; 1717209ff23fSmrg} 1718209ff23fSmrg 1719209ff23fSmrgstatic __inline__ int radeon_timedout(const struct timeval *endtime) 1720209ff23fSmrg{ 1721209ff23fSmrg struct timeval now; 1722209ff23fSmrg gettimeofday(&now, NULL); 1723209ff23fSmrg return now.tv_sec == endtime->tv_sec ? 1724209ff23fSmrg now.tv_usec > endtime->tv_usec : now.tv_sec > endtime->tv_sec; 1725209ff23fSmrg} 1726209ff23fSmrg 1727ad43ddacSmrgenum { 1728ad43ddacSmrg RADEON_CREATE_PIXMAP_TILING_MACRO = 0x10000000, 1729ad43ddacSmrg RADEON_CREATE_PIXMAP_TILING_MICRO = 0x20000000, 1730ad43ddacSmrg}; 1731ad43ddacSmrg 1732209ff23fSmrg#endif /* _RADEON_H_ */ 1733