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