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