radeon.h revision 0d16fef4
1de2362d3Smrg/*
2de2362d3Smrg * Copyright 2000 ATI Technologies Inc., Markham, Ontario, and
3de2362d3Smrg *                VA Linux Systems Inc., Fremont, California.
4de2362d3Smrg *
5de2362d3Smrg * All Rights Reserved.
6de2362d3Smrg *
7de2362d3Smrg * Permission is hereby granted, free of charge, to any person obtaining
8de2362d3Smrg * a copy of this software and associated documentation files (the
9de2362d3Smrg * "Software"), to deal in the Software without restriction, including
10de2362d3Smrg * without limitation on the rights to use, copy, modify, merge,
11de2362d3Smrg * publish, distribute, sublicense, and/or sell copies of the Software,
12de2362d3Smrg * and to permit persons to whom the Software is furnished to do so,
13de2362d3Smrg * subject to the following conditions:
14de2362d3Smrg *
15de2362d3Smrg * The above copyright notice and this permission notice (including the
16de2362d3Smrg * next paragraph) shall be included in all copies or substantial
17de2362d3Smrg * portions of the Software.
18de2362d3Smrg *
19de2362d3Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20de2362d3Smrg * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21de2362d3Smrg * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
22de2362d3Smrg * NON-INFRINGEMENT.  IN NO EVENT SHALL ATI, VA LINUX SYSTEMS AND/OR
23de2362d3Smrg * THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
24de2362d3Smrg * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25de2362d3Smrg * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
26de2362d3Smrg * DEALINGS IN THE SOFTWARE.
27de2362d3Smrg */
28de2362d3Smrg
29de2362d3Smrg/*
30de2362d3Smrg * Authors:
31de2362d3Smrg *   Kevin E. Martin <martin@xfree86.org>
32de2362d3Smrg *   Rickard E. Faith <faith@valinux.com>
33de2362d3Smrg *   Alan Hourihane <alanh@fairlite.demon.co.uk>
34de2362d3Smrg *
35de2362d3Smrg */
36de2362d3Smrg
37de2362d3Smrg#ifndef _RADEON_H_
38de2362d3Smrg#define _RADEON_H_
39de2362d3Smrg
40de2362d3Smrg#include <stdlib.h>		/* For abs() */
41de2362d3Smrg#include <unistd.h>		/* For usleep() */
42de2362d3Smrg#include <sys/time.h>		/* For gettimeofday() */
43de2362d3Smrg
44de2362d3Smrg#include "config.h"
45de2362d3Smrg
46de2362d3Smrg#include "xf86str.h"
47de2362d3Smrg#include "compiler.h"
48de2362d3Smrg
49de2362d3Smrg				/* PCI support */
50de2362d3Smrg#include "xf86Pci.h"
51de2362d3Smrg
52de2362d3Smrg#include "exa.h"
53de2362d3Smrg
54de2362d3Smrg				/* Exa and Cursor Support */
55de2362d3Smrg#include "xf86Cursor.h"
56de2362d3Smrg
57de2362d3Smrg				/* DDC support */
58de2362d3Smrg#include "xf86DDC.h"
59de2362d3Smrg
60de2362d3Smrg				/* Xv support */
61de2362d3Smrg#include "xf86xv.h"
62de2362d3Smrg
63de2362d3Smrg#include "radeon_probe.h"
64de2362d3Smrg
65de2362d3Smrg				/* DRI support */
66de2362d3Smrg#include "xf86drm.h"
67de2362d3Smrg#include "radeon_drm.h"
68de2362d3Smrg
690d16fef4Smrg#ifndef RADEON_GEM_NO_CPU_ACCESS
700d16fef4Smrg#define RADEON_GEM_NO_CPU_ACCESS	(1 << 4)
710d16fef4Smrg#endif
720d16fef4Smrg
73de2362d3Smrg#ifdef DAMAGE
74de2362d3Smrg#include "damage.h"
75de2362d3Smrg#include "globals.h"
76de2362d3Smrg#endif
77de2362d3Smrg
78de2362d3Smrg#include "xf86Crtc.h"
79de2362d3Smrg#include "X11/Xatom.h"
80de2362d3Smrg
81de2362d3Smrg#include "radeon_bo.h"
82de2362d3Smrg#include "radeon_cs.h"
83de2362d3Smrg#include "radeon_dri2.h"
84de2362d3Smrg#include "drmmode_display.h"
85de2362d3Smrg#include "radeon_surface.h"
86de2362d3Smrg
87de2362d3Smrg				/* Render support */
88de2362d3Smrg#ifdef RENDER
89de2362d3Smrg#include "picturestr.h"
90de2362d3Smrg#endif
91de2362d3Smrg
92de2362d3Smrg#include "compat-api.h"
93de2362d3Smrg
94de2362d3Smrg#include "simple_list.h"
95de2362d3Smrg#include "atipcirename.h"
96de2362d3Smrg
970d16fef4Smrgstruct _SyncFence;
980d16fef4Smrg
99de2362d3Smrg#ifndef MAX
100de2362d3Smrg#define MAX(a,b) ((a)>(b)?(a):(b))
101de2362d3Smrg#endif
102de2362d3Smrg#ifndef MIN
103de2362d3Smrg#define MIN(a,b) ((a)>(b)?(b):(a))
104de2362d3Smrg#endif
105de2362d3Smrg
106de2362d3Smrg#if HAVE_BYTESWAP_H
107de2362d3Smrg#include <byteswap.h>
108de2362d3Smrg#elif defined(USE_SYS_ENDIAN_H)
109de2362d3Smrg#include <sys/endian.h>
110de2362d3Smrg#else
111de2362d3Smrg#define bswap_16(value)  \
112de2362d3Smrg        ((((value) & 0xff) << 8) | ((value) >> 8))
113de2362d3Smrg
114de2362d3Smrg#define bswap_32(value) \
115de2362d3Smrg        (((uint32_t)bswap_16((uint16_t)((value) & 0xffff)) << 16) | \
116de2362d3Smrg        (uint32_t)bswap_16((uint16_t)((value) >> 16)))
117de2362d3Smrg
118de2362d3Smrg#define bswap_64(value) \
119de2362d3Smrg        (((uint64_t)bswap_32((uint32_t)((value) & 0xffffffff)) \
120de2362d3Smrg            << 32) | \
121de2362d3Smrg        (uint64_t)bswap_32((uint32_t)((value) >> 32)))
122de2362d3Smrg#endif
123de2362d3Smrg
124de2362d3Smrg#if X_BYTE_ORDER == X_BIG_ENDIAN
125de2362d3Smrg#define le32_to_cpu(x) bswap_32(x)
126de2362d3Smrg#define le16_to_cpu(x) bswap_16(x)
127de2362d3Smrg#define cpu_to_le32(x) bswap_32(x)
128de2362d3Smrg#define cpu_to_le16(x) bswap_16(x)
129de2362d3Smrg#else
130de2362d3Smrg#define le32_to_cpu(x) (x)
131de2362d3Smrg#define le16_to_cpu(x) (x)
132de2362d3Smrg#define cpu_to_le32(x) (x)
133de2362d3Smrg#define cpu_to_le16(x) (x)
134de2362d3Smrg#endif
135de2362d3Smrg
136de2362d3Smrg/* Provide substitutes for gcc's __FUNCTION__ on other compilers */
137de2362d3Smrg#if !defined(__GNUC__) && !defined(__FUNCTION__)
138de2362d3Smrg# define __FUNCTION__ __func__		/* C99 */
139de2362d3Smrg#endif
140de2362d3Smrg
141de2362d3Smrgtypedef enum {
142de2362d3Smrg    OPTION_ACCEL,
143de2362d3Smrg    OPTION_SW_CURSOR,
144de2362d3Smrg    OPTION_PAGE_FLIP,
145de2362d3Smrg    OPTION_EXA_PIXMAPS,
146de2362d3Smrg    OPTION_COLOR_TILING,
147de2362d3Smrg    OPTION_COLOR_TILING_2D,
148de2362d3Smrg#ifdef RENDER
149de2362d3Smrg    OPTION_RENDER_ACCEL,
150de2362d3Smrg    OPTION_SUBPIXEL_ORDER,
151de2362d3Smrg#endif
152de2362d3Smrg    OPTION_ACCELMETHOD,
153de2362d3Smrg    OPTION_EXA_VSYNC,
154de2362d3Smrg    OPTION_ZAPHOD_HEADS,
1550d16fef4Smrg    OPTION_SWAPBUFFERS_WAIT,
1560d16fef4Smrg    OPTION_DELETE_DP12,
1570d16fef4Smrg    OPTION_DRI3,
1580d16fef4Smrg    OPTION_DRI,
1590d16fef4Smrg    OPTION_SHADOW_PRIMARY,
1600d16fef4Smrg    OPTION_TEAR_FREE,
161de2362d3Smrg} RADEONOpts;
162de2362d3Smrg
163de2362d3Smrg
1640d16fef4Smrg#if XF86_CRTC_VERSION >= 5
1650d16fef4Smrg#define RADEON_PIXMAP_SHARING 1
1660d16fef4Smrg#endif
1670d16fef4Smrg
168de2362d3Smrg#define RADEON_VSYNC_TIMEOUT	20000 /* Maximum wait for VSYNC (in usecs) */
169de2362d3Smrg
170de2362d3Smrg/* Buffer are aligned on 4096 byte boundaries */
171de2362d3Smrg#define RADEON_GPU_PAGE_SIZE 4096
172de2362d3Smrg#define RADEON_BUFFER_ALIGN (RADEON_GPU_PAGE_SIZE - 1)
173de2362d3Smrg
174de2362d3Smrg
175de2362d3Smrg#define xFixedToFloat(f) (((float) (f)) / 65536)
176de2362d3Smrg
177de2362d3Smrg#define RADEON_LOGLEVEL_DEBUG 4
178de2362d3Smrg
179de2362d3Smrg/* for Xv, outputs */
180de2362d3Smrg#define MAKE_ATOM(a) MakeAtom(a, sizeof(a) - 1, TRUE)
181de2362d3Smrg
182de2362d3Smrg/* Other macros */
183de2362d3Smrg#define RADEON_ARRAY_SIZE(x)  (sizeof(x)/sizeof(x[0]))
184de2362d3Smrg#define RADEON_ALIGN(x,bytes) (((x) + ((bytes) - 1)) & ~((bytes) - 1))
185de2362d3Smrg#define RADEONPTR(pScrn)      ((RADEONInfoPtr)(pScrn)->driverPrivate)
186de2362d3Smrg
187de2362d3Smrg#define IS_RV100_VARIANT ((info->ChipFamily == CHIP_FAMILY_RV100)  ||  \
188de2362d3Smrg        (info->ChipFamily == CHIP_FAMILY_RV200)  ||  \
189de2362d3Smrg        (info->ChipFamily == CHIP_FAMILY_RS100)  ||  \
190de2362d3Smrg        (info->ChipFamily == CHIP_FAMILY_RS200)  ||  \
191de2362d3Smrg        (info->ChipFamily == CHIP_FAMILY_RV250)  ||  \
192de2362d3Smrg        (info->ChipFamily == CHIP_FAMILY_RV280)  ||  \
193de2362d3Smrg        (info->ChipFamily == CHIP_FAMILY_RS300))
194de2362d3Smrg
195de2362d3Smrg
196de2362d3Smrg#define IS_R300_VARIANT ((info->ChipFamily == CHIP_FAMILY_R300)  ||  \
197de2362d3Smrg        (info->ChipFamily == CHIP_FAMILY_RV350) ||  \
198de2362d3Smrg        (info->ChipFamily == CHIP_FAMILY_R350)  ||  \
199de2362d3Smrg        (info->ChipFamily == CHIP_FAMILY_RV380) ||  \
200de2362d3Smrg        (info->ChipFamily == CHIP_FAMILY_R420)  ||  \
201de2362d3Smrg        (info->ChipFamily == CHIP_FAMILY_RV410) ||  \
202de2362d3Smrg        (info->ChipFamily == CHIP_FAMILY_RS400) ||  \
203de2362d3Smrg        (info->ChipFamily == CHIP_FAMILY_RS480))
204de2362d3Smrg
205de2362d3Smrg#define IS_AVIVO_VARIANT ((info->ChipFamily >= CHIP_FAMILY_RV515))
206de2362d3Smrg
207de2362d3Smrg#define IS_DCE3_VARIANT ((info->ChipFamily >= CHIP_FAMILY_RV620))
208de2362d3Smrg
209de2362d3Smrg#define IS_DCE32_VARIANT ((info->ChipFamily >= CHIP_FAMILY_RV730))
210de2362d3Smrg
211de2362d3Smrg#define IS_DCE4_VARIANT ((info->ChipFamily >= CHIP_FAMILY_CEDAR))
212de2362d3Smrg
213de2362d3Smrg#define IS_DCE41_VARIANT ((info->ChipFamily >= CHIP_FAMILY_PALM))
214de2362d3Smrg
215de2362d3Smrg#define IS_DCE5_VARIANT ((info->ChipFamily >= CHIP_FAMILY_BARTS))
216de2362d3Smrg
217de2362d3Smrg#define IS_EVERGREEN_3D (info->ChipFamily >= CHIP_FAMILY_CEDAR)
218de2362d3Smrg
219de2362d3Smrg#define IS_R600_3D (info->ChipFamily >= CHIP_FAMILY_R600)
220de2362d3Smrg
221de2362d3Smrg#define IS_R500_3D ((info->ChipFamily == CHIP_FAMILY_RV515)  ||  \
222de2362d3Smrg	(info->ChipFamily == CHIP_FAMILY_R520)   ||  \
223de2362d3Smrg	(info->ChipFamily == CHIP_FAMILY_RV530)  ||  \
224de2362d3Smrg	(info->ChipFamily == CHIP_FAMILY_R580)   ||  \
225de2362d3Smrg	(info->ChipFamily == CHIP_FAMILY_RV560)  ||  \
226de2362d3Smrg	(info->ChipFamily == CHIP_FAMILY_RV570))
227de2362d3Smrg
228de2362d3Smrg/* RS6xx, RS740 are technically R4xx as well, but the
229de2362d3Smrg * clipping hardware seems to follow the r3xx restrictions
230de2362d3Smrg */
231de2362d3Smrg#define IS_R400_3D ((info->ChipFamily == CHIP_FAMILY_R420)  ||  \
232de2362d3Smrg	(info->ChipFamily == CHIP_FAMILY_RV410))
233de2362d3Smrg
234de2362d3Smrg#define IS_R300_3D ((info->ChipFamily == CHIP_FAMILY_R300)  ||  \
235de2362d3Smrg	(info->ChipFamily == CHIP_FAMILY_RV350) ||  \
236de2362d3Smrg	(info->ChipFamily == CHIP_FAMILY_R350)  ||  \
237de2362d3Smrg	(info->ChipFamily == CHIP_FAMILY_RV380) ||  \
238de2362d3Smrg	(info->ChipFamily == CHIP_FAMILY_R420)  ||  \
239de2362d3Smrg	(info->ChipFamily == CHIP_FAMILY_RV410) ||  \
240de2362d3Smrg	(info->ChipFamily == CHIP_FAMILY_RS690) ||  \
241de2362d3Smrg	(info->ChipFamily == CHIP_FAMILY_RS600) ||  \
242de2362d3Smrg	(info->ChipFamily == CHIP_FAMILY_RS740) ||  \
243de2362d3Smrg	(info->ChipFamily == CHIP_FAMILY_RS400) ||  \
244de2362d3Smrg	(info->ChipFamily == CHIP_FAMILY_RS480))
245de2362d3Smrg
246de2362d3Smrg#define IS_R200_3D ((info->ChipFamily == CHIP_FAMILY_RV250) || \
247de2362d3Smrg	(info->ChipFamily == CHIP_FAMILY_RV280) || \
248de2362d3Smrg	(info->ChipFamily == CHIP_FAMILY_RS300) || \
249de2362d3Smrg	(info->ChipFamily == CHIP_FAMILY_R200))
250de2362d3Smrg
251de2362d3Smrg#define CURSOR_WIDTH	64
252de2362d3Smrg#define CURSOR_HEIGHT	64
253de2362d3Smrg
254de2362d3Smrg#define CURSOR_WIDTH_CIK	128
255de2362d3Smrg#define CURSOR_HEIGHT_CIK	128
256de2362d3Smrg
2570d16fef4Smrg
2580d16fef4Smrg#ifdef USE_GLAMOR
2590d16fef4Smrg
2600d16fef4Smrgstruct radeon_pixmap {
2610d16fef4Smrg	struct radeon_surface surface;
2620d16fef4Smrg
2630d16fef4Smrg	uint_fast32_t gpu_read;
2640d16fef4Smrg	uint_fast32_t gpu_write;
2650d16fef4Smrg
2660d16fef4Smrg	struct radeon_bo *bo;
2670d16fef4Smrg
2680d16fef4Smrg	uint32_t tiling_flags;
2690d16fef4Smrg
2700d16fef4Smrg	/* GEM handle for glamor-only pixmaps shared via DRI3 */
2710d16fef4Smrg	Bool handle_valid;
2720d16fef4Smrg	uint32_t handle;
2730d16fef4Smrg};
2740d16fef4Smrg
2750d16fef4Smrgextern DevPrivateKeyRec glamor_pixmap_index;
2760d16fef4Smrg
2770d16fef4Smrgstatic inline struct radeon_pixmap *radeon_get_pixmap_private(PixmapPtr pixmap)
2780d16fef4Smrg{
2790d16fef4Smrg	return dixGetPrivate(&pixmap->devPrivates, &glamor_pixmap_index);
2800d16fef4Smrg}
2810d16fef4Smrg
2820d16fef4Smrgstatic inline void radeon_set_pixmap_private(PixmapPtr pixmap, struct radeon_pixmap *priv)
2830d16fef4Smrg{
2840d16fef4Smrg	dixSetPrivate(&pixmap->devPrivates, &glamor_pixmap_index, priv);
2850d16fef4Smrg}
2860d16fef4Smrg
2870d16fef4Smrg#endif /* USE_GLAMOR */
2880d16fef4Smrg
2890d16fef4Smrg
290de2362d3Smrgstruct radeon_exa_pixmap_priv {
291de2362d3Smrg    struct radeon_bo *bo;
292de2362d3Smrg    uint32_t tiling_flags;
293de2362d3Smrg    struct radeon_surface surface;
294de2362d3Smrg    Bool bo_mapped;
295de2362d3Smrg    Bool shared;
296de2362d3Smrg};
297de2362d3Smrg
298de2362d3Smrg#define RADEON_2D_EXA_COPY 1
299de2362d3Smrg#define RADEON_2D_EXA_SOLID 2
300de2362d3Smrg
301de2362d3Smrgstruct radeon_2d_state {
302de2362d3Smrg    int op; //
303de2362d3Smrg    uint32_t dst_pitch_offset;
304de2362d3Smrg    uint32_t src_pitch_offset;
305de2362d3Smrg    uint32_t dp_gui_master_cntl;
306de2362d3Smrg    uint32_t dp_cntl;
307de2362d3Smrg    uint32_t dp_write_mask;
308de2362d3Smrg    uint32_t dp_brush_frgd_clr;
309de2362d3Smrg    uint32_t dp_brush_bkgd_clr;
310de2362d3Smrg    uint32_t dp_src_frgd_clr;
311de2362d3Smrg    uint32_t dp_src_bkgd_clr;
312de2362d3Smrg    uint32_t default_sc_bottom_right;
313de2362d3Smrg    uint32_t dst_domain;
314de2362d3Smrg    struct radeon_bo *dst_bo;
315de2362d3Smrg    struct radeon_bo *src_bo;
316de2362d3Smrg};
317de2362d3Smrg
318de2362d3Smrg#define DMA_BO_FREE_TIME 1000
319de2362d3Smrg
320de2362d3Smrgstruct radeon_dma_bo {
321de2362d3Smrg    struct radeon_dma_bo *next, *prev;
322de2362d3Smrg    struct radeon_bo  *bo;
323de2362d3Smrg    int expire_counter;
324de2362d3Smrg};
325de2362d3Smrg
326de2362d3Smrgstruct r600_accel_object {
327de2362d3Smrg    uint32_t pitch;
328de2362d3Smrg    uint32_t width;
329de2362d3Smrg    uint32_t height;
330de2362d3Smrg    int bpp;
331de2362d3Smrg    uint32_t domain;
332de2362d3Smrg    struct radeon_bo *bo;
333de2362d3Smrg    uint32_t tiling_flags;
334de2362d3Smrg    struct radeon_surface *surface;
335de2362d3Smrg};
336de2362d3Smrg
337de2362d3Smrgstruct radeon_vbo_object {
338de2362d3Smrg    int               vb_offset;
339de2362d3Smrg    int               vb_total;
340de2362d3Smrg    uint32_t          vb_size;
341de2362d3Smrg    uint32_t          vb_op_vert_size;
342de2362d3Smrg    int32_t           vb_start_op;
343de2362d3Smrg    struct radeon_bo *vb_bo;
344de2362d3Smrg    unsigned          verts_per_op;
345de2362d3Smrg};
346de2362d3Smrg
347de2362d3Smrgstruct radeon_accel_state {
348de2362d3Smrg
349de2362d3Smrg				/* Saved values for ScreenToScreenCopy */
350de2362d3Smrg    int               xdir;
351de2362d3Smrg    int               ydir;
352de2362d3Smrg
353de2362d3Smrg    /* render accel */
354de2362d3Smrg    unsigned short    texW[2];
355de2362d3Smrg    unsigned short    texH[2];
356de2362d3Smrg    Bool              XInited3D; /* X itself has the 3D context */
357de2362d3Smrg    int               num_gb_pipes;
358de2362d3Smrg    Bool              has_tcl;
359de2362d3Smrg    Bool              allowHWDFS;
360de2362d3Smrg
361de2362d3Smrg    /* EXA */
362de2362d3Smrg    ExaDriverPtr      exa;
363de2362d3Smrg    int               exaSyncMarker;
364de2362d3Smrg    int               exaMarkerSynced;
365de2362d3Smrg    int               engineMode;
366de2362d3Smrg#define EXA_ENGINEMODE_UNKNOWN 0
367de2362d3Smrg#define EXA_ENGINEMODE_2D      1
368de2362d3Smrg#define EXA_ENGINEMODE_3D      2
369de2362d3Smrg
370de2362d3Smrg    int               composite_op;
371de2362d3Smrg    PicturePtr        dst_pic;
372de2362d3Smrg    PicturePtr        msk_pic;
373de2362d3Smrg    PicturePtr        src_pic;
374de2362d3Smrg    PixmapPtr         dst_pix;
375de2362d3Smrg    PixmapPtr         msk_pix;
376de2362d3Smrg    PixmapPtr         src_pix;
377de2362d3Smrg    Bool              is_transform[2];
378de2362d3Smrg    PictTransform     *transform[2];
379de2362d3Smrg    /* Whether we are tiling horizontally and vertically */
380de2362d3Smrg    Bool              need_src_tile_x;
381de2362d3Smrg    Bool              need_src_tile_y;
382de2362d3Smrg    /* Size of tiles ... set to 65536x65536 if not tiling in that direction */
383de2362d3Smrg    Bool              src_tile_width;
384de2362d3Smrg    Bool              src_tile_height;
385de2362d3Smrg    uint32_t          *draw_header;
386de2362d3Smrg    unsigned          vtx_count;
387de2362d3Smrg    unsigned          num_vtx;
388de2362d3Smrg    Bool              vsync;
389de2362d3Smrg
390de2362d3Smrg    struct radeon_vbo_object vbo;
391de2362d3Smrg    struct radeon_vbo_object cbuf;
392de2362d3Smrg
393de2362d3Smrg    /* where to discard IB from if we cancel operation */
394de2362d3Smrg    uint32_t          ib_reset_op;
395de2362d3Smrg    struct radeon_dma_bo bo_free;
396de2362d3Smrg    struct radeon_dma_bo bo_wait;
397de2362d3Smrg    struct radeon_dma_bo bo_reserved;
398de2362d3Smrg    Bool use_vbos;
399de2362d3Smrg    void (*finish_op)(ScrnInfoPtr, int);
400de2362d3Smrg    // shader storage
401de2362d3Smrg    struct radeon_bo  *shaders_bo;
402de2362d3Smrg    uint32_t          solid_vs_offset;
403de2362d3Smrg    uint32_t          solid_ps_offset;
404de2362d3Smrg    uint32_t          copy_vs_offset;
405de2362d3Smrg    uint32_t          copy_ps_offset;
406de2362d3Smrg    uint32_t          comp_vs_offset;
407de2362d3Smrg    uint32_t          comp_ps_offset;
408de2362d3Smrg    uint32_t          xv_vs_offset;
409de2362d3Smrg    uint32_t          xv_ps_offset;
410de2362d3Smrg    // shader consts
411de2362d3Smrg    uint32_t          solid_vs_const_offset;
412de2362d3Smrg    uint32_t          solid_ps_const_offset;
413de2362d3Smrg    uint32_t          copy_vs_const_offset;
414de2362d3Smrg    uint32_t          copy_ps_const_offset;
415de2362d3Smrg    uint32_t          comp_vs_const_offset;
416de2362d3Smrg    uint32_t          comp_ps_const_offset;
417de2362d3Smrg    uint32_t          comp_mask_ps_const_offset;
418de2362d3Smrg    uint32_t          xv_vs_const_offset;
419de2362d3Smrg    uint32_t          xv_ps_const_offset;
420de2362d3Smrg
421de2362d3Smrg    //size/addr stuff
422de2362d3Smrg    struct r600_accel_object src_obj[2];
423de2362d3Smrg    struct r600_accel_object dst_obj;
424de2362d3Smrg    uint32_t          src_size[2];
425de2362d3Smrg    uint32_t          dst_size;
426de2362d3Smrg
427de2362d3Smrg    uint32_t          vs_size;
428de2362d3Smrg    uint64_t          vs_mc_addr;
429de2362d3Smrg    uint32_t          ps_size;
430de2362d3Smrg    uint64_t          ps_mc_addr;
431de2362d3Smrg
432de2362d3Smrg    // solid/copy
433de2362d3Smrg    void *copy_area;
434de2362d3Smrg    struct radeon_bo  *copy_area_bo;
435de2362d3Smrg    Bool              same_surface;
436de2362d3Smrg    int               rop;
437de2362d3Smrg    uint32_t          planemask;
438de2362d3Smrg    uint32_t          fg;
439de2362d3Smrg
440de2362d3Smrg    // composite
441de2362d3Smrg    Bool              component_alpha;
442de2362d3Smrg    Bool              src_alpha;
443de2362d3Smrg    // vline
444de2362d3Smrg    xf86CrtcPtr       vline_crtc;
445de2362d3Smrg    int               vline_y1;
446de2362d3Smrg    int               vline_y2;
447de2362d3Smrg
448de2362d3Smrg    Bool              force;
449de2362d3Smrg};
450de2362d3Smrg
451de2362d3Smrgtypedef struct {
452de2362d3Smrg    EntityInfoPtr     pEnt;
453de2362d3Smrg    pciVideoPtr       PciInfo;
454de2362d3Smrg    int               Chipset;
455de2362d3Smrg    RADEONChipFamily  ChipFamily;
456de2362d3Smrg
457de2362d3Smrg    Bool              (*CloseScreen)(CLOSE_SCREEN_ARGS_DECL);
458de2362d3Smrg
459de2362d3Smrg    void              (*BlockHandler)(BLOCKHANDLER_ARGS_DECL);
460de2362d3Smrg
4610d16fef4Smrg    void              (*CreateFence) (ScreenPtr pScreen, struct _SyncFence *pFence,
4620d16fef4Smrg				      Bool initially_triggered);
4630d16fef4Smrg
464de2362d3Smrg    int               pix24bpp;         /* Depth of pixmap for 24bpp fb      */
465de2362d3Smrg    Bool              dac6bits;         /* Use 6 bit DAC?                    */
466de2362d3Smrg
467de2362d3Smrg    int               pixel_bytes;
468de2362d3Smrg
469de2362d3Smrg    Bool              directRenderingEnabled;
470de2362d3Smrg    struct radeon_dri2  dri2;
471de2362d3Smrg
472de2362d3Smrg    /* accel */
473de2362d3Smrg    Bool              RenderAccel; /* Render */
474de2362d3Smrg    Bool              allowColorTiling;
475de2362d3Smrg    Bool              allowColorTiling2D;
4760d16fef4Smrg    uint_fast32_t     gpu_flushed;
4770d16fef4Smrg    uint_fast32_t     gpu_synced;
478de2362d3Smrg    struct radeon_accel_state *accel_state;
4790d16fef4Smrg    PixmapPtr         fbcon_pixmap;
480de2362d3Smrg    Bool              accelOn;
481de2362d3Smrg    Bool              use_glamor;
4820d16fef4Smrg    Bool              shadow_primary;
4830d16fef4Smrg    Bool              tear_free;
484de2362d3Smrg    Bool	      exa_pixmaps;
485de2362d3Smrg    Bool              exa_force_create;
486de2362d3Smrg    XF86ModReqInfo    exaReq;
487de2362d3Smrg    Bool              is_fast_fb; /* use direct mapping for fast fb access */
488de2362d3Smrg
489de2362d3Smrg    unsigned int xv_max_width;
490de2362d3Smrg    unsigned int xv_max_height;
491de2362d3Smrg
492de2362d3Smrg    /* general */
493de2362d3Smrg    OptionInfoPtr     Options;
494de2362d3Smrg
495de2362d3Smrg    DisplayModePtr currentMode;
496de2362d3Smrg
497de2362d3Smrg    CreateScreenResourcesProcPtr CreateScreenResources;
4980d16fef4Smrg#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) >= 10
4990d16fef4Smrg    CreateWindowProcPtr CreateWindow;
5000d16fef4Smrg#endif
501de2362d3Smrg
502de2362d3Smrg    Bool              IsSecondary;
503de2362d3Smrg
504de2362d3Smrg    Bool              r600_shadow_fb;
505de2362d3Smrg    void *fb_shadow;
506de2362d3Smrg
507de2362d3Smrg    void (*reemit_current2d)(ScrnInfoPtr pScrn, int op); // emit the current 2D state into the IB
508de2362d3Smrg    struct radeon_2d_state state_2d;
509de2362d3Smrg    struct radeon_bo *front_bo;
510de2362d3Smrg    struct radeon_bo_manager *bufmgr;
511de2362d3Smrg    struct radeon_cs_manager *csm;
512de2362d3Smrg    struct radeon_cs *cs;
513de2362d3Smrg
514de2362d3Smrg    struct radeon_bo *cursor_bo[32];
515de2362d3Smrg    uint64_t vram_size;
516de2362d3Smrg    uint64_t gart_size;
517de2362d3Smrg    drmmode_rec drmmode;
518de2362d3Smrg    Bool drmmode_inited;
519de2362d3Smrg    /* r6xx+ tile config */
520de2362d3Smrg    Bool have_tiling_info;
521de2362d3Smrg    uint32_t tile_config;
522de2362d3Smrg    int group_bytes;
523de2362d3Smrg    int num_channels;
524de2362d3Smrg    int num_banks;
525de2362d3Smrg    int r7xx_bank_op;
526de2362d3Smrg    struct radeon_surface_manager *surf_man;
527de2362d3Smrg    struct radeon_surface front_surface;
528de2362d3Smrg
529de2362d3Smrg    /* Xv bicubic filtering */
530de2362d3Smrg    struct radeon_bo *bicubic_bo;
531de2362d3Smrg
532de2362d3Smrg    /* kms pageflipping */
533de2362d3Smrg    Bool allowPageFlip;
534de2362d3Smrg
535de2362d3Smrg    /* Perform vsync'ed SwapBuffers? */
536de2362d3Smrg    Bool swapBuffersWait;
537de2362d3Smrg
538de2362d3Smrg    /* cursor size */
539de2362d3Smrg    int cursor_w;
540de2362d3Smrg    int cursor_h;
5410d16fef4Smrg
5420d16fef4Smrg    /* If bit n of this field is set, xf86_config->crtc[n] currently can't
5430d16fef4Smrg     * use the HW cursor
5440d16fef4Smrg     */
5450d16fef4Smrg    unsigned hwcursor_disabled;
5460d16fef4Smrg
5470d16fef4Smrg#ifdef USE_GLAMOR
5480d16fef4Smrg    struct {
5490d16fef4Smrg	CreateGCProcPtr SavedCreateGC;
5500d16fef4Smrg	RegionPtr (*SavedCopyArea)(DrawablePtr, DrawablePtr, GCPtr, int, int,
5510d16fef4Smrg				   int, int, int, int);
5520d16fef4Smrg	void (*SavedPolyFillRect)(DrawablePtr, GCPtr, int, xRectangle*);
5530d16fef4Smrg	CloseScreenProcPtr SavedCloseScreen;
5540d16fef4Smrg	GetImageProcPtr SavedGetImage;
5550d16fef4Smrg	GetSpansProcPtr SavedGetSpans;
5560d16fef4Smrg	CreatePixmapProcPtr SavedCreatePixmap;
5570d16fef4Smrg	DestroyPixmapProcPtr SavedDestroyPixmap;
5580d16fef4Smrg	CopyWindowProcPtr SavedCopyWindow;
5590d16fef4Smrg	ChangeWindowAttributesProcPtr SavedChangeWindowAttributes;
5600d16fef4Smrg	BitmapToRegionProcPtr SavedBitmapToRegion;
5610d16fef4Smrg#ifdef RENDER
5620d16fef4Smrg	CompositeProcPtr SavedComposite;
5630d16fef4Smrg	TrianglesProcPtr SavedTriangles;
5640d16fef4Smrg	GlyphsProcPtr SavedGlyphs;
5650d16fef4Smrg	TrapezoidsProcPtr SavedTrapezoids;
5660d16fef4Smrg	AddTrapsProcPtr SavedAddTraps;
5670d16fef4Smrg	UnrealizeGlyphProcPtr SavedUnrealizeGlyph;
5680d16fef4Smrg#endif
5690d16fef4Smrg#ifdef RADEON_PIXMAP_SHARING
5700d16fef4Smrg	SharePixmapBackingProcPtr SavedSharePixmapBacking;
5710d16fef4Smrg	SetSharedPixmapBackingProcPtr SavedSetSharedPixmapBacking;
5720d16fef4Smrg#endif
5730d16fef4Smrg    } glamor;
5740d16fef4Smrg#endif /* USE_GLAMOR */
575de2362d3Smrg} RADEONInfoRec, *RADEONInfoPtr;
576de2362d3Smrg
577de2362d3Smrg/* radeon_accel.c */
578de2362d3Smrgextern Bool RADEONAccelInit(ScreenPtr pScreen);
579de2362d3Smrgextern void RADEONEngineInit(ScrnInfoPtr pScrn);
580de2362d3Smrgextern void  RADEONCopySwap(uint8_t *dst, uint8_t *src, unsigned int size, int swap);
581de2362d3Smrgextern void RADEONInit3DEngine(ScrnInfoPtr pScrn);
582de2362d3Smrgextern int radeon_cs_space_remaining(ScrnInfoPtr pScrn);
583de2362d3Smrg
584de2362d3Smrg/* radeon_commonfuncs.c */
585de2362d3Smrgextern void RADEONWaitForVLine(ScrnInfoPtr pScrn, PixmapPtr pPix,
586de2362d3Smrg			       xf86CrtcPtr crtc, int start, int stop);
587de2362d3Smrg
588de2362d3Smrg
589de2362d3Smrg/* radeon_exa.c */
590de2362d3Smrgextern unsigned eg_tile_split(unsigned tile_split);
591de2362d3Smrgextern Bool radeon_transform_is_affine_or_scaled(PictTransformPtr t);
592de2362d3Smrg
593de2362d3Smrg/* radeon_exa_funcs.c */
594de2362d3Smrgextern Bool RADEONDrawInit(ScreenPtr pScreen);
595de2362d3Smrgextern Bool R600DrawInit(ScreenPtr pScreen);
596de2362d3Smrgextern Bool R600LoadShaders(ScrnInfoPtr pScrn);
597de2362d3Smrgextern Bool EVERGREENDrawInit(ScreenPtr pScreen);
598de2362d3Smrg
599de2362d3Smrg/* radeon_exa.c */
600de2362d3Smrgextern Bool RADEONGetDatatypeBpp(int bpp, uint32_t *type);
601de2362d3Smrgextern Bool RADEONGetPixmapOffsetPitch(PixmapPtr pPix,
602de2362d3Smrg				       uint32_t *pitch_offset);
603de2362d3Smrg
6040d16fef4Smrg/* radeon_dri3.c */
6050d16fef4SmrgBool radeon_dri3_screen_init(ScreenPtr screen);
6060d16fef4Smrg
6070d16fef4Smrg/* radeon_kms.c */
6080d16fef4Smrgvoid radeon_scanout_update_handler(xf86CrtcPtr crtc, uint32_t frame,
6090d16fef4Smrg				   uint64_t usec, void *event_data);
6100d16fef4Smrg
6110d16fef4Smrg/* radeon_present.c */
6120d16fef4SmrgBool radeon_present_screen_init(ScreenPtr screen);
6130d16fef4Smrg
6140d16fef4Smrg/* radeon_sync.c */
6150d16fef4Smrgextern Bool radeon_sync_init(ScreenPtr screen);
6160d16fef4Smrgextern void radeon_sync_close(ScreenPtr screen);
6170d16fef4Smrg
618de2362d3Smrg/* radeon_video.c */
619de2362d3Smrgextern void RADEONInitVideo(ScreenPtr pScreen);
620de2362d3Smrgextern void RADEONResetVideo(ScrnInfoPtr pScrn);
621de2362d3Smrgextern Bool radeon_load_bicubic_texture(ScrnInfoPtr pScrn);
622de2362d3Smrgextern xf86CrtcPtr radeon_pick_best_crtc(ScrnInfoPtr pScrn,
623de2362d3Smrg					 Bool consider_disabled,
624de2362d3Smrg					 int x1, int x2, int y1, int y2);
625de2362d3Smrg
626de2362d3Smrgextern void radeon_cs_flush_indirect(ScrnInfoPtr pScrn);
627de2362d3Smrgextern void radeon_ddx_cs_start(ScrnInfoPtr pScrn,
628de2362d3Smrg				int num, const char *file,
629de2362d3Smrg				const char *func, int line);
630de2362d3Smrgvoid radeon_kms_update_vram_limit(ScrnInfoPtr pScrn, uint32_t new_fb_size);
631de2362d3Smrgextern RADEONEntPtr RADEONEntPriv(ScrnInfoPtr pScrn);
632de2362d3Smrg
633de2362d3SmrgdrmVBlankSeqType radeon_populate_vbl_request_type(xf86CrtcPtr crtc);
634de2362d3Smrg
635de2362d3Smrgstatic inline struct radeon_surface *radeon_get_pixmap_surface(PixmapPtr pPix)
636de2362d3Smrg{
637de2362d3Smrg#ifdef USE_GLAMOR
638de2362d3Smrg    RADEONInfoPtr info = RADEONPTR(xf86ScreenToScrn(pPix->drawable.pScreen));
639de2362d3Smrg
640de2362d3Smrg    if (info->use_glamor) {
641de2362d3Smrg	struct radeon_pixmap *priv;
642de2362d3Smrg	priv = radeon_get_pixmap_private(pPix);
643de2362d3Smrg	return priv ? &priv->surface : NULL;
644de2362d3Smrg    } else
645de2362d3Smrg#endif
646de2362d3Smrg    {
647de2362d3Smrg	struct radeon_exa_pixmap_priv *driver_priv;
648de2362d3Smrg	driver_priv = exaGetPixmapDriverPrivate(pPix);
649de2362d3Smrg	return &driver_priv->surface;
650de2362d3Smrg    }
651de2362d3Smrg
652de2362d3Smrg    return NULL;
653de2362d3Smrg}
654de2362d3Smrg
655de2362d3Smrguint32_t radeon_get_pixmap_tiling(PixmapPtr pPix);
656de2362d3Smrg
657de2362d3Smrgstatic inline void radeon_set_pixmap_bo(PixmapPtr pPix, struct radeon_bo *bo)
658de2362d3Smrg{
6590d16fef4Smrg    ScreenPtr pScreen = pPix->drawable.pScreen;
6600d16fef4Smrg
661de2362d3Smrg#ifdef USE_GLAMOR
662de2362d3Smrg    RADEONInfoPtr info = RADEONPTR(xf86ScreenToScrn(pPix->drawable.pScreen));
663de2362d3Smrg
664de2362d3Smrg    if (info->use_glamor) {
665de2362d3Smrg	struct radeon_pixmap *priv;
666de2362d3Smrg
667de2362d3Smrg	priv = radeon_get_pixmap_private(pPix);
668de2362d3Smrg	if (priv == NULL && bo == NULL)
669de2362d3Smrg	    return;
670de2362d3Smrg
671de2362d3Smrg	if (priv) {
672de2362d3Smrg	    if (priv->bo == bo)
673de2362d3Smrg		return;
674de2362d3Smrg
675de2362d3Smrg	    if (priv->bo)
676de2362d3Smrg		radeon_bo_unref(priv->bo);
677de2362d3Smrg
678de2362d3Smrg	    if (!bo) {
679de2362d3Smrg		free(priv);
680de2362d3Smrg		priv = NULL;
681de2362d3Smrg	    }
682de2362d3Smrg	}
683de2362d3Smrg
684de2362d3Smrg	if (bo) {
685de2362d3Smrg	    uint32_t pitch;
686de2362d3Smrg
687de2362d3Smrg	    if (!priv) {
688de2362d3Smrg		priv = calloc(1, sizeof (struct radeon_pixmap));
689de2362d3Smrg		if (!priv)
690de2362d3Smrg		    goto out;
691de2362d3Smrg	    }
692de2362d3Smrg
693de2362d3Smrg	    radeon_bo_ref(bo);
694de2362d3Smrg	    priv->bo = bo;
695de2362d3Smrg
6960d16fef4Smrg	    if (radeon_bo_get_tiling(bo, &priv->tiling_flags, &pitch) == 0 &&
6970d16fef4Smrg		pitch != pPix->devKind)
6980d16fef4Smrg		pScreen->ModifyPixmapHeader(pPix, -1, -1, -1, -1, pitch, NULL);
699de2362d3Smrg	}
700de2362d3Smrgout:
701de2362d3Smrg	radeon_set_pixmap_private(pPix, priv);
702de2362d3Smrg    } else
703de2362d3Smrg#endif /* USE_GLAMOR */
704de2362d3Smrg    {
705de2362d3Smrg	struct radeon_exa_pixmap_priv *driver_priv;
706de2362d3Smrg
707de2362d3Smrg	driver_priv = exaGetPixmapDriverPrivate(pPix);
708de2362d3Smrg	if (driver_priv) {
709de2362d3Smrg	    uint32_t pitch;
710de2362d3Smrg
711de2362d3Smrg	    if (driver_priv->bo)
712de2362d3Smrg		radeon_bo_unref(driver_priv->bo);
713de2362d3Smrg
714de2362d3Smrg	    radeon_bo_ref(bo);
715de2362d3Smrg	    driver_priv->bo = bo;
716de2362d3Smrg
7170d16fef4Smrg	    if (radeon_bo_get_tiling(bo, &driver_priv->tiling_flags, &pitch) == 0 &&
7180d16fef4Smrg		pitch != pPix->devKind)
7190d16fef4Smrg		pScreen->ModifyPixmapHeader(pPix, -1, -1, -1, -1, pitch, NULL);
720de2362d3Smrg	}
721de2362d3Smrg    }
722de2362d3Smrg}
723de2362d3Smrg
724de2362d3Smrgstatic inline struct radeon_bo *radeon_get_pixmap_bo(PixmapPtr pPix)
725de2362d3Smrg{
726de2362d3Smrg#ifdef USE_GLAMOR
727de2362d3Smrg    RADEONInfoPtr info = RADEONPTR(xf86ScreenToScrn(pPix->drawable.pScreen));
728de2362d3Smrg
729de2362d3Smrg    if (info->use_glamor) {
730de2362d3Smrg	struct radeon_pixmap *priv;
731de2362d3Smrg	priv = radeon_get_pixmap_private(pPix);
732de2362d3Smrg	return priv ? priv->bo : NULL;
733de2362d3Smrg    } else
734de2362d3Smrg#endif
735de2362d3Smrg    {
736de2362d3Smrg	struct radeon_exa_pixmap_priv *driver_priv;
737de2362d3Smrg	driver_priv = exaGetPixmapDriverPrivate(pPix);
7380d16fef4Smrg	return driver_priv ? driver_priv->bo : NULL;
739de2362d3Smrg    }
740de2362d3Smrg
741de2362d3Smrg    return NULL;
742de2362d3Smrg}
743de2362d3Smrg
744de2362d3Smrgstatic inline Bool radeon_get_pixmap_shared(PixmapPtr pPix)
745de2362d3Smrg{
746de2362d3Smrg#ifdef USE_GLAMOR
747de2362d3Smrg    RADEONInfoPtr info = RADEONPTR(xf86ScreenToScrn(pPix->drawable.pScreen));
748de2362d3Smrg
749de2362d3Smrg    if (info->use_glamor) {
750de2362d3Smrg        ErrorF("glamor sharing todo\n");
751de2362d3Smrg	return FALSE;
752de2362d3Smrg    } else
753de2362d3Smrg#endif
754de2362d3Smrg    {
755de2362d3Smrg	struct radeon_exa_pixmap_priv *driver_priv;
756de2362d3Smrg	driver_priv = exaGetPixmapDriverPrivate(pPix);
757de2362d3Smrg	return driver_priv->shared;
758de2362d3Smrg    }
759de2362d3Smrg    return FALSE;
760de2362d3Smrg}
761de2362d3Smrg
762de2362d3Smrg#define CP_PACKET0(reg, n)						\
763de2362d3Smrg	(RADEON_CP_PACKET0 | ((n) << 16) | ((reg) >> 2))
764de2362d3Smrg#define CP_PACKET1(reg0, reg1)						\
765de2362d3Smrg	(RADEON_CP_PACKET1 | (((reg1) >> 2) << 11) | ((reg0) >> 2))
766de2362d3Smrg#define CP_PACKET2()							\
767de2362d3Smrg	(RADEON_CP_PACKET2)
768de2362d3Smrg#define CP_PACKET3(pkt, n)						\
769de2362d3Smrg	(RADEON_CP_PACKET3 | (pkt) | ((n) << 16))
770de2362d3Smrg
771de2362d3Smrg
772de2362d3Smrg#define RADEON_VERBOSE	0
773de2362d3Smrg
774de2362d3Smrg#define BEGIN_RING(n) do {						\
775de2362d3Smrg    if (RADEON_VERBOSE) {						\
776de2362d3Smrg	xf86DrvMsg(pScrn->scrnIndex, X_INFO,				\
777de2362d3Smrg		   "BEGIN_RING(%d) in %s\n", (unsigned int)n, __FUNCTION__);\
778de2362d3Smrg    }									\
779de2362d3Smrg    radeon_ddx_cs_start(pScrn, n, __FILE__, __func__, __LINE__);   \
780de2362d3Smrg} while (0)
781de2362d3Smrg
782de2362d3Smrg#define ADVANCE_RING() do {						\
783de2362d3Smrg    radeon_cs_end(info->cs, __FILE__, __func__, __LINE__); \
784de2362d3Smrg  } while (0)
785de2362d3Smrg
786de2362d3Smrg#define OUT_RING(x) do {						\
787de2362d3Smrg    if (RADEON_VERBOSE) {						\
788de2362d3Smrg	xf86DrvMsg(pScrn->scrnIndex, X_INFO,				\
789de2362d3Smrg		   "   OUT_RING(0x%08x)\n", (unsigned int)(x));		\
790de2362d3Smrg    }									\
791de2362d3Smrg    radeon_cs_write_dword(info->cs, (x));		\
792de2362d3Smrg} while (0)
793de2362d3Smrg
794de2362d3Smrg#define OUT_RING_REG(reg, val)						\
795de2362d3Smrgdo {									\
796de2362d3Smrg    OUT_RING(CP_PACKET0(reg, 0));					\
797de2362d3Smrg    OUT_RING(val);							\
798de2362d3Smrg} while (0)
799de2362d3Smrg
800de2362d3Smrg#define OUT_RING_RELOC(x, read_domains, write_domain)			\
801de2362d3Smrg  do {									\
802de2362d3Smrg	int _ret; \
803de2362d3Smrg    _ret = radeon_cs_write_reloc(info->cs, x, read_domains, write_domain, 0); \
804de2362d3Smrg	if (_ret) ErrorF("reloc emit failure %d\n", _ret); \
805de2362d3Smrg  } while(0)
806de2362d3Smrg
807de2362d3Smrg
808de2362d3Smrg#define FLUSH_RING()							\
809de2362d3Smrgdo {									\
810de2362d3Smrg    if (RADEON_VERBOSE)							\
811de2362d3Smrg	xf86DrvMsg(pScrn->scrnIndex, X_INFO,				\
812de2362d3Smrg		   "FLUSH_RING in %s\n", __FUNCTION__);			\
813de2362d3Smrg    radeon_cs_flush_indirect(pScrn); 				\
814de2362d3Smrg} while (0)
815de2362d3Smrg
816de2362d3Smrg#define CS_FULL(cs) ((cs)->cdw > 15 * 1024)
817de2362d3Smrg
818de2362d3Smrg#define RADEON_SWITCH_TO_2D()						\
819de2362d3Smrgdo {									\
820de2362d3Smrg	uint32_t flush = 0;                                             \
821de2362d3Smrg	switch (info->accel_state->engineMode) {			\
822de2362d3Smrg	case EXA_ENGINEMODE_UNKNOWN:					\
823de2362d3Smrg	    flush = 1;                                                  \
824de2362d3Smrg	    break;							\
825de2362d3Smrg	case EXA_ENGINEMODE_3D:						\
826de2362d3Smrg	    flush = CS_FULL(info->cs);			\
827de2362d3Smrg	    break;							\
828de2362d3Smrg	case EXA_ENGINEMODE_2D:						\
829de2362d3Smrg	    flush = CS_FULL(info->cs);			\
830de2362d3Smrg	    break;							\
831de2362d3Smrg	}								\
832de2362d3Smrg	if (flush) {							\
833de2362d3Smrg	    radeon_cs_flush_indirect(pScrn);			\
834de2362d3Smrg	}								\
835de2362d3Smrg        info->accel_state->engineMode = EXA_ENGINEMODE_2D;              \
836de2362d3Smrg} while (0);
837de2362d3Smrg
838de2362d3Smrg#define RADEON_SWITCH_TO_3D()						\
839de2362d3Smrgdo {									\
840de2362d3Smrg	uint32_t flush = 0;						\
841de2362d3Smrg	switch (info->accel_state->engineMode) {			\
842de2362d3Smrg	case EXA_ENGINEMODE_UNKNOWN:					\
843de2362d3Smrg	    flush = 1;                                                  \
844de2362d3Smrg	    break;							\
845de2362d3Smrg	case EXA_ENGINEMODE_2D:						\
846de2362d3Smrg	    flush = CS_FULL(info->cs);	 		\
847de2362d3Smrg	    break;							\
848de2362d3Smrg	case EXA_ENGINEMODE_3D:						\
849de2362d3Smrg	    flush = CS_FULL(info->cs);			\
850de2362d3Smrg	    break;							\
851de2362d3Smrg	}								\
852de2362d3Smrg	if (flush) {							\
853de2362d3Smrg	    radeon_cs_flush_indirect(pScrn);			\
854de2362d3Smrg	}                                                               \
855de2362d3Smrg	if (!info->accel_state->XInited3D)				\
856de2362d3Smrg	    RADEONInit3DEngine(pScrn);                                  \
857de2362d3Smrg        info->accel_state->engineMode = EXA_ENGINEMODE_3D;              \
858de2362d3Smrg} while (0);
859de2362d3Smrg
860de2362d3Smrg				/* Memory mapped register access macros */
861de2362d3Smrg
862de2362d3Smrg#define BEGIN_ACCEL_RELOC(n, r) do {		\
863de2362d3Smrg	int _nqw = (n) + (r);	\
864de2362d3Smrg	BEGIN_RING(2*_nqw);			\
865de2362d3Smrg    } while (0)
866de2362d3Smrg
867de2362d3Smrg#define EMIT_OFFSET(reg, value, pPix, rd, wd) do {		\
868de2362d3Smrg    driver_priv = exaGetPixmapDriverPrivate(pPix);		\
869de2362d3Smrg    OUT_RING_REG((reg), (value));				\
870de2362d3Smrg    OUT_RING_RELOC(driver_priv->bo, (rd), (wd));			\
871de2362d3Smrg    } while(0)
872de2362d3Smrg
873de2362d3Smrg#define EMIT_READ_OFFSET(reg, value, pPix) EMIT_OFFSET(reg, value, pPix, (RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT), 0)
874de2362d3Smrg#define EMIT_WRITE_OFFSET(reg, value, pPix) EMIT_OFFSET(reg, value, pPix, 0, RADEON_GEM_DOMAIN_VRAM)
875de2362d3Smrg
876de2362d3Smrg#define OUT_TEXTURE_REG(reg, offset, bo) do {   \
877de2362d3Smrg    OUT_RING_REG((reg), (offset));                                   \
878de2362d3Smrg    OUT_RING_RELOC((bo), RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT, 0); \
879de2362d3Smrg  } while(0)
880de2362d3Smrg
881de2362d3Smrg#define EMIT_COLORPITCH(reg, value, pPix) do {			\
882de2362d3Smrg    driver_priv = exaGetPixmapDriverPrivate(pPix);			\
883de2362d3Smrg    OUT_RING_REG((reg), value);					\
884de2362d3Smrg    OUT_RING_RELOC(driver_priv->bo, 0, RADEON_GEM_DOMAIN_VRAM);		\
885de2362d3Smrg} while(0)
886de2362d3Smrg
887de2362d3Smrgstatic __inline__ void RADEON_SYNC(RADEONInfoPtr info, ScrnInfoPtr pScrn)
888de2362d3Smrg{
889de2362d3Smrg    if (pScrn->pScreen)
890de2362d3Smrg	exaWaitSync(pScrn->pScreen);
891de2362d3Smrg}
892de2362d3Smrg
893de2362d3Smrgenum {
8940d16fef4Smrg    RADEON_CREATE_PIXMAP_SCANOUT		= 0x02000000,
895de2362d3Smrg    RADEON_CREATE_PIXMAP_DRI2			= 0x04000000,
896de2362d3Smrg    RADEON_CREATE_PIXMAP_TILING_MICRO_SQUARE	= 0x08000000,
897de2362d3Smrg    RADEON_CREATE_PIXMAP_TILING_MACRO		= 0x10000000,
898de2362d3Smrg    RADEON_CREATE_PIXMAP_TILING_MICRO		= 0x20000000,
899de2362d3Smrg    RADEON_CREATE_PIXMAP_DEPTH			= 0x40000000, /* for r200 */
900de2362d3Smrg    RADEON_CREATE_PIXMAP_SZBUFFER		= 0x80000000, /* for eg */
901de2362d3Smrg};
902de2362d3Smrg
903de2362d3Smrg#define RADEON_CREATE_PIXMAP_TILING_FLAGS	\
904de2362d3Smrg    (RADEON_CREATE_PIXMAP_TILING_MICRO_SQUARE |	\
905de2362d3Smrg     RADEON_CREATE_PIXMAP_TILING_MACRO |	\
906de2362d3Smrg     RADEON_CREATE_PIXMAP_TILING_MICRO |	\
907de2362d3Smrg     RADEON_CREATE_PIXMAP_DEPTH |		\
908de2362d3Smrg     RADEON_CREATE_PIXMAP_SZBUFFER)
909de2362d3Smrg
910de2362d3Smrg
911de2362d3Smrg/* Compute log base 2 of val. */
912de2362d3Smrgstatic __inline__ int
913de2362d3SmrgRADEONLog2(int val)
914de2362d3Smrg{
915de2362d3Smrg	int bits;
916de2362d3Smrg#if (defined __i386__ || defined __x86_64__) && (defined __GNUC__)
917de2362d3Smrg	__asm volatile("bsrl	%1, %0"
918de2362d3Smrg		: "=r" (bits)
919de2362d3Smrg		: "c" (val)
920de2362d3Smrg	);
921de2362d3Smrg	return bits;
922de2362d3Smrg#else
923de2362d3Smrg	for (bits = 0; val != 0; val >>= 1, ++bits)
924de2362d3Smrg		;
925de2362d3Smrg	return bits - 1;
926de2362d3Smrg#endif
927de2362d3Smrg}
928de2362d3Smrg
929de2362d3Smrg#define RADEON_TILING_MASK				0xff
930de2362d3Smrg#define RADEON_TILING_LINEAR				0x0
931de2362d3Smrg
932de2362d3Smrg#endif /* _RADEON_H_ */
933