XORG_NV/sun-src/xf86-video-ati-6.5.8.0/src/radeon.h
changeset 65 0fe232a00381
equal deleted inserted replaced
64:c03273ff2fb9 65:0fe232a00381
       
     1 /* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/radeon.h,v 1.43 2003/11/06 18:38:00 tsi Exp $ */
       
     2 /*
       
     3  * Copyright 2000 ATI Technologies Inc., Markham, Ontario, and
       
     4  *                VA Linux Systems Inc., Fremont, California.
       
     5  *
       
     6  * All Rights Reserved.
       
     7  *
       
     8  * Permission is hereby granted, free of charge, to any person obtaining
       
     9  * a copy of this software and associated documentation files (the
       
    10  * "Software"), to deal in the Software without restriction, including
       
    11  * without limitation on the rights to use, copy, modify, merge,
       
    12  * publish, distribute, sublicense, and/or sell copies of the Software,
       
    13  * and to permit persons to whom the Software is furnished to do so,
       
    14  * subject to the following conditions:
       
    15  *
       
    16  * The above copyright notice and this permission notice (including the
       
    17  * next paragraph) shall be included in all copies or substantial
       
    18  * portions of the Software.
       
    19  *
       
    20  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
       
    21  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
       
    22  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
       
    23  * NON-INFRINGEMENT.  IN NO EVENT SHALL ATI, VA LINUX SYSTEMS AND/OR
       
    24  * THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
       
    25  * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
       
    26  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
       
    27  * DEALINGS IN THE SOFTWARE.
       
    28  */
       
    29 
       
    30 /*
       
    31  * Authors:
       
    32  *   Kevin E. Martin <[email protected]>
       
    33  *   Rickard E. Faith <[email protected]>
       
    34  *   Alan Hourihane <[email protected]>
       
    35  *
       
    36  */
       
    37 
       
    38 #ifndef _RADEON_H_
       
    39 #define _RADEON_H_
       
    40 
       
    41 #include "xf86str.h"
       
    42 #include "xf86_ansic.h"
       
    43 #include "compiler.h"
       
    44 #include "xf86fbman.h"
       
    45 
       
    46 				/* PCI support */
       
    47 #include "xf86Pci.h"
       
    48 
       
    49 #ifdef USE_EXA
       
    50 #include "exa.h"
       
    51 #endif
       
    52 #ifdef USE_XAA
       
    53 #include "xaa.h"
       
    54 #endif
       
    55 
       
    56 				/* Exa and Cursor Support */
       
    57 #include "vbe.h"
       
    58 #include "xf86Cursor.h"
       
    59 
       
    60 				/* DDC support */
       
    61 #include "xf86DDC.h"
       
    62 
       
    63 				/* Xv support */
       
    64 #include "xf86xv.h"
       
    65 
       
    66 #include "radeon_probe.h"
       
    67 				/* DRI support */
       
    68 #ifdef XF86DRI
       
    69 #define _XF86DRI_SERVER_
       
    70 #include "radeon_dripriv.h"
       
    71 #include "dri.h"
       
    72 #include "GL/glxint.h"
       
    73 #endif
       
    74 
       
    75 				/* Render support */
       
    76 #ifdef RENDER
       
    77 #include "picturestr.h"
       
    78 #endif
       
    79 
       
    80 /* ------- mergedfb support ------------- */
       
    81 		/* Psuedo Xinerama support */
       
    82 #define NEED_REPLIES  		/* ? */
       
    83 #define EXTENSION_PROC_ARGS void *
       
    84 #include "extnsionst.h"  	/* required */
       
    85 #include <X11/extensions/panoramiXproto.h>  	/* required */
       
    86 #define RADEON_XINERAMA_MAJOR_VERSION  1
       
    87 #define RADEON_XINERAMA_MINOR_VERSION  1
       
    88 
       
    89 
       
    90 /* Relative merge position */
       
    91 typedef enum {
       
    92    radeonLeftOf,
       
    93    radeonRightOf,
       
    94    radeonAbove,
       
    95    radeonBelow,
       
    96    radeonClone
       
    97 } RADEONScrn2Rel;
       
    98 
       
    99 typedef struct _region {
       
   100     int x0,x1,y0,y1;
       
   101 } region;
       
   102 
       
   103 /* ------------------------------------- */
       
   104 
       
   105 #define RADEON_DEBUG            0 /* Turn off debugging output               */
       
   106 #define RADEON_IDLE_RETRY      16 /* Fall out of idle loops after this count */
       
   107 #define RADEON_TIMEOUT    2000000 /* Fall out of wait loops after this count */
       
   108 #define RADEON_MMIOSIZE   0x80000
       
   109 
       
   110 /* Buffer are aligned on 4096 byte boundaries */
       
   111 #define RADEON_BUFFER_ALIGN 0x00000fff
       
   112 #define RADEON_VBIOS_SIZE 0x00010000
       
   113 #define RADEON_USE_RMX 0x80000000 /* mode flag for using RMX
       
   114 				   * Need to comfirm this is not used
       
   115 				   * for something else.
       
   116 				   */
       
   117 
       
   118 #if RADEON_DEBUG
       
   119 #define RADEONTRACE(x)						\
       
   120 do {									\
       
   121     ErrorF("(**) %s(%d): ", RADEON_NAME, pScrn->scrnIndex);		\
       
   122     ErrorF x;								\
       
   123 } while(0)
       
   124 #else
       
   125 #define RADEONTRACE(x) do { } while(0)
       
   126 #endif
       
   127 
       
   128 
       
   129 /* Other macros */
       
   130 #define RADEON_ARRAY_SIZE(x)  (sizeof(x)/sizeof(x[0]))
       
   131 #define RADEON_ALIGN(x,bytes) (((x) + ((bytes) - 1)) & ~((bytes) - 1))
       
   132 #define RADEONPTR(pScrn)      ((RADEONInfoPtr)(pScrn)->driverPrivate)
       
   133 
       
   134 
       
   135 typedef struct {
       
   136 				/* Common registers */
       
   137     CARD32            ovr_clr;
       
   138     CARD32            ovr_wid_left_right;
       
   139     CARD32            ovr_wid_top_bottom;
       
   140     CARD32            ov0_scale_cntl;
       
   141     CARD32            mpp_tb_config;
       
   142     CARD32            mpp_gp_config;
       
   143     CARD32            subpic_cntl;
       
   144     CARD32            viph_control;
       
   145     CARD32            i2c_cntl_1;
       
   146     CARD32            gen_int_cntl;
       
   147     CARD32            cap0_trig_cntl;
       
   148     CARD32            cap1_trig_cntl;
       
   149     CARD32            bus_cntl;
       
   150     CARD32            bios_4_scratch;
       
   151     CARD32            bios_5_scratch;
       
   152     CARD32            bios_6_scratch;
       
   153     CARD32            surface_cntl;
       
   154     CARD32            surfaces[8][3];
       
   155     CARD32            mc_agp_location;
       
   156     CARD32            mc_fb_location;
       
   157     CARD32            display_base_addr;
       
   158     CARD32            display2_base_addr;
       
   159     CARD32            ov0_base_addr;
       
   160 
       
   161 				/* Other registers to save for VT switches */
       
   162     CARD32            dp_datatype;
       
   163     CARD32            rbbm_soft_reset;
       
   164     CARD32            clock_cntl_index;
       
   165     CARD32            amcgpio_en_reg;
       
   166     CARD32            amcgpio_mask;
       
   167 
       
   168 				/* CRTC registers */
       
   169     CARD32            crtc_gen_cntl;
       
   170     CARD32            crtc_ext_cntl;
       
   171     CARD32            dac_cntl;
       
   172     CARD32            crtc_h_total_disp;
       
   173     CARD32            crtc_h_sync_strt_wid;
       
   174     CARD32            crtc_v_total_disp;
       
   175     CARD32            crtc_v_sync_strt_wid;
       
   176     CARD32            crtc_offset;
       
   177     CARD32            crtc_offset_cntl;
       
   178     CARD32            crtc_pitch;
       
   179     CARD32            disp_merge_cntl;
       
   180     CARD32            grph_buffer_cntl;
       
   181     CARD32            crtc_more_cntl;
       
   182 
       
   183 				/* CRTC2 registers */
       
   184     CARD32            crtc2_gen_cntl;
       
   185 
       
   186     CARD32            dac2_cntl;
       
   187     CARD32            disp_output_cntl;
       
   188     CARD32            disp_hw_debug;
       
   189     CARD32            disp2_merge_cntl;
       
   190     CARD32            grph2_buffer_cntl;
       
   191     CARD32            crtc2_h_total_disp;
       
   192     CARD32            crtc2_h_sync_strt_wid;
       
   193     CARD32            crtc2_v_total_disp;
       
   194     CARD32            crtc2_v_sync_strt_wid;
       
   195     CARD32            crtc2_offset;
       
   196     CARD32            crtc2_offset_cntl;
       
   197     CARD32            crtc2_pitch;
       
   198 				/* Flat panel registers */
       
   199     CARD32            fp_crtc_h_total_disp;
       
   200     CARD32            fp_crtc_v_total_disp;
       
   201     CARD32            fp_gen_cntl;
       
   202     CARD32            fp2_gen_cntl;
       
   203     CARD32            fp_h_sync_strt_wid;
       
   204     CARD32            fp2_h_sync_strt_wid;
       
   205     CARD32            fp_horz_stretch;
       
   206     CARD32            fp_panel_cntl;
       
   207     CARD32            fp_v_sync_strt_wid;
       
   208     CARD32            fp2_v_sync_strt_wid;
       
   209     CARD32            fp_vert_stretch;
       
   210     CARD32            lvds_gen_cntl;
       
   211     CARD32            lvds_pll_cntl;
       
   212     CARD32            tmds_pll_cntl;
       
   213     CARD32            tmds_transmitter_cntl;
       
   214 
       
   215 				/* Computed values for PLL */
       
   216     CARD32            dot_clock_freq;
       
   217     CARD32            pll_output_freq;
       
   218     int               feedback_div;
       
   219     int               post_div;
       
   220 
       
   221 				/* PLL registers */
       
   222     unsigned          ppll_ref_div;
       
   223     unsigned          ppll_div_3;
       
   224     CARD32            htotal_cntl;
       
   225 
       
   226 				/* Computed values for PLL2 */
       
   227     CARD32            dot_clock_freq_2;
       
   228     CARD32            pll_output_freq_2;
       
   229     int               feedback_div_2;
       
   230     int               post_div_2;
       
   231 
       
   232 				/* PLL2 registers */
       
   233     CARD32            p2pll_ref_div;
       
   234     CARD32            p2pll_div_0;
       
   235     CARD32            htotal_cntl2;
       
   236 
       
   237 				/* Pallet */
       
   238     Bool              palette_valid;
       
   239     CARD32            palette[256];
       
   240     CARD32            palette2[256];
       
   241 
       
   242     CARD32            tv_dac_cntl;
       
   243 
       
   244 } RADEONSaveRec, *RADEONSavePtr;
       
   245 
       
   246 typedef struct {
       
   247     CARD16            reference_freq;
       
   248     CARD16            reference_div;
       
   249     CARD32            min_pll_freq;
       
   250     CARD32            max_pll_freq;
       
   251     CARD16            xclk;
       
   252 } RADEONPLLRec, *RADEONPLLPtr;
       
   253 
       
   254 typedef struct {
       
   255     int               bitsPerPixel;
       
   256     int               depth;
       
   257     int               displayWidth;
       
   258     int               displayHeight;
       
   259     int               pixel_code;
       
   260     int               pixel_bytes;
       
   261     DisplayModePtr    mode;
       
   262 } RADEONFBLayout;
       
   263 
       
   264 typedef enum {
       
   265     CHIP_FAMILY_UNKNOW,
       
   266     CHIP_FAMILY_LEGACY,
       
   267     CHIP_FAMILY_RADEON,
       
   268     CHIP_FAMILY_RV100,
       
   269     CHIP_FAMILY_RS100,    /* U1 (IGP320M) or A3 (IGP320)*/
       
   270     CHIP_FAMILY_RV200,
       
   271     CHIP_FAMILY_RS200,    /* U2 (IGP330M/340M/350M) or A4 (IGP330/340/345/350), RS250 (IGP 7000) */
       
   272     CHIP_FAMILY_R200,
       
   273     CHIP_FAMILY_RV250,
       
   274     CHIP_FAMILY_RS300,    /* RS300/RS350 */
       
   275     CHIP_FAMILY_RV280,
       
   276     CHIP_FAMILY_R300,
       
   277     CHIP_FAMILY_R350,
       
   278     CHIP_FAMILY_RV350,
       
   279     CHIP_FAMILY_RV380,    /* RV370/RV380/M22/M24 */
       
   280     CHIP_FAMILY_R420,     /* R420/R423/M18 */
       
   281     CHIP_FAMILY_RV410,    /* RV410, M26 */
       
   282     CHIP_FAMILY_RS400,    /* xpress 200, 200m (RS400/410/480) */
       
   283     CHIP_FAMILY_LAST
       
   284 } RADEONChipFamily;
       
   285 
       
   286 #define IS_RV100_VARIANT ((info->ChipFamily == CHIP_FAMILY_RV100)  ||  \
       
   287         (info->ChipFamily == CHIP_FAMILY_RV200)  ||  \
       
   288         (info->ChipFamily == CHIP_FAMILY_RS100)  ||  \
       
   289         (info->ChipFamily == CHIP_FAMILY_RS200)  ||  \
       
   290         (info->ChipFamily == CHIP_FAMILY_RV250)  ||  \
       
   291         (info->ChipFamily == CHIP_FAMILY_RV280)  ||  \
       
   292         (info->ChipFamily == CHIP_FAMILY_RS300))
       
   293 
       
   294 
       
   295 #define IS_R300_VARIANT ((info->ChipFamily == CHIP_FAMILY_R300)  ||  \
       
   296         (info->ChipFamily == CHIP_FAMILY_RV350) ||  \
       
   297         (info->ChipFamily == CHIP_FAMILY_R350)  ||  \
       
   298         (info->ChipFamily == CHIP_FAMILY_RV380) ||  \
       
   299         (info->ChipFamily == CHIP_FAMILY_R420)  ||  \
       
   300         (info->ChipFamily == CHIP_FAMILY_RV410) ||  \
       
   301         (info->ChipFamily == CHIP_FAMILY_RS400))
       
   302 
       
   303 /*
       
   304  * Errata workarounds
       
   305  */
       
   306 typedef enum {
       
   307        CHIP_ERRATA_R300_CG             = 0x00000001,
       
   308        CHIP_ERRATA_PLL_DUMMYREADS      = 0x00000002,
       
   309        CHIP_ERRATA_PLL_DELAY           = 0x00000004
       
   310 } RADEONErrata;
       
   311 
       
   312 typedef enum {
       
   313 	CARD_PCI,
       
   314 	CARD_AGP,
       
   315 	CARD_PCIE
       
   316 } RADEONCardType;
       
   317 
       
   318 typedef struct {
       
   319     CARD32 freq;
       
   320     CARD32 value;
       
   321 }RADEONTMDSPll;
       
   322 
       
   323 typedef struct {
       
   324     EntityInfoPtr     pEnt;
       
   325     pciVideoPtr       PciInfo;
       
   326     PCITAG            PciTag;
       
   327     int               Chipset;
       
   328     RADEONChipFamily  ChipFamily;
       
   329     RADEONErrata      ChipErrata;
       
   330 
       
   331     Bool              FBDev;
       
   332 
       
   333     unsigned long     LinearAddr;       /* Frame buffer physical address     */
       
   334     unsigned long     MMIOAddr;         /* MMIO region physical address      */
       
   335     unsigned long     BIOSAddr;         /* BIOS physical address             */
       
   336     unsigned int      fbLocation;
       
   337     CARD32            mc_fb_location;
       
   338     CARD32            mc_agp_location;
       
   339 
       
   340     unsigned char     *MMIO;            /* Map of MMIO region                */
       
   341     unsigned char     *FB;              /* Map of frame buffer               */
       
   342     CARD8             *VBIOS;           /* Video BIOS pointer                */
       
   343 
       
   344     Bool              IsAtomBios;       /* New BIOS used in R420 etc.        */
       
   345     int               ROMHeaderStart;   /* Start of the ROM Info Table       */
       
   346     int               MasterDataStart;  /* Offset for Master Data Table for ATOM BIOS */
       
   347 
       
   348     CARD32            MemCntl;
       
   349     CARD32            BusCntl;
       
   350     unsigned long     FbMapSize;        /* Size of frame buffer, in bytes    */
       
   351     unsigned long     FbSecureSize;     /* Size of secured fb area at end of
       
   352                                            framebuffer */
       
   353     int               Flags;            /* Saved copy of mode flags          */
       
   354 
       
   355 				/* VE/M6 support */
       
   356     RADEONMonitorType DisplayType;      /* Monitor connected on              */
       
   357     RADEONDDCType     DDCType;
       
   358     RADEONConnectorType ConnectorType;
       
   359     Bool              HasCRTC2;         /* All cards except original Radeon  */
       
   360     Bool              IsMobility;       /* Mobile chips for laptops */
       
   361     Bool              IsIGP;            /* IGP chips */
       
   362     Bool              HasSingleDAC;     /* only TVDAC on chip */
       
   363     Bool              IsSecondary;      /* Second Screen                     */
       
   364     Bool	      IsPrimary;        /* Primary Screen */
       
   365     Bool              IsSwitching;      /* Flag for switching mode           */
       
   366     Bool              OverlayOnCRTC2;
       
   367     Bool              PanelOff;         /* Force panel (LCD/DFP) off         */
       
   368     Bool              ddc_mode;         /* Validate mode by matching exactly
       
   369 					 * the modes supported in DDC data
       
   370 					 */
       
   371     Bool              R300CGWorkaround;
       
   372 
       
   373 				/* EDID or BIOS values for FPs */
       
   374     int               PanelXRes;
       
   375     int               PanelYRes;
       
   376     int               HOverPlus;
       
   377     int               HSyncWidth;
       
   378     int               HBlank;
       
   379     int               VOverPlus;
       
   380     int               VSyncWidth;
       
   381     int               VBlank;
       
   382     int               PanelPwrDly;
       
   383     int               DotClock;
       
   384     int               RefDivider;
       
   385     int               FeedbackDivider;
       
   386     int               PostDivider;
       
   387     Bool              UseBiosDividers;
       
   388 				/* EDID data using DDC interface */
       
   389     Bool              ddc_bios;
       
   390     Bool              ddc1;
       
   391     Bool              ddc2;
       
   392     I2CBusPtr         pI2CBus;
       
   393     CARD32            DDCReg;
       
   394 
       
   395     RADEONPLLRec      pll;
       
   396     RADEONTMDSPll     tmds_pll[4];
       
   397     int               RamWidth;
       
   398     float	      sclk;		/* in MHz */
       
   399     float	      mclk;		/* in MHz */
       
   400     Bool	      IsDDR;
       
   401     int               DispPriority;
       
   402 
       
   403     RADEONSaveRec     SavedReg;         /* Original (text) mode              */
       
   404     RADEONSaveRec     ModeReg;          /* Current mode                      */
       
   405     Bool              (*CloseScreen)(int, ScreenPtr);
       
   406 
       
   407     void              (*BlockHandler)(int, pointer, pointer, pointer);
       
   408 
       
   409     Bool              PaletteSavedOnVT; /* Palette saved on last VT switch   */
       
   410 
       
   411 #ifdef USE_EXA
       
   412     ExaDriverRec      exa;
       
   413     int               engineMode;
       
   414 #define EXA_ENGINEMODE_UNKNOWN 0
       
   415 #define EXA_ENGINEMODE_2D      1
       
   416 #define EXA_ENGINEMODE_3D      2
       
   417 #endif
       
   418 #ifdef USE_XAA
       
   419     XAAInfoRecPtr     accel;
       
   420 #endif
       
   421     Bool              accelOn;
       
   422     xf86CursorInfoPtr cursor;
       
   423 #ifdef USE_EXA
       
   424     ExaOffscreenArea   *cursorArea;
       
   425 #endif
       
   426     unsigned long     cursor_offset;
       
   427 #ifdef USE_XAA
       
   428     unsigned long     cursor_end;
       
   429 #endif
       
   430     Bool              allowColorTiling;
       
   431     Bool              tilingEnabled; /* mirror of sarea->tiling_enabled */
       
   432 #ifdef ARGB_CURSOR
       
   433     Bool	      cursor_argb;
       
   434 #endif
       
   435     int               cursor_fg;
       
   436     int               cursor_bg;
       
   437 
       
   438 #ifdef USE_XAA
       
   439     /*
       
   440      * XAAForceTransBlit is used to change the behavior of the XAA
       
   441      * SetupForScreenToScreenCopy function, to make it DGA-friendly.
       
   442      */
       
   443     Bool              XAAForceTransBlit;
       
   444 #endif
       
   445 
       
   446     int               fifo_slots;       /* Free slots in the FIFO (64 max)   */
       
   447     int               pix24bpp;         /* Depth of pixmap for 24bpp fb      */
       
   448     Bool              dac6bits;         /* Use 6 bit DAC?                    */
       
   449 
       
   450 				/* Computed values for Radeon */
       
   451     int               pitch;
       
   452     int               datatype;
       
   453     CARD32            dp_gui_master_cntl;
       
   454     CARD32            dp_gui_master_cntl_clip;
       
   455     CARD32            trans_color;
       
   456 
       
   457 				/* Saved values for ScreenToScreenCopy */
       
   458     int               xdir;
       
   459     int               ydir;
       
   460 
       
   461 #ifdef USE_XAA
       
   462 				/* ScanlineScreenToScreenColorExpand support */
       
   463     unsigned char     *scratch_buffer[1];
       
   464     unsigned char     *scratch_save;
       
   465     int               scanline_x;
       
   466     int               scanline_y;
       
   467     int               scanline_w;
       
   468     int               scanline_h;
       
   469     int               scanline_h_w;
       
   470     int               scanline_words;
       
   471     int               scanline_direct;
       
   472     int               scanline_bpp;     /* Only used for ImageWrite */
       
   473     int               scanline_fg;
       
   474     int               scanline_bg;
       
   475     int               scanline_hpass;
       
   476     int               scanline_x1clip;
       
   477     int               scanline_x2clip;
       
   478 #endif
       
   479 				/* Saved values for DashedTwoPointLine */
       
   480     int               dashLen;
       
   481     CARD32            dashPattern;
       
   482     int               dash_fg;
       
   483     int               dash_bg;
       
   484 
       
   485     DGAModePtr        DGAModes;
       
   486     int               numDGAModes;
       
   487     Bool              DGAactive;
       
   488     int               DGAViewportStatus;
       
   489     DGAFunctionRec    DGAFuncs;
       
   490 
       
   491     RADEONFBLayout    CurrentLayout;
       
   492     CARD32            dst_pitch_offset;
       
   493 #ifdef XF86DRI
       
   494     Bool              noBackBuffer;	
       
   495     Bool              directRenderingEnabled;
       
   496     Bool              directRenderingInited;
       
   497     Bool              newMemoryMap;
       
   498     drmVersionPtr     pLibDRMVersion;
       
   499     drmVersionPtr     pKernelDRMVersion;
       
   500     DRIInfoPtr        pDRIInfo;
       
   501     int               drmFD;
       
   502     int               numVisualConfigs;
       
   503     __GLXvisualConfig *pVisualConfigs;
       
   504     RADEONConfigPrivPtr pVisualConfigsPriv;
       
   505     Bool             (*DRICloseScreen)(int, ScreenPtr);
       
   506 
       
   507     drm_handle_t         fbHandle;
       
   508 
       
   509     drmSize           registerSize;
       
   510     drm_handle_t         registerHandle;
       
   511 
       
   512     RADEONCardType    cardType;            /* Current card is a PCI card */
       
   513     drmSize           pciSize;
       
   514     drm_handle_t         pciMemHandle;
       
   515     unsigned char     *PCI;             /* Map */
       
   516 
       
   517     Bool              depthMoves;       /* Enable depth moves -- slow! */
       
   518     Bool              allowPageFlip;    /* Enable 3d page flipping */
       
   519     Bool              have3DWindows;    /* Are there any 3d clients? */
       
   520 
       
   521     drmSize           gartSize;
       
   522     drm_handle_t         agpMemHandle;     /* Handle from drmAgpAlloc */
       
   523     unsigned long     gartOffset;
       
   524     unsigned char     *AGP;             /* Map */
       
   525     int               agpMode;
       
   526     int               agpFastWrite;
       
   527 
       
   528     CARD32            pciCommand;
       
   529 
       
   530     Bool              CPRuns;           /* CP is running */
       
   531     Bool              CPInUse;          /* CP has been used by X server */
       
   532     Bool              CPStarted;        /* CP has started */
       
   533     int               CPMode;           /* CP mode that server/clients use */
       
   534     int               CPFifoSize;       /* Size of the CP command FIFO */
       
   535     int               CPusecTimeout;    /* CP timeout in usecs */
       
   536 
       
   537 				/* CP ring buffer data */
       
   538     unsigned long     ringStart;        /* Offset into GART space */
       
   539     drm_handle_t         ringHandle;       /* Handle from drmAddMap */
       
   540     drmSize           ringMapSize;      /* Size of map */
       
   541     int               ringSize;         /* Size of ring (in MB) */
       
   542     unsigned char     *ring;            /* Map */
       
   543     int               ringSizeLog2QW;
       
   544 
       
   545     unsigned long     ringReadOffset;   /* Offset into GART space */
       
   546     drm_handle_t         ringReadPtrHandle; /* Handle from drmAddMap */
       
   547     drmSize           ringReadMapSize;  /* Size of map */
       
   548     unsigned char     *ringReadPtr;     /* Map */
       
   549 
       
   550 				/* CP vertex/indirect buffer data */
       
   551     unsigned long     bufStart;         /* Offset into GART space */
       
   552     drm_handle_t         bufHandle;        /* Handle from drmAddMap */
       
   553     drmSize           bufMapSize;       /* Size of map */
       
   554     int               bufSize;          /* Size of buffers (in MB) */
       
   555     unsigned char     *buf;             /* Map */
       
   556     int               bufNumBufs;       /* Number of buffers */
       
   557     drmBufMapPtr      buffers;          /* Buffer map */
       
   558 
       
   559 				/* CP GART Texture data */
       
   560     unsigned long     gartTexStart;      /* Offset into GART space */
       
   561     drm_handle_t         gartTexHandle;     /* Handle from drmAddMap */
       
   562     drmSize           gartTexMapSize;    /* Size of map */
       
   563     int               gartTexSize;       /* Size of GART tex space (in MB) */
       
   564     unsigned char     *gartTex;          /* Map */
       
   565     int               log2GARTTexGran;
       
   566 
       
   567 				/* CP accleration */
       
   568     drmBufPtr         indirectBuffer;
       
   569     int               indirectStart;
       
   570 
       
   571 				/* DRI screen private data */
       
   572     int               fbX;
       
   573     int               fbY;
       
   574     int               backX;
       
   575     int               backY;
       
   576     int               depthX;
       
   577     int               depthY;
       
   578 
       
   579     int               frontOffset;
       
   580     int               frontPitch;
       
   581     int               backOffset;
       
   582     int               backPitch;
       
   583     int               depthOffset;
       
   584     int               depthPitch;
       
   585     int               textureOffset;
       
   586     int               textureSize;
       
   587     int               log2TexGran;
       
   588 
       
   589     int               pciGartSize;
       
   590     CARD32            pciGartOffset;
       
   591     void              *pciGartBackup;
       
   592 #ifdef USE_XAA
       
   593     CARD32            frontPitchOffset;
       
   594     CARD32            backPitchOffset;
       
   595     CARD32            depthPitchOffset;
       
   596 
       
   597 				/* offscreen memory management */
       
   598     int               backLines;
       
   599     FBAreaPtr         backArea;
       
   600     int               depthTexLines;
       
   601     FBAreaPtr         depthTexArea;
       
   602 #endif
       
   603 
       
   604 				/* Saved scissor values */
       
   605     CARD32            sc_left;
       
   606     CARD32            sc_right;
       
   607     CARD32            sc_top;
       
   608     CARD32            sc_bottom;
       
   609 
       
   610     CARD32            re_top_left;
       
   611     CARD32            re_width_height;
       
   612 
       
   613     CARD32            aux_sc_cntl;
       
   614 
       
   615     int               irq;
       
   616 
       
   617     Bool              DMAForXv;
       
   618 
       
   619 #ifdef PER_CONTEXT_SAREA
       
   620     int               perctx_sarea_size;
       
   621 #endif
       
   622 
       
   623     /* Debugging info for BEGIN_RING/ADVANCE_RING pairs. */
       
   624     int               dma_begin_count;
       
   625     char              *dma_debug_func;
       
   626     int               dma_debug_lineno;
       
   627 #endif /* XF86DRI */
       
   628 
       
   629 				/* XVideo */
       
   630     XF86VideoAdaptorPtr adaptor;
       
   631     void              (*VideoTimerCallback)(ScrnInfoPtr, Time);
       
   632     int               videoKey;
       
   633     int		      RageTheatreCrystal;
       
   634     int               RageTheatreTunerPort;
       
   635     int               RageTheatreCompositePort;
       
   636     int               RageTheatreSVideoPort;
       
   637     int               tunerType;
       
   638 	char*			RageTheatreMicrocPath;
       
   639 	char*			RageTheatreMicrocType;
       
   640     Bool               MM_TABLE_valid;
       
   641     struct {
       
   642     	CARD8 table_revision;
       
   643 	CARD8 table_size;
       
   644         CARD8 tuner_type;
       
   645         CARD8 audio_chip;
       
   646         CARD8 product_id;
       
   647         CARD8 tuner_voltage_teletext_fm;
       
   648         CARD8 i2s_config; /* configuration of the sound chip */
       
   649         CARD8 video_decoder_type;
       
   650         CARD8 video_decoder_host_config;
       
   651         CARD8 input[5];
       
   652     	} MM_TABLE;
       
   653     CARD16 video_decoder_type;
       
   654 
       
   655     /* Render */
       
   656     Bool              RenderAccel;
       
   657 #ifdef USE_XAA
       
   658     FBLinearPtr       RenderTex;
       
   659     void              (*RenderCallback)(ScrnInfoPtr);
       
   660     Time              RenderTimeout;
       
   661 #endif
       
   662 
       
   663     /* general */
       
   664     Bool              showCache;
       
   665     OptionInfoPtr     Options;
       
   666 
       
   667     Bool              useEXA;
       
   668 #ifdef XFree86LOADER
       
   669 #ifdef USE_EXA
       
   670     XF86ModReqInfo    exaReq;
       
   671 #endif
       
   672 #ifdef USE_XAA
       
   673     XF86ModReqInfo    xaaReq;
       
   674 #endif
       
   675 #endif
       
   676 
       
   677     /* X itself has the 3D context */
       
   678     Bool              XInited3D;
       
   679 
       
   680     /* merged fb stuff, also covers clone modes */
       
   681     Bool		MergedFB;
       
   682     RADEONScrn2Rel	CRT2Position;
       
   683     char *		CRT2HSync;
       
   684     char *		CRT2VRefresh;
       
   685     char *		MetaModes;
       
   686     ScrnInfoPtr		CRT2pScrn;
       
   687     DisplayModePtr	CRT1Modes;
       
   688     DisplayModePtr	CRT1CurrentMode;
       
   689     int			CRT1frameX0;
       
   690     int			CRT1frameY0;
       
   691     int			CRT1frameX1;
       
   692     int			CRT1frameY1;
       
   693     RADEONMonitorType   MergeType;
       
   694     RADEONDDCType       MergeDDCType;
       
   695     void        	(*PointerMoved)(int index, int x, int y);
       
   696     /* pseudo xinerama support for mergedfb */
       
   697     int			maxCRT1_X1, maxCRT1_X2, maxCRT1_Y1, maxCRT1_Y2;
       
   698     int			maxCRT2_X1, maxCRT2_X2, maxCRT2_Y1, maxCRT2_Y2;
       
   699     int			maxClone_X1, maxClone_X2, maxClone_Y1, maxClone_Y2;
       
   700     Bool		UseRADEONXinerama;
       
   701     Bool		CRT2IsScrn0;
       
   702     ExtensionEntry 	*XineramaExtEntry;
       
   703     int			RADEONXineramaVX, RADEONXineramaVY;
       
   704     Bool		AtLeastOneNonClone;
       
   705     int			MergedFBXDPI, MergedFBYDPI;
       
   706     Bool		NoVirtual;
       
   707     int                 CRT1XOffs, CRT1YOffs, CRT2XOffs, CRT2YOffs;
       
   708     int                 MBXNR1XMAX, MBXNR1YMAX, MBXNR2XMAX, MBXNR2YMAX;
       
   709     Bool                NonRect, HaveNonRect, HaveOffsRegions, MouseRestrictions;
       
   710     region              NonRectDead, OffDead1, OffDead2;
       
   711 
       
   712     /* special handlings for DELL triple-head server */
       
   713     Bool		IsDellServer; 
       
   714 
       
   715     /* enable bios hotkey output switching */
       
   716     Bool		BiosHotkeys;
       
   717 
       
   718     Bool               VGAAccess;
       
   719 
       
   720     int                MaxSurfaceWidth;
       
   721     int                MaxLines;
       
   722 
       
   723 } RADEONInfoRec, *RADEONInfoPtr;
       
   724 
       
   725 #define RADEONWaitForFifo(pScrn, entries)				\
       
   726 do {									\
       
   727     if (info->fifo_slots < entries)					\
       
   728 	RADEONWaitForFifoFunction(pScrn, entries);			\
       
   729     info->fifo_slots -= entries;					\
       
   730 } while (0)
       
   731 
       
   732 extern RADEONEntPtr RADEONEntPriv(ScrnInfoPtr pScrn);
       
   733 extern void        RADEONWaitForFifoFunction(ScrnInfoPtr pScrn, int entries);
       
   734 extern void        RADEONWaitForIdleMMIO(ScrnInfoPtr pScrn);
       
   735 #ifdef XF86DRI
       
   736 extern void        RADEONWaitForIdleCP(ScrnInfoPtr pScrn);
       
   737 #endif
       
   738 
       
   739 extern void        RADEONDoAdjustFrame(ScrnInfoPtr pScrn, int x, int y,
       
   740 				       int clone);
       
   741 
       
   742 extern void        RADEONEngineReset(ScrnInfoPtr pScrn);
       
   743 extern void        RADEONEngineFlush(ScrnInfoPtr pScrn);
       
   744 extern void        RADEONEngineRestore(ScrnInfoPtr pScrn);
       
   745 
       
   746 extern unsigned    RADEONINPLL(ScrnInfoPtr pScrn, int addr);
       
   747 extern void        RADEONOUTPLL(ScrnInfoPtr pScrn, int addr, CARD32 data);
       
   748 
       
   749 extern void        RADEONWaitForVerticalSync(ScrnInfoPtr pScrn);
       
   750 extern void        RADEONWaitForVerticalSync2(ScrnInfoPtr pScrn);
       
   751 
       
   752 extern void        RADEONChangeSurfaces(ScrnInfoPtr pScrn);
       
   753 
       
   754 extern Bool        RADEONAccelInit(ScreenPtr pScreen);
       
   755 #ifdef USE_EXA
       
   756 extern Bool        RADEONSetupMemEXA (ScreenPtr pScreen);
       
   757 extern Bool        RADEONDrawInitMMIO(ScreenPtr pScreen);
       
   758 #ifdef XF86DRI
       
   759 extern Bool        RADEONDrawInitCP(ScreenPtr pScreen);
       
   760 #endif
       
   761 #endif
       
   762 #ifdef USE_XAA
       
   763 extern void        RADEONAccelInitMMIO(ScreenPtr pScreen, XAAInfoRecPtr a);
       
   764 #endif
       
   765 extern void        RADEONEngineInit(ScrnInfoPtr pScrn);
       
   766 extern Bool        RADEONCursorInit(ScreenPtr pScreen);
       
   767 extern Bool        RADEONDGAInit(ScreenPtr pScreen);
       
   768 
       
   769 extern void        RADEONInit3DEngine(ScrnInfoPtr pScrn);
       
   770 
       
   771 extern int         RADEONMinBits(int val);
       
   772 
       
   773 extern void        RADEONInitVideo(ScreenPtr pScreen);
       
   774 extern void        RADEONResetVideo(ScrnInfoPtr pScrn);
       
   775 extern void        R300CGWorkaround(ScrnInfoPtr pScrn);
       
   776 
       
   777 extern void        RADEONPllErrataAfterIndex(RADEONInfoPtr info);
       
   778 extern void        RADEONPllErrataAfterData(RADEONInfoPtr info);
       
   779 
       
   780 #ifdef XF86DRI
       
   781 #ifdef USE_XAA
       
   782 extern void        RADEONAccelInitCP(ScreenPtr pScreen, XAAInfoRecPtr a);
       
   783 #endif
       
   784 extern Bool        RADEONDRIGetVersion(ScrnInfoPtr pScrn);
       
   785 extern Bool        RADEONDRIScreenInit(ScreenPtr pScreen);
       
   786 extern void        RADEONDRICloseScreen(ScreenPtr pScreen);
       
   787 extern void        RADEONDRIResume(ScreenPtr pScreen);
       
   788 extern Bool        RADEONDRIFinishScreenInit(ScreenPtr pScreen);
       
   789 extern void        RADEONDRIAllocatePCIGARTTable(ScreenPtr pScreen);
       
   790 extern void	   RADEONDRIInitPageFlip(ScreenPtr pScreen);
       
   791 extern void        RADEONDRIStop(ScreenPtr pScreen);
       
   792 
       
   793 extern drmBufPtr   RADEONCPGetBuffer(ScrnInfoPtr pScrn);
       
   794 extern void        RADEONCPFlushIndirect(ScrnInfoPtr pScrn, int discard);
       
   795 extern void        RADEONCPReleaseIndirect(ScrnInfoPtr pScrn);
       
   796 extern int         RADEONCPStop(ScrnInfoPtr pScrn,  RADEONInfoPtr info);
       
   797 
       
   798 extern CARD8*      RADEONHostDataBlit(ScrnInfoPtr pScrn, unsigned int bpp,
       
   799 				      unsigned int w, CARD32 dstPitch,
       
   800 				      CARD32 *bufPitch, CARD8 **dst,
       
   801 				      unsigned int *h, unsigned int *hpass);
       
   802 extern void        RADEONHostDataBlitCopyPass(ScrnInfoPtr pScrn,
       
   803 					      unsigned int bpp,
       
   804 					      CARD8 *dst, CARD8 *src,
       
   805 					      unsigned int hpass,
       
   806 					      unsigned int dstPitch,
       
   807 					      unsigned int srcPitch);
       
   808 extern void        RADEONCopySwap(CARD8 *dst, CARD8 *src, unsigned int size,
       
   809 				  int swap);
       
   810 
       
   811 extern Bool        RADEONGetBIOSInfo(ScrnInfoPtr pScrn, xf86Int10InfoPtr pInt10);
       
   812 extern Bool        RADEONGetConnectorInfoFromBIOS (ScrnInfoPtr pScrn);
       
   813 extern Bool        RADEONGetClockInfoFromBIOS (ScrnInfoPtr pScrn);
       
   814 extern Bool        RADEONGetLVDSInfoFromBIOS (ScrnInfoPtr pScrn);
       
   815 extern Bool        RADEONGetTMDSInfoFromBIOS (ScrnInfoPtr pScrn);
       
   816 extern Bool        RADEONGetHardCodedEDIDFromBIOS (ScrnInfoPtr pScrn);
       
   817 
       
   818 #define RADEONCP_START(pScrn, info)					\
       
   819 do {									\
       
   820     int _ret = drmCommandNone(info->drmFD, DRM_RADEON_CP_START);	\
       
   821     if (_ret) {								\
       
   822 	xf86DrvMsg(pScrn->scrnIndex, X_ERROR,				\
       
   823 		   "%s: CP start %d\n", __FUNCTION__, _ret);		\
       
   824     }									\
       
   825     info->CPStarted = TRUE;                                             \
       
   826 } while (0)
       
   827 
       
   828 #define RADEONCP_STOP(pScrn, info)					\
       
   829 do {									\
       
   830     int _ret;								\
       
   831      if (info->CPStarted) {						\
       
   832         _ret = RADEONCPStop(pScrn, info);				\
       
   833         if (_ret) {							\
       
   834 	    xf86DrvMsg(pScrn->scrnIndex, X_ERROR,			\
       
   835 		   "%s: CP stop %d\n", __FUNCTION__, _ret);		\
       
   836         }								\
       
   837         info->CPStarted = FALSE;                                        \
       
   838    }									\
       
   839     RADEONEngineRestore(pScrn);						\
       
   840     info->CPRuns = FALSE;						\
       
   841 } while (0)
       
   842 
       
   843 #define RADEONCP_RESET(pScrn, info)					\
       
   844 do {									\
       
   845     if (RADEONCP_USE_RING_BUFFER(info->CPMode)) {			\
       
   846 	int _ret = drmCommandNone(info->drmFD, DRM_RADEON_CP_RESET);	\
       
   847 	if (_ret) {							\
       
   848 	    xf86DrvMsg(pScrn->scrnIndex, X_ERROR,			\
       
   849 		       "%s: CP reset %d\n", __FUNCTION__, _ret);	\
       
   850 	}								\
       
   851     }									\
       
   852 } while (0)
       
   853 
       
   854 #define RADEONCP_REFRESH(pScrn, info)					\
       
   855 do {									\
       
   856     if (!info->CPInUse) {						\
       
   857 	RADEON_WAIT_UNTIL_IDLE();					\
       
   858 	BEGIN_RING(6);							\
       
   859 	OUT_RING_REG(RADEON_RE_TOP_LEFT,     info->re_top_left);	\
       
   860 	OUT_RING_REG(RADEON_RE_WIDTH_HEIGHT, info->re_width_height);	\
       
   861 	OUT_RING_REG(RADEON_AUX_SC_CNTL,     info->aux_sc_cntl);	\
       
   862 	ADVANCE_RING();							\
       
   863 	info->CPInUse = TRUE;						\
       
   864     }									\
       
   865 } while (0)
       
   866 
       
   867 
       
   868 #define CP_PACKET0(reg, n)						\
       
   869 	(RADEON_CP_PACKET0 | ((n) << 16) | ((reg) >> 2))
       
   870 #define CP_PACKET1(reg0, reg1)						\
       
   871 	(RADEON_CP_PACKET1 | (((reg1) >> 2) << 11) | ((reg0) >> 2))
       
   872 #define CP_PACKET2()							\
       
   873 	(RADEON_CP_PACKET2)
       
   874 #define CP_PACKET3(pkt, n)						\
       
   875 	(RADEON_CP_PACKET3 | (pkt) | ((n) << 16))
       
   876 
       
   877 
       
   878 #define RADEON_VERBOSE	0
       
   879 
       
   880 #define RING_LOCALS	CARD32 *__head = NULL; int __expected; int __count = 0
       
   881 
       
   882 #define BEGIN_RING(n) do {						\
       
   883     if (RADEON_VERBOSE) {						\
       
   884 	xf86DrvMsg(pScrn->scrnIndex, X_INFO,				\
       
   885 		   "BEGIN_RING(%d) in %s\n", n, __FUNCTION__);		\
       
   886     }									\
       
   887     if (++info->dma_begin_count != 1) {					\
       
   888 	xf86DrvMsg(pScrn->scrnIndex, X_ERROR,				\
       
   889 		   "BEGIN_RING without end at %s:%d\n",			\
       
   890 		   info->dma_debug_func, info->dma_debug_lineno);	\
       
   891 	info->dma_begin_count = 1;					\
       
   892     }									\
       
   893     info->dma_debug_func = __FILE__;					\
       
   894     info->dma_debug_lineno = __LINE__;					\
       
   895     if (!info->indirectBuffer) {					\
       
   896 	info->indirectBuffer = RADEONCPGetBuffer(pScrn);		\
       
   897 	info->indirectStart = 0;					\
       
   898     } else if (info->indirectBuffer->used + (n) * (int)sizeof(CARD32) >	\
       
   899 	       info->indirectBuffer->total) {				\
       
   900 	RADEONCPFlushIndirect(pScrn, 1);				\
       
   901     }									\
       
   902     __expected = n;							\
       
   903     __head = (pointer)((char *)info->indirectBuffer->address +		\
       
   904 		       info->indirectBuffer->used);			\
       
   905     __count = 0;							\
       
   906 } while (0)
       
   907 
       
   908 #define ADVANCE_RING() do {						\
       
   909     if (info->dma_begin_count-- != 1) {					\
       
   910 	xf86DrvMsg(pScrn->scrnIndex, X_ERROR,				\
       
   911 		   "ADVANCE_RING without begin at %s:%d\n",		\
       
   912 		   __FILE__, __LINE__);					\
       
   913 	info->dma_begin_count = 0;					\
       
   914     }									\
       
   915     if (__count != __expected) {					\
       
   916 	xf86DrvMsg(pScrn->scrnIndex, X_ERROR,				\
       
   917 		   "ADVANCE_RING count != expected (%d vs %d) at %s:%d\n", \
       
   918 		   __count, __expected, __FILE__, __LINE__);		\
       
   919     }									\
       
   920     if (RADEON_VERBOSE) {						\
       
   921 	xf86DrvMsg(pScrn->scrnIndex, X_INFO,				\
       
   922 		   "ADVANCE_RING() start: %d used: %d count: %d\n",	\
       
   923 		   info->indirectStart,					\
       
   924 		   info->indirectBuffer->used,				\
       
   925 		   __count * (int)sizeof(CARD32));			\
       
   926     }									\
       
   927     info->indirectBuffer->used += __count * (int)sizeof(CARD32);	\
       
   928 } while (0)
       
   929 
       
   930 #define OUT_RING(x) do {						\
       
   931     if (RADEON_VERBOSE) {						\
       
   932 	xf86DrvMsg(pScrn->scrnIndex, X_INFO,				\
       
   933 		   "   OUT_RING(0x%08x)\n", (unsigned int)(x));		\
       
   934     }									\
       
   935     __head[__count++] = (x);						\
       
   936 } while (0)
       
   937 
       
   938 #define OUT_RING_REG(reg, val)						\
       
   939 do {									\
       
   940     OUT_RING(CP_PACKET0(reg, 0));					\
       
   941     OUT_RING(val);							\
       
   942 } while (0)
       
   943 
       
   944 #define FLUSH_RING()							\
       
   945 do {									\
       
   946     if (RADEON_VERBOSE)							\
       
   947 	xf86DrvMsg(pScrn->scrnIndex, X_INFO,				\
       
   948 		   "FLUSH_RING in %s\n", __FUNCTION__);			\
       
   949     if (info->indirectBuffer) {						\
       
   950 	RADEONCPFlushIndirect(pScrn, 0);				\
       
   951     }									\
       
   952 } while (0)
       
   953 
       
   954 
       
   955 #define RADEON_WAIT_UNTIL_2D_IDLE()					\
       
   956 do {									\
       
   957     BEGIN_RING(2);							\
       
   958     OUT_RING(CP_PACKET0(RADEON_WAIT_UNTIL, 0));				\
       
   959     OUT_RING((RADEON_WAIT_2D_IDLECLEAN |				\
       
   960 	      RADEON_WAIT_HOST_IDLECLEAN));				\
       
   961     ADVANCE_RING();							\
       
   962 } while (0)
       
   963 
       
   964 #define RADEON_WAIT_UNTIL_3D_IDLE()					\
       
   965 do {									\
       
   966     BEGIN_RING(2);							\
       
   967     OUT_RING(CP_PACKET0(RADEON_WAIT_UNTIL, 0));				\
       
   968     OUT_RING((RADEON_WAIT_3D_IDLECLEAN |				\
       
   969 	      RADEON_WAIT_HOST_IDLECLEAN));				\
       
   970     ADVANCE_RING();							\
       
   971 } while (0)
       
   972 
       
   973 #define RADEON_WAIT_UNTIL_IDLE()					\
       
   974 do {									\
       
   975     if (RADEON_VERBOSE) {						\
       
   976 	xf86DrvMsg(pScrn->scrnIndex, X_INFO,				\
       
   977 		   "WAIT_UNTIL_IDLE() in %s\n", __FUNCTION__);		\
       
   978     }									\
       
   979     BEGIN_RING(2);							\
       
   980     OUT_RING(CP_PACKET0(RADEON_WAIT_UNTIL, 0));				\
       
   981     OUT_RING((RADEON_WAIT_2D_IDLECLEAN |				\
       
   982 	      RADEON_WAIT_3D_IDLECLEAN |				\
       
   983 	      RADEON_WAIT_HOST_IDLECLEAN));				\
       
   984     ADVANCE_RING();							\
       
   985 } while (0)
       
   986 
       
   987 #define RADEON_FLUSH_CACHE()						\
       
   988 do {									\
       
   989     BEGIN_RING(2);							\
       
   990     OUT_RING(CP_PACKET0(RADEON_RB3D_DSTCACHE_CTLSTAT, 0));		\
       
   991     OUT_RING(RADEON_RB3D_DC_FLUSH);					\
       
   992     ADVANCE_RING();							\
       
   993 } while (0)
       
   994 
       
   995 #define RADEON_PURGE_CACHE()						\
       
   996 do {									\
       
   997     BEGIN_RING(2);							\
       
   998     OUT_RING(CP_PACKET0(RADEON_RB3D_DSTCACHE_CTLSTAT, 0));		\
       
   999     OUT_RING(RADEON_RB3D_DC_FLUSH_ALL);					\
       
  1000     ADVANCE_RING();							\
       
  1001 } while (0)
       
  1002 
       
  1003 #endif /* XF86DRI */
       
  1004 
       
  1005 static __inline__ void RADEON_MARK_SYNC(RADEONInfoPtr info, ScrnInfoPtr pScrn)
       
  1006 {
       
  1007 #ifdef USE_EXA
       
  1008     if (info->useEXA)
       
  1009 	exaMarkSync(pScrn->pScreen);
       
  1010 #endif
       
  1011 #ifdef USE_XAA
       
  1012     if (!info->useEXA)
       
  1013 	SET_SYNC_FLAG(info->accel);
       
  1014 #endif
       
  1015 }
       
  1016 
       
  1017 static __inline__ void RADEON_SYNC(RADEONInfoPtr info, ScrnInfoPtr pScrn)
       
  1018 {
       
  1019 #ifdef USE_EXA
       
  1020     if (info->useEXA)
       
  1021 	exaWaitSync(pScrn->pScreen);
       
  1022 #endif
       
  1023 #ifdef USE_XAA
       
  1024     if (!info->useEXA && info->accel)
       
  1025 	info->accel->Sync(pScrn);
       
  1026 #endif
       
  1027 }
       
  1028 
       
  1029 #endif /* _RADEON_H_ */