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