radeon.h revision 7821949a
1de2362d3Smrg/* 2de2362d3Smrg * Copyright 2000 ATI Technologies Inc., Markham, Ontario, and 3de2362d3Smrg * VA Linux Systems Inc., Fremont, California. 4de2362d3Smrg * 5de2362d3Smrg * All Rights Reserved. 6de2362d3Smrg * 7de2362d3Smrg * Permission is hereby granted, free of charge, to any person obtaining 8de2362d3Smrg * a copy of this software and associated documentation files (the 9de2362d3Smrg * "Software"), to deal in the Software without restriction, including 10de2362d3Smrg * without limitation on the rights to use, copy, modify, merge, 11de2362d3Smrg * publish, distribute, sublicense, and/or sell copies of the Software, 12de2362d3Smrg * and to permit persons to whom the Software is furnished to do so, 13de2362d3Smrg * subject to the following conditions: 14de2362d3Smrg * 15de2362d3Smrg * The above copyright notice and this permission notice (including the 16de2362d3Smrg * next paragraph) shall be included in all copies or substantial 17de2362d3Smrg * portions of the Software. 18de2362d3Smrg * 19de2362d3Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20de2362d3Smrg * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21de2362d3Smrg * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22de2362d3Smrg * NON-INFRINGEMENT. IN NO EVENT SHALL ATI, VA LINUX SYSTEMS AND/OR 23de2362d3Smrg * THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24de2362d3Smrg * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25de2362d3Smrg * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 26de2362d3Smrg * DEALINGS IN THE SOFTWARE. 27de2362d3Smrg */ 28de2362d3Smrg 29de2362d3Smrg/* 30de2362d3Smrg * Authors: 31de2362d3Smrg * Kevin E. Martin <martin@xfree86.org> 32de2362d3Smrg * Rickard E. Faith <faith@valinux.com> 33de2362d3Smrg * Alan Hourihane <alanh@fairlite.demon.co.uk> 34de2362d3Smrg * 35de2362d3Smrg */ 36de2362d3Smrg 37de2362d3Smrg#ifndef _RADEON_H_ 38de2362d3Smrg#define _RADEON_H_ 39de2362d3Smrg 40de2362d3Smrg#include <stdlib.h> /* For abs() */ 41de2362d3Smrg#include <unistd.h> /* For usleep() */ 42de2362d3Smrg#include <sys/time.h> /* For gettimeofday() */ 43de2362d3Smrg 44de2362d3Smrg#include "config.h" 45de2362d3Smrg 46de2362d3Smrg#include "xf86str.h" 47de2362d3Smrg#include "compiler.h" 487821949aSmrg#include "xf86fbman.h" 49de2362d3Smrg 50de2362d3Smrg /* PCI support */ 51de2362d3Smrg#include "xf86Pci.h" 52de2362d3Smrg 537821949aSmrg#ifdef USE_EXA 54de2362d3Smrg#include "exa.h" 557821949aSmrg#endif 567821949aSmrg#ifdef USE_XAA 577821949aSmrg#include "xaa.h" 587821949aSmrg#endif 59de2362d3Smrg 60de2362d3Smrg /* Exa and Cursor Support */ 617821949aSmrg#include "vbe.h" 62de2362d3Smrg#include "xf86Cursor.h" 63de2362d3Smrg 64de2362d3Smrg /* DDC support */ 65de2362d3Smrg#include "xf86DDC.h" 66de2362d3Smrg 67de2362d3Smrg /* Xv support */ 68de2362d3Smrg#include "xf86xv.h" 69de2362d3Smrg 70de2362d3Smrg#include "radeon_probe.h" 717821949aSmrg#include "radeon_tv.h" 72de2362d3Smrg 73de2362d3Smrg /* DRI support */ 747821949aSmrg#ifdef XF86DRI 757821949aSmrg#define _XF86DRI_SERVER_ 767821949aSmrg#include "dri.h" 777821949aSmrg#include "GL/glxint.h" 78de2362d3Smrg#include "xf86drm.h" 79de2362d3Smrg#include "radeon_drm.h" 80de2362d3Smrg 81de2362d3Smrg#ifdef DAMAGE 82de2362d3Smrg#include "damage.h" 83de2362d3Smrg#include "globals.h" 84de2362d3Smrg#endif 857821949aSmrg#endif 86de2362d3Smrg 87de2362d3Smrg#include "xf86Crtc.h" 88de2362d3Smrg#include "X11/Xatom.h" 89de2362d3Smrg 907821949aSmrg#ifdef XF86DRM_MODE 91de2362d3Smrg#include "radeon_bo.h" 92de2362d3Smrg#include "radeon_cs.h" 93de2362d3Smrg#include "radeon_dri2.h" 94de2362d3Smrg#include "drmmode_display.h" 95de2362d3Smrg#include "radeon_surface.h" 967821949aSmrg#else 977821949aSmrg#include "radeon_dummy_bufmgr.h" 987821949aSmrg#endif 99de2362d3Smrg 100de2362d3Smrg /* Render support */ 101de2362d3Smrg#ifdef RENDER 102de2362d3Smrg#include "picturestr.h" 103de2362d3Smrg#endif 104de2362d3Smrg 105de2362d3Smrg#include "compat-api.h" 106de2362d3Smrg 107de2362d3Smrg#include "simple_list.h" 108de2362d3Smrg#include "atipcirename.h" 109de2362d3Smrg 110de2362d3Smrg#ifndef MAX 111de2362d3Smrg#define MAX(a,b) ((a)>(b)?(a):(b)) 112de2362d3Smrg#endif 113de2362d3Smrg#ifndef MIN 114de2362d3Smrg#define MIN(a,b) ((a)>(b)?(b):(a)) 115de2362d3Smrg#endif 116de2362d3Smrg 117de2362d3Smrg#if HAVE_BYTESWAP_H 118de2362d3Smrg#include <byteswap.h> 119de2362d3Smrg#elif defined(USE_SYS_ENDIAN_H) 120de2362d3Smrg#include <sys/endian.h> 121de2362d3Smrg#else 122de2362d3Smrg#define bswap_16(value) \ 123de2362d3Smrg ((((value) & 0xff) << 8) | ((value) >> 8)) 124de2362d3Smrg 125de2362d3Smrg#define bswap_32(value) \ 126de2362d3Smrg (((uint32_t)bswap_16((uint16_t)((value) & 0xffff)) << 16) | \ 127de2362d3Smrg (uint32_t)bswap_16((uint16_t)((value) >> 16))) 128de2362d3Smrg 129de2362d3Smrg#define bswap_64(value) \ 130de2362d3Smrg (((uint64_t)bswap_32((uint32_t)((value) & 0xffffffff)) \ 131de2362d3Smrg << 32) | \ 132de2362d3Smrg (uint64_t)bswap_32((uint32_t)((value) >> 32))) 133de2362d3Smrg#endif 134de2362d3Smrg 135de2362d3Smrg#if X_BYTE_ORDER == X_BIG_ENDIAN 136de2362d3Smrg#define le32_to_cpu(x) bswap_32(x) 137de2362d3Smrg#define le16_to_cpu(x) bswap_16(x) 138de2362d3Smrg#define cpu_to_le32(x) bswap_32(x) 139de2362d3Smrg#define cpu_to_le16(x) bswap_16(x) 140de2362d3Smrg#else 141de2362d3Smrg#define le32_to_cpu(x) (x) 142de2362d3Smrg#define le16_to_cpu(x) (x) 143de2362d3Smrg#define cpu_to_le32(x) (x) 144de2362d3Smrg#define cpu_to_le16(x) (x) 145de2362d3Smrg#endif 146de2362d3Smrg 147de2362d3Smrg/* Provide substitutes for gcc's __FUNCTION__ on other compilers */ 148de2362d3Smrg#if !defined(__GNUC__) && !defined(__FUNCTION__) 149de2362d3Smrg# define __FUNCTION__ __func__ /* C99 */ 150de2362d3Smrg#endif 151de2362d3Smrg 1527821949aSmrg#ifndef HAVE_XF86MODEBANDWIDTH 1537821949aSmrgextern unsigned int xf86ModeBandwidth(DisplayModePtr mode, int depth); 1547821949aSmrg#define MODE_BANDWIDTH MODE_BAD 1557821949aSmrg#endif 1567821949aSmrg 157de2362d3Smrgtypedef enum { 1587821949aSmrg OPTION_NOACCEL, 159de2362d3Smrg OPTION_SW_CURSOR, 1607821949aSmrg OPTION_DAC_6BIT, 1617821949aSmrg OPTION_DAC_8BIT, 1627821949aSmrg#ifdef XF86DRI 1637821949aSmrg OPTION_BUS_TYPE, 1647821949aSmrg OPTION_CP_PIO, 1657821949aSmrg OPTION_USEC_TIMEOUT, 1667821949aSmrg OPTION_AGP_MODE, 1677821949aSmrg OPTION_AGP_FW, 1687821949aSmrg OPTION_GART_SIZE, 1697821949aSmrg OPTION_GART_SIZE_OLD, 1707821949aSmrg OPTION_RING_SIZE, 1717821949aSmrg OPTION_BUFFER_SIZE, 1727821949aSmrg OPTION_DEPTH_MOVE, 173de2362d3Smrg OPTION_PAGE_FLIP, 1747821949aSmrg OPTION_NO_BACKBUFFER, 1757821949aSmrg OPTION_XV_DMA, 1767821949aSmrg OPTION_FBTEX_PERCENT, 1777821949aSmrg OPTION_DEPTH_BITS, 1787821949aSmrg OPTION_PCIAPER_SIZE, 1797821949aSmrg#ifdef USE_EXA 1807821949aSmrg OPTION_ACCEL_DFS, 181de2362d3Smrg OPTION_EXA_PIXMAPS, 1827821949aSmrg#endif 1837821949aSmrg#endif 1847821949aSmrg OPTION_IGNORE_EDID, 1857821949aSmrg OPTION_CUSTOM_EDID, 1867821949aSmrg OPTION_DISP_PRIORITY, 1877821949aSmrg OPTION_PANEL_SIZE, 1887821949aSmrg OPTION_MIN_DOTCLOCK, 189de2362d3Smrg OPTION_COLOR_TILING, 190de2362d3Smrg OPTION_COLOR_TILING_2D, 1917821949aSmrg#ifdef XvExtension 1927821949aSmrg OPTION_VIDEO_KEY, 1937821949aSmrg OPTION_RAGE_THEATRE_CRYSTAL, 1947821949aSmrg OPTION_RAGE_THEATRE_TUNER_PORT, 1957821949aSmrg OPTION_RAGE_THEATRE_COMPOSITE_PORT, 1967821949aSmrg OPTION_RAGE_THEATRE_SVIDEO_PORT, 1977821949aSmrg OPTION_TUNER_TYPE, 1987821949aSmrg OPTION_RAGE_THEATRE_MICROC_PATH, 1997821949aSmrg OPTION_RAGE_THEATRE_MICROC_TYPE, 2007821949aSmrg OPTION_SCALER_WIDTH, 2017821949aSmrg#endif 202de2362d3Smrg#ifdef RENDER 203de2362d3Smrg OPTION_RENDER_ACCEL, 204de2362d3Smrg OPTION_SUBPIXEL_ORDER, 205de2362d3Smrg#endif 2067821949aSmrg OPTION_SHOWCACHE, 2077821949aSmrg OPTION_CLOCK_GATING, 2087821949aSmrg OPTION_BIOS_HOTKEYS, 2097821949aSmrg OPTION_VGA_ACCESS, 2107821949aSmrg OPTION_REVERSE_DDC, 2117821949aSmrg OPTION_LVDS_PROBE_PLL, 212de2362d3Smrg OPTION_ACCELMETHOD, 2137821949aSmrg OPTION_CONNECTORTABLE, 2147821949aSmrg OPTION_DRI, 2157821949aSmrg OPTION_DEFAULT_CONNECTOR_TABLE, 2167821949aSmrg#if defined(__powerpc__) 2177821949aSmrg OPTION_MAC_MODEL, 2187821949aSmrg#endif 2197821949aSmrg OPTION_DEFAULT_TMDS_PLL, 2207821949aSmrg OPTION_TVDAC_LOAD_DETECT, 2217821949aSmrg OPTION_FORCE_TVOUT, 2227821949aSmrg OPTION_TVSTD, 2237821949aSmrg OPTION_IGNORE_LID_STATUS, 2247821949aSmrg OPTION_DEFAULT_TVDAC_ADJ, 2257821949aSmrg OPTION_INT10, 226de2362d3Smrg OPTION_EXA_VSYNC, 2277821949aSmrg OPTION_ATOM_TVOUT, 2287821949aSmrg OPTION_R4XX_ATOM, 2297821949aSmrg OPTION_FORCE_LOW_POWER, 2307821949aSmrg OPTION_DYNAMIC_PM, 2317821949aSmrg OPTION_NEW_PLL, 232de2362d3Smrg OPTION_ZAPHOD_HEADS, 2337821949aSmrg OPTION_SWAPBUFFERS_WAIT 234de2362d3Smrg} RADEONOpts; 235de2362d3Smrg 236de2362d3Smrg 2377821949aSmrg#define RADEON_IDLE_RETRY 16 /* Fall out of idle loops after this count */ 2387821949aSmrg#define RADEON_TIMEOUT 2000000 /* Fall out of wait loops after this count */ 2390d16fef4Smrg 240de2362d3Smrg#define RADEON_VSYNC_TIMEOUT 20000 /* Maximum wait for VSYNC (in usecs) */ 241de2362d3Smrg 242de2362d3Smrg/* Buffer are aligned on 4096 byte boundaries */ 243de2362d3Smrg#define RADEON_GPU_PAGE_SIZE 4096 244de2362d3Smrg#define RADEON_BUFFER_ALIGN (RADEON_GPU_PAGE_SIZE - 1) 2457821949aSmrg#define RADEON_VBIOS_SIZE 0x00010000 2467821949aSmrg#define RADEON_USE_RMX 0x80000000 /* mode flag for using RMX 2477821949aSmrg * Need to comfirm this is not used 2487821949aSmrg * for something else. 2497821949aSmrg */ 250de2362d3Smrg 251de2362d3Smrg#define xFixedToFloat(f) (((float) (f)) / 65536) 252de2362d3Smrg 253de2362d3Smrg#define RADEON_LOGLEVEL_DEBUG 4 254de2362d3Smrg 255de2362d3Smrg/* for Xv, outputs */ 256de2362d3Smrg#define MAKE_ATOM(a) MakeAtom(a, sizeof(a) - 1, TRUE) 257de2362d3Smrg 258de2362d3Smrg/* Other macros */ 259de2362d3Smrg#define RADEON_ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) 260de2362d3Smrg#define RADEON_ALIGN(x,bytes) (((x) + ((bytes) - 1)) & ~((bytes) - 1)) 261de2362d3Smrg#define RADEONPTR(pScrn) ((RADEONInfoPtr)(pScrn)->driverPrivate) 262de2362d3Smrg 2637821949aSmrgtypedef struct { 2647821949aSmrg int revision; 2657821949aSmrg uint16_t rr1_offset; 2667821949aSmrg uint16_t rr2_offset; 2677821949aSmrg uint16_t dyn_clk_offset; 2687821949aSmrg uint16_t pll_offset; 2697821949aSmrg uint16_t mem_config_offset; 2707821949aSmrg uint16_t mem_reset_offset; 2717821949aSmrg uint16_t short_mem_offset; 2727821949aSmrg uint16_t rr3_offset; 2737821949aSmrg uint16_t rr4_offset; 2747821949aSmrg} RADEONBIOSInitTable; 2757821949aSmrg 2767821949aSmrg#define RADEON_PLL_USE_BIOS_DIVS (1 << 0) 2777821949aSmrg#define RADEON_PLL_NO_ODD_POST_DIV (1 << 1) 2787821949aSmrg#define RADEON_PLL_USE_REF_DIV (1 << 2) 2797821949aSmrg#define RADEON_PLL_LEGACY (1 << 3) 2807821949aSmrg#define RADEON_PLL_PREFER_LOW_REF_DIV (1 << 4) 2817821949aSmrg#define RADEON_PLL_PREFER_HIGH_REF_DIV (1 << 5) 2827821949aSmrg#define RADEON_PLL_PREFER_LOW_FB_DIV (1 << 6) 2837821949aSmrg#define RADEON_PLL_PREFER_HIGH_FB_DIV (1 << 7) 2847821949aSmrg#define RADEON_PLL_PREFER_LOW_POST_DIV (1 << 8) 2857821949aSmrg#define RADEON_PLL_PREFER_HIGH_POST_DIV (1 << 9) 2867821949aSmrg#define RADEON_PLL_USE_FRAC_FB_DIV (1 << 10) 2877821949aSmrg#define RADEON_PLL_PREFER_CLOSEST_LOWER (1 << 11) 2887821949aSmrg#define RADEON_PLL_USE_POST_DIV (1 << 12) 2897821949aSmrg 2907821949aSmrgtypedef struct { 2917821949aSmrg uint32_t reference_freq; 2927821949aSmrg uint32_t reference_div; 2937821949aSmrg uint32_t post_div; 2947821949aSmrg uint32_t pll_in_min; 2957821949aSmrg uint32_t pll_in_max; 2967821949aSmrg uint32_t pll_out_min; 2977821949aSmrg uint32_t pll_out_max; 2987821949aSmrg uint16_t xclk; 2997821949aSmrg 3007821949aSmrg uint32_t min_ref_div; 3017821949aSmrg uint32_t max_ref_div; 3027821949aSmrg uint32_t min_post_div; 3037821949aSmrg uint32_t max_post_div; 3047821949aSmrg uint32_t min_feedback_div; 3057821949aSmrg uint32_t max_feedback_div; 3067821949aSmrg uint32_t min_frac_feedback_div; 3077821949aSmrg uint32_t max_frac_feedback_div; 3087821949aSmrg uint32_t best_vco; 3097821949aSmrg} RADEONPLLRec, *RADEONPLLPtr; 3107821949aSmrg 3117821949aSmrgtypedef struct { 3127821949aSmrg int bitsPerPixel; 3137821949aSmrg int depth; 3147821949aSmrg int displayWidth; 3157821949aSmrg int displayHeight; 3167821949aSmrg int pixel_code; 3177821949aSmrg int pixel_bytes; 3187821949aSmrg DisplayModePtr mode; 3197821949aSmrg} RADEONFBLayout; 3207821949aSmrg 321de2362d3Smrg#define IS_RV100_VARIANT ((info->ChipFamily == CHIP_FAMILY_RV100) || \ 322de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RV200) || \ 323de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RS100) || \ 324de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RS200) || \ 325de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RV250) || \ 326de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RV280) || \ 327de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RS300)) 328de2362d3Smrg 329de2362d3Smrg 330de2362d3Smrg#define IS_R300_VARIANT ((info->ChipFamily == CHIP_FAMILY_R300) || \ 331de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RV350) || \ 332de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_R350) || \ 333de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RV380) || \ 334de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_R420) || \ 335de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RV410) || \ 336de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RS400) || \ 337de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RS480)) 338de2362d3Smrg 339de2362d3Smrg#define IS_AVIVO_VARIANT ((info->ChipFamily >= CHIP_FAMILY_RV515)) 340de2362d3Smrg 341de2362d3Smrg#define IS_DCE3_VARIANT ((info->ChipFamily >= CHIP_FAMILY_RV620)) 342de2362d3Smrg 343de2362d3Smrg#define IS_DCE32_VARIANT ((info->ChipFamily >= CHIP_FAMILY_RV730)) 344de2362d3Smrg 345de2362d3Smrg#define IS_DCE4_VARIANT ((info->ChipFamily >= CHIP_FAMILY_CEDAR)) 346de2362d3Smrg 347de2362d3Smrg#define IS_DCE41_VARIANT ((info->ChipFamily >= CHIP_FAMILY_PALM)) 348de2362d3Smrg 349de2362d3Smrg#define IS_DCE5_VARIANT ((info->ChipFamily >= CHIP_FAMILY_BARTS)) 350de2362d3Smrg 351de2362d3Smrg#define IS_EVERGREEN_3D (info->ChipFamily >= CHIP_FAMILY_CEDAR) 352de2362d3Smrg 353de2362d3Smrg#define IS_R600_3D (info->ChipFamily >= CHIP_FAMILY_R600) 354de2362d3Smrg 355de2362d3Smrg#define IS_R500_3D ((info->ChipFamily == CHIP_FAMILY_RV515) || \ 356de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_R520) || \ 357de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RV530) || \ 358de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_R580) || \ 359de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RV560) || \ 360de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RV570)) 361de2362d3Smrg 362de2362d3Smrg#define IS_R400_3D ((info->ChipFamily == CHIP_FAMILY_R420) || \ 3637821949aSmrg (info->ChipFamily == CHIP_FAMILY_RV410) || \ 3647821949aSmrg (info->ChipFamily == CHIP_FAMILY_RS690) || \ 3657821949aSmrg (info->ChipFamily == CHIP_FAMILY_RS600) || \ 3667821949aSmrg (info->ChipFamily == CHIP_FAMILY_RS740)) 367de2362d3Smrg 368de2362d3Smrg#define IS_R300_3D ((info->ChipFamily == CHIP_FAMILY_R300) || \ 369de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RV350) || \ 370de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_R350) || \ 371de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RV380) || \ 372de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_R420) || \ 373de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RV410) || \ 374de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RS690) || \ 375de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RS600) || \ 376de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RS740) || \ 377de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RS400) || \ 378de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RS480)) 379de2362d3Smrg 380de2362d3Smrg#define IS_R200_3D ((info->ChipFamily == CHIP_FAMILY_RV250) || \ 381de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RV280) || \ 382de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_RS300) || \ 383de2362d3Smrg (info->ChipFamily == CHIP_FAMILY_R200)) 384de2362d3Smrg 3857821949aSmrg/* 3867821949aSmrg * Errata workarounds 3877821949aSmrg */ 3887821949aSmrgtypedef enum { 3897821949aSmrg CHIP_ERRATA_R300_CG = 0x00000001, 3907821949aSmrg CHIP_ERRATA_PLL_DUMMYREADS = 0x00000002, 3917821949aSmrg CHIP_ERRATA_PLL_DELAY = 0x00000004 3927821949aSmrg} RADEONErrata; 3930d16fef4Smrg 3947821949aSmrgtypedef enum { 3957821949aSmrg RADEON_DVOCHIP_NONE, 3967821949aSmrg RADEON_SIL_164, 3977821949aSmrg RADEON_SIL_1178 3987821949aSmrg} RADEONExtTMDSChip; 3990d16fef4Smrg 4007821949aSmrg#if defined(__powerpc__) 4017821949aSmrgtypedef enum { 4027821949aSmrg RADEON_MAC_NONE, 4037821949aSmrg RADEON_MAC_IBOOK, 4047821949aSmrg RADEON_MAC_POWERBOOK_EXTERNAL, 4057821949aSmrg RADEON_MAC_POWERBOOK_INTERNAL, 4067821949aSmrg RADEON_MAC_POWERBOOK_VGA, 4077821949aSmrg RADEON_MAC_MINI_EXTERNAL, 4087821949aSmrg RADEON_MAC_MINI_INTERNAL, 4097821949aSmrg RADEON_MAC_IMAC_G5_ISIGHT, 4107821949aSmrg RADEON_MAC_EMAC, 4117821949aSmrg RADEON_MAC_SAM440EP 4127821949aSmrg} RADEONMacModel; 4137821949aSmrg#endif 4140d16fef4Smrg 4157821949aSmrgtypedef enum { 4167821949aSmrg CARD_PCI, 4177821949aSmrg CARD_AGP, 4187821949aSmrg CARD_PCIE 4197821949aSmrg} RADEONCardType; 4200d16fef4Smrg 4217821949aSmrgtypedef enum { 4227821949aSmrg POWER_DEFAULT, 4237821949aSmrg POWER_LOW, 4247821949aSmrg POWER_HIGH 4257821949aSmrg} RADEONPMType; 4260d16fef4Smrg 4277821949aSmrgtypedef struct { 4287821949aSmrg RADEONPMType type; 4297821949aSmrg uint32_t sclk; 4307821949aSmrg uint32_t mclk; 4317821949aSmrg uint32_t pcie_lanes; 4327821949aSmrg uint32_t flags; 4337821949aSmrg} RADEONPowerMode; 4340d16fef4Smrg 4357821949aSmrgtypedef struct { 4367821949aSmrg /* power modes */ 4377821949aSmrg int num_modes; 4387821949aSmrg int current_mode; 4397821949aSmrg RADEONPowerMode mode[3]; 4400d16fef4Smrg 4417821949aSmrg Bool clock_gating_enabled; 4427821949aSmrg Bool dynamic_mode_enabled; 4437821949aSmrg Bool force_low_power_enabled; 4447821949aSmrg} RADEONPowerManagement; 4450d16fef4Smrg 4467821949aSmrgtypedef struct _atomBiosHandle *atomBiosHandlePtr; 4470d16fef4Smrg 448de2362d3Smrgstruct radeon_exa_pixmap_priv { 449de2362d3Smrg struct radeon_bo *bo; 450de2362d3Smrg uint32_t tiling_flags; 4517821949aSmrg#ifdef XF86DRM_MODE 452de2362d3Smrg struct radeon_surface surface; 4537821949aSmrg#endif 454de2362d3Smrg Bool bo_mapped; 455de2362d3Smrg}; 456de2362d3Smrg 457de2362d3Smrg#define RADEON_2D_EXA_COPY 1 458de2362d3Smrg#define RADEON_2D_EXA_SOLID 2 459de2362d3Smrg 460de2362d3Smrgstruct radeon_2d_state { 461de2362d3Smrg int op; // 462de2362d3Smrg uint32_t dst_pitch_offset; 463de2362d3Smrg uint32_t src_pitch_offset; 464de2362d3Smrg uint32_t dp_gui_master_cntl; 465de2362d3Smrg uint32_t dp_cntl; 466de2362d3Smrg uint32_t dp_write_mask; 467de2362d3Smrg uint32_t dp_brush_frgd_clr; 468de2362d3Smrg uint32_t dp_brush_bkgd_clr; 469de2362d3Smrg uint32_t dp_src_frgd_clr; 470de2362d3Smrg uint32_t dp_src_bkgd_clr; 471de2362d3Smrg uint32_t default_sc_bottom_right; 472de2362d3Smrg struct radeon_bo *dst_bo; 473de2362d3Smrg struct radeon_bo *src_bo; 474de2362d3Smrg}; 475de2362d3Smrg 4767821949aSmrg#ifdef XF86DRI 4777821949aSmrgstruct radeon_cp { 4787821949aSmrg Bool CPRuns; /* CP is running */ 4797821949aSmrg Bool CPInUse; /* CP has been used by X server */ 4807821949aSmrg Bool CPStarted; /* CP has started */ 4817821949aSmrg int CPMode; /* CP mode that server/clients use */ 4827821949aSmrg int CPFifoSize; /* Size of the CP command FIFO */ 4837821949aSmrg int CPusecTimeout; /* CP timeout in usecs */ 4847821949aSmrg Bool needCacheFlush; 4857821949aSmrg 4867821949aSmrg /* CP accleration */ 4877821949aSmrg drmBufPtr indirectBuffer; 4887821949aSmrg int indirectStart; 4897821949aSmrg 4907821949aSmrg /* Debugging info for BEGIN_RING/ADVANCE_RING pairs. */ 4917821949aSmrg int dma_begin_count; 4927821949aSmrg char *dma_debug_func; 4937821949aSmrg int dma_debug_lineno; 4947821949aSmrg 4957821949aSmrg }; 4967821949aSmrg 4977821949aSmrgtypedef struct { 4987821949aSmrg /* Nothing here yet */ 4997821949aSmrg int dummy; 5007821949aSmrg} RADEONConfigPrivRec, *RADEONConfigPrivPtr; 5017821949aSmrg 5027821949aSmrgtypedef struct { 5037821949aSmrg /* Nothing here yet */ 5047821949aSmrg int dummy; 5057821949aSmrg} RADEONDRIContextRec, *RADEONDRIContextPtr; 5067821949aSmrg 5077821949aSmrgstruct radeon_dri { 5087821949aSmrg Bool noBackBuffer; 5097821949aSmrg 5107821949aSmrg Bool newMemoryMap; 5117821949aSmrg drmVersionPtr pLibDRMVersion; 5127821949aSmrg drmVersionPtr pKernelDRMVersion; 5137821949aSmrg DRIInfoPtr pDRIInfo; 5147821949aSmrg int drmFD; 5157821949aSmrg int numVisualConfigs; 5167821949aSmrg __GLXvisualConfig *pVisualConfigs; 5177821949aSmrg RADEONConfigPrivPtr pVisualConfigsPriv; 5187821949aSmrg Bool (*DRICloseScreen)(CLOSE_SCREEN_ARGS_DECL); 5197821949aSmrg 5207821949aSmrg drm_handle_t fbHandle; 5217821949aSmrg 5227821949aSmrg drmSize registerSize; 5237821949aSmrg drm_handle_t registerHandle; 5247821949aSmrg 5257821949aSmrg drmSize pciSize; 5267821949aSmrg drm_handle_t pciMemHandle; 5277821949aSmrg unsigned char *PCI; /* Map */ 5287821949aSmrg 5297821949aSmrg Bool depthMoves; /* Enable depth moves -- slow! */ 5307821949aSmrg Bool allowPageFlip; /* Enable 3d page flipping */ 5317821949aSmrg#ifdef DAMAGE 5327821949aSmrg DamagePtr pDamage; 5337821949aSmrg RegionRec driRegion; 5347821949aSmrg#endif 5357821949aSmrg Bool have3DWindows; /* Are there any 3d clients? */ 5367821949aSmrg 5377821949aSmrg int pciAperSize; 5387821949aSmrg drmSize gartSize; 5397821949aSmrg drm_handle_t agpMemHandle; /* Handle from drmAgpAlloc */ 5407821949aSmrg unsigned long gartOffset; 5417821949aSmrg unsigned char *AGP; /* Map */ 5427821949aSmrg int agpMode; 5437821949aSmrg 5447821949aSmrg uint32_t pciCommand; 5457821949aSmrg 5467821949aSmrg /* CP ring buffer data */ 5477821949aSmrg unsigned long ringStart; /* Offset into GART space */ 5487821949aSmrg drm_handle_t ringHandle; /* Handle from drmAddMap */ 5497821949aSmrg drmSize ringMapSize; /* Size of map */ 5507821949aSmrg int ringSize; /* Size of ring (in MB) */ 5517821949aSmrg drmAddress ring; /* Map */ 5527821949aSmrg int ringSizeLog2QW; 5537821949aSmrg 5547821949aSmrg unsigned long ringReadOffset; /* Offset into GART space */ 5557821949aSmrg drm_handle_t ringReadPtrHandle; /* Handle from drmAddMap */ 5567821949aSmrg drmSize ringReadMapSize; /* Size of map */ 5577821949aSmrg drmAddress ringReadPtr; /* Map */ 5587821949aSmrg 5597821949aSmrg /* CP vertex/indirect buffer data */ 5607821949aSmrg unsigned long bufStart; /* Offset into GART space */ 5617821949aSmrg drm_handle_t bufHandle; /* Handle from drmAddMap */ 5627821949aSmrg drmSize bufMapSize; /* Size of map */ 5637821949aSmrg int bufSize; /* Size of buffers (in MB) */ 5647821949aSmrg drmAddress buf; /* Map */ 5657821949aSmrg int bufNumBufs; /* Number of buffers */ 5667821949aSmrg drmBufMapPtr buffers; /* Buffer map */ 5677821949aSmrg 5687821949aSmrg /* CP GART Texture data */ 5697821949aSmrg unsigned long gartTexStart; /* Offset into GART space */ 5707821949aSmrg drm_handle_t gartTexHandle; /* Handle from drmAddMap */ 5717821949aSmrg drmSize gartTexMapSize; /* Size of map */ 5727821949aSmrg int gartTexSize; /* Size of GART tex space (in MB) */ 5737821949aSmrg drmAddress gartTex; /* Map */ 5747821949aSmrg int log2GARTTexGran; 5757821949aSmrg 5767821949aSmrg /* DRI screen private data */ 5777821949aSmrg int fbX; 5787821949aSmrg int fbY; 5797821949aSmrg int backX; 5807821949aSmrg int backY; 5817821949aSmrg int depthX; 5827821949aSmrg int depthY; 5837821949aSmrg 5847821949aSmrg int frontOffset; 5857821949aSmrg int frontPitch; 5867821949aSmrg int backOffset; 5877821949aSmrg int backPitch; 5887821949aSmrg int depthOffset; 5897821949aSmrg int depthPitch; 5907821949aSmrg int depthBits; 5917821949aSmrg int textureOffset; 5927821949aSmrg int textureSize; 5937821949aSmrg int log2TexGran; 5947821949aSmrg 5957821949aSmrg int pciGartSize; 5967821949aSmrg uint32_t pciGartOffset; 5977821949aSmrg void *pciGartBackup; 5987821949aSmrg 5997821949aSmrg int irq; 6007821949aSmrg 6017821949aSmrg#ifdef USE_XAA 6027821949aSmrg uint32_t frontPitchOffset; 6037821949aSmrg uint32_t backPitchOffset; 6047821949aSmrg uint32_t depthPitchOffset; 6057821949aSmrg 6067821949aSmrg /* offscreen memory management */ 6077821949aSmrg int backLines; 6087821949aSmrg FBAreaPtr backArea; 6097821949aSmrg int depthTexLines; 6107821949aSmrg FBAreaPtr depthTexArea; 6117821949aSmrg#endif 6127821949aSmrg 6137821949aSmrg}; 6147821949aSmrg#endif 6157821949aSmrg 616de2362d3Smrg#define DMA_BO_FREE_TIME 1000 617de2362d3Smrg 618de2362d3Smrgstruct radeon_dma_bo { 619de2362d3Smrg struct radeon_dma_bo *next, *prev; 620de2362d3Smrg struct radeon_bo *bo; 621de2362d3Smrg int expire_counter; 622de2362d3Smrg}; 623de2362d3Smrg 624de2362d3Smrgstruct r600_accel_object { 625de2362d3Smrg uint32_t pitch; 626de2362d3Smrg uint32_t width; 627de2362d3Smrg uint32_t height; 6287821949aSmrg uint32_t offset; 629de2362d3Smrg int bpp; 630de2362d3Smrg uint32_t domain; 631de2362d3Smrg struct radeon_bo *bo; 632de2362d3Smrg uint32_t tiling_flags; 6337821949aSmrg#if defined(XF86DRM_MODE) 634de2362d3Smrg struct radeon_surface *surface; 6357821949aSmrg#endif 636de2362d3Smrg}; 637de2362d3Smrg 638de2362d3Smrgstruct radeon_vbo_object { 639de2362d3Smrg int vb_offset; 6407821949aSmrg uint64_t vb_mc_addr; 641de2362d3Smrg int vb_total; 6427821949aSmrg void *vb_ptr; 643de2362d3Smrg uint32_t vb_size; 644de2362d3Smrg uint32_t vb_op_vert_size; 645de2362d3Smrg int32_t vb_start_op; 646de2362d3Smrg struct radeon_bo *vb_bo; 647de2362d3Smrg unsigned verts_per_op; 648de2362d3Smrg}; 649de2362d3Smrg 650de2362d3Smrgstruct radeon_accel_state { 6517821949aSmrg /* common accel data */ 6527821949aSmrg int fifo_slots; /* Free slots in the FIFO (64 max) */ 6537821949aSmrg /* Computed values for Radeon */ 6547821949aSmrg uint32_t dp_gui_master_cntl; 6557821949aSmrg uint32_t dp_gui_master_cntl_clip; 6567821949aSmrg uint32_t trans_color; 657de2362d3Smrg /* Saved values for ScreenToScreenCopy */ 658de2362d3Smrg int xdir; 659de2362d3Smrg int ydir; 6607821949aSmrg uint32_t dst_pitch_offset; 661de2362d3Smrg 662de2362d3Smrg /* render accel */ 663de2362d3Smrg unsigned short texW[2]; 664de2362d3Smrg unsigned short texH[2]; 665de2362d3Smrg Bool XInited3D; /* X itself has the 3D context */ 666de2362d3Smrg int num_gb_pipes; 667de2362d3Smrg Bool has_tcl; 668de2362d3Smrg Bool allowHWDFS; 669de2362d3Smrg 6707821949aSmrg#ifdef USE_EXA 671de2362d3Smrg /* EXA */ 672de2362d3Smrg ExaDriverPtr exa; 673de2362d3Smrg int exaSyncMarker; 674de2362d3Smrg int exaMarkerSynced; 675de2362d3Smrg int engineMode; 676de2362d3Smrg#define EXA_ENGINEMODE_UNKNOWN 0 677de2362d3Smrg#define EXA_ENGINEMODE_2D 1 678de2362d3Smrg#define EXA_ENGINEMODE_3D 2 679de2362d3Smrg 680de2362d3Smrg int composite_op; 681de2362d3Smrg PicturePtr dst_pic; 682de2362d3Smrg PicturePtr msk_pic; 683de2362d3Smrg PicturePtr src_pic; 684de2362d3Smrg PixmapPtr dst_pix; 685de2362d3Smrg PixmapPtr msk_pix; 686de2362d3Smrg PixmapPtr src_pix; 687de2362d3Smrg Bool is_transform[2]; 688de2362d3Smrg PictTransform *transform[2]; 689de2362d3Smrg /* Whether we are tiling horizontally and vertically */ 690de2362d3Smrg Bool need_src_tile_x; 691de2362d3Smrg Bool need_src_tile_y; 692de2362d3Smrg /* Size of tiles ... set to 65536x65536 if not tiling in that direction */ 693de2362d3Smrg Bool src_tile_width; 694de2362d3Smrg Bool src_tile_height; 695de2362d3Smrg uint32_t *draw_header; 696de2362d3Smrg unsigned vtx_count; 697de2362d3Smrg unsigned num_vtx; 698de2362d3Smrg Bool vsync; 699de2362d3Smrg 7007821949aSmrg drmBufPtr ib; 7017821949aSmrg 702de2362d3Smrg struct radeon_vbo_object vbo; 703de2362d3Smrg struct radeon_vbo_object cbuf; 704de2362d3Smrg 705de2362d3Smrg /* where to discard IB from if we cancel operation */ 706de2362d3Smrg uint32_t ib_reset_op; 7077821949aSmrg#ifdef XF86DRM_MODE 708de2362d3Smrg struct radeon_dma_bo bo_free; 709de2362d3Smrg struct radeon_dma_bo bo_wait; 710de2362d3Smrg struct radeon_dma_bo bo_reserved; 711de2362d3Smrg Bool use_vbos; 7127821949aSmrg#endif 713de2362d3Smrg void (*finish_op)(ScrnInfoPtr, int); 714de2362d3Smrg // shader storage 7157821949aSmrg ExaOffscreenArea *shaders; 716de2362d3Smrg struct radeon_bo *shaders_bo; 717de2362d3Smrg uint32_t solid_vs_offset; 718de2362d3Smrg uint32_t solid_ps_offset; 719de2362d3Smrg uint32_t copy_vs_offset; 720de2362d3Smrg uint32_t copy_ps_offset; 721de2362d3Smrg uint32_t comp_vs_offset; 722de2362d3Smrg uint32_t comp_ps_offset; 723de2362d3Smrg uint32_t xv_vs_offset; 724de2362d3Smrg uint32_t xv_ps_offset; 725de2362d3Smrg // shader consts 726de2362d3Smrg uint32_t solid_vs_const_offset; 727de2362d3Smrg uint32_t solid_ps_const_offset; 728de2362d3Smrg uint32_t copy_vs_const_offset; 729de2362d3Smrg uint32_t copy_ps_const_offset; 730de2362d3Smrg uint32_t comp_vs_const_offset; 731de2362d3Smrg uint32_t comp_ps_const_offset; 732de2362d3Smrg uint32_t comp_mask_ps_const_offset; 733de2362d3Smrg uint32_t xv_vs_const_offset; 734de2362d3Smrg uint32_t xv_ps_const_offset; 735de2362d3Smrg 736de2362d3Smrg //size/addr stuff 737de2362d3Smrg struct r600_accel_object src_obj[2]; 738de2362d3Smrg struct r600_accel_object dst_obj; 739de2362d3Smrg uint32_t src_size[2]; 740de2362d3Smrg uint32_t dst_size; 741de2362d3Smrg 742de2362d3Smrg uint32_t vs_size; 743de2362d3Smrg uint64_t vs_mc_addr; 744de2362d3Smrg uint32_t ps_size; 745de2362d3Smrg uint64_t ps_mc_addr; 746de2362d3Smrg 7477821949aSmrg // UTS/DFS 7487821949aSmrg drmBufPtr scratch; 7497821949aSmrg 750de2362d3Smrg // solid/copy 7517821949aSmrg ExaOffscreenArea *copy_area; 752de2362d3Smrg struct radeon_bo *copy_area_bo; 753de2362d3Smrg Bool same_surface; 754de2362d3Smrg int rop; 755de2362d3Smrg uint32_t planemask; 756de2362d3Smrg uint32_t fg; 757de2362d3Smrg 758de2362d3Smrg // composite 759de2362d3Smrg Bool component_alpha; 760de2362d3Smrg Bool src_alpha; 761de2362d3Smrg // vline 762de2362d3Smrg xf86CrtcPtr vline_crtc; 763de2362d3Smrg int vline_y1; 764de2362d3Smrg int vline_y2; 7657821949aSmrg#endif 766de2362d3Smrg 7677821949aSmrg#ifdef USE_XAA 7687821949aSmrg /* XAA */ 7697821949aSmrg XAAInfoRecPtr accel; 7707821949aSmrg /* ScanlineScreenToScreenColorExpand support */ 7717821949aSmrg unsigned char *scratch_buffer[1]; 7727821949aSmrg unsigned char *scratch_save; 7737821949aSmrg int scanline_x; 7747821949aSmrg int scanline_y; 7757821949aSmrg int scanline_w; 7767821949aSmrg int scanline_h; 7777821949aSmrg int scanline_h_w; 7787821949aSmrg int scanline_words; 7797821949aSmrg int scanline_direct; 7807821949aSmrg int scanline_bpp; /* Only used for ImageWrite */ 7817821949aSmrg int scanline_fg; 7827821949aSmrg int scanline_bg; 7837821949aSmrg int scanline_hpass; 7847821949aSmrg int scanline_x1clip; 7857821949aSmrg int scanline_x2clip; 7867821949aSmrg /* Saved values for DashedTwoPointLine */ 7877821949aSmrg int dashLen; 7887821949aSmrg uint32_t dashPattern; 7897821949aSmrg int dash_fg; 7907821949aSmrg int dash_bg; 7917821949aSmrg 7927821949aSmrg FBLinearPtr RenderTex; 7937821949aSmrg void (*RenderCallback)(ScrnInfoPtr); 7947821949aSmrg Time RenderTimeout; 7957821949aSmrg /* 7967821949aSmrg * XAAForceTransBlit is used to change the behavior of the XAA 7977821949aSmrg * SetupForScreenToScreenCopy function, to make it DGA-friendly. 7987821949aSmrg */ 7997821949aSmrg Bool XAAForceTransBlit; 8007821949aSmrg#endif 801de2362d3Smrg 8027314432eSmrg}; 8037314432eSmrg 804de2362d3Smrgtypedef struct { 805de2362d3Smrg EntityInfoPtr pEnt; 806de2362d3Smrg pciVideoPtr PciInfo; 8077821949aSmrg#ifndef XSERVER_LIBPCIACCESS 8087821949aSmrg PCITAG PciTag; 8097821949aSmrg#endif 810de2362d3Smrg int Chipset; 811de2362d3Smrg RADEONChipFamily ChipFamily; 8127821949aSmrg RADEONErrata ChipErrata; 8137821949aSmrg 8147821949aSmrg unsigned long long LinearAddr; /* Frame buffer physical address */ 8157821949aSmrg unsigned long long MMIOAddr; /* MMIO region physical address */ 8167821949aSmrg unsigned long long BIOSAddr; /* BIOS physical address */ 8177821949aSmrg uint64_t fbLocation; 8187821949aSmrg uint32_t gartLocation; 8197821949aSmrg uint32_t mc_fb_location; 8207821949aSmrg uint32_t mc_agp_location; 8217821949aSmrg uint32_t mc_agp_location_hi; 8227821949aSmrg 8237821949aSmrg void *MMIO; /* Map of MMIO region */ 8247821949aSmrg void *FB; /* Map of frame buffer */ 8257821949aSmrg uint8_t *VBIOS; /* Video BIOS pointer */ 8267821949aSmrg 8277821949aSmrg Bool IsAtomBios; /* New BIOS used in R420 etc. */ 8287821949aSmrg int ROMHeaderStart; /* Start of the ROM Info Table */ 8297821949aSmrg int MasterDataStart; /* Offset for Master Data Table for ATOM BIOS */ 8307821949aSmrg 8317821949aSmrg uint32_t MemCntl; 8327821949aSmrg uint32_t BusCntl; 8337821949aSmrg unsigned long MMIOSize; /* MMIO region physical address */ 8347821949aSmrg unsigned long FbMapSize; /* Size of frame buffer, in bytes */ 8357821949aSmrg unsigned long FbSecureSize; /* Size of secured fb area at end of 8367821949aSmrg framebuffer */ 8377821949aSmrg 8387821949aSmrg Bool IsMobility; /* Mobile chips for laptops */ 8397821949aSmrg Bool IsIGP; /* IGP chips */ 8407821949aSmrg Bool HasSingleDAC; /* only TVDAC on chip */ 8417821949aSmrg Bool ddc_mode; /* Validate mode by matching exactly 8427821949aSmrg * the modes supported in DDC data 8437821949aSmrg */ 8447821949aSmrg Bool R300CGWorkaround; 8457821949aSmrg 8467821949aSmrg /* EDID or BIOS values for FPs */ 8477821949aSmrg int RefDivider; 8487821949aSmrg int FeedbackDivider; 8497821949aSmrg int PostDivider; 8507821949aSmrg Bool UseBiosDividers; 8517821949aSmrg /* EDID data using DDC interface */ 8527821949aSmrg Bool ddc_bios; 8537821949aSmrg Bool ddc1; 8547821949aSmrg Bool ddc2; 8557821949aSmrg 8567821949aSmrg RADEONPLLRec pll; 8577821949aSmrg int default_dispclk; 8587821949aSmrg int dp_extclk; 8597821949aSmrg 8607821949aSmrg int RamWidth; 8617821949aSmrg float sclk; /* in MHz */ 8627821949aSmrg float mclk; /* in MHz */ 8637821949aSmrg Bool IsDDR; 8647821949aSmrg int DispPriority; 8657821949aSmrg 8667821949aSmrg RADEONSavePtr SavedReg; /* Original (text) mode */ 8677821949aSmrg RADEONSavePtr ModeReg; /* Current mode */ 868de2362d3Smrg Bool (*CloseScreen)(CLOSE_SCREEN_ARGS_DECL); 869de2362d3Smrg 870de2362d3Smrg void (*BlockHandler)(BLOCKHANDLER_ARGS_DECL); 871de2362d3Smrg 8727821949aSmrg Bool PaletteSavedOnVT; /* Palette saved on last VT switch */ 8737821949aSmrg 8747821949aSmrg xf86CursorInfoPtr cursor; 8757821949aSmrg#ifdef ARGB_CURSOR 8767821949aSmrg Bool cursor_argb; 8777821949aSmrg#endif 8787821949aSmrg int cursor_fg; 8797821949aSmrg int cursor_bg; 8800d16fef4Smrg 881de2362d3Smrg int pix24bpp; /* Depth of pixmap for 24bpp fb */ 882de2362d3Smrg Bool dac6bits; /* Use 6 bit DAC? */ 883de2362d3Smrg 8847821949aSmrg RADEONFBLayout CurrentLayout; 885de2362d3Smrg 8867821949aSmrg#ifdef XF86DRI 887de2362d3Smrg Bool directRenderingEnabled; 8887821949aSmrg Bool directRenderingInited; 8897821949aSmrg RADEONCardType cardType; /* Current card is a PCI card */ 8907821949aSmrg struct radeon_cp *cp; 8917821949aSmrg struct radeon_dri *dri; 8927821949aSmrg#ifdef XF86DRM_MODE 893de2362d3Smrg struct radeon_dri2 dri2; 8947821949aSmrg#endif 8957821949aSmrg#ifdef USE_EXA 8967821949aSmrg Bool accelDFS; 8977821949aSmrg#endif 8987821949aSmrg Bool DMAForXv; 8997821949aSmrg#endif /* XF86DRI */ 900de2362d3Smrg 901de2362d3Smrg /* accel */ 902de2362d3Smrg Bool RenderAccel; /* Render */ 903de2362d3Smrg Bool allowColorTiling; 904de2362d3Smrg Bool allowColorTiling2D; 9057821949aSmrg Bool tilingEnabled; /* mirror of sarea->tiling_enabled */ 906de2362d3Smrg struct radeon_accel_state *accel_state; 907de2362d3Smrg Bool accelOn; 9087821949aSmrg Bool useEXA; 9097821949aSmrg#ifdef USE_EXA 910de2362d3Smrg Bool exa_pixmaps; 911de2362d3Smrg Bool exa_force_create; 912de2362d3Smrg XF86ModReqInfo exaReq; 9137821949aSmrg#endif 9147821949aSmrg#ifdef USE_XAA 9157821949aSmrg XF86ModReqInfo xaaReq; 9167821949aSmrg#endif 917de2362d3Smrg 9187821949aSmrg /* XVideo */ 9197821949aSmrg XF86VideoAdaptorPtr adaptor; 9207821949aSmrg void (*VideoTimerCallback)(ScrnInfoPtr, Time); 9217821949aSmrg int videoKey; 9227821949aSmrg int RageTheatreCrystal; 9237821949aSmrg int RageTheatreTunerPort; 9247821949aSmrg int RageTheatreCompositePort; 9257821949aSmrg int RageTheatreSVideoPort; 9267821949aSmrg int tunerType; 9277821949aSmrg char* RageTheatreMicrocPath; 9287821949aSmrg char* RageTheatreMicrocType; 9297821949aSmrg Bool MM_TABLE_valid; 9307821949aSmrg struct { 9317821949aSmrg uint8_t table_revision; 9327821949aSmrg uint8_t table_size; 9337821949aSmrg uint8_t tuner_type; 9347821949aSmrg uint8_t audio_chip; 9357821949aSmrg uint8_t product_id; 9367821949aSmrg uint8_t tuner_voltage_teletext_fm; 9377821949aSmrg uint8_t i2s_config; /* configuration of the sound chip */ 9387821949aSmrg uint8_t video_decoder_type; 9397821949aSmrg uint8_t video_decoder_host_config; 9407821949aSmrg uint8_t input[5]; 9417821949aSmrg } MM_TABLE; 9427821949aSmrg uint16_t video_decoder_type; 9437821949aSmrg int overlay_scaler_buffer_width; 9447821949aSmrg int ecp_div; 945de2362d3Smrg unsigned int xv_max_width; 946de2362d3Smrg unsigned int xv_max_height; 947de2362d3Smrg 948de2362d3Smrg /* general */ 949de2362d3Smrg OptionInfoPtr Options; 950de2362d3Smrg 9517821949aSmrg DisplayModePtr currentMode, savedCurrentMode; 9527821949aSmrg 9537821949aSmrg /* special handlings for DELL triple-head server */ 9547821949aSmrg Bool IsDellServer; 9557821949aSmrg 9567821949aSmrg Bool VGAAccess; 9577821949aSmrg 9587821949aSmrg int MaxSurfaceWidth; 9597821949aSmrg int MaxLines; 9607821949aSmrg 9617821949aSmrg Bool want_vblank_interrupts; 9627821949aSmrg RADEONBIOSConnector BiosConnector[RADEON_MAX_BIOS_CONNECTOR]; 9637821949aSmrg radeon_encoder_ptr encoders[RADEON_MAX_BIOS_CONNECTOR]; 9647821949aSmrg RADEONBIOSInitTable BiosTable; 9657821949aSmrg 9667821949aSmrg /* save crtc state for console restore */ 9677821949aSmrg Bool crtc_on; 9687821949aSmrg Bool crtc2_on; 9697821949aSmrg 9707821949aSmrg Bool InternalTVOut; 9717821949aSmrg 9727821949aSmrg#if defined(__powerpc__) 9737821949aSmrg RADEONMacModel MacModel; 9747821949aSmrg#endif 9757821949aSmrg RADEONExtTMDSChip ext_tmds_chip; 9767821949aSmrg 9777821949aSmrg atomBiosHandlePtr atomBIOS; 9787821949aSmrg unsigned long FbFreeStart, FbFreeSize; 9797821949aSmrg unsigned char* BIOSCopy; 980de2362d3Smrg 981de2362d3Smrg CreateScreenResourcesProcPtr CreateScreenResources; 9827821949aSmrg 9837821949aSmrg /* if no devices are connected at server startup */ 9847821949aSmrg Bool first_load_no_devices; 985de2362d3Smrg 986de2362d3Smrg Bool IsSecondary; 9877821949aSmrg Bool IsPrimary; 988de2362d3Smrg 989de2362d3Smrg Bool r600_shadow_fb; 990de2362d3Smrg void *fb_shadow; 991de2362d3Smrg 9927821949aSmrg /* some server chips have a hardcoded edid in the bios so that they work with KVMs */ 9937821949aSmrg Bool get_hardcoded_edid_from_bios; 9947821949aSmrg 9957821949aSmrg int virtualX; 9967821949aSmrg int virtualY; 9977821949aSmrg 9987821949aSmrg Bool r4xx_atom; 9997821949aSmrg 10007821949aSmrg /* pm */ 10017821949aSmrg RADEONPowerManagement pm; 10027821949aSmrg 10037821949aSmrg /* igp info */ 10047821949aSmrg float igp_sideport_mclk; 10057821949aSmrg float igp_system_mclk; 10067821949aSmrg float igp_ht_link_clk; 10077821949aSmrg float igp_ht_link_width; 10087821949aSmrg 10097821949aSmrg int can_resize; 1010de2362d3Smrg void (*reemit_current2d)(ScrnInfoPtr pScrn, int op); // emit the current 2D state into the IB 1011de2362d3Smrg struct radeon_2d_state state_2d; 10127821949aSmrg Bool kms_enabled; 1013de2362d3Smrg struct radeon_bo *front_bo; 10147821949aSmrg#ifdef XF86DRM_MODE 1015de2362d3Smrg struct radeon_bo_manager *bufmgr; 1016de2362d3Smrg struct radeon_cs_manager *csm; 1017de2362d3Smrg struct radeon_cs *cs; 1018de2362d3Smrg 1019de2362d3Smrg struct radeon_bo *cursor_bo[32]; 1020de2362d3Smrg uint64_t vram_size; 1021de2362d3Smrg uint64_t gart_size; 1022de2362d3Smrg drmmode_rec drmmode; 1023de2362d3Smrg /* r6xx+ tile config */ 1024de2362d3Smrg Bool have_tiling_info; 1025de2362d3Smrg uint32_t tile_config; 1026de2362d3Smrg int group_bytes; 1027de2362d3Smrg int num_channels; 1028de2362d3Smrg int num_banks; 1029de2362d3Smrg int r7xx_bank_op; 1030de2362d3Smrg struct radeon_surface_manager *surf_man; 1031de2362d3Smrg struct radeon_surface front_surface; 10327821949aSmrg#else 10337821949aSmrg /* fake bool */ 10347821949aSmrg Bool cs; 10357821949aSmrg#endif 1036de2362d3Smrg 1037de2362d3Smrg /* Xv bicubic filtering */ 1038de2362d3Smrg struct radeon_bo *bicubic_bo; 10397821949aSmrg void *bicubic_memory; 10407821949aSmrg int bicubic_offset; 1041de2362d3Smrg /* kms pageflipping */ 1042de2362d3Smrg Bool allowPageFlip; 1043de2362d3Smrg 1044de2362d3Smrg /* Perform vsync'ed SwapBuffers? */ 1045de2362d3Smrg Bool swapBuffersWait; 10467821949aSmrg} RADEONInfoRec, *RADEONInfoPtr; 1047de2362d3Smrg 10487821949aSmrg#define RADEONWaitForFifo(pScrn, entries) \ 10497821949aSmrgdo { \ 10507821949aSmrg if (info->accel_state->fifo_slots < entries) \ 10517821949aSmrg RADEONWaitForFifoFunction(pScrn, entries); \ 10527821949aSmrg info->accel_state->fifo_slots -= entries; \ 10537821949aSmrg} while (0) 10540d16fef4Smrg 10557821949aSmrg/* legacy_crtc.c */ 10567821949aSmrgextern void legacy_crtc_dpms(xf86CrtcPtr crtc, int mode); 10577821949aSmrgextern void legacy_crtc_mode_set(xf86CrtcPtr crtc, DisplayModePtr mode, 10587821949aSmrg DisplayModePtr adjusted_mode, int x, int y); 10597821949aSmrgextern void RADEONRestoreCommonRegisters(ScrnInfoPtr pScrn, 10607821949aSmrg RADEONSavePtr restore); 10617821949aSmrgextern void RADEONRestoreCrtcRegisters(ScrnInfoPtr pScrn, 10627821949aSmrg RADEONSavePtr restore); 10637821949aSmrgextern void RADEONRestoreCrtc2Registers(ScrnInfoPtr pScrn, 10647821949aSmrg RADEONSavePtr restore); 10657821949aSmrgextern void RADEONRestorePLLRegisters(ScrnInfoPtr pScrn, 10667821949aSmrg RADEONSavePtr restore); 10677821949aSmrgextern void RADEONRestorePLL2Registers(ScrnInfoPtr pScrn, 10687821949aSmrg RADEONSavePtr restore); 10697821949aSmrgextern void RADEONSaveCommonRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save); 10707821949aSmrgextern void RADEONSaveCrtcRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save); 10717821949aSmrgextern void RADEONSaveCrtc2Registers(ScrnInfoPtr pScrn, RADEONSavePtr save); 10727821949aSmrgextern void RADEONSavePLLRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save); 10737821949aSmrgextern void RADEONSavePLL2Registers(ScrnInfoPtr pScrn, RADEONSavePtr save); 10747821949aSmrg 10757821949aSmrg/* legacy_output.c */ 10767821949aSmrgextern RADEONMonitorType legacy_dac_detect(xf86OutputPtr output); 10777821949aSmrgextern void legacy_output_dpms(xf86OutputPtr output, int mode); 10787821949aSmrgextern void legacy_output_mode_set(xf86OutputPtr output, DisplayModePtr mode, 10797821949aSmrg DisplayModePtr adjusted_mode); 10807821949aSmrgextern I2CDevPtr RADEONDVODeviceInit(I2CBusPtr b, I2CSlaveAddr addr); 10817821949aSmrgextern Bool RADEONDVOReadByte(I2CDevPtr dvo, int addr, uint8_t *ch); 10827821949aSmrgextern Bool RADEONDVOWriteByte(I2CDevPtr dvo, int addr, uint8_t ch); 10837821949aSmrgextern void RADEONRestoreDACRegisters(ScrnInfoPtr pScrn, RADEONSavePtr restore); 10847821949aSmrgextern void RADEONRestoreFPRegisters(ScrnInfoPtr pScrn, RADEONSavePtr restore); 10857821949aSmrgextern void RADEONRestoreFP2Registers(ScrnInfoPtr pScrn, RADEONSavePtr restore); 10867821949aSmrgextern void RADEONRestoreLVDSRegisters(ScrnInfoPtr pScrn, RADEONSavePtr restore); 10877821949aSmrgextern void RADEONRestoreRMXRegisters(ScrnInfoPtr pScrn, RADEONSavePtr restore); 10887821949aSmrgextern void RADEONSaveDACRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save); 10897821949aSmrgextern void RADEONSaveFPRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save); 10907821949aSmrgextern void radeon_save_palette_on_demand(ScrnInfoPtr pScrn, int palID); 10917821949aSmrg 10927821949aSmrgextern void RADEONGetTVDacAdjInfo(ScrnInfoPtr pScrn, radeon_tvdac_ptr tvdac); 10937821949aSmrgextern void RADEONGetTMDSInfoFromTable(ScrnInfoPtr pScrn, radeon_tmds_ptr tmds); 10947821949aSmrgextern void RADEONGetTMDSInfo(ScrnInfoPtr pScrn, radeon_tmds_ptr tmds); 10957821949aSmrgextern void RADEONGetExtTMDSInfo(ScrnInfoPtr pScrn, radeon_dvo_ptr dvo); 10967821949aSmrgextern void RADEONGetLVDSInfo(ScrnInfoPtr pScrn, radeon_lvds_ptr lvds); 1097de2362d3Smrg 1098de2362d3Smrg/* radeon_accel.c */ 1099de2362d3Smrgextern Bool RADEONAccelInit(ScreenPtr pScreen); 11007821949aSmrgextern void RADEONEngineFlush(ScrnInfoPtr pScrn); 1101de2362d3Smrgextern void RADEONEngineInit(ScrnInfoPtr pScrn); 11027821949aSmrgextern void RADEONEngineReset(ScrnInfoPtr pScrn); 11037821949aSmrgextern void RADEONEngineRestore(ScrnInfoPtr pScrn); 11047821949aSmrgextern uint8_t *RADEONHostDataBlit(ScrnInfoPtr pScrn, unsigned int cpp, 11057821949aSmrg unsigned int w, uint32_t dstPitchOff, 11067821949aSmrg uint32_t *bufPitch, int x, int *y, 11077821949aSmrg unsigned int *h, unsigned int *hpass); 11087821949aSmrgextern void RADEONHostDataBlitCopyPass(ScrnInfoPtr pScrn, 11097821949aSmrg unsigned int bpp, 11107821949aSmrg uint8_t *dst, uint8_t *src, 11117821949aSmrg unsigned int hpass, 11127821949aSmrg unsigned int dstPitch, 11137821949aSmrg unsigned int srcPitch); 1114de2362d3Smrgextern void RADEONCopySwap(uint8_t *dst, uint8_t *src, unsigned int size, int swap); 11157821949aSmrgextern void RADEONHostDataParams(ScrnInfoPtr pScrn, uint8_t *dst, 11167821949aSmrg uint32_t pitch, int cpp, 11177821949aSmrg uint32_t *dstPitchOffset, int *x, int *y); 1118de2362d3Smrgextern void RADEONInit3DEngine(ScrnInfoPtr pScrn); 11197821949aSmrgextern void RADEONWaitForFifoFunction(ScrnInfoPtr pScrn, int entries); 11207821949aSmrg#ifdef XF86DRI 11217821949aSmrgextern drmBufPtr RADEONCPGetBuffer(ScrnInfoPtr pScrn); 11227821949aSmrgextern void RADEONCPFlushIndirect(ScrnInfoPtr pScrn, int discard); 11237821949aSmrgextern void RADEONCPReleaseIndirect(ScrnInfoPtr pScrn); 11247821949aSmrgextern int RADEONCPStop(ScrnInfoPtr pScrn, RADEONInfoPtr info); 11257821949aSmrg# ifdef USE_XAA 11267821949aSmrgextern Bool RADEONSetupMemXAA_DRI(ScreenPtr pScreen); 11277821949aSmrg# endif 11287821949aSmrguint32_t radeonGetPixmapOffset(PixmapPtr pPix); 11297821949aSmrg#endif 1130de2362d3Smrgextern int radeon_cs_space_remaining(ScrnInfoPtr pScrn); 1131de2362d3Smrg 11327821949aSmrg#ifdef USE_XAA 11337821949aSmrg/* radeon_accelfuncs.c */ 11347821949aSmrgextern void RADEONAccelInitMMIO(ScreenPtr pScreen, XAAInfoRecPtr a); 11357821949aSmrgextern Bool RADEONSetupMemXAA(ScreenPtr pScreen); 11367821949aSmrg#endif 11377821949aSmrg 11387821949aSmrg/* radeon_bios.c */ 11397821949aSmrgextern Bool RADEONGetBIOSInfo(ScrnInfoPtr pScrn, xf86Int10InfoPtr pInt10); 11407821949aSmrgextern Bool RADEONGetClockInfoFromBIOS(ScrnInfoPtr pScrn); 11417821949aSmrgextern Bool RADEONGetConnectorInfoFromBIOS(ScrnInfoPtr pScrn); 11427821949aSmrgextern Bool RADEONGetDAC2InfoFromBIOS(ScrnInfoPtr pScrn, radeon_tvdac_ptr tvdac); 11437821949aSmrgextern Bool RADEONGetExtTMDSInfoFromBIOS (ScrnInfoPtr pScrn, radeon_dvo_ptr dvo); 11447821949aSmrgextern xf86MonPtr RADEONGetHardCodedEDIDFromBIOS(xf86OutputPtr output); 11457821949aSmrgextern Bool RADEONGetBIOSInitTableOffsets(ScrnInfoPtr pScrn); 11467821949aSmrgextern Bool RADEONGetLVDSInfoFromBIOS(ScrnInfoPtr pScrn, radeon_lvds_ptr lvds); 11477821949aSmrgextern Bool RADEONGetTMDSInfoFromBIOS(ScrnInfoPtr pScrn, radeon_tmds_ptr tmds); 11487821949aSmrgextern Bool RADEONGetTVInfoFromBIOS(xf86OutputPtr output); 11497821949aSmrgextern Bool RADEONInitExtTMDSInfoFromBIOS (xf86OutputPtr output); 11507821949aSmrgextern Bool RADEONPostCardFromBIOSTables(ScrnInfoPtr pScrn); 11517821949aSmrgextern Bool radeon_card_posted(ScrnInfoPtr pScrn); 1152de2362d3Smrg 11537821949aSmrg/* radeon_commonfuncs.c */ 11547821949aSmrg#ifdef XF86DRI 11557821949aSmrgextern void RADEONWaitForIdleCP(ScrnInfoPtr pScrn); 11567821949aSmrgextern void RADEONWaitForVLineCP(ScrnInfoPtr pScrn, PixmapPtr pPix, 11577821949aSmrg xf86CrtcPtr crtc, int start, int stop); 11587821949aSmrg#endif 11597821949aSmrgextern void RADEONWaitForIdleMMIO(ScrnInfoPtr pScrn); 11607821949aSmrgextern void RADEONWaitForVLineMMIO(ScrnInfoPtr pScrn, PixmapPtr pPix, 11617821949aSmrg xf86CrtcPtr crtc, int start, int stop); 11627821949aSmrg 11637821949aSmrg/* radeon_crtc.c */ 11647821949aSmrgextern void radeon_crtc_dpms(xf86CrtcPtr crtc, int mode); 11657821949aSmrgextern void radeon_do_crtc_dpms(xf86CrtcPtr crtc, int mode); 11667821949aSmrgextern void radeon_crtc_load_lut(xf86CrtcPtr crtc); 11677821949aSmrgextern void radeon_crtc_modeset_ioctl(xf86CrtcPtr crtc, Bool post); 11687821949aSmrgextern Bool RADEONAllocateControllers(ScrnInfoPtr pScrn, int mask); 11697821949aSmrgextern void RADEONBlank(ScrnInfoPtr pScrn); 11707821949aSmrgextern void RADEONComputePLL(xf86CrtcPtr crtc, 11717821949aSmrg RADEONPLLPtr pll, unsigned long freq, 11727821949aSmrg uint32_t *chosen_dot_clock_freq, 11737821949aSmrg uint32_t *chosen_feedback_div, 11747821949aSmrg uint32_t *chosen_frac_feedback_div, 11757821949aSmrg uint32_t *chosen_reference_div, 11767821949aSmrg uint32_t *chosen_post_div, int flags); 11777821949aSmrgextern DisplayModePtr RADEONCrtcFindClosestMode(xf86CrtcPtr crtc, 11787821949aSmrg DisplayModePtr pMode); 11797821949aSmrgextern void RADEONUnblank(ScrnInfoPtr pScrn); 11807821949aSmrgextern Bool RADEONSetTiling(ScrnInfoPtr pScrn); 11817821949aSmrgextern void RADEONInitDispBandwidth(ScrnInfoPtr pScrn); 11827821949aSmrg 11837821949aSmrg/* radeon_cursor.c */ 11847821949aSmrgextern Bool RADEONCursorInit(ScreenPtr pScreen); 11857821949aSmrgextern void radeon_crtc_hide_cursor(xf86CrtcPtr crtc); 11867821949aSmrgextern void radeon_crtc_load_cursor_argb(xf86CrtcPtr crtc, CARD32 *image); 11877821949aSmrgextern void radeon_crtc_set_cursor_colors(xf86CrtcPtr crtc, int bg, int fg); 11887821949aSmrgextern void radeon_crtc_set_cursor_position(xf86CrtcPtr crtc, int x, int y); 11897821949aSmrgextern void radeon_crtc_show_cursor(xf86CrtcPtr crtc); 11907821949aSmrg 11917821949aSmrg#ifdef XF86DRI 11927821949aSmrg/* radeon_dri.c */ 11937821949aSmrgextern void RADEONDRIAllocatePCIGARTTable(ScreenPtr pScreen); 11947821949aSmrgextern void RADEONDRICloseScreen(ScreenPtr pScreen); 11957821949aSmrgextern Bool RADEONDRIFinishScreenInit(ScreenPtr pScreen); 11967821949aSmrgextern int RADEONDRIGetPciAperTableSize(ScrnInfoPtr pScrn); 11977821949aSmrgextern Bool RADEONDRIGetVersion(ScrnInfoPtr pScrn); 11987821949aSmrgextern void RADEONDRIResume(ScreenPtr pScreen); 11997821949aSmrgextern Bool RADEONDRIScreenInit(ScreenPtr pScreen); 12007821949aSmrgextern int RADEONDRISetParam(ScrnInfoPtr pScrn, 12017821949aSmrg unsigned int param, int64_t value); 12027821949aSmrgextern Bool RADEONDRISetVBlankInterrupt(ScrnInfoPtr pScrn, Bool on); 12037821949aSmrgextern void RADEONDRIStop(ScreenPtr pScreen); 12047821949aSmrg#endif 1205de2362d3Smrg 12067821949aSmrg/* radeon_driver.c */ 12077821949aSmrgextern void RADEONDoAdjustFrame(ScrnInfoPtr pScrn, int x, int y, Bool clone); 12087821949aSmrgextern void RADEONChangeSurfaces(ScrnInfoPtr pScrn); 12097821949aSmrgextern RADEONEntPtr RADEONEntPriv(ScrnInfoPtr pScrn); 12107821949aSmrgextern int RADEONMinBits(int val); 12117821949aSmrgextern unsigned RADEONINMC(ScrnInfoPtr pScrn, int addr); 12127821949aSmrgextern unsigned RADEONINPLL(ScrnInfoPtr pScrn, int addr); 12137821949aSmrgextern unsigned RADEONINPCIE(ScrnInfoPtr pScrn, int addr); 12147821949aSmrgextern unsigned R600INPCIE_PORT(ScrnInfoPtr pScrn, int addr); 12157821949aSmrgextern void RADEONOUTMC(ScrnInfoPtr pScrn, int addr, uint32_t data); 12167821949aSmrgextern void RADEONOUTPLL(ScrnInfoPtr pScrn, int addr, uint32_t data); 12177821949aSmrgextern void RADEONOUTPCIE(ScrnInfoPtr pScrn, int addr, uint32_t data); 12187821949aSmrgextern void R600OUTPCIE_PORT(ScrnInfoPtr pScrn, int addr, uint32_t data); 12197821949aSmrgextern void RADEONPllErrataAfterData(RADEONInfoPtr info); 12207821949aSmrgextern void RADEONPllErrataAfterIndex(RADEONInfoPtr info); 12217821949aSmrgextern void RADEONWaitForVerticalSync(ScrnInfoPtr pScrn); 12227821949aSmrgextern void RADEONWaitForVerticalSync2(ScrnInfoPtr pScrn); 12237821949aSmrgextern void RADEONInitMemMapRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save, 12247821949aSmrg RADEONInfoPtr info); 12257821949aSmrgextern void RADEONRestoreMemMapRegisters(ScrnInfoPtr pScrn, 12267821949aSmrg RADEONSavePtr restore); 12277821949aSmrgextern Bool 12287821949aSmrgRADEONZaphodStringMatches(ScrnInfoPtr pScrn, const char *s, char *output_name); 12297821949aSmrg 12307821949aSmrgBool RADEONGetRec(ScrnInfoPtr pScrn); 12317821949aSmrgvoid RADEONFreeRec(ScrnInfoPtr pScrn); 12327821949aSmrgBool RADEONPreInitVisual(ScrnInfoPtr pScrn); 12337821949aSmrgBool RADEONPreInitWeight(ScrnInfoPtr pScrn); 12347821949aSmrg 12357821949aSmrgextern Bool RADEON_DP_I2CInit(ScrnInfoPtr pScrn, I2CBusPtr *bus_ptr, 12367821949aSmrg char *name, xf86OutputPtr output); 12377821949aSmrgextern void RADEON_DP_GetDPCD(xf86OutputPtr output); 12387821949aSmrgextern int RADEON_DP_GetSinkType(xf86OutputPtr output); 12397821949aSmrg 12407821949aSmrg/* radeon_pm.c */ 12417821949aSmrgextern void RADEONPMInit(ScrnInfoPtr pScrn); 12427821949aSmrgextern void RADEONPMBlockHandler(ScrnInfoPtr pScrn); 12437821949aSmrgextern void RADEONPMEnterVT(ScrnInfoPtr pScrn); 12447821949aSmrgextern void RADEONPMLeaveVT(ScrnInfoPtr pScrn); 12457821949aSmrgextern void RADEONPMFini(ScrnInfoPtr pScrn); 12467821949aSmrg 12477821949aSmrg#ifdef USE_EXA 1248de2362d3Smrg/* radeon_exa.c */ 1249de2362d3Smrgextern unsigned eg_tile_split(unsigned tile_split); 12507821949aSmrgextern Bool RADEONSetupMemEXA(ScreenPtr pScreen); 1251de2362d3Smrgextern Bool radeon_transform_is_affine_or_scaled(PictTransformPtr t); 1252de2362d3Smrg 1253de2362d3Smrg/* radeon_exa_funcs.c */ 12547821949aSmrgextern void RADEONCopyCP(PixmapPtr pDst, int srcX, int srcY, int dstX, 12557821949aSmrg int dstY, int w, int h); 12567821949aSmrgextern void RADEONCopyMMIO(PixmapPtr pDst, int srcX, int srcY, int dstX, 12577821949aSmrg int dstY, int w, int h); 12587821949aSmrgextern Bool RADEONDrawInitCP(ScreenPtr pScreen); 12597821949aSmrgextern Bool RADEONDrawInitMMIO(ScreenPtr pScreen); 12607821949aSmrgextern void RADEONDoPrepareCopyCP(ScrnInfoPtr pScrn, 12617821949aSmrg uint32_t src_pitch_offset, 12627821949aSmrg uint32_t dst_pitch_offset, 12637821949aSmrg uint32_t datatype, int rop, 12647821949aSmrg Pixel planemask); 12657821949aSmrgextern void RADEONDoPrepareCopyMMIO(ScrnInfoPtr pScrn, 12667821949aSmrg uint32_t src_pitch_offset, 12677821949aSmrg uint32_t dst_pitch_offset, 12687821949aSmrg uint32_t datatype, int rop, 12697821949aSmrg Pixel planemask); 1270de2362d3Smrgextern Bool R600DrawInit(ScreenPtr pScreen); 1271de2362d3Smrgextern Bool R600LoadShaders(ScrnInfoPtr pScrn); 12727821949aSmrg#ifdef XF86DRM_MODE 1273de2362d3Smrgextern Bool EVERGREENDrawInit(ScreenPtr pScreen); 12747821949aSmrg#endif 12757821949aSmrg#endif 1276de2362d3Smrg 12777821949aSmrg#if defined(XF86DRI) && defined(USE_EXA) 1278de2362d3Smrg/* radeon_exa.c */ 1279de2362d3Smrgextern Bool RADEONGetDatatypeBpp(int bpp, uint32_t *type); 1280de2362d3Smrgextern Bool RADEONGetPixmapOffsetPitch(PixmapPtr pPix, 1281de2362d3Smrg uint32_t *pitch_offset); 12827821949aSmrgextern unsigned long long RADEONTexOffsetStart(PixmapPtr pPix); 12837821949aSmrg#endif 1284de2362d3Smrg 12857821949aSmrg/* radeon_modes.c */ 12867821949aSmrgextern void RADEONSetPitch(ScrnInfoPtr pScrn); 12877821949aSmrgextern DisplayModePtr RADEONProbeOutputModes(xf86OutputPtr output); 12887821949aSmrg 12897821949aSmrg/* radeon_output.c */ 12907821949aSmrgextern RADEONI2CBusRec atom_setup_i2c_bus(int ddc_line); 12917821949aSmrgextern RADEONI2CBusRec legacy_setup_i2c_bus(int ddc_line); 12927821949aSmrgextern void RADEONGetPanelInfo(ScrnInfoPtr pScrn); 12937821949aSmrgextern void RADEONInitConnector(xf86OutputPtr output); 12947821949aSmrgextern void RADEONPrintPortMap(ScrnInfoPtr pScrn); 12957821949aSmrgextern void RADEONSetOutputType(ScrnInfoPtr pScrn, 12967821949aSmrg RADEONOutputPrivatePtr radeon_output); 12977821949aSmrgextern Bool RADEONSetupConnectors(ScrnInfoPtr pScrn); 12987821949aSmrgextern Bool RADEONI2CDoLock(xf86OutputPtr output, I2CBusPtr b, Bool lock_state); 12997821949aSmrg 13007821949aSmrgextern Bool radeon_dp_mode_fixup(xf86OutputPtr output, DisplayModePtr mode, DisplayModePtr adjusted_mode); 13017821949aSmrg 13027821949aSmrg/* radeon_tv.c */ 13037821949aSmrgextern void RADEONSaveTVRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save); 13047821949aSmrgextern void RADEONAdjustCrtcRegistersForTV(ScrnInfoPtr pScrn, RADEONSavePtr save, 13057821949aSmrg DisplayModePtr mode, xf86OutputPtr output); 13067821949aSmrgextern void RADEONAdjustPLLRegistersForTV(ScrnInfoPtr pScrn, RADEONSavePtr save, 13077821949aSmrg DisplayModePtr mode, xf86OutputPtr output); 13087821949aSmrgextern void RADEONAdjustCrtc2RegistersForTV(ScrnInfoPtr pScrn, RADEONSavePtr save, 13097821949aSmrg DisplayModePtr mode, xf86OutputPtr output); 13107821949aSmrgextern void RADEONAdjustPLL2RegistersForTV(ScrnInfoPtr pScrn, RADEONSavePtr save, 13117821949aSmrg DisplayModePtr mode, xf86OutputPtr output); 13127821949aSmrgextern void RADEONInitTVRegisters(xf86OutputPtr output, RADEONSavePtr save, 13137821949aSmrg DisplayModePtr mode, BOOL IsPrimary); 13147821949aSmrgextern void RADEONRestoreTVRegisters(ScrnInfoPtr pScrn, RADEONSavePtr restore); 13157821949aSmrgextern void RADEONUpdateHVPosition(xf86OutputPtr output, DisplayModePtr mode); 13160d16fef4Smrg 1317de2362d3Smrg/* radeon_video.c */ 1318de2362d3Smrgextern void RADEONInitVideo(ScreenPtr pScreen); 1319de2362d3Smrgextern void RADEONResetVideo(ScrnInfoPtr pScrn); 1320de2362d3Smrgextern Bool radeon_load_bicubic_texture(ScrnInfoPtr pScrn); 1321de2362d3Smrgextern xf86CrtcPtr radeon_pick_best_crtc(ScrnInfoPtr pScrn, 1322de2362d3Smrg int x1, int x2, int y1, int y2); 1323de2362d3Smrg 13247821949aSmrg/* radeon_legacy_memory.c */ 13257821949aSmrgextern uint32_t 13267821949aSmrgradeon_legacy_allocate_memory(ScrnInfoPtr pScrn, 13277821949aSmrg void **mem_struct, 13287821949aSmrg int size, 13297821949aSmrg int align, 13307821949aSmrg int domain); 13317821949aSmrgextern void 13327821949aSmrgradeon_legacy_free_memory(ScrnInfoPtr pScrn, 13337821949aSmrg void *mem_struct); 13347821949aSmrg 13357821949aSmrg#ifdef XF86DRM_MODE 1336de2362d3Smrgextern void radeon_cs_flush_indirect(ScrnInfoPtr pScrn); 1337de2362d3Smrgextern void radeon_ddx_cs_start(ScrnInfoPtr pScrn, 1338de2362d3Smrg int num, const char *file, 1339de2362d3Smrg const char *func, int line); 13407821949aSmrgvoid radeon_kms_update_vram_limit(ScrnInfoPtr pScrn, int new_fb_size); 13417821949aSmrgstruct radeon_surface *radeon_get_pixmap_surface(PixmapPtr pPix); 13427821949aSmrg#endif 13437821949aSmrgstruct radeon_bo *radeon_get_pixmap_bo(PixmapPtr pPix); 13447821949aSmrgvoid radeon_set_pixmap_bo(PixmapPtr pPix, struct radeon_bo *bo); 1345de2362d3Smrguint32_t radeon_get_pixmap_tiling(PixmapPtr pPix); 1346de2362d3Smrg 13477821949aSmrg#ifdef XF86DRI 13487821949aSmrg# ifdef USE_XAA 13497821949aSmrg/* radeon_accelfuncs.c */ 13507821949aSmrgextern void RADEONAccelInitCP(ScreenPtr pScreen, XAAInfoRecPtr a); 13517821949aSmrg# endif 1352de2362d3Smrg 13537821949aSmrg#define RADEONCP_START(pScrn, info) \ 13547821949aSmrgdo { \ 13557821949aSmrg int _ret = drmCommandNone(info->dri->drmFD, DRM_RADEON_CP_START); \ 13567821949aSmrg if (_ret) { \ 13577821949aSmrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \ 13587821949aSmrg "%s: CP start %d\n", __FUNCTION__, _ret); \ 13597821949aSmrg } \ 13607821949aSmrg info->cp->CPStarted = TRUE; \ 13617821949aSmrg} while (0) 1362de2362d3Smrg 13637821949aSmrg#define RADEONCP_RELEASE(pScrn, info) \ 13647821949aSmrgdo { \ 13657821949aSmrg if (info->cs) { \ 13667821949aSmrg radeon_cs_flush_indirect(pScrn); \ 13677821949aSmrg } else if (info->cp->CPInUse) { \ 13687821949aSmrg RADEON_PURGE_CACHE(); \ 13697821949aSmrg RADEON_WAIT_UNTIL_IDLE(); \ 13707821949aSmrg RADEONCPReleaseIndirect(pScrn); \ 13717821949aSmrg info->cp->CPInUse = FALSE; \ 13727821949aSmrg } \ 13737821949aSmrg} while (0) 1374de2362d3Smrg 13757821949aSmrg#define RADEONCP_STOP(pScrn, info) \ 13767821949aSmrgdo { \ 13777821949aSmrg int _ret; \ 13787821949aSmrg if (info->cp->CPStarted) { \ 13797821949aSmrg _ret = RADEONCPStop(pScrn, info); \ 13807821949aSmrg if (_ret) { \ 13817821949aSmrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \ 13827821949aSmrg "%s: CP stop %d\n", __FUNCTION__, _ret); \ 13837821949aSmrg } \ 13847821949aSmrg info->cp->CPStarted = FALSE; \ 13857821949aSmrg } \ 13867821949aSmrg if (info->ChipFamily < CHIP_FAMILY_R600) \ 13877821949aSmrg RADEONEngineRestore(pScrn); \ 13887821949aSmrg info->cp->CPRuns = FALSE; \ 13897821949aSmrg} while (0) 13907314432eSmrg 13917821949aSmrg#define RADEONCP_RESET(pScrn, info) \ 13927821949aSmrgdo { \ 13937821949aSmrg int _ret = drmCommandNone(info->dri->drmFD, DRM_RADEON_CP_RESET); \ 13947821949aSmrg if (_ret) { \ 13957821949aSmrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \ 13967821949aSmrg "%s: CP reset %d\n", __FUNCTION__, _ret); \ 13977821949aSmrg } \ 13987821949aSmrg} while (0) 1399de2362d3Smrg 14007821949aSmrg#define RADEONCP_REFRESH(pScrn, info) \ 14017821949aSmrgdo { \ 14027821949aSmrg if (!info->cp->CPInUse && !info->cs) { \ 14037821949aSmrg if (info->cp->needCacheFlush) { \ 14047821949aSmrg RADEON_PURGE_CACHE(); \ 14057821949aSmrg RADEON_PURGE_ZCACHE(); \ 14067821949aSmrg info->cp->needCacheFlush = FALSE; \ 14077821949aSmrg } \ 14087821949aSmrg RADEON_WAIT_UNTIL_IDLE(); \ 14097821949aSmrg info->cp->CPInUse = TRUE; \ 14107821949aSmrg } \ 14117821949aSmrg} while (0) 1412de2362d3Smrg 1413de2362d3Smrg 1414de2362d3Smrg#define CP_PACKET0(reg, n) \ 1415de2362d3Smrg (RADEON_CP_PACKET0 | ((n) << 16) | ((reg) >> 2)) 1416de2362d3Smrg#define CP_PACKET1(reg0, reg1) \ 1417de2362d3Smrg (RADEON_CP_PACKET1 | (((reg1) >> 2) << 11) | ((reg0) >> 2)) 1418de2362d3Smrg#define CP_PACKET2() \ 1419de2362d3Smrg (RADEON_CP_PACKET2) 1420de2362d3Smrg#define CP_PACKET3(pkt, n) \ 1421de2362d3Smrg (RADEON_CP_PACKET3 | (pkt) | ((n) << 16)) 1422de2362d3Smrg 1423de2362d3Smrg 1424de2362d3Smrg#define RADEON_VERBOSE 0 1425de2362d3Smrg 14267821949aSmrg#define RING_LOCALS uint32_t *__head = NULL; int __expected; int __count = 0 14277821949aSmrg 1428de2362d3Smrg#define BEGIN_RING(n) do { \ 1429de2362d3Smrg if (RADEON_VERBOSE) { \ 1430de2362d3Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ 1431de2362d3Smrg "BEGIN_RING(%d) in %s\n", (unsigned int)n, __FUNCTION__);\ 1432de2362d3Smrg } \ 14337821949aSmrg if (info->cs) { radeon_ddx_cs_start(pScrn, n, __FILE__, __func__, __LINE__); } else { \ 14347821949aSmrg if (++info->cp->dma_begin_count != 1) { \ 14357821949aSmrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \ 14367821949aSmrg "BEGIN_RING without end at %s:%d\n", \ 14377821949aSmrg info->cp->dma_debug_func, info->cp->dma_debug_lineno); \ 14387821949aSmrg info->cp->dma_begin_count = 1; \ 14397821949aSmrg } \ 14407821949aSmrg info->cp->dma_debug_func = __FILE__; \ 14417821949aSmrg info->cp->dma_debug_lineno = __LINE__; \ 14427821949aSmrg if (!info->cp->indirectBuffer) { \ 14437821949aSmrg info->cp->indirectBuffer = RADEONCPGetBuffer(pScrn); \ 14447821949aSmrg info->cp->indirectStart = 0; \ 14457821949aSmrg } else if (info->cp->indirectBuffer->used + (n) * (int)sizeof(uint32_t) > \ 14467821949aSmrg info->cp->indirectBuffer->total) { \ 14477821949aSmrg RADEONCPFlushIndirect(pScrn, 1); \ 14487821949aSmrg } \ 14497821949aSmrg __expected = n; \ 14507821949aSmrg __head = (pointer)((char *)info->cp->indirectBuffer->address + \ 14517821949aSmrg info->cp->indirectBuffer->used); \ 14527821949aSmrg __count = 0; \ 14537821949aSmrg } \ 1454de2362d3Smrg} while (0) 1455de2362d3Smrg 1456de2362d3Smrg#define ADVANCE_RING() do { \ 14577821949aSmrg if (info->cs) radeon_cs_end(info->cs, __FILE__, __func__, __LINE__); else { \ 14587821949aSmrg if (info->cp->dma_begin_count-- != 1) { \ 14597821949aSmrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \ 14607821949aSmrg "ADVANCE_RING without begin at %s:%d\n", \ 14617821949aSmrg __FILE__, __LINE__); \ 14627821949aSmrg info->cp->dma_begin_count = 0; \ 14637821949aSmrg } \ 14647821949aSmrg if (__count != __expected) { \ 14657821949aSmrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \ 14667821949aSmrg "ADVANCE_RING count != expected (%d vs %d) at %s:%d\n", \ 14677821949aSmrg __count, __expected, __FILE__, __LINE__); \ 14687821949aSmrg } \ 14697821949aSmrg if (RADEON_VERBOSE) { \ 14707821949aSmrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ 14717821949aSmrg "ADVANCE_RING() start: %d used: %d count: %d\n", \ 14727821949aSmrg info->cp->indirectStart, \ 14737821949aSmrg info->cp->indirectBuffer->used, \ 14747821949aSmrg __count * (int)sizeof(uint32_t)); \ 14757821949aSmrg } \ 14767821949aSmrg info->cp->indirectBuffer->used += __count * (int)sizeof(uint32_t); \ 14777821949aSmrg } \ 1478de2362d3Smrg } while (0) 1479de2362d3Smrg 1480de2362d3Smrg#define OUT_RING(x) do { \ 1481de2362d3Smrg if (RADEON_VERBOSE) { \ 1482de2362d3Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ 1483de2362d3Smrg " OUT_RING(0x%08x)\n", (unsigned int)(x)); \ 1484de2362d3Smrg } \ 14857821949aSmrg if (info->cs) radeon_cs_write_dword(info->cs, (x)); else \ 14867821949aSmrg __head[__count++] = (x); \ 1487de2362d3Smrg} while (0) 1488de2362d3Smrg 1489de2362d3Smrg#define OUT_RING_REG(reg, val) \ 1490de2362d3Smrgdo { \ 1491de2362d3Smrg OUT_RING(CP_PACKET0(reg, 0)); \ 1492de2362d3Smrg OUT_RING(val); \ 1493de2362d3Smrg} while (0) 1494de2362d3Smrg 1495de2362d3Smrg#define OUT_RING_RELOC(x, read_domains, write_domain) \ 1496de2362d3Smrg do { \ 1497de2362d3Smrg int _ret; \ 1498de2362d3Smrg _ret = radeon_cs_write_reloc(info->cs, x, read_domains, write_domain, 0); \ 1499de2362d3Smrg if (_ret) ErrorF("reloc emit failure %d\n", _ret); \ 1500de2362d3Smrg } while(0) 1501de2362d3Smrg 1502de2362d3Smrg 1503de2362d3Smrg#define FLUSH_RING() \ 1504de2362d3Smrgdo { \ 1505de2362d3Smrg if (RADEON_VERBOSE) \ 1506de2362d3Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ 1507de2362d3Smrg "FLUSH_RING in %s\n", __FUNCTION__); \ 15087821949aSmrg if (info->cs) \ 15097821949aSmrg radeon_cs_flush_indirect(pScrn); \ 15107821949aSmrg else if (info->cp->indirectBuffer) \ 15117821949aSmrg RADEONCPFlushIndirect(pScrn, 0); \ 15127821949aSmrg} while (0) 15137821949aSmrg 15147821949aSmrg 15157821949aSmrg#define RADEON_WAIT_UNTIL_2D_IDLE() \ 15167821949aSmrgdo { \ 15177821949aSmrg if (info->ChipFamily < CHIP_FAMILY_R600) { \ 15187821949aSmrg BEGIN_RING(2); \ 15197821949aSmrg OUT_RING(CP_PACKET0(RADEON_WAIT_UNTIL, 0)); \ 15207821949aSmrg OUT_RING((RADEON_WAIT_2D_IDLECLEAN | \ 15217821949aSmrg RADEON_WAIT_HOST_IDLECLEAN)); \ 15227821949aSmrg ADVANCE_RING(); \ 15237821949aSmrg } \ 15247821949aSmrg} while (0) 15257821949aSmrg 15267821949aSmrg#define RADEON_WAIT_UNTIL_3D_IDLE() \ 15277821949aSmrgdo { \ 15287821949aSmrg if (info->ChipFamily < CHIP_FAMILY_R600) { \ 15297821949aSmrg BEGIN_RING(2); \ 15307821949aSmrg OUT_RING(CP_PACKET0(RADEON_WAIT_UNTIL, 0)); \ 15317821949aSmrg OUT_RING((RADEON_WAIT_3D_IDLECLEAN | \ 15327821949aSmrg RADEON_WAIT_HOST_IDLECLEAN)); \ 15337821949aSmrg ADVANCE_RING(); \ 15347821949aSmrg } \ 15357821949aSmrg} while (0) 15367821949aSmrg 15377821949aSmrg#define RADEON_WAIT_UNTIL_IDLE() \ 15387821949aSmrgdo { \ 15397821949aSmrg if (RADEON_VERBOSE) { \ 15407821949aSmrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ 15417821949aSmrg "WAIT_UNTIL_IDLE() in %s\n", __FUNCTION__); \ 15427821949aSmrg } \ 15437821949aSmrg if (info->ChipFamily < CHIP_FAMILY_R600) { \ 15447821949aSmrg BEGIN_RING(2); \ 15457821949aSmrg OUT_RING(CP_PACKET0(RADEON_WAIT_UNTIL, 0)); \ 15467821949aSmrg OUT_RING((RADEON_WAIT_2D_IDLECLEAN | \ 15477821949aSmrg RADEON_WAIT_3D_IDLECLEAN | \ 15487821949aSmrg RADEON_WAIT_HOST_IDLECLEAN)); \ 15497821949aSmrg ADVANCE_RING(); \ 15507821949aSmrg } \ 15517821949aSmrg} while (0) 15527821949aSmrg 15537821949aSmrg#define RADEON_PURGE_CACHE() \ 15547821949aSmrgdo { \ 15557821949aSmrg if (info->ChipFamily < CHIP_FAMILY_R600) { \ 15567821949aSmrg BEGIN_RING(2); \ 15577821949aSmrg if (info->ChipFamily <= CHIP_FAMILY_RV280) { \ 15587821949aSmrg OUT_RING(CP_PACKET0(RADEON_RB3D_DSTCACHE_CTLSTAT, 0)); \ 15597821949aSmrg OUT_RING(RADEON_RB3D_DC_FLUSH_ALL); \ 15607821949aSmrg } else { \ 15617821949aSmrg OUT_RING(CP_PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0)); \ 15627821949aSmrg OUT_RING(R300_RB3D_DC_FLUSH_ALL); \ 15637821949aSmrg } \ 15647821949aSmrg ADVANCE_RING(); \ 15657821949aSmrg } \ 1566de2362d3Smrg} while (0) 1567de2362d3Smrg 15687821949aSmrg#define RADEON_PURGE_ZCACHE() \ 15697821949aSmrgdo { \ 15707821949aSmrg if (info->ChipFamily < CHIP_FAMILY_R600) { \ 15717821949aSmrg BEGIN_RING(2); \ 15727821949aSmrg if (info->ChipFamily <= CHIP_FAMILY_RV280) { \ 15737821949aSmrg OUT_RING(CP_PACKET0(RADEON_RB3D_ZCACHE_CTLSTAT, 0)); \ 15747821949aSmrg OUT_RING(RADEON_RB3D_ZC_FLUSH_ALL); \ 15757821949aSmrg } else { \ 15767821949aSmrg OUT_RING(CP_PACKET0(R300_RB3D_ZCACHE_CTLSTAT, 0)); \ 15777821949aSmrg OUT_RING(R300_ZC_FLUSH_ALL); \ 15787821949aSmrg } \ 15797821949aSmrg ADVANCE_RING(); \ 15807821949aSmrg } \ 15817821949aSmrg} while (0) 15827821949aSmrg 15837821949aSmrg#endif /* XF86DRI */ 15847821949aSmrg 15857821949aSmrg#if defined(XF86DRI) && defined(USE_EXA) 15867821949aSmrg 15877821949aSmrg#ifdef XF86DRM_MODE 1588de2362d3Smrg#define CS_FULL(cs) ((cs)->cdw > 15 * 1024) 15897821949aSmrg#else 15907821949aSmrg#define CS_FULL(cs) FALSE 15917821949aSmrg#endif 1592de2362d3Smrg 1593de2362d3Smrg#define RADEON_SWITCH_TO_2D() \ 1594de2362d3Smrgdo { \ 1595de2362d3Smrg uint32_t flush = 0; \ 1596de2362d3Smrg switch (info->accel_state->engineMode) { \ 1597de2362d3Smrg case EXA_ENGINEMODE_UNKNOWN: \ 1598de2362d3Smrg flush = 1; \ 1599de2362d3Smrg break; \ 1600de2362d3Smrg case EXA_ENGINEMODE_3D: \ 16017821949aSmrg flush = !info->cs || CS_FULL(info->cs); \ 1602de2362d3Smrg break; \ 1603de2362d3Smrg case EXA_ENGINEMODE_2D: \ 16047821949aSmrg flush = info->cs && CS_FULL(info->cs); \ 1605de2362d3Smrg break; \ 1606de2362d3Smrg } \ 1607de2362d3Smrg if (flush) { \ 16087821949aSmrg if (info->cs) \ 16097821949aSmrg radeon_cs_flush_indirect(pScrn); \ 16107821949aSmrg else if (info->directRenderingEnabled) \ 16117821949aSmrg RADEONCPFlushIndirect(pScrn, 1); \ 1612de2362d3Smrg } \ 1613de2362d3Smrg info->accel_state->engineMode = EXA_ENGINEMODE_2D; \ 1614de2362d3Smrg} while (0); 1615de2362d3Smrg 1616de2362d3Smrg#define RADEON_SWITCH_TO_3D() \ 1617de2362d3Smrgdo { \ 1618de2362d3Smrg uint32_t flush = 0; \ 1619de2362d3Smrg switch (info->accel_state->engineMode) { \ 1620de2362d3Smrg case EXA_ENGINEMODE_UNKNOWN: \ 1621de2362d3Smrg flush = 1; \ 1622de2362d3Smrg break; \ 1623de2362d3Smrg case EXA_ENGINEMODE_2D: \ 16247821949aSmrg flush = !info->cs || CS_FULL(info->cs); \ 1625de2362d3Smrg break; \ 1626de2362d3Smrg case EXA_ENGINEMODE_3D: \ 16277821949aSmrg flush = info->cs && CS_FULL(info->cs); \ 1628de2362d3Smrg break; \ 1629de2362d3Smrg } \ 1630de2362d3Smrg if (flush) { \ 16317821949aSmrg if (info->cs) \ 16327821949aSmrg radeon_cs_flush_indirect(pScrn); \ 16337821949aSmrg else if (info->directRenderingEnabled) \ 16347821949aSmrg RADEONCPFlushIndirect(pScrn, 1); \ 1635de2362d3Smrg } \ 1636de2362d3Smrg if (!info->accel_state->XInited3D) \ 1637de2362d3Smrg RADEONInit3DEngine(pScrn); \ 1638de2362d3Smrg info->accel_state->engineMode = EXA_ENGINEMODE_3D; \ 1639de2362d3Smrg} while (0); 16407821949aSmrg#else 16417821949aSmrg#define RADEON_SWITCH_TO_2D() 16427821949aSmrg#define RADEON_SWITCH_TO_3D() 16437821949aSmrg#endif 1644de2362d3Smrg 16457821949aSmrgstatic __inline__ void RADEON_MARK_SYNC(RADEONInfoPtr info, ScrnInfoPtr pScrn) 16467821949aSmrg{ 16477821949aSmrg#ifdef USE_EXA 16487821949aSmrg if (info->useEXA) 16497821949aSmrg exaMarkSync(pScrn->pScreen); 16507821949aSmrg#endif 16517821949aSmrg#ifdef USE_XAA 16527821949aSmrg if (!info->useEXA) 16537821949aSmrg SET_SYNC_FLAG(info->accel_state->accel); 16547821949aSmrg#endif 16557821949aSmrg} 1656de2362d3Smrg 1657de2362d3Smrgstatic __inline__ void RADEON_SYNC(RADEONInfoPtr info, ScrnInfoPtr pScrn) 1658de2362d3Smrg{ 16597821949aSmrg#ifdef USE_EXA 16607821949aSmrg if (info->useEXA && pScrn->pScreen) 1661de2362d3Smrg exaWaitSync(pScrn->pScreen); 16627821949aSmrg#endif 16637821949aSmrg#ifdef USE_XAA 16647821949aSmrg if (!info->useEXA && info->accel_state->accel) 16657821949aSmrg info->accel_state->accel->Sync(pScrn); 16667821949aSmrg#endif 1667de2362d3Smrg} 1668de2362d3Smrg 16697821949aSmrgstatic __inline__ void radeon_init_timeout(struct timeval *endtime, 16707821949aSmrg unsigned int timeout) 16717821949aSmrg{ 16727821949aSmrg gettimeofday(endtime, NULL); 16737821949aSmrg endtime->tv_usec += timeout; 16747821949aSmrg endtime->tv_sec += endtime->tv_usec / 1000000; 16757821949aSmrg endtime->tv_usec %= 1000000; 16767821949aSmrg} 1677de2362d3Smrg 16787821949aSmrgstatic __inline__ int radeon_timedout(const struct timeval *endtime) 1679de2362d3Smrg{ 16807821949aSmrg struct timeval now; 16817821949aSmrg gettimeofday(&now, NULL); 16827821949aSmrg return now.tv_sec == endtime->tv_sec ? 16837821949aSmrg now.tv_usec > endtime->tv_usec : now.tv_sec > endtime->tv_sec; 1684de2362d3Smrg} 1685de2362d3Smrg 16867821949aSmrgenum { 16877821949aSmrg RADEON_CREATE_PIXMAP_TILING_MACRO = 0x10000000, 16887821949aSmrg RADEON_CREATE_PIXMAP_TILING_MICRO = 0x20000000, 16897821949aSmrg RADEON_CREATE_PIXMAP_DEPTH = 0x40000000, /* for r200 */ 16907821949aSmrg RADEON_CREATE_PIXMAP_SZBUFFER = 0x80000000, /* for eg */ 16917821949aSmrg}; 1692de2362d3Smrg 1693de2362d3Smrg#endif /* _RADEON_H_ */ 1694