radeon.h revision 6322c902
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"
4568105dcbSveego
46209ff23fSmrg#include "xf86str.h"
47209ff23fSmrg#include "compiler.h"
48209ff23fSmrg
49209ff23fSmrg				/* PCI support */
50209ff23fSmrg#include "xf86Pci.h"
51209ff23fSmrg
52209ff23fSmrg#include "exa.h"
53209ff23fSmrg
54209ff23fSmrg				/* Exa and Cursor Support */
55209ff23fSmrg#include "xf86Cursor.h"
56209ff23fSmrg
57209ff23fSmrg				/* DDC support */
58209ff23fSmrg#include "xf86DDC.h"
59209ff23fSmrg
60209ff23fSmrg				/* Xv support */
61209ff23fSmrg#include "xf86xv.h"
62209ff23fSmrg
63209ff23fSmrg#include "radeon_probe.h"
64209ff23fSmrg
65209ff23fSmrg				/* DRI support */
66b7e1c893Smrg#include "xf86drm.h"
67ad43ddacSmrg#include "radeon_drm.h"
68b7e1c893Smrg
696322c902Smrg#ifndef RADEON_GEM_NO_CPU_ACCESS
706322c902Smrg#define RADEON_GEM_NO_CPU_ACCESS	(1 << 4)
716322c902Smrg#endif
726322c902Smrg
73209ff23fSmrg#ifdef DAMAGE
74209ff23fSmrg#include "damage.h"
75209ff23fSmrg#include "globals.h"
76209ff23fSmrg#endif
77209ff23fSmrg
78209ff23fSmrg#include "xf86Crtc.h"
79209ff23fSmrg#include "X11/Xatom.h"
80209ff23fSmrg
81ad43ddacSmrg#include "radeon_bo.h"
82ad43ddacSmrg#include "radeon_cs.h"
83ad43ddacSmrg#include "radeon_dri2.h"
84ad43ddacSmrg#include "drmmode_display.h"
8540732134Srjs#include "radeon_surface.h"
86ad43ddacSmrg
87209ff23fSmrg				/* Render support */
88209ff23fSmrg#ifdef RENDER
89209ff23fSmrg#include "picturestr.h"
90209ff23fSmrg#endif
91209ff23fSmrg
9268105dcbSveego#include "compat-api.h"
9368105dcbSveego
94ad43ddacSmrg#include "simple_list.h"
95209ff23fSmrg#include "atipcirename.h"
96209ff23fSmrg
976322c902Smrgstruct _SyncFence;
986322c902Smrg
99209ff23fSmrg#ifndef MAX
100209ff23fSmrg#define MAX(a,b) ((a)>(b)?(a):(b))
101209ff23fSmrg#endif
102209ff23fSmrg#ifndef MIN
103209ff23fSmrg#define MIN(a,b) ((a)>(b)?(b):(a))
104209ff23fSmrg#endif
105209ff23fSmrg
106b7e1c893Smrg#if HAVE_BYTESWAP_H
107b7e1c893Smrg#include <byteswap.h>
108b7e1c893Smrg#elif defined(USE_SYS_ENDIAN_H)
109b7e1c893Smrg#include <sys/endian.h>
110b7e1c893Smrg#else
111b7e1c893Smrg#define bswap_16(value)  \
112b7e1c893Smrg        ((((value) & 0xff) << 8) | ((value) >> 8))
113b7e1c893Smrg
114b7e1c893Smrg#define bswap_32(value) \
115b7e1c893Smrg        (((uint32_t)bswap_16((uint16_t)((value) & 0xffff)) << 16) | \
116b7e1c893Smrg        (uint32_t)bswap_16((uint16_t)((value) >> 16)))
117b7e1c893Smrg
118b7e1c893Smrg#define bswap_64(value) \
119b7e1c893Smrg        (((uint64_t)bswap_32((uint32_t)((value) & 0xffffffff)) \
120b7e1c893Smrg            << 32) | \
121b7e1c893Smrg        (uint64_t)bswap_32((uint32_t)((value) >> 32)))
122b7e1c893Smrg#endif
123b7e1c893Smrg
124b7e1c893Smrg#if X_BYTE_ORDER == X_BIG_ENDIAN
125b7e1c893Smrg#define le32_to_cpu(x) bswap_32(x)
126b7e1c893Smrg#define le16_to_cpu(x) bswap_16(x)
127b7e1c893Smrg#define cpu_to_le32(x) bswap_32(x)
128b7e1c893Smrg#define cpu_to_le16(x) bswap_16(x)
129b7e1c893Smrg#else
130b7e1c893Smrg#define le32_to_cpu(x) (x)
131b7e1c893Smrg#define le16_to_cpu(x) (x)
132b7e1c893Smrg#define cpu_to_le32(x) (x)
133b7e1c893Smrg#define cpu_to_le16(x) (x)
134b7e1c893Smrg#endif
135b7e1c893Smrg
136209ff23fSmrg/* Provide substitutes for gcc's __FUNCTION__ on other compilers */
137209ff23fSmrg#if !defined(__GNUC__) && !defined(__FUNCTION__)
138209ff23fSmrg# define __FUNCTION__ __func__		/* C99 */
139209ff23fSmrg#endif
140209ff23fSmrg
141209ff23fSmrgtypedef enum {
1426322c902Smrg    OPTION_ACCEL,
143209ff23fSmrg    OPTION_SW_CURSOR,
144209ff23fSmrg    OPTION_PAGE_FLIP,
145ad43ddacSmrg    OPTION_EXA_PIXMAPS,
146209ff23fSmrg    OPTION_COLOR_TILING,
14740732134Srjs    OPTION_COLOR_TILING_2D,
148209ff23fSmrg#ifdef RENDER
149209ff23fSmrg    OPTION_RENDER_ACCEL,
150209ff23fSmrg    OPTION_SUBPIXEL_ORDER,
151209ff23fSmrg#endif
152209ff23fSmrg    OPTION_ACCELMETHOD,
153b7e1c893Smrg    OPTION_EXA_VSYNC,
154921a55d8Smrg    OPTION_ZAPHOD_HEADS,
1556322c902Smrg    OPTION_SWAPBUFFERS_WAIT,
1566322c902Smrg    OPTION_DELETE_DP12,
1576322c902Smrg    OPTION_DRI3,
1586322c902Smrg    OPTION_DRI,
1596322c902Smrg    OPTION_SHADOW_PRIMARY,
1606322c902Smrg    OPTION_TEAR_FREE,
161209ff23fSmrg} RADEONOpts;
162209ff23fSmrg
163209ff23fSmrg
1646322c902Smrg#if XF86_CRTC_VERSION >= 5
1656322c902Smrg#define RADEON_PIXMAP_SHARING 1
1666322c902Smrg#endif
167209ff23fSmrg
168209ff23fSmrg#define RADEON_VSYNC_TIMEOUT	20000 /* Maximum wait for VSYNC (in usecs) */
169209ff23fSmrg
170209ff23fSmrg/* Buffer are aligned on 4096 byte boundaries */
171ad43ddacSmrg#define RADEON_GPU_PAGE_SIZE 4096
172ad43ddacSmrg#define RADEON_BUFFER_ALIGN (RADEON_GPU_PAGE_SIZE - 1)
1736322c902Smrg
174209ff23fSmrg
175209ff23fSmrg#define xFixedToFloat(f) (((float) (f)) / 65536)
176209ff23fSmrg
177209ff23fSmrg#define RADEON_LOGLEVEL_DEBUG 4
178209ff23fSmrg
179209ff23fSmrg/* for Xv, outputs */
180209ff23fSmrg#define MAKE_ATOM(a) MakeAtom(a, sizeof(a) - 1, TRUE)
181209ff23fSmrg
182209ff23fSmrg/* Other macros */
183209ff23fSmrg#define RADEON_ARRAY_SIZE(x)  (sizeof(x)/sizeof(x[0]))
184209ff23fSmrg#define RADEON_ALIGN(x,bytes) (((x) + ((bytes) - 1)) & ~((bytes) - 1))
185209ff23fSmrg#define RADEONPTR(pScrn)      ((RADEONInfoPtr)(pScrn)->driverPrivate)
186209ff23fSmrg
187209ff23fSmrg#define IS_RV100_VARIANT ((info->ChipFamily == CHIP_FAMILY_RV100)  ||  \
188209ff23fSmrg        (info->ChipFamily == CHIP_FAMILY_RV200)  ||  \
189209ff23fSmrg        (info->ChipFamily == CHIP_FAMILY_RS100)  ||  \
190209ff23fSmrg        (info->ChipFamily == CHIP_FAMILY_RS200)  ||  \
191209ff23fSmrg        (info->ChipFamily == CHIP_FAMILY_RV250)  ||  \
192209ff23fSmrg        (info->ChipFamily == CHIP_FAMILY_RV280)  ||  \
193209ff23fSmrg        (info->ChipFamily == CHIP_FAMILY_RS300))
194209ff23fSmrg
195209ff23fSmrg
196209ff23fSmrg#define IS_R300_VARIANT ((info->ChipFamily == CHIP_FAMILY_R300)  ||  \
197209ff23fSmrg        (info->ChipFamily == CHIP_FAMILY_RV350) ||  \
198209ff23fSmrg        (info->ChipFamily == CHIP_FAMILY_R350)  ||  \
199209ff23fSmrg        (info->ChipFamily == CHIP_FAMILY_RV380) ||  \
200209ff23fSmrg        (info->ChipFamily == CHIP_FAMILY_R420)  ||  \
201209ff23fSmrg        (info->ChipFamily == CHIP_FAMILY_RV410) ||  \
202209ff23fSmrg        (info->ChipFamily == CHIP_FAMILY_RS400) ||  \
203209ff23fSmrg        (info->ChipFamily == CHIP_FAMILY_RS480))
204209ff23fSmrg
205209ff23fSmrg#define IS_AVIVO_VARIANT ((info->ChipFamily >= CHIP_FAMILY_RV515))
206209ff23fSmrg
207209ff23fSmrg#define IS_DCE3_VARIANT ((info->ChipFamily >= CHIP_FAMILY_RV620))
208209ff23fSmrg
209b7e1c893Smrg#define IS_DCE32_VARIANT ((info->ChipFamily >= CHIP_FAMILY_RV730))
210b7e1c893Smrg
211ad43ddacSmrg#define IS_DCE4_VARIANT ((info->ChipFamily >= CHIP_FAMILY_CEDAR))
212ad43ddacSmrg
213921a55d8Smrg#define IS_DCE41_VARIANT ((info->ChipFamily >= CHIP_FAMILY_PALM))
214921a55d8Smrg
215921a55d8Smrg#define IS_DCE5_VARIANT ((info->ChipFamily >= CHIP_FAMILY_BARTS))
216921a55d8Smrg
217921a55d8Smrg#define IS_EVERGREEN_3D (info->ChipFamily >= CHIP_FAMILY_CEDAR)
218921a55d8Smrg
219b7e1c893Smrg#define IS_R600_3D (info->ChipFamily >= CHIP_FAMILY_R600)
220b7e1c893Smrg
221209ff23fSmrg#define IS_R500_3D ((info->ChipFamily == CHIP_FAMILY_RV515)  ||  \
222209ff23fSmrg	(info->ChipFamily == CHIP_FAMILY_R520)   ||  \
223209ff23fSmrg	(info->ChipFamily == CHIP_FAMILY_RV530)  ||  \
224209ff23fSmrg	(info->ChipFamily == CHIP_FAMILY_R580)   ||  \
225209ff23fSmrg	(info->ChipFamily == CHIP_FAMILY_RV560)  ||  \
226209ff23fSmrg	(info->ChipFamily == CHIP_FAMILY_RV570))
227209ff23fSmrg
2286322c902Smrg/* RS6xx, RS740 are technically R4xx as well, but the
2296322c902Smrg * clipping hardware seems to follow the r3xx restrictions
2306322c902Smrg */
231ad43ddacSmrg#define IS_R400_3D ((info->ChipFamily == CHIP_FAMILY_R420)  ||  \
2326322c902Smrg	(info->ChipFamily == CHIP_FAMILY_RV410))
233ad43ddacSmrg
234209ff23fSmrg#define IS_R300_3D ((info->ChipFamily == CHIP_FAMILY_R300)  ||  \
235209ff23fSmrg	(info->ChipFamily == CHIP_FAMILY_RV350) ||  \
236209ff23fSmrg	(info->ChipFamily == CHIP_FAMILY_R350)  ||  \
237209ff23fSmrg	(info->ChipFamily == CHIP_FAMILY_RV380) ||  \
238209ff23fSmrg	(info->ChipFamily == CHIP_FAMILY_R420)  ||  \
239209ff23fSmrg	(info->ChipFamily == CHIP_FAMILY_RV410) ||  \
240209ff23fSmrg	(info->ChipFamily == CHIP_FAMILY_RS690) ||  \
241209ff23fSmrg	(info->ChipFamily == CHIP_FAMILY_RS600) ||  \
242209ff23fSmrg	(info->ChipFamily == CHIP_FAMILY_RS740) ||  \
243209ff23fSmrg	(info->ChipFamily == CHIP_FAMILY_RS400) ||  \
244209ff23fSmrg	(info->ChipFamily == CHIP_FAMILY_RS480))
245209ff23fSmrg
246ad43ddacSmrg#define IS_R200_3D ((info->ChipFamily == CHIP_FAMILY_RV250) || \
247ad43ddacSmrg	(info->ChipFamily == CHIP_FAMILY_RV280) || \
248ad43ddacSmrg	(info->ChipFamily == CHIP_FAMILY_RS300) || \
249ad43ddacSmrg	(info->ChipFamily == CHIP_FAMILY_R200))
250ad43ddacSmrg
2516322c902Smrg#define CURSOR_WIDTH	64
2526322c902Smrg#define CURSOR_HEIGHT	64
253209ff23fSmrg
2546322c902Smrg#define CURSOR_WIDTH_CIK	128
2556322c902Smrg#define CURSOR_HEIGHT_CIK	128
256209ff23fSmrg
257209ff23fSmrg
2586322c902Smrg#ifdef USE_GLAMOR
259209ff23fSmrg
2606322c902Smrgstruct radeon_pixmap {
2616322c902Smrg	struct radeon_surface surface;
262ad43ddacSmrg
2636322c902Smrg	uint_fast32_t gpu_read;
2646322c902Smrg	uint_fast32_t gpu_write;
265ad43ddacSmrg
2666322c902Smrg	struct radeon_bo *bo;
267ad43ddacSmrg
2686322c902Smrg	uint32_t tiling_flags;
2696322c902Smrg
2706322c902Smrg	/* GEM handle for glamor-only pixmaps shared via DRI3 */
2716322c902Smrg	Bool handle_valid;
2726322c902Smrg	uint32_t handle;
2736322c902Smrg};
2746322c902Smrg
2756322c902Smrgextern DevPrivateKeyRec glamor_pixmap_index;
2766322c902Smrg
2776322c902Smrgstatic inline struct radeon_pixmap *radeon_get_pixmap_private(PixmapPtr pixmap)
2786322c902Smrg{
2796322c902Smrg	return dixGetPrivate(&pixmap->devPrivates, &glamor_pixmap_index);
2806322c902Smrg}
2816322c902Smrg
2826322c902Smrgstatic inline void radeon_set_pixmap_private(PixmapPtr pixmap, struct radeon_pixmap *priv)
2836322c902Smrg{
2846322c902Smrg	dixSetPrivate(&pixmap->devPrivates, &glamor_pixmap_index, priv);
2856322c902Smrg}
2866322c902Smrg
2876322c902Smrg#endif /* USE_GLAMOR */
288ad43ddacSmrg
289209ff23fSmrg
290ad43ddacSmrgstruct radeon_exa_pixmap_priv {
291ad43ddacSmrg    struct radeon_bo *bo;
292c4ae5be6Smrg    uint32_t tiling_flags;
29340732134Srjs    struct radeon_surface surface;
294ad43ddacSmrg    Bool bo_mapped;
2956322c902Smrg    Bool shared;
296ad43ddacSmrg};
297ad43ddacSmrg
298ad43ddacSmrg#define RADEON_2D_EXA_COPY 1
299ad43ddacSmrg#define RADEON_2D_EXA_SOLID 2
300ad43ddacSmrg
301ad43ddacSmrgstruct radeon_2d_state {
302ad43ddacSmrg    int op; //
303ad43ddacSmrg    uint32_t dst_pitch_offset;
304ad43ddacSmrg    uint32_t src_pitch_offset;
305ad43ddacSmrg    uint32_t dp_gui_master_cntl;
306ad43ddacSmrg    uint32_t dp_cntl;
307ad43ddacSmrg    uint32_t dp_write_mask;
308ad43ddacSmrg    uint32_t dp_brush_frgd_clr;
309ad43ddacSmrg    uint32_t dp_brush_bkgd_clr;
310ad43ddacSmrg    uint32_t dp_src_frgd_clr;
311ad43ddacSmrg    uint32_t dp_src_bkgd_clr;
312ad43ddacSmrg    uint32_t default_sc_bottom_right;
3136322c902Smrg    uint32_t dst_domain;
314ad43ddacSmrg    struct radeon_bo *dst_bo;
315ad43ddacSmrg    struct radeon_bo *src_bo;
316ad43ddacSmrg};
317ad43ddacSmrg
318ad43ddacSmrg#define DMA_BO_FREE_TIME 1000
319ad43ddacSmrg
320ad43ddacSmrgstruct radeon_dma_bo {
321ad43ddacSmrg    struct radeon_dma_bo *next, *prev;
322ad43ddacSmrg    struct radeon_bo  *bo;
323ad43ddacSmrg    int expire_counter;
324ad43ddacSmrg};
325ad43ddacSmrg
326ad43ddacSmrgstruct r600_accel_object {
327ad43ddacSmrg    uint32_t pitch;
328ad43ddacSmrg    uint32_t width;
329ad43ddacSmrg    uint32_t height;
330ad43ddacSmrg    int bpp;
331ad43ddacSmrg    uint32_t domain;
332ad43ddacSmrg    struct radeon_bo *bo;
333b13dfe66Smrg    uint32_t tiling_flags;
33440732134Srjs    struct radeon_surface *surface;
335ad43ddacSmrg};
336ad43ddacSmrg
337921a55d8Smrgstruct radeon_vbo_object {
338921a55d8Smrg    int               vb_offset;
339921a55d8Smrg    int               vb_total;
340921a55d8Smrg    uint32_t          vb_size;
341921a55d8Smrg    uint32_t          vb_op_vert_size;
342921a55d8Smrg    int32_t           vb_start_op;
343921a55d8Smrg    struct radeon_bo *vb_bo;
344921a55d8Smrg    unsigned          verts_per_op;
345921a55d8Smrg};
346921a55d8Smrg
347b7e1c893Smrgstruct radeon_accel_state {
3486322c902Smrg
349b7e1c893Smrg				/* Saved values for ScreenToScreenCopy */
350b7e1c893Smrg    int               xdir;
351b7e1c893Smrg    int               ydir;
352209ff23fSmrg
353b7e1c893Smrg    /* render accel */
354b7e1c893Smrg    unsigned short    texW[2];
355b7e1c893Smrg    unsigned short    texH[2];
356b7e1c893Smrg    Bool              XInited3D; /* X itself has the 3D context */
357b7e1c893Smrg    int               num_gb_pipes;
358b7e1c893Smrg    Bool              has_tcl;
359c4ae5be6Smrg    Bool              allowHWDFS;
360209ff23fSmrg
361b7e1c893Smrg    /* EXA */
362b7e1c893Smrg    ExaDriverPtr      exa;
363b7e1c893Smrg    int               exaSyncMarker;
364b7e1c893Smrg    int               exaMarkerSynced;
365b7e1c893Smrg    int               engineMode;
366b7e1c893Smrg#define EXA_ENGINEMODE_UNKNOWN 0
367b7e1c893Smrg#define EXA_ENGINEMODE_2D      1
368b7e1c893Smrg#define EXA_ENGINEMODE_3D      2
369209ff23fSmrg
370ad43ddacSmrg    int               composite_op;
371ad43ddacSmrg    PicturePtr        dst_pic;
372ad43ddacSmrg    PicturePtr        msk_pic;
373ad43ddacSmrg    PicturePtr        src_pic;
374ad43ddacSmrg    PixmapPtr         dst_pix;
375ad43ddacSmrg    PixmapPtr         msk_pix;
376ad43ddacSmrg    PixmapPtr         src_pix;
377b7e1c893Smrg    Bool              is_transform[2];
378b7e1c893Smrg    PictTransform     *transform[2];
379b7e1c893Smrg    /* Whether we are tiling horizontally and vertically */
380b7e1c893Smrg    Bool              need_src_tile_x;
381b7e1c893Smrg    Bool              need_src_tile_y;
382b7e1c893Smrg    /* Size of tiles ... set to 65536x65536 if not tiling in that direction */
383b7e1c893Smrg    Bool              src_tile_width;
384b7e1c893Smrg    Bool              src_tile_height;
385ad43ddacSmrg    uint32_t          *draw_header;
386ad43ddacSmrg    unsigned          vtx_count;
387ad43ddacSmrg    unsigned          num_vtx;
388b7e1c893Smrg    Bool              vsync;
389b7e1c893Smrg
390921a55d8Smrg    struct radeon_vbo_object vbo;
391921a55d8Smrg    struct radeon_vbo_object cbuf;
392921a55d8Smrg
393ad43ddacSmrg    /* where to discard IB from if we cancel operation */
394ad43ddacSmrg    uint32_t          ib_reset_op;
395ad43ddacSmrg    struct radeon_dma_bo bo_free;
396ad43ddacSmrg    struct radeon_dma_bo bo_wait;
397ad43ddacSmrg    struct radeon_dma_bo bo_reserved;
398ad43ddacSmrg    Bool use_vbos;
3990974d292Smrg    void (*finish_op)(ScrnInfoPtr, int);
400b7e1c893Smrg    // shader storage
401ad43ddacSmrg    struct radeon_bo  *shaders_bo;
402b7e1c893Smrg    uint32_t          solid_vs_offset;
403b7e1c893Smrg    uint32_t          solid_ps_offset;
404b7e1c893Smrg    uint32_t          copy_vs_offset;
405b7e1c893Smrg    uint32_t          copy_ps_offset;
406b7e1c893Smrg    uint32_t          comp_vs_offset;
407b7e1c893Smrg    uint32_t          comp_ps_offset;
408b7e1c893Smrg    uint32_t          xv_vs_offset;
409b7e1c893Smrg    uint32_t          xv_ps_offset;
410921a55d8Smrg    // shader consts
411921a55d8Smrg    uint32_t          solid_vs_const_offset;
412921a55d8Smrg    uint32_t          solid_ps_const_offset;
413921a55d8Smrg    uint32_t          copy_vs_const_offset;
414921a55d8Smrg    uint32_t          copy_ps_const_offset;
415921a55d8Smrg    uint32_t          comp_vs_const_offset;
416921a55d8Smrg    uint32_t          comp_ps_const_offset;
417921a55d8Smrg    uint32_t          comp_mask_ps_const_offset;
418921a55d8Smrg    uint32_t          xv_vs_const_offset;
419921a55d8Smrg    uint32_t          xv_ps_const_offset;
420b7e1c893Smrg
421b7e1c893Smrg    //size/addr stuff
422ad43ddacSmrg    struct r600_accel_object src_obj[2];
423ad43ddacSmrg    struct r600_accel_object dst_obj;
424b7e1c893Smrg    uint32_t          src_size[2];
425b7e1c893Smrg    uint32_t          dst_size;
426ad43ddacSmrg
427b7e1c893Smrg    uint32_t          vs_size;
428b7e1c893Smrg    uint64_t          vs_mc_addr;
429b7e1c893Smrg    uint32_t          ps_size;
430b7e1c893Smrg    uint64_t          ps_mc_addr;
431b7e1c893Smrg
43240732134Srjs    // solid/copy
4336322c902Smrg    void *copy_area;
434ad43ddacSmrg    struct radeon_bo  *copy_area_bo;
435b7e1c893Smrg    Bool              same_surface;
436b7e1c893Smrg    int               rop;
437b7e1c893Smrg    uint32_t          planemask;
43840732134Srjs    uint32_t          fg;
439b7e1c893Smrg
440b7e1c893Smrg    // composite
441b7e1c893Smrg    Bool              component_alpha;
442b7e1c893Smrg    Bool              src_alpha;
443ad43ddacSmrg    // vline
444ad43ddacSmrg    xf86CrtcPtr       vline_crtc;
445ad43ddacSmrg    int               vline_y1;
446ad43ddacSmrg    int               vline_y2;
447209ff23fSmrg
4486322c902Smrg    Bool              force;
449b7e1c893Smrg};
450b7e1c893Smrg
451b7e1c893Smrgtypedef struct {
452b7e1c893Smrg    EntityInfoPtr     pEnt;
453b7e1c893Smrg    pciVideoPtr       PciInfo;
454b7e1c893Smrg    int               Chipset;
455b7e1c893Smrg    RADEONChipFamily  ChipFamily;
4566322c902Smrg
45768105dcbSveego    Bool              (*CloseScreen)(CLOSE_SCREEN_ARGS_DECL);
458b7e1c893Smrg
45968105dcbSveego    void              (*BlockHandler)(BLOCKHANDLER_ARGS_DECL);
460b7e1c893Smrg
4616322c902Smrg    void              (*CreateFence) (ScreenPtr pScreen, struct _SyncFence *pFence,
4626322c902Smrg				      Bool initially_triggered);
463b7e1c893Smrg
464b7e1c893Smrg    int               pix24bpp;         /* Depth of pixmap for 24bpp fb      */
465b7e1c893Smrg    Bool              dac6bits;         /* Use 6 bit DAC?                    */
466b7e1c893Smrg
4676322c902Smrg    int               pixel_bytes;
468b7e1c893Smrg
469b7e1c893Smrg    Bool              directRenderingEnabled;
470ad43ddacSmrg    struct radeon_dri2  dri2;
471209ff23fSmrg
472b7e1c893Smrg    /* accel */
473b7e1c893Smrg    Bool              RenderAccel; /* Render */
474b7e1c893Smrg    Bool              allowColorTiling;
47540732134Srjs    Bool              allowColorTiling2D;
4766322c902Smrg    uint_fast32_t     gpu_flushed;
4776322c902Smrg    uint_fast32_t     gpu_synced;
478b7e1c893Smrg    struct radeon_accel_state *accel_state;
4796322c902Smrg    PixmapPtr         fbcon_pixmap;
480b7e1c893Smrg    Bool              accelOn;
4816322c902Smrg    Bool              use_glamor;
4826322c902Smrg    Bool              shadow_primary;
4836322c902Smrg    Bool              tear_free;
484ad43ddacSmrg    Bool	      exa_pixmaps;
485ad43ddacSmrg    Bool              exa_force_create;
486b7e1c893Smrg    XF86ModReqInfo    exaReq;
4876322c902Smrg    Bool              is_fast_fb; /* use direct mapping for fast fb access */
488b7e1c893Smrg
489ad43ddacSmrg    unsigned int xv_max_width;
490ad43ddacSmrg    unsigned int xv_max_height;
491209ff23fSmrg
492209ff23fSmrg    /* general */
493209ff23fSmrg    OptionInfoPtr     Options;
494209ff23fSmrg
4956322c902Smrg    DisplayModePtr currentMode;
496209ff23fSmrg
497209ff23fSmrg    CreateScreenResourcesProcPtr CreateScreenResources;
4986322c902Smrg#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) >= 10
4996322c902Smrg    CreateWindowProcPtr CreateWindow;
5006322c902Smrg#endif
501209ff23fSmrg
502209ff23fSmrg    Bool              IsSecondary;
503209ff23fSmrg
504209ff23fSmrg    Bool              r600_shadow_fb;
505209ff23fSmrg    void *fb_shadow;
506209ff23fSmrg
507ad43ddacSmrg    void (*reemit_current2d)(ScrnInfoPtr pScrn, int op); // emit the current 2D state into the IB
508ad43ddacSmrg    struct radeon_2d_state state_2d;
509ad43ddacSmrg    struct radeon_bo *front_bo;
510ad43ddacSmrg    struct radeon_bo_manager *bufmgr;
511ad43ddacSmrg    struct radeon_cs_manager *csm;
512ad43ddacSmrg    struct radeon_cs *cs;
513ad43ddacSmrg
51440732134Srjs    struct radeon_bo *cursor_bo[32];
515ad43ddacSmrg    uint64_t vram_size;
516ad43ddacSmrg    uint64_t gart_size;
517ad43ddacSmrg    drmmode_rec drmmode;
5186322c902Smrg    Bool drmmode_inited;
5190974d292Smrg    /* r6xx+ tile config */
520b13dfe66Smrg    Bool have_tiling_info;
5210974d292Smrg    uint32_t tile_config;
5220974d292Smrg    int group_bytes;
5230974d292Smrg    int num_channels;
5240974d292Smrg    int num_banks;
5250974d292Smrg    int r7xx_bank_op;
52640732134Srjs    struct radeon_surface_manager *surf_man;
52740732134Srjs    struct radeon_surface front_surface;
528ad43ddacSmrg
529ad43ddacSmrg    /* Xv bicubic filtering */
530ad43ddacSmrg    struct radeon_bo *bicubic_bo;
5316322c902Smrg
532921a55d8Smrg    /* kms pageflipping */
533921a55d8Smrg    Bool allowPageFlip;
534921a55d8Smrg
535921a55d8Smrg    /* Perform vsync'ed SwapBuffers? */
536921a55d8Smrg    Bool swapBuffersWait;
537209ff23fSmrg
5386322c902Smrg    /* cursor size */
5396322c902Smrg    int cursor_w;
5406322c902Smrg    int cursor_h;
541209ff23fSmrg
5426322c902Smrg    /* If bit n of this field is set, xf86_config->crtc[n] currently can't
5436322c902Smrg     * use the HW cursor
5446322c902Smrg     */
5456322c902Smrg    unsigned hwcursor_disabled;
5466322c902Smrg
5476322c902Smrg#ifdef USE_GLAMOR
5486322c902Smrg    struct {
5496322c902Smrg	CreateGCProcPtr SavedCreateGC;
5506322c902Smrg	RegionPtr (*SavedCopyArea)(DrawablePtr, DrawablePtr, GCPtr, int, int,
5516322c902Smrg				   int, int, int, int);
5526322c902Smrg	void (*SavedPolyFillRect)(DrawablePtr, GCPtr, int, xRectangle*);
5536322c902Smrg	CloseScreenProcPtr SavedCloseScreen;
5546322c902Smrg	GetImageProcPtr SavedGetImage;
5556322c902Smrg	GetSpansProcPtr SavedGetSpans;
5566322c902Smrg	CreatePixmapProcPtr SavedCreatePixmap;
5576322c902Smrg	DestroyPixmapProcPtr SavedDestroyPixmap;
5586322c902Smrg	CopyWindowProcPtr SavedCopyWindow;
5596322c902Smrg	ChangeWindowAttributesProcPtr SavedChangeWindowAttributes;
5606322c902Smrg	BitmapToRegionProcPtr SavedBitmapToRegion;
5616322c902Smrg#ifdef RENDER
5626322c902Smrg	CompositeProcPtr SavedComposite;
5636322c902Smrg	TrianglesProcPtr SavedTriangles;
5646322c902Smrg	GlyphsProcPtr SavedGlyphs;
5656322c902Smrg	TrapezoidsProcPtr SavedTrapezoids;
5666322c902Smrg	AddTrapsProcPtr SavedAddTraps;
5676322c902Smrg	UnrealizeGlyphProcPtr SavedUnrealizeGlyph;
5686322c902Smrg#endif
5696322c902Smrg#ifdef RADEON_PIXMAP_SHARING
5706322c902Smrg	SharePixmapBackingProcPtr SavedSharePixmapBacking;
5716322c902Smrg	SetSharedPixmapBackingProcPtr SavedSetSharedPixmapBacking;
5726322c902Smrg#endif
5736322c902Smrg    } glamor;
5746322c902Smrg#endif /* USE_GLAMOR */
5756322c902Smrg} RADEONInfoRec, *RADEONInfoPtr;
576b7e1c893Smrg
577209ff23fSmrg/* radeon_accel.c */
578209ff23fSmrgextern Bool RADEONAccelInit(ScreenPtr pScreen);
579209ff23fSmrgextern void RADEONEngineInit(ScrnInfoPtr pScrn);
580209ff23fSmrgextern void  RADEONCopySwap(uint8_t *dst, uint8_t *src, unsigned int size, int swap);
581209ff23fSmrgextern void RADEONInit3DEngine(ScrnInfoPtr pScrn);
5822f39173dSmrgextern int radeon_cs_space_remaining(ScrnInfoPtr pScrn);
583209ff23fSmrg
584209ff23fSmrg/* radeon_commonfuncs.c */
5856322c902Smrgextern void RADEONWaitForVLine(ScrnInfoPtr pScrn, PixmapPtr pPix,
5866322c902Smrg			       xf86CrtcPtr crtc, int start, int stop);
5876322c902Smrg
588209ff23fSmrg
589209ff23fSmrg/* radeon_exa.c */
59040732134Srjsextern unsigned eg_tile_split(unsigned tile_split);
591b13dfe66Smrgextern Bool radeon_transform_is_affine_or_scaled(PictTransformPtr t);
592209ff23fSmrg
593209ff23fSmrg/* radeon_exa_funcs.c */
5946322c902Smrgextern Bool RADEONDrawInit(ScreenPtr pScreen);
595b7e1c893Smrgextern Bool R600DrawInit(ScreenPtr pScreen);
596b7e1c893Smrgextern Bool R600LoadShaders(ScrnInfoPtr pScrn);
597921a55d8Smrgextern Bool EVERGREENDrawInit(ScreenPtr pScreen);
598209ff23fSmrg
599209ff23fSmrg/* radeon_exa.c */
600209ff23fSmrgextern Bool RADEONGetDatatypeBpp(int bpp, uint32_t *type);
601209ff23fSmrgextern Bool RADEONGetPixmapOffsetPitch(PixmapPtr pPix,
602209ff23fSmrg				       uint32_t *pitch_offset);
603209ff23fSmrg
6046322c902Smrg/* radeon_dri3.c */
6056322c902SmrgBool radeon_dri3_screen_init(ScreenPtr screen);
6066322c902Smrg
6076322c902Smrg/* radeon_kms.c */
6086322c902Smrgvoid radeon_scanout_update_handler(xf86CrtcPtr crtc, uint32_t frame,
6096322c902Smrg				   uint64_t usec, void *event_data);
6106322c902Smrg
6116322c902Smrg/* radeon_present.c */
6126322c902SmrgBool radeon_present_screen_init(ScreenPtr screen);
6136322c902Smrg
6146322c902Smrg/* radeon_sync.c */
6156322c902Smrgextern Bool radeon_sync_init(ScreenPtr screen);
6166322c902Smrgextern void radeon_sync_close(ScreenPtr screen);
617209ff23fSmrg
618209ff23fSmrg/* radeon_video.c */
619209ff23fSmrgextern void RADEONInitVideo(ScreenPtr pScreen);
620209ff23fSmrgextern void RADEONResetVideo(ScrnInfoPtr pScrn);
621ad43ddacSmrgextern Bool radeon_load_bicubic_texture(ScrnInfoPtr pScrn);
622ad43ddacSmrgextern xf86CrtcPtr radeon_pick_best_crtc(ScrnInfoPtr pScrn,
6236322c902Smrg					 Bool consider_disabled,
624ad43ddacSmrg					 int x1, int x2, int y1, int y2);
625209ff23fSmrg
626ad43ddacSmrgextern void radeon_cs_flush_indirect(ScrnInfoPtr pScrn);
627ad43ddacSmrgextern void radeon_ddx_cs_start(ScrnInfoPtr pScrn,
628ad43ddacSmrg				int num, const char *file,
629ad43ddacSmrg				const char *func, int line);
6306322c902Smrgvoid radeon_kms_update_vram_limit(ScrnInfoPtr pScrn, uint32_t new_fb_size);
6316322c902Smrgextern RADEONEntPtr RADEONEntPriv(ScrnInfoPtr pScrn);
632209ff23fSmrg
6336322c902SmrgdrmVBlankSeqType radeon_populate_vbl_request_type(xf86CrtcPtr crtc);
634209ff23fSmrg
6356322c902Smrgstatic inline struct radeon_surface *radeon_get_pixmap_surface(PixmapPtr pPix)
6366322c902Smrg{
6376322c902Smrg#ifdef USE_GLAMOR
6386322c902Smrg    RADEONInfoPtr info = RADEONPTR(xf86ScreenToScrn(pPix->drawable.pScreen));
6396322c902Smrg
6406322c902Smrg    if (info->use_glamor) {
6416322c902Smrg	struct radeon_pixmap *priv;
6426322c902Smrg	priv = radeon_get_pixmap_private(pPix);
6436322c902Smrg	return priv ? &priv->surface : NULL;
6446322c902Smrg    } else
6456322c902Smrg#endif
6466322c902Smrg    {
6476322c902Smrg	struct radeon_exa_pixmap_priv *driver_priv;
6486322c902Smrg	driver_priv = exaGetPixmapDriverPrivate(pPix);
6496322c902Smrg	return &driver_priv->surface;
6506322c902Smrg    }
6516322c902Smrg
6526322c902Smrg    return NULL;
6536322c902Smrg}
654209ff23fSmrg
6556322c902Smrguint32_t radeon_get_pixmap_tiling(PixmapPtr pPix);
656209ff23fSmrg
6576322c902Smrgstatic inline void radeon_set_pixmap_bo(PixmapPtr pPix, struct radeon_bo *bo)
6586322c902Smrg{
6596322c902Smrg    ScreenPtr pScreen = pPix->drawable.pScreen;
6606322c902Smrg
6616322c902Smrg#ifdef USE_GLAMOR
6626322c902Smrg    RADEONInfoPtr info = RADEONPTR(xf86ScreenToScrn(pPix->drawable.pScreen));
6636322c902Smrg
6646322c902Smrg    if (info->use_glamor) {
6656322c902Smrg	struct radeon_pixmap *priv;
6666322c902Smrg
6676322c902Smrg	priv = radeon_get_pixmap_private(pPix);
6686322c902Smrg	if (priv == NULL && bo == NULL)
6696322c902Smrg	    return;
6706322c902Smrg
6716322c902Smrg	if (priv) {
6726322c902Smrg	    if (priv->bo == bo)
6736322c902Smrg		return;
6746322c902Smrg
6756322c902Smrg	    if (priv->bo)
6766322c902Smrg		radeon_bo_unref(priv->bo);
6776322c902Smrg
6786322c902Smrg	    if (!bo) {
6796322c902Smrg		free(priv);
6806322c902Smrg		priv = NULL;
6816322c902Smrg	    }
6826322c902Smrg	}
6836322c902Smrg
6846322c902Smrg	if (bo) {
6856322c902Smrg	    uint32_t pitch;
6866322c902Smrg
6876322c902Smrg	    if (!priv) {
6886322c902Smrg		priv = calloc(1, sizeof (struct radeon_pixmap));
6896322c902Smrg		if (!priv)
6906322c902Smrg		    goto out;
6916322c902Smrg	    }
6926322c902Smrg
6936322c902Smrg	    radeon_bo_ref(bo);
6946322c902Smrg	    priv->bo = bo;
6956322c902Smrg
6966322c902Smrg	    if (radeon_bo_get_tiling(bo, &priv->tiling_flags, &pitch) == 0 &&
6976322c902Smrg		pitch != pPix->devKind)
6986322c902Smrg		pScreen->ModifyPixmapHeader(pPix, -1, -1, -1, -1, pitch, NULL);
6996322c902Smrg	}
7006322c902Smrgout:
7016322c902Smrg	radeon_set_pixmap_private(pPix, priv);
7026322c902Smrg    } else
7036322c902Smrg#endif /* USE_GLAMOR */
7046322c902Smrg    {
7056322c902Smrg	struct radeon_exa_pixmap_priv *driver_priv;
7066322c902Smrg
7076322c902Smrg	driver_priv = exaGetPixmapDriverPrivate(pPix);
7086322c902Smrg	if (driver_priv) {
7096322c902Smrg	    uint32_t pitch;
7106322c902Smrg
7116322c902Smrg	    if (driver_priv->bo)
7126322c902Smrg		radeon_bo_unref(driver_priv->bo);
7136322c902Smrg
7146322c902Smrg	    radeon_bo_ref(bo);
7156322c902Smrg	    driver_priv->bo = bo;
7166322c902Smrg
7176322c902Smrg	    if (radeon_bo_get_tiling(bo, &driver_priv->tiling_flags, &pitch) == 0 &&
7186322c902Smrg		pitch != pPix->devKind)
7196322c902Smrg		pScreen->ModifyPixmapHeader(pPix, -1, -1, -1, -1, pitch, NULL);
7206322c902Smrg	}
7216322c902Smrg    }
7226322c902Smrg}
723209ff23fSmrg
7246322c902Smrgstatic inline struct radeon_bo *radeon_get_pixmap_bo(PixmapPtr pPix)
7256322c902Smrg{
7266322c902Smrg#ifdef USE_GLAMOR
7276322c902Smrg    RADEONInfoPtr info = RADEONPTR(xf86ScreenToScrn(pPix->drawable.pScreen));
7286322c902Smrg
7296322c902Smrg    if (info->use_glamor) {
7306322c902Smrg	struct radeon_pixmap *priv;
7316322c902Smrg	priv = radeon_get_pixmap_private(pPix);
7326322c902Smrg	return priv ? priv->bo : NULL;
7336322c902Smrg    } else
7346322c902Smrg#endif
7356322c902Smrg    {
7366322c902Smrg	struct radeon_exa_pixmap_priv *driver_priv;
7376322c902Smrg	driver_priv = exaGetPixmapDriverPrivate(pPix);
7386322c902Smrg	return driver_priv ? driver_priv->bo : NULL;
7396322c902Smrg    }
7406322c902Smrg
7416322c902Smrg    return NULL;
7426322c902Smrg}
743209ff23fSmrg
7446322c902Smrgstatic inline Bool radeon_get_pixmap_shared(PixmapPtr pPix)
7456322c902Smrg{
7466322c902Smrg#ifdef USE_GLAMOR
7476322c902Smrg    RADEONInfoPtr info = RADEONPTR(xf86ScreenToScrn(pPix->drawable.pScreen));
7486322c902Smrg
7496322c902Smrg    if (info->use_glamor) {
7506322c902Smrg        ErrorF("glamor sharing todo\n");
7516322c902Smrg	return FALSE;
7526322c902Smrg    } else
7536322c902Smrg#endif
7546322c902Smrg    {
7556322c902Smrg	struct radeon_exa_pixmap_priv *driver_priv;
7566322c902Smrg	driver_priv = exaGetPixmapDriverPrivate(pPix);
7576322c902Smrg	return driver_priv->shared;
7586322c902Smrg    }
7596322c902Smrg    return FALSE;
7606322c902Smrg}
761209ff23fSmrg
762209ff23fSmrg#define CP_PACKET0(reg, n)						\
763209ff23fSmrg	(RADEON_CP_PACKET0 | ((n) << 16) | ((reg) >> 2))
764209ff23fSmrg#define CP_PACKET1(reg0, reg1)						\
765209ff23fSmrg	(RADEON_CP_PACKET1 | (((reg1) >> 2) << 11) | ((reg0) >> 2))
766209ff23fSmrg#define CP_PACKET2()							\
767209ff23fSmrg	(RADEON_CP_PACKET2)
768209ff23fSmrg#define CP_PACKET3(pkt, n)						\
769209ff23fSmrg	(RADEON_CP_PACKET3 | (pkt) | ((n) << 16))
770209ff23fSmrg
771209ff23fSmrg
772209ff23fSmrg#define RADEON_VERBOSE	0
773209ff23fSmrg
774209ff23fSmrg#define BEGIN_RING(n) do {						\
775209ff23fSmrg    if (RADEON_VERBOSE) {						\
776209ff23fSmrg	xf86DrvMsg(pScrn->scrnIndex, X_INFO,				\
777209ff23fSmrg		   "BEGIN_RING(%d) in %s\n", (unsigned int)n, __FUNCTION__);\
778209ff23fSmrg    }									\
7796322c902Smrg    radeon_ddx_cs_start(pScrn, n, __FILE__, __func__, __LINE__);   \
780209ff23fSmrg} while (0)
781209ff23fSmrg
782209ff23fSmrg#define ADVANCE_RING() do {						\
7836322c902Smrg    radeon_cs_end(info->cs, __FILE__, __func__, __LINE__); \
784ad43ddacSmrg  } while (0)
785209ff23fSmrg
786209ff23fSmrg#define OUT_RING(x) do {						\
787209ff23fSmrg    if (RADEON_VERBOSE) {						\
788209ff23fSmrg	xf86DrvMsg(pScrn->scrnIndex, X_INFO,				\
789209ff23fSmrg		   "   OUT_RING(0x%08x)\n", (unsigned int)(x));		\
790209ff23fSmrg    }									\
7916322c902Smrg    radeon_cs_write_dword(info->cs, (x));		\
792209ff23fSmrg} while (0)
793209ff23fSmrg
794209ff23fSmrg#define OUT_RING_REG(reg, val)						\
795209ff23fSmrgdo {									\
796209ff23fSmrg    OUT_RING(CP_PACKET0(reg, 0));					\
797209ff23fSmrg    OUT_RING(val);							\
798209ff23fSmrg} while (0)
799209ff23fSmrg
800ad43ddacSmrg#define OUT_RING_RELOC(x, read_domains, write_domain)			\
801ad43ddacSmrg  do {									\
802ad43ddacSmrg	int _ret; \
803ad43ddacSmrg    _ret = radeon_cs_write_reloc(info->cs, x, read_domains, write_domain, 0); \
804ad43ddacSmrg	if (_ret) ErrorF("reloc emit failure %d\n", _ret); \
805ad43ddacSmrg  } while(0)
806ad43ddacSmrg
807ad43ddacSmrg
808209ff23fSmrg#define FLUSH_RING()							\
809209ff23fSmrgdo {									\
810209ff23fSmrg    if (RADEON_VERBOSE)							\
811209ff23fSmrg	xf86DrvMsg(pScrn->scrnIndex, X_INFO,				\
812209ff23fSmrg		   "FLUSH_RING in %s\n", __FUNCTION__);			\
8136322c902Smrg    radeon_cs_flush_indirect(pScrn); 				\
814209ff23fSmrg} while (0)
815209ff23fSmrg
816ad43ddacSmrg#define CS_FULL(cs) ((cs)->cdw > 15 * 1024)
817ad43ddacSmrg
818b7e1c893Smrg#define RADEON_SWITCH_TO_2D()						\
819b7e1c893Smrgdo {									\
820b7e1c893Smrg	uint32_t flush = 0;                                             \
821b7e1c893Smrg	switch (info->accel_state->engineMode) {			\
822b7e1c893Smrg	case EXA_ENGINEMODE_UNKNOWN:					\
823b7e1c893Smrg	    flush = 1;                                                  \
824ad43ddacSmrg	    break;							\
825ad43ddacSmrg	case EXA_ENGINEMODE_3D:						\
8266322c902Smrg	    flush = CS_FULL(info->cs);			\
827ad43ddacSmrg	    break;							\
828b7e1c893Smrg	case EXA_ENGINEMODE_2D:						\
8296322c902Smrg	    flush = CS_FULL(info->cs);			\
830b7e1c893Smrg	    break;							\
831b7e1c893Smrg	}								\
832ad43ddacSmrg	if (flush) {							\
8336322c902Smrg	    radeon_cs_flush_indirect(pScrn);			\
834ad43ddacSmrg	}								\
835b7e1c893Smrg        info->accel_state->engineMode = EXA_ENGINEMODE_2D;              \
836b7e1c893Smrg} while (0);
837b7e1c893Smrg
838b7e1c893Smrg#define RADEON_SWITCH_TO_3D()						\
839b7e1c893Smrgdo {									\
840b7e1c893Smrg	uint32_t flush = 0;						\
841b7e1c893Smrg	switch (info->accel_state->engineMode) {			\
842b7e1c893Smrg	case EXA_ENGINEMODE_UNKNOWN:					\
843b7e1c893Smrg	    flush = 1;                                                  \
844ad43ddacSmrg	    break;							\
845ad43ddacSmrg	case EXA_ENGINEMODE_2D:						\
8466322c902Smrg	    flush = CS_FULL(info->cs);	 		\
847ad43ddacSmrg	    break;							\
848b7e1c893Smrg	case EXA_ENGINEMODE_3D:						\
8496322c902Smrg	    flush = CS_FULL(info->cs);			\
850b7e1c893Smrg	    break;							\
851b7e1c893Smrg	}								\
852b7e1c893Smrg	if (flush) {							\
8536322c902Smrg	    radeon_cs_flush_indirect(pScrn);			\
854b7e1c893Smrg	}                                                               \
855ad43ddacSmrg	if (!info->accel_state->XInited3D)				\
856ad43ddacSmrg	    RADEONInit3DEngine(pScrn);                                  \
857b7e1c893Smrg        info->accel_state->engineMode = EXA_ENGINEMODE_3D;              \
858b7e1c893Smrg} while (0);
859b7e1c893Smrg
8606322c902Smrg				/* Memory mapped register access macros */
8616322c902Smrg
8626322c902Smrg#define BEGIN_ACCEL_RELOC(n, r) do {		\
8636322c902Smrg	int _nqw = (n) + (r);	\
8646322c902Smrg	BEGIN_RING(2*_nqw);			\
8656322c902Smrg    } while (0)
8666322c902Smrg
8676322c902Smrg#define EMIT_OFFSET(reg, value, pPix, rd, wd) do {		\
8686322c902Smrg    driver_priv = exaGetPixmapDriverPrivate(pPix);		\
8696322c902Smrg    OUT_RING_REG((reg), (value));				\
8706322c902Smrg    OUT_RING_RELOC(driver_priv->bo, (rd), (wd));			\
8716322c902Smrg    } while(0)
8726322c902Smrg
8736322c902Smrg#define EMIT_READ_OFFSET(reg, value, pPix) EMIT_OFFSET(reg, value, pPix, (RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT), 0)
8746322c902Smrg#define EMIT_WRITE_OFFSET(reg, value, pPix) EMIT_OFFSET(reg, value, pPix, 0, RADEON_GEM_DOMAIN_VRAM)
8756322c902Smrg
8766322c902Smrg#define OUT_TEXTURE_REG(reg, offset, bo) do {   \
8776322c902Smrg    OUT_RING_REG((reg), (offset));                                   \
8786322c902Smrg    OUT_RING_RELOC((bo), RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT, 0); \
8796322c902Smrg  } while(0)
8806322c902Smrg
8816322c902Smrg#define EMIT_COLORPITCH(reg, value, pPix) do {			\
8826322c902Smrg    driver_priv = exaGetPixmapDriverPrivate(pPix);			\
8836322c902Smrg    OUT_RING_REG((reg), value);					\
8846322c902Smrg    OUT_RING_RELOC(driver_priv->bo, 0, RADEON_GEM_DOMAIN_VRAM);		\
8856322c902Smrg} while(0)
886209ff23fSmrg
887209ff23fSmrgstatic __inline__ void RADEON_SYNC(RADEONInfoPtr info, ScrnInfoPtr pScrn)
888209ff23fSmrg{
8896322c902Smrg    if (pScrn->pScreen)
890209ff23fSmrg	exaWaitSync(pScrn->pScreen);
891209ff23fSmrg}
892209ff23fSmrg
8936322c902Smrgenum {
8946322c902Smrg    RADEON_CREATE_PIXMAP_SCANOUT		= 0x02000000,
8956322c902Smrg    RADEON_CREATE_PIXMAP_DRI2			= 0x04000000,
8966322c902Smrg    RADEON_CREATE_PIXMAP_TILING_MICRO_SQUARE	= 0x08000000,
8976322c902Smrg    RADEON_CREATE_PIXMAP_TILING_MACRO		= 0x10000000,
8986322c902Smrg    RADEON_CREATE_PIXMAP_TILING_MICRO		= 0x20000000,
8996322c902Smrg    RADEON_CREATE_PIXMAP_DEPTH			= 0x40000000, /* for r200 */
9006322c902Smrg    RADEON_CREATE_PIXMAP_SZBUFFER		= 0x80000000, /* for eg */
9016322c902Smrg};
902209ff23fSmrg
9036322c902Smrg#define RADEON_CREATE_PIXMAP_TILING_FLAGS	\
9046322c902Smrg    (RADEON_CREATE_PIXMAP_TILING_MICRO_SQUARE |	\
9056322c902Smrg     RADEON_CREATE_PIXMAP_TILING_MACRO |	\
9066322c902Smrg     RADEON_CREATE_PIXMAP_TILING_MICRO |	\
9076322c902Smrg     RADEON_CREATE_PIXMAP_DEPTH |		\
9086322c902Smrg     RADEON_CREATE_PIXMAP_SZBUFFER)
9096322c902Smrg
9106322c902Smrg
9116322c902Smrg/* Compute log base 2 of val. */
9126322c902Smrgstatic __inline__ int
9136322c902SmrgRADEONLog2(int val)
914209ff23fSmrg{
9156322c902Smrg	int bits;
9166322c902Smrg#if (defined __i386__ || defined __x86_64__) && (defined __GNUC__)
9176322c902Smrg	__asm volatile("bsrl	%1, %0"
9186322c902Smrg		: "=r" (bits)
9196322c902Smrg		: "c" (val)
9206322c902Smrg	);
9216322c902Smrg	return bits;
9226322c902Smrg#else
9236322c902Smrg	for (bits = 0; val != 0; val >>= 1, ++bits)
9246322c902Smrg		;
9256322c902Smrg	return bits - 1;
9266322c902Smrg#endif
927209ff23fSmrg}
928209ff23fSmrg
9296322c902Smrg#define RADEON_TILING_MASK				0xff
9306322c902Smrg#define RADEON_TILING_LINEAR				0x0
931ad43ddacSmrg
932209ff23fSmrg#endif /* _RADEON_H_ */
933