1c582b7e3Smrg/*
2c582b7e3Smrg * Copyright 1999, 2000 ATI Technologies Inc., Markham, Ontario,
3c582b7e3Smrg *                      Precision Insight, Inc., Cedar Park, Texas, and
4c582b7e3Smrg *                      VA Linux Systems Inc., Fremont, California.
5c582b7e3Smrg *
6c582b7e3Smrg * All Rights Reserved.
7c582b7e3Smrg *
8c582b7e3Smrg * Permission is hereby granted, free of charge, to any person obtaining
9c582b7e3Smrg * a copy of this software and associated documentation files (the
10c582b7e3Smrg * "Software"), to deal in the Software without restriction, including
11c582b7e3Smrg * without limitation on the rights to use, copy, modify, merge,
12c582b7e3Smrg * publish, distribute, sublicense, and/or sell copies of the Software,
13c582b7e3Smrg * and to permit persons to whom the Software is furnished to do so,
14c582b7e3Smrg * subject to the following conditions:
15c582b7e3Smrg *
16c582b7e3Smrg * The above copyright notice and this permission notice (including the
17c582b7e3Smrg * next paragraph) shall be included in all copies or substantial
18c582b7e3Smrg * portions of the Software.
19c582b7e3Smrg *
20c582b7e3Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21c582b7e3Smrg * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22c582b7e3Smrg * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23c582b7e3Smrg * NON-INFRINGEMENT.  IN NO EVENT SHALL ATI, PRECISION INSIGHT, VA LINUX
24c582b7e3Smrg * SYSTEMS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
25c582b7e3Smrg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
26c582b7e3Smrg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
27c582b7e3Smrg * OTHER DEALINGS IN THE SOFTWARE.
28c582b7e3Smrg */
29c582b7e3Smrg
30c582b7e3Smrg/*
31c582b7e3Smrg * Authors:
32c582b7e3Smrg *   Rickard E. Faith <faith@valinux.com>
33c582b7e3Smrg *   Kevin E. Martin <martin@valinux.com>
34c582b7e3Smrg *
35c582b7e3Smrg */
36c582b7e3Smrg
37c582b7e3Smrg#ifndef _R128_H_
38c582b7e3Smrg#define _R128_H_
39c582b7e3Smrg
40c582b7e3Smrg#include <unistd.h>
41c582b7e3Smrg#include "xf86str.h"
42c582b7e3Smrg
43c582b7e3Smrg				/* PCI support */
44c582b7e3Smrg#include "xf86Pci.h"
45c582b7e3Smrg
4684354367Smrg				/* EXA support */
4784354367Smrg#ifdef USE_EXA
4884354367Smrg#include "exa.h"
4984354367Smrg#endif
5084354367Smrg
51c582b7e3Smrg				/* XAA and Cursor Support */
5284354367Smrg#ifdef HAVE_XAA_H
53c582b7e3Smrg#include "xaa.h"
5484354367Smrg#endif
5584354367Smrg#include "xf86fbman.h"
56c582b7e3Smrg#include "xf86Cursor.h"
57c582b7e3Smrg
58c582b7e3Smrg				/* DDC support */
59c582b7e3Smrg#include "xf86DDC.h"
60c582b7e3Smrg
61c582b7e3Smrg				/* Xv support */
62c582b7e3Smrg#include "xf86xv.h"
63c582b7e3Smrg
64c582b7e3Smrg				/* DRI support */
6584354367Smrg#ifndef XF86DRI
6684354367Smrg#undef R128DRI
6784354367Smrg#endif
6884354367Smrg
6984354367Smrg#if R128DRI
70c582b7e3Smrg#define _XF86DRI_SERVER_
71c582b7e3Smrg#include "r128_dripriv.h"
72c582b7e3Smrg#include "dri.h"
73c582b7e3Smrg#endif
74c582b7e3Smrg
7584354367Smrg#include "fb.h"
76b3ff493bSmrg#include "xf86Crtc.h"
7784354367Smrg
7884354367Smrg#include "compat-api.h"
79c582b7e3Smrg#include "atipcirename.h"
80c582b7e3Smrg
8184354367Smrg#include "r128_probe.h"
8284354367Smrg
8384354367Smrg#if HAVE_BYTESWAP_H
8484354367Smrg#include <byteswap.h>
8584354367Smrg#elif defined(USE_SYS_ENDIAN_H)
8684354367Smrg#include <sys/endian.h>
8784354367Smrg#else
8884354367Smrg#define bswap_16(value)  \
8984354367Smrg        ((((value) & 0xff) << 8) | ((value) >> 8))
9084354367Smrg
9184354367Smrg#define bswap_32(value) \
9284354367Smrg        (((uint32_t)bswap_16((uint16_t)((value) & 0xffff)) << 16) | \
9384354367Smrg        (uint32_t)bswap_16((uint16_t)((value) >> 16)))
9484354367Smrg
9584354367Smrg#define bswap_64(value) \
9684354367Smrg        (((uint64_t)bswap_32((uint32_t)((value) & 0xffffffff)) \
9784354367Smrg            << 32) | \
9884354367Smrg        (uint64_t)bswap_32((uint32_t)((value) >> 32)))
9984354367Smrg#endif
10084354367Smrg
10184354367Smrg#if X_BYTE_ORDER == X_BIG_ENDIAN
10284354367Smrg#define le32_to_cpu(x) bswap_32(x)
10384354367Smrg#define le16_to_cpu(x) bswap_16(x)
10484354367Smrg#define cpu_to_le32(x) bswap_32(x)
10584354367Smrg#define cpu_to_le16(x) bswap_16(x)
10684354367Smrg#else
10784354367Smrg#define le32_to_cpu(x) (x)
10884354367Smrg#define le16_to_cpu(x) (x)
10984354367Smrg#define cpu_to_le32(x) (x)
11084354367Smrg#define cpu_to_le16(x) (x)
11184354367Smrg#endif
11284354367Smrg
113c582b7e3Smrg#define R128_DEBUG          0   /* Turn off debugging output               */
114c582b7e3Smrg#define R128_IDLE_RETRY    32   /* Fall out of idle loops after this count */
115c582b7e3Smrg#define R128_TIMEOUT  2000000   /* Fall out of wait loops after this count */
116c582b7e3Smrg#define R128_MMIOSIZE  0x4000
117c582b7e3Smrg
118c582b7e3Smrg#define R128_VBIOS_SIZE 0x00010000
1199e881af1Smacallan#define R128_NAME "R128"
120c582b7e3Smrg
121c582b7e3Smrg#if R128_DEBUG
12284354367Smrg#include "r128_version.h"
12384354367Smrg
12481f79626Smrg#endif
12581f79626Smrg
12681f79626Smrg#if R128_DEBUG
12781f79626Smrg#define DEBUG(x) x
12881f79626Smrg
129c582b7e3Smrg#else
13081f79626Smrg#define DEBUG(x)
13181f79626Smrg
132c582b7e3Smrg#endif
133c582b7e3Smrg
134c582b7e3Smrg
135c582b7e3Smrg/* Other macros */
136c582b7e3Smrg#define R128_ARRAY_SIZE(x)  (sizeof(x)/sizeof(x[0]))
137c582b7e3Smrg#define R128_ALIGN(x,bytes) (((x) + ((bytes) - 1)) & ~((bytes) - 1))
138c582b7e3Smrg#define R128PTR(pScrn) ((R128InfoPtr)(pScrn)->driverPrivate)
139c582b7e3Smrg
140b3ff493bSmrg#define R128_BIOS8(v)  ((info->VBIOS[(v)]))
141b3ff493bSmrg#define R128_BIOS16(v) ((info->VBIOS[(v)])           | \
142b3ff493bSmrg			(info->VBIOS[(v) + 1] << 8))
143b3ff493bSmrg#define R128_BIOS32(v) ((info->VBIOS[(v)])           | \
144b3ff493bSmrg			(info->VBIOS[(v) + 1] << 8)  | \
145b3ff493bSmrg			(info->VBIOS[(v) + 2] << 16) | \
146b3ff493bSmrg			(info->VBIOS[(v) + 3] << 24))
147b3ff493bSmrg
148c582b7e3Smrgtypedef struct {        /* All values in XCLKS    */
149c582b7e3Smrg    int  ML;            /* Memory Read Latency    */
150c582b7e3Smrg    int  MB;            /* Memory Burst Length    */
151c582b7e3Smrg    int  Trcd;          /* RAS to CAS delay       */
152c582b7e3Smrg    int  Trp;           /* RAS percentage         */
153c582b7e3Smrg    int  Twr;           /* Write Recovery         */
154c582b7e3Smrg    int  CL;            /* CAS Latency            */
155c582b7e3Smrg    int  Tr2w;          /* Read to Write Delay    */
156c582b7e3Smrg    int  Rloop;         /* Loop Latency           */
157c582b7e3Smrg    int  Rloop_fudge;   /* Add to ML to get Rloop */
158e8b4ed9fSmrg    const char *name;
159c582b7e3Smrg} R128RAMRec, *R128RAMPtr;
160c582b7e3Smrg
161c582b7e3Smrgtypedef struct {
162c582b7e3Smrg				/* Common registers */
163b3ff493bSmrg    uint32_t   ovr_clr;
164b3ff493bSmrg    uint32_t   ovr_wid_left_right;
165b3ff493bSmrg    uint32_t   ovr_wid_top_bottom;
166b3ff493bSmrg    uint32_t   ov0_scale_cntl;
167b3ff493bSmrg    uint32_t   mpp_tb_config;
168b3ff493bSmrg    uint32_t   mpp_gp_config;
169b3ff493bSmrg    uint32_t   subpic_cntl;
170b3ff493bSmrg    uint32_t   viph_control;
171b3ff493bSmrg    uint32_t   i2c_cntl_1;
172b3ff493bSmrg    uint32_t   gen_int_cntl;
173b3ff493bSmrg    uint32_t   cap0_trig_cntl;
174b3ff493bSmrg    uint32_t   cap1_trig_cntl;
175b3ff493bSmrg    uint32_t   bus_cntl;
176b3ff493bSmrg    uint32_t   config_cntl;
177c582b7e3Smrg
178c582b7e3Smrg				/* Other registers to save for VT switches */
179b3ff493bSmrg    uint32_t   dp_datatype;
180b3ff493bSmrg    uint32_t   gen_reset_cntl;
181b3ff493bSmrg    uint32_t   clock_cntl_index;
182b3ff493bSmrg    uint32_t   amcgpio_en_reg;
183b3ff493bSmrg    uint32_t   amcgpio_mask;
184c582b7e3Smrg
185c582b7e3Smrg				/* CRTC registers */
186b3ff493bSmrg    uint32_t   crtc_gen_cntl;
187b3ff493bSmrg    uint32_t   crtc_ext_cntl;
188b3ff493bSmrg    uint32_t   dac_cntl;
189b3ff493bSmrg    uint32_t   crtc_h_total_disp;
190b3ff493bSmrg    uint32_t   crtc_h_sync_strt_wid;
191b3ff493bSmrg    uint32_t   crtc_v_total_disp;
192b3ff493bSmrg    uint32_t   crtc_v_sync_strt_wid;
193b3ff493bSmrg    uint32_t   crtc_offset;
194b3ff493bSmrg    uint32_t   crtc_offset_cntl;
195b3ff493bSmrg    uint32_t   crtc_pitch;
196c582b7e3Smrg
197c582b7e3Smrg				/* CRTC2 registers */
198b3ff493bSmrg    uint32_t   crtc2_gen_cntl;
199b3ff493bSmrg    uint32_t   crtc2_h_total_disp;
200b3ff493bSmrg    uint32_t   crtc2_h_sync_strt_wid;
201b3ff493bSmrg    uint32_t   crtc2_v_total_disp;
202b3ff493bSmrg    uint32_t   crtc2_v_sync_strt_wid;
203b3ff493bSmrg    uint32_t   crtc2_offset;
204b3ff493bSmrg    uint32_t   crtc2_offset_cntl;
205b3ff493bSmrg    uint32_t   crtc2_pitch;
206c582b7e3Smrg
207c582b7e3Smrg				/* Flat panel registers */
208b3ff493bSmrg    uint32_t   fp_crtc_h_total_disp;
209b3ff493bSmrg    uint32_t   fp_crtc_v_total_disp;
210b3ff493bSmrg    uint32_t   fp_gen_cntl;
211b3ff493bSmrg    uint32_t   fp_h_sync_strt_wid;
212b3ff493bSmrg    uint32_t   fp_horz_stretch;
213b3ff493bSmrg    uint32_t   fp_panel_cntl;
214b3ff493bSmrg    uint32_t   fp_v_sync_strt_wid;
215b3ff493bSmrg    uint32_t   fp_vert_stretch;
216b3ff493bSmrg    uint32_t   lvds_gen_cntl;
217b3ff493bSmrg    uint32_t   tmds_crc;
218b3ff493bSmrg    uint32_t   tmds_transmitter_cntl;
219c582b7e3Smrg
220c582b7e3Smrg				/* Computed values for PLL */
221b3ff493bSmrg    uint32_t   dot_clock_freq;
222b3ff493bSmrg    uint32_t   pll_output_freq;
223c582b7e3Smrg    int        feedback_div;
224c582b7e3Smrg    int        post_div;
225c582b7e3Smrg
226c582b7e3Smrg				/* PLL registers */
227b3ff493bSmrg    uint32_t   ppll_ref_div;
228b3ff493bSmrg    uint32_t   ppll_div_3;
229b3ff493bSmrg    uint32_t   ppll_div_0;
230b3ff493bSmrg    uint32_t   htotal_cntl;
231c582b7e3Smrg
232c582b7e3Smrg				/* Computed values for PLL2 */
233b3ff493bSmrg    uint32_t   dot_clock_freq_2;
234b3ff493bSmrg    uint32_t   pll_output_freq_2;
235c582b7e3Smrg    int        feedback_div_2;
236c582b7e3Smrg    int        post_div_2;
237c582b7e3Smrg
238c582b7e3Smrg				/* PLL2 registers */
239b3ff493bSmrg    uint32_t   p2pll_ref_div;
240b3ff493bSmrg    uint32_t   p2pll_div_0;
241b3ff493bSmrg    uint32_t   htotal_cntl2;
242c582b7e3Smrg
243c582b7e3Smrg				/* DDA register */
244b3ff493bSmrg    uint32_t   dda_config;
245b3ff493bSmrg    uint32_t   dda_on_off;
246c582b7e3Smrg
247c582b7e3Smrg				/* DDA2 register */
248b3ff493bSmrg    uint32_t   dda2_config;
249b3ff493bSmrg    uint32_t   dda2_on_off;
250c582b7e3Smrg
251c582b7e3Smrg				/* Pallet */
252c582b7e3Smrg    Bool       palette_valid;
253b3ff493bSmrg    uint32_t   palette[256];
254b3ff493bSmrg    uint32_t   palette2[256];
255c582b7e3Smrg} R128SaveRec, *R128SavePtr;
256c582b7e3Smrg
257c582b7e3Smrgtypedef struct {
258b3ff493bSmrg    uint16_t      reference_freq;
259b3ff493bSmrg    uint16_t      reference_div;
260c582b7e3Smrg    unsigned      min_pll_freq;
261c582b7e3Smrg    unsigned      max_pll_freq;
262b3ff493bSmrg    uint16_t      xclk;
263c582b7e3Smrg} R128PLLRec, *R128PLLPtr;
264c582b7e3Smrg
265c582b7e3Smrgtypedef struct {
266c582b7e3Smrg    int                bitsPerPixel;
267c582b7e3Smrg    int                depth;
268c582b7e3Smrg    int                displayWidth;
269c582b7e3Smrg    int                pixel_code;
270c582b7e3Smrg    int                pixel_bytes;
271c582b7e3Smrg    DisplayModePtr     mode;
272c582b7e3Smrg} R128FBLayout;
273c582b7e3Smrg
27484354367Smrg#ifdef USE_EXA
27584354367Smrgstruct r128_2d_state {
27684354367Smrg    Bool in_use;
27784354367Smrg    Bool composite_setup;
27884354367Smrg    uint32_t dst_pitch_offset;
27984354367Smrg    uint32_t src_pitch_offset;
28084354367Smrg    uint32_t dp_gui_master_cntl;
28184354367Smrg    uint32_t dp_cntl;
28284354367Smrg    uint32_t dp_write_mask;
28384354367Smrg    uint32_t dp_brush_frgd_clr;
28484354367Smrg    uint32_t dp_brush_bkgd_clr;
28584354367Smrg    uint32_t dp_src_frgd_clr;
28684354367Smrg    uint32_t dp_src_bkgd_clr;
28784354367Smrg    uint32_t default_sc_bottom_right;
28884354367Smrg#if defined(R128DRI) && defined(RENDER)
28984354367Smrg    Bool has_mask;
29084354367Smrg    int x_offset;
29184354367Smrg    int y_offset;
29284354367Smrg    int widths[2];
29384354367Smrg    int heights[2];
29484354367Smrg    Bool is_transform[2];
29584354367Smrg    PictTransform *transform[2];
29684354367Smrg    PixmapPtr src_pix;
29784354367Smrg    PixmapPtr msk_pix;
29884354367Smrg#endif
29984354367Smrg};
30084354367Smrg#endif
30184354367Smrg
302c582b7e3Smrgtypedef struct {
303c582b7e3Smrg    EntityInfoPtr     pEnt;
304c582b7e3Smrg    pciVideoPtr       PciInfo;
305b3ff493bSmrg#ifndef XSERVER_LIBPCIACCESS
306c582b7e3Smrg    PCITAG            PciTag;
307b3ff493bSmrg#endif
308c582b7e3Smrg    int               Chipset;
309c582b7e3Smrg
31079e5230eSmacallan#ifndef AVOID_FBDEV
311c582b7e3Smrg    Bool              FBDev;
31279e5230eSmacallan#endif
313c582b7e3Smrg
314e1efbb8aSmacallan#ifdef __NetBSD__
315e1efbb8aSmacallan    Bool	      HaveWSDisplay;
316e1efbb8aSmacallan    Bool	      HaveBacklightControl;
317e1efbb8aSmacallan#endif
318c582b7e3Smrg    unsigned long     LinearAddr;   /* Frame buffer physical address         */
319c582b7e3Smrg    unsigned long     MMIOAddr;     /* MMIO region physical address          */
320c582b7e3Smrg    unsigned long     BIOSAddr;     /* BIOS physical address                 */
321c582b7e3Smrg
322c582b7e3Smrg    void              *MMIO;        /* Map of MMIO region                    */
323c582b7e3Smrg    void              *FB;          /* Map of frame buffer                   */
324b3ff493bSmrg    uint8_t           *VBIOS;       /* Video BIOS for mode validation on FPs */
325b3ff493bSmrg    int               FPBIOSstart;  /* Start of the flat panel info          */
326c582b7e3Smrg
327b3ff493bSmrg    uint32_t          MemCntl;
328b3ff493bSmrg    uint32_t          BusCntl;
329c582b7e3Smrg    unsigned long     FbMapSize;    /* Size of frame buffer, in bytes        */
330c582b7e3Smrg    Bool              HasPanelRegs; /* Current chip can connect to a FP      */
331c582b7e3Smrg
332c582b7e3Smrg    R128PLLRec        pll;
333c582b7e3Smrg    R128RAMPtr        ram;
334c582b7e3Smrg
335c582b7e3Smrg    R128SaveRec       SavedReg;     /* Original (text) mode                  */
336c582b7e3Smrg    R128SaveRec       ModeReg;      /* Current mode                          */
33784354367Smrg    Bool              (*CloseScreen)(CLOSE_SCREEN_ARGS_DECL);
33884354367Smrg    void              (*BlockHandler)(BLOCKHANDLER_ARGS_DECL);
339c582b7e3Smrg
340c582b7e3Smrg    Bool              PaletteSavedOnVT; /* Palette saved on last VT switch   */
341c582b7e3Smrg
34284354367Smrg#ifdef HAVE_XAA_H
343c582b7e3Smrg    XAAInfoRecPtr     accel;
34484354367Smrg#endif
34581f79626Smrg
34681f79626Smrg    Bool              noAccel;
347c582b7e3Smrg    Bool              accelOn;
34884354367Smrg    Bool	      useEXA;
34984354367Smrg    Bool	      RenderAccel;
35084354367Smrg#ifdef USE_EXA
35184354367Smrg    ExaDriverPtr      ExaDriver;
35284354367Smrg    XF86ModReqInfo    exaReq;
35384354367Smrg    struct r128_2d_state state_2d;
35484354367Smrg#endif
35584354367Smrg
356c582b7e3Smrg    int               fifo_slots;   /* Free slots in the FIFO (64 max)       */
357c582b7e3Smrg    int               pix24bpp;     /* Depth of pixmap for 24bpp framebuffer */
358c582b7e3Smrg    Bool              dac6bits;     /* Use 6 bit DAC?                        */
35981f79626Smrg    Bool              swCursor;
360c582b7e3Smrg
361c582b7e3Smrg				/* Computed values for Rage 128 */
362c582b7e3Smrg    int               pitch;
363c582b7e3Smrg    int               datatype;
364b3ff493bSmrg    uint32_t          dp_gui_master_cntl;
365c582b7e3Smrg
366c582b7e3Smrg				/* Saved values for ScreenToScreenCopy */
367c582b7e3Smrg    int               xdir;
368c582b7e3Smrg    int               ydir;
369c582b7e3Smrg
370c582b7e3Smrg				/* ScanlineScreenToScreenColorExpand support */
371c582b7e3Smrg    unsigned char     *scratch_buffer[1];
372c582b7e3Smrg    unsigned char     *scratch_save;
373c582b7e3Smrg    int               scanline_x;
374c582b7e3Smrg    int               scanline_y;
375c582b7e3Smrg    int               scanline_w;
376c582b7e3Smrg    int               scanline_h;
37784354367Smrg#ifdef R128DRI
378c582b7e3Smrg    int               scanline_hpass;
379c582b7e3Smrg    int               scanline_x1clip;
380c582b7e3Smrg    int               scanline_x2clip;
381c582b7e3Smrg    int               scanline_rop;
382c582b7e3Smrg    int               scanline_fg;
383c582b7e3Smrg    int               scanline_bg;
38484354367Smrg#endif /* R128DRI */
385c582b7e3Smrg    int               scanline_words;
386c582b7e3Smrg    int               scanline_direct;
387c582b7e3Smrg    int               scanline_bpp; /* Only used for ImageWrite */
388c582b7e3Smrg
389c582b7e3Smrg    R128FBLayout      CurrentLayout;
39084354367Smrg#ifdef R128DRI
391c582b7e3Smrg    Bool              directRenderingEnabled;
392c582b7e3Smrg    DRIInfoPtr        pDRIInfo;
393c582b7e3Smrg    int               drmFD;
394b3ff493bSmrg    drm_context_t     drmCtx;
395c582b7e3Smrg
396b3ff493bSmrg    drm_handle_t      fbHandle;
397c582b7e3Smrg
398c582b7e3Smrg    drmSize           registerSize;
399b3ff493bSmrg    drm_handle_t      registerHandle;
400c582b7e3Smrg
401c582b7e3Smrg    Bool              IsPCI;            /* Current card is a PCI card */
402c582b7e3Smrg    drmSize           pciSize;
403b3ff493bSmrg    drm_handle_t      pciMemHandle;
404c582b7e3Smrg    drmAddress        PCI;              /* Map */
405c582b7e3Smrg
406c582b7e3Smrg    Bool              allowPageFlip;    /* Enable 3d page flipping */
407c582b7e3Smrg    Bool              have3DWindows;    /* Are there any 3d clients? */
408c582b7e3Smrg    int               drmMinor;
409c582b7e3Smrg
410c582b7e3Smrg    drmSize           agpSize;
411b3ff493bSmrg    drm_handle_t      agpMemHandle;     /* Handle from drmAgpAlloc */
412c582b7e3Smrg    unsigned long     agpOffset;
413c582b7e3Smrg    drmAddress        AGP;              /* Map */
414c582b7e3Smrg    int               agpMode;
415c582b7e3Smrg
416c582b7e3Smrg    Bool              CCEInUse;         /* CCE is currently active */
417c582b7e3Smrg    int               CCEMode;          /* CCE mode that server/clients use */
418c582b7e3Smrg    int               CCEFifoSize;      /* Size of the CCE command FIFO */
419c582b7e3Smrg    Bool              CCESecure;        /* CCE security enabled */
420c582b7e3Smrg    int               CCEusecTimeout;   /* CCE timeout in usecs */
421c582b7e3Smrg
422c582b7e3Smrg				/* CCE ring buffer data */
423c582b7e3Smrg    unsigned long     ringStart;        /* Offset into AGP space */
424b3ff493bSmrg    drm_handle_t      ringHandle;       /* Handle from drmAddMap */
425c582b7e3Smrg    drmSize           ringMapSize;      /* Size of map */
426c582b7e3Smrg    int               ringSize;         /* Size of ring (in MB) */
427c582b7e3Smrg    drmAddress        ring;             /* Map */
428c582b7e3Smrg    int               ringSizeLog2QW;
429c582b7e3Smrg
430c582b7e3Smrg    unsigned long     ringReadOffset;   /* Offset into AGP space */
431b3ff493bSmrg    drm_handle_t      ringReadPtrHandle;/* Handle from drmAddMap */
432c582b7e3Smrg    drmSize           ringReadMapSize;  /* Size of map */
433c582b7e3Smrg    drmAddress        ringReadPtr;      /* Map */
434c582b7e3Smrg
435c582b7e3Smrg				/* CCE vertex/indirect buffer data */
436c582b7e3Smrg    unsigned long     bufStart;        /* Offset into AGP space */
437b3ff493bSmrg    drm_handle_t      bufHandle;       /* Handle from drmAddMap */
438c582b7e3Smrg    drmSize           bufMapSize;      /* Size of map */
439c582b7e3Smrg    int               bufSize;         /* Size of buffers (in MB) */
440c582b7e3Smrg    drmAddress        buf;             /* Map */
441c582b7e3Smrg    int               bufNumBufs;      /* Number of buffers */
442c582b7e3Smrg    drmBufMapPtr      buffers;         /* Buffer map */
443c582b7e3Smrg
444c582b7e3Smrg				/* CCE AGP Texture data */
445c582b7e3Smrg    unsigned long     agpTexStart;      /* Offset into AGP space */
446b3ff493bSmrg    drm_handle_t      agpTexHandle;     /* Handle from drmAddMap */
447c582b7e3Smrg    drmSize           agpTexMapSize;    /* Size of map */
448c582b7e3Smrg    int               agpTexSize;       /* Size of AGP tex space (in MB) */
449c582b7e3Smrg    drmAddress        agpTex;           /* Map */
450c582b7e3Smrg    int               log2AGPTexGran;
451c582b7e3Smrg
452e8b4ed9fSmrg				/* CCE 2D acceleration */
453c582b7e3Smrg    drmBufPtr         indirectBuffer;
454c582b7e3Smrg    int               indirectStart;
455c582b7e3Smrg
456c582b7e3Smrg				/* DRI screen private data */
457c582b7e3Smrg    int               fbX;
458c582b7e3Smrg    int               fbY;
459c582b7e3Smrg    int               backX;
460c582b7e3Smrg    int               backY;
461c582b7e3Smrg    int               depthX;
462c582b7e3Smrg    int               depthY;
463c582b7e3Smrg
464c582b7e3Smrg    int               frontOffset;
465c582b7e3Smrg    int               frontPitch;
466c582b7e3Smrg    int               backOffset;
467c582b7e3Smrg    int               backPitch;
468c582b7e3Smrg    int               depthOffset;
469c582b7e3Smrg    int               depthPitch;
470c582b7e3Smrg    int               spanOffset;
471c582b7e3Smrg    int               textureOffset;
472c582b7e3Smrg    int               textureSize;
473c582b7e3Smrg    int               log2TexGran;
474c582b7e3Smrg
475c582b7e3Smrg				/* Saved scissor values */
476b3ff493bSmrg    uint32_t          sc_left;
477b3ff493bSmrg    uint32_t          sc_right;
478b3ff493bSmrg    uint32_t          sc_top;
479b3ff493bSmrg    uint32_t          sc_bottom;
480c582b7e3Smrg
481b3ff493bSmrg    uint32_t          re_top_left;
482b3ff493bSmrg    uint32_t          re_width_height;
483c582b7e3Smrg
484b3ff493bSmrg    uint32_t          aux_sc_cntl;
485c582b7e3Smrg
486c582b7e3Smrg    int               irq;
487b3ff493bSmrg    uint32_t          gen_int_cntl;
488c582b7e3Smrg
489c582b7e3Smrg    Bool              DMAForXv;
490c582b7e3Smrg#endif
491c582b7e3Smrg
492c582b7e3Smrg    XF86VideoAdaptorPtr adaptor;
493c582b7e3Smrg    void              (*VideoTimerCallback)(ScrnInfoPtr, Time);
494c582b7e3Smrg    int               videoKey;
495c582b7e3Smrg    Bool              showCache;
496c582b7e3Smrg    OptionInfoPtr     Options;
497c582b7e3Smrg
498c582b7e3Smrg    Bool              isDFP;
499c582b7e3Smrg    Bool              isPro2;
500b3ff493bSmrg    Bool              SwitchingMode;
501b3ff493bSmrg    Bool              DDC;
502c582b7e3Smrg
503c582b7e3Smrg    Bool              VGAAccess;
504c582b7e3Smrg} R128InfoRec, *R128InfoPtr;
505c582b7e3Smrg
506c582b7e3Smrg#define R128WaitForFifo(pScrn, entries)                                      \
507c582b7e3Smrgdo {                                                                         \
508c582b7e3Smrg    if (info->fifo_slots < entries) R128WaitForFifoFunction(pScrn, entries); \
509c582b7e3Smrg    info->fifo_slots -= entries;                                             \
510c582b7e3Smrg} while (0)
511c582b7e3Smrg
51281f79626Smrg/* Compute n/d with rounding. */
51381f79626Smrgstatic inline int R128Div(int n, int d)
51481f79626Smrg{
51581f79626Smrg    return (n + (d / 2)) / d;
51681f79626Smrg}
51781f79626Smrg
518c582b7e3Smrgextern R128EntPtr R128EntPriv(ScrnInfoPtr pScrn);
519c582b7e3Smrgextern void        R128WaitForFifoFunction(ScrnInfoPtr pScrn, int entries);
520c582b7e3Smrgextern void        R128WaitForIdle(ScrnInfoPtr pScrn);
521c582b7e3Smrgextern void        R128EngineReset(ScrnInfoPtr pScrn);
522c582b7e3Smrgextern void        R128EngineFlush(ScrnInfoPtr pScrn);
523c582b7e3Smrg
524c582b7e3Smrgextern unsigned    R128INPLL(ScrnInfoPtr pScrn, int addr);
525c582b7e3Smrgextern void        R128WaitForVerticalSync(ScrnInfoPtr pScrn);
526c582b7e3Smrg
52781f79626Smrgextern Bool R128XAAAccelInit(ScreenPtr pScreen);
528c582b7e3Smrgextern void        R128EngineInit(ScrnInfoPtr pScrn);
529c582b7e3Smrgextern Bool        R128CursorInit(ScreenPtr pScreen);
530c582b7e3Smrg
531c582b7e3Smrgextern int         R128MinBits(int val);
532b3ff493bSmrgextern xf86OutputPtr R128FirstOutput(xf86CrtcPtr crtc);
533c582b7e3Smrg
534c582b7e3Smrgextern void        R128InitVideo(ScreenPtr pScreen);
535c582b7e3Smrg
536b3ff493bSmrgextern void        R128InitCommonRegisters(R128SavePtr save, R128InfoPtr info);
537b3ff493bSmrgextern void        R128InitRMXRegisters(R128SavePtr orig, R128SavePtr save, xf86OutputPtr output, DisplayModePtr mode);
538b3ff493bSmrgextern void        R128InitFPRegisters(R128SavePtr orig, R128SavePtr save, xf86OutputPtr output);
539b3ff493bSmrgextern void        R128InitLVDSRegisters(R128SavePtr orig, R128SavePtr save, xf86OutputPtr output);
540b3ff493bSmrgextern void        R128RestoreCommonRegisters(ScrnInfoPtr pScrn, R128SavePtr restore);
541b3ff493bSmrgextern void        R128RestoreDACRegisters(ScrnInfoPtr pScrn, R128SavePtr restore);
542b3ff493bSmrgextern void        R128RestoreRMXRegisters(ScrnInfoPtr pScrn, R128SavePtr restore);
543b3ff493bSmrgextern void        R128RestoreFPRegisters(ScrnInfoPtr pScrn, R128SavePtr restore);
544b3ff493bSmrgextern void        R128RestoreLVDSRegisters(ScrnInfoPtr pScrn, R128SavePtr restore);
545b3ff493bSmrgextern void        R128RestoreCrtcRegisters(ScrnInfoPtr pScrn, R128SavePtr restore);
546b3ff493bSmrgextern void        R128RestorePLLRegisters(ScrnInfoPtr pScrn, R128SavePtr restore);
547b3ff493bSmrgextern void        R128RestoreDDARegisters(ScrnInfoPtr pScrn, R128SavePtr restore);
548b3ff493bSmrgextern void        R128RestoreCrtc2Registers(ScrnInfoPtr pScrn, R128SavePtr restore);
549b3ff493bSmrgextern void        R128RestorePLL2Registers(ScrnInfoPtr pScrn, R128SavePtr restore);
550b3ff493bSmrgextern void        R128RestoreDDA2Registers(ScrnInfoPtr pScrn, R128SavePtr restore);
551b3ff493bSmrg
552b3ff493bSmrgextern void        r128_crtc_set_cursor_colors(xf86CrtcPtr crtc, int bg, int fg);
553b3ff493bSmrgextern void        r128_crtc_set_cursor_position(xf86CrtcPtr crtc, int x, int y);
554b3ff493bSmrgextern void        r128_crtc_show_cursor(xf86CrtcPtr crtc);
555b3ff493bSmrgextern void        r128_crtc_hide_cursor(xf86CrtcPtr crtc);
556b3ff493bSmrgextern void        r128_crtc_load_cursor_image(xf86CrtcPtr crtc, unsigned char *src);
557b3ff493bSmrg
558b3ff493bSmrgextern uint32_t    R128AllocateMemory(ScrnInfoPtr pScrn, void **mem_struct, int size, int align, Bool need_accel);
559b3ff493bSmrgextern Bool        R128SetupConnectors(ScrnInfoPtr pScrn);
560b3ff493bSmrgextern Bool        R128AllocateControllers(ScrnInfoPtr pScrn);
561b3ff493bSmrgextern void        R128GetPanelInfoFromBIOS(xf86OutputPtr output);
562b3ff493bSmrgextern void        R128Blank(ScrnInfoPtr pScrn);
563b3ff493bSmrgextern void        R128Unblank(ScrnInfoPtr pScrn);
564b3ff493bSmrgextern void        R128DPMSSetOn(xf86OutputPtr output);
565b3ff493bSmrgextern void        R128DPMSSetOff(xf86OutputPtr output);
566b3ff493bSmrgextern ModeStatus     R128DoValidMode(xf86OutputPtr output, DisplayModePtr mode, int flags);
567b3ff493bSmrgextern DisplayModePtr R128ProbeOutputModes(xf86OutputPtr output);
568b3ff493bSmrg
56984354367Smrg#ifdef R128DRI
570c582b7e3Smrgextern Bool        R128DRIScreenInit(ScreenPtr pScreen);
571c582b7e3Smrgextern void        R128DRICloseScreen(ScreenPtr pScreen);
572c582b7e3Smrgextern Bool        R128DRIFinishScreenInit(ScreenPtr pScreen);
573c582b7e3Smrg
574c582b7e3Smrg#define R128CCE_START(pScrn, info)					\
575c582b7e3Smrgdo {									\
576c582b7e3Smrg    int _ret = drmCommandNone(info->drmFD, DRM_R128_CCE_START);		\
577c582b7e3Smrg    if (_ret) {								\
578c582b7e3Smrg	xf86DrvMsg(pScrn->scrnIndex, X_ERROR,				\
579c582b7e3Smrg		   "%s: CCE start %d\n", __FUNCTION__, _ret);		\
580c582b7e3Smrg    }									\
581c582b7e3Smrg} while (0)
582c582b7e3Smrg
583c582b7e3Smrg#define R128CCE_STOP(pScrn, info)					\
584c582b7e3Smrgdo {									\
585c582b7e3Smrg    int _ret = R128CCEStop(pScrn);					\
586c582b7e3Smrg    if (_ret) {								\
587c582b7e3Smrg	xf86DrvMsg(pScrn->scrnIndex, X_ERROR,				\
588c582b7e3Smrg		   "%s: CCE stop %d\n", __FUNCTION__, _ret);		\
589c582b7e3Smrg    }									\
590c582b7e3Smrg} while (0)
591c582b7e3Smrg
592c582b7e3Smrg#define R128CCE_RESET(pScrn, info)					\
593c582b7e3Smrgdo {									\
594c582b7e3Smrg    if (info->directRenderingEnabled					\
595c582b7e3Smrg	&& R128CCE_USE_RING_BUFFER(info->CCEMode)) {			\
596c582b7e3Smrg	int _ret = drmCommandNone(info->drmFD, DRM_R128_CCE_RESET);	\
597c582b7e3Smrg	if (_ret) {							\
598c582b7e3Smrg	    xf86DrvMsg(pScrn->scrnIndex, X_ERROR,			\
599c582b7e3Smrg		       "%s: CCE reset %d\n", __FUNCTION__, _ret);	\
600c582b7e3Smrg	}								\
601c582b7e3Smrg    }									\
602c582b7e3Smrg} while (0)
603c582b7e3Smrg
604c582b7e3Smrgextern drmBufPtr   R128CCEGetBuffer(ScrnInfoPtr pScrn);
605c582b7e3Smrg#endif
606c582b7e3Smrg
607c582b7e3Smrgextern void        R128CCEFlushIndirect(ScrnInfoPtr pScrn, int discard);
608c582b7e3Smrgextern void        R128CCEReleaseIndirect(ScrnInfoPtr pScrn);
609c582b7e3Smrgextern void        R128CCEWaitForIdle(ScrnInfoPtr pScrn);
610c582b7e3Smrgextern int         R128CCEStop(ScrnInfoPtr pScrn);
611a0e1ef58Smrgextern void	   R128CopySwap(uint8_t *dst, uint8_t *src, unsigned int size, int swap);
612c582b7e3Smrg
61384354367Smrg#ifdef USE_EXA
61481f79626Smrgextern Bool	   R128EXAInit(ScreenPtr pScreen, int total);
61584354367Smrgextern Bool	   R128GetDatatypeBpp(int bpp, uint32_t *type);
61684354367Smrgextern Bool	   R128GetPixmapOffsetPitch(PixmapPtr pPix, uint32_t *pitch_offset);
61784354367Smrgextern void	   R128DoPrepareCopy(ScrnInfoPtr pScrn, uint32_t src_pitch_offset,
61884354367Smrg				    uint32_t dst_pitch_offset, uint32_t datatype, int alu, Pixel planemask);
61981f79626Smrgextern void R128Done(PixmapPtr pPixmap);
62081f79626Smrg
62181f79626Smrg#ifdef R128DRI
62281f79626Smrgextern void EmitCCE2DState(ScrnInfoPtr pScrn);
62381f79626Smrg#endif
62481f79626Smrg
62581f79626Smrg#ifdef RENDER
62681f79626Smrgextern Bool R128CCECheckComposite(int op,
62781f79626Smrg                                    PicturePtr pSrcPicture,
62881f79626Smrg                                    PicturePtr pMaskPicture,
62981f79626Smrg                                    PicturePtr pDstPicture);
63081f79626Smrgextern Bool R128CCEPrepareComposite(int op,                                    PicturePtr pSrcPicture,
63181f79626Smrg                                    PicturePtr pMaskPicture,
63281f79626Smrg                                    PicturePtr pDstPicture,
63381f79626Smrg                                    PixmapPtr pSrc,
63481f79626Smrg                                    PixmapPtr pMask,
63581f79626Smrg                                    PixmapPtr pDst);
63681f79626Smrgextern void R128CCEComposite(PixmapPtr pDst,
63781f79626Smrg                                int srcX, int srcY,
63881f79626Smrg                                int maskX, int maskY,
63981f79626Smrg                                int dstX, int dstY,
64081f79626Smrg                                int w, int h);
64181f79626Smrg#define R128CCEDoneComposite R128Done
64281f79626Smrg#endif
64384354367Smrg#endif
64484354367Smrg
645c582b7e3Smrg
646c582b7e3Smrg#define CCE_PACKET0( reg, n )						\
647c582b7e3Smrg	(R128_CCE_PACKET0 | ((n) << 16) | ((reg) >> 2))
648c582b7e3Smrg#define CCE_PACKET1( reg0, reg1 )					\
649c582b7e3Smrg	(R128_CCE_PACKET1 | (((reg1) >> 2) << 11) | ((reg0) >> 2))
650c582b7e3Smrg#define CCE_PACKET2()							\
651c582b7e3Smrg	(R128_CCE_PACKET2)
652c582b7e3Smrg#define CCE_PACKET3( pkt, n )						\
653c582b7e3Smrg	(R128_CCE_PACKET3 | (pkt) | ((n) << 16))
654c582b7e3Smrg
655c582b7e3Smrg
656c582b7e3Smrg#define R128_VERBOSE	0
657c582b7e3Smrg
658b3ff493bSmrg#define RING_LOCALS	uint32_t *__head; int __count;
659c582b7e3Smrg
660c582b7e3Smrg#define R128CCE_REFRESH(pScrn, info)					\
661c582b7e3Smrgdo {									\
662c582b7e3Smrg   if ( R128_VERBOSE ) {						\
663c582b7e3Smrg      xf86DrvMsg( pScrn->scrnIndex, X_INFO, "REFRESH( %d ) in %s\n",	\
664c582b7e3Smrg		  !info->CCEInUse , __FUNCTION__ );			\
665c582b7e3Smrg   }									\
666c582b7e3Smrg   if ( !info->CCEInUse ) {						\
667c582b7e3Smrg      R128CCEWaitForIdle(pScrn);					\
668c582b7e3Smrg      BEGIN_RING( 6 );							\
669c582b7e3Smrg      OUT_RING_REG( R128_RE_TOP_LEFT,     info->re_top_left );		\
670c582b7e3Smrg      OUT_RING_REG( R128_RE_WIDTH_HEIGHT, info->re_width_height );	\
671c582b7e3Smrg      OUT_RING_REG( R128_AUX_SC_CNTL,     info->aux_sc_cntl );		\
672c582b7e3Smrg      ADVANCE_RING();							\
673c582b7e3Smrg      info->CCEInUse = TRUE;						\
674c582b7e3Smrg   }									\
675c582b7e3Smrg} while (0)
676c582b7e3Smrg
677c582b7e3Smrg#define BEGIN_RING( n ) do {						\
678c582b7e3Smrg   if ( R128_VERBOSE ) {						\
679c582b7e3Smrg      xf86DrvMsg( pScrn->scrnIndex, X_INFO,				\
680c582b7e3Smrg		  "BEGIN_RING( %d ) in %s\n", n, __FUNCTION__ );	\
681c582b7e3Smrg   }									\
682c582b7e3Smrg   if ( !info->indirectBuffer ) {					\
683c582b7e3Smrg      info->indirectBuffer = R128CCEGetBuffer( pScrn );			\
684c582b7e3Smrg      info->indirectStart = 0;						\
685c582b7e3Smrg   } else if ( (info->indirectBuffer->used + 4*(n)) >			\
686c582b7e3Smrg                info->indirectBuffer->total ) {				\
687c582b7e3Smrg      R128CCEFlushIndirect( pScrn, 1 );					\
688c582b7e3Smrg   }									\
689c582b7e3Smrg   __head = (pointer)((char *)info->indirectBuffer->address +		\
690c582b7e3Smrg		       info->indirectBuffer->used);			\
691c582b7e3Smrg   __count = 0;								\
692c582b7e3Smrg} while (0)
693c582b7e3Smrg
694c582b7e3Smrg#define ADVANCE_RING() do {						\
695c582b7e3Smrg   if ( R128_VERBOSE ) {						\
696c582b7e3Smrg      xf86DrvMsg( pScrn->scrnIndex, X_INFO,				\
697c582b7e3Smrg		  "ADVANCE_RING() used: %d+%d=%d/%d\n",			\
698c582b7e3Smrg		  info->indirectBuffer->used - info->indirectStart,	\
699b3ff493bSmrg		  __count * (int)sizeof(uint32_t),			\
700c582b7e3Smrg		  info->indirectBuffer->used - info->indirectStart +	\
701b3ff493bSmrg		  __count * (int)sizeof(uint32_t),			\
702c582b7e3Smrg		  info->indirectBuffer->total - info->indirectStart );	\
703c582b7e3Smrg   }									\
704b3ff493bSmrg   info->indirectBuffer->used += __count * (int)sizeof(uint32_t);		\
705c582b7e3Smrg} while (0)
706c582b7e3Smrg
707c582b7e3Smrg#define OUT_RING( x ) do {						\
708c582b7e3Smrg   if ( R128_VERBOSE ) {						\
709c582b7e3Smrg      xf86DrvMsg( pScrn->scrnIndex, X_INFO,				\
710c582b7e3Smrg		  "   OUT_RING( 0x%08x )\n", (unsigned int)(x) );	\
711c582b7e3Smrg   }									\
712c582b7e3Smrg   MMIO_OUT32(&__head[__count++], 0, (x));				\
713c582b7e3Smrg} while (0)
714c582b7e3Smrg
715c582b7e3Smrg#define OUT_RING_REG( reg, val )					\
716c582b7e3Smrgdo {									\
717c582b7e3Smrg   OUT_RING( CCE_PACKET0( reg, 0 ) );					\
718c582b7e3Smrg   OUT_RING( val );							\
719c582b7e3Smrg} while (0)
720c582b7e3Smrg
721c582b7e3Smrg#define FLUSH_RING()							\
722c582b7e3Smrgdo {									\
723c582b7e3Smrg   if ( R128_VERBOSE )							\
724c582b7e3Smrg      xf86DrvMsg( pScrn->scrnIndex, X_INFO,				\
725c582b7e3Smrg		  "FLUSH_RING in %s\n", __FUNCTION__ );			\
726c582b7e3Smrg   if ( info->indirectBuffer ) {					\
727c582b7e3Smrg      R128CCEFlushIndirect( pScrn, 0 );					\
728c582b7e3Smrg   }									\
729c582b7e3Smrg} while (0)
730c582b7e3Smrg
731c582b7e3Smrg#endif
732