/* * $Id$ * * Copyright © 2003 Eric Anholt * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of Eric Anholt not be used in * advertising or publicity pertaining to distribution of the software without * specific, written prior permission. Eric Anholt makes no * representations about the suitability of this software for any purpose. It * is provided "as is" without express or implied warranty. * * ERIC ANHOLT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO * EVENT SHALL ERIC ANHOLT BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* $Header$ */ #ifndef _ATI_H_ #define _ATI_H_ #ifdef HAVE_CONFIG_H #include #endif #ifdef KDRIVEFBDEV #include #endif #ifdef KDRIVEVESA #include #endif #include "kxv.h" #ifdef XF86DRI #define USE_DRI #include "libdrm.h" #include "dri.h" #ifdef GLXEXT #include "GL/glxint.h" #include "GL/glxtokens.h" #include "ati_dripriv.h" #endif #endif #define ATI_REG_BASE(c) ((c)->attr.address[1]) #define ATI_REG_SIZE(c) (0x4000) #ifdef __powerpc__ static __inline__ void MMIO_OUT32(__volatile__ void *base, const unsigned long offset, const unsigned int val) { __asm__ __volatile__( "stwbrx %1,%2,%3\n\t" "eieio" : "=m" (*((volatile unsigned char *)base+offset)) : "r" (val), "b" (base), "r" (offset)); } static __inline__ CARD32 MMIO_IN32(__volatile__ void *base, const unsigned long offset) { register unsigned int val; __asm__ __volatile__( "lwbrx %0,%1,%2\n\t" "eieio" : "=r" (val) : "b" (base), "r" (offset), "m" (*((volatile unsigned char *)base+offset))); return val; } #else #define MMIO_OUT32(mmio, a, v) (*(VOL32 *)((mmio) + (a)) = (v)) #define MMIO_IN32(mmio, a) (*(VOL32 *)((mmio) + (a))) #endif #define MMIO_OUT8(mmio, a, v) (*(VOL8 *)((mmio) + (a)) = (v)) #define MMIO_IN8(mmio, a, v) (*(VOL8 *)((mmio) + (a))) #define INPLL(mmio, addr) \ (MMIO_OUT8(mmio, ATI_REG_CLOCK_CNTL_INDEX, addr), \ MMIO_IN32(mmio, ATI_REG_CLOCK_CNTL_DATA)) #define OUTPLL(mmio, addr, val) do { \ MMIO_OUT8(mmio, ATI_REG_CLOCK_CNTL_INDEX, (addr) | ATI_PLL_WR_EN); \ MMIO_OUT32(mmio, ATI_REG_CLOCK_CNTL_DATA, val); \ } while (0) typedef volatile CARD8 VOL8; typedef volatile CARD16 VOL16; typedef volatile CARD32 VOL32; struct pci_id_entry { CARD16 vendor; CARD16 device; CARD8 caps; char *name; }; struct backend_funcs { void (*cardfini)(KdCardInfo *); void (*scrfini)(KdScreenInfo *); Bool (*initScreen)(ScreenPtr); Bool (*finishInitScreen)(ScreenPtr pScreen); Bool (*createRes)(ScreenPtr); void (*preserve)(KdCardInfo *); void (*restore)(KdCardInfo *); Bool (*dpms)(ScreenPtr, int); Bool (*enable)(ScreenPtr); void (*disable)(ScreenPtr); void (*getColors)(ScreenPtr, int, int, xColorItem *); void (*putColors)(ScreenPtr, int, int, xColorItem *); #ifdef RANDR Bool (*randrSetConfig) (ScreenPtr, Rotation, int, RRScreenSizePtr); #endif }; typedef struct _ATICardInfo { union { #ifdef KDRIVEFBDEV FbdevPriv fbdev; #endif #ifdef KDRIVEVESA VesaCardPrivRec vesa; #endif } backend_priv; struct backend_funcs backend_funcs; struct pci_id_entry *pci_id; CARD8 *reg_base; Bool is_radeon; Bool is_r100; Bool is_r200; Bool is_r300; Bool is_agp; char *busid; CARD32 crtc_pitch; CARD32 crtc2_pitch; #ifdef USE_DRI int drmFd; #endif /* USE_DRI */ Bool use_fbdev, use_vesa; } ATICardInfo; #define getATICardInfo(kd) ((ATICardInfo *) ((kd)->card->driver)) #define ATICardInfo(kd) ATICardInfo *atic = getATICardInfo(kd) typedef struct _ATICursor { int width, height; int xhot, yhot; Bool has_cursor; CursorPtr pCursor; Pixel source, mask; KdOffscreenArea *area; } ATICursor; typedef struct _ATIPortPriv { int brightness; int saturation; RegionRec clip; Bool videoOn; Time offTime; Time freeTime; CARD32 size; KdOffscreenArea *off_screen; DrawablePtr pDraw; PixmapPtr pPixmap; CARD32 src_offset; CARD32 src_pitch; CARD8 *src_addr; int id; int src_x1, src_y1, src_x2, src_y2; int dst_x1, dst_y1, dst_x2, dst_y2; int src_w, src_h, dst_w, dst_h; } ATIPortPrivRec, *ATIPortPrivPtr; typedef struct _dmaBuf { int size; int used; void *address; #ifdef USE_DRI drmBufPtr drmBuf; #endif } dmaBuf; typedef struct _ATIScreenInfo { union { #ifdef KDRIVEFBDEV FbdevScrPriv fbdev; #endif #ifdef KDRIVEVESA VesaScreenPrivRec vesa; #endif } backend_priv; KaaScreenInfoRec kaa; ATICardInfo *atic; KdScreenInfo *screen; int scratch_offset; int scratch_next; int scratch_size; KdOffscreenArea *scratch_area; ATICursor cursor; KdVideoAdaptorPtr pAdaptor; int num_texture_ports; Bool using_pio; /* If we use decode DMA packets to MMIO. */ Bool using_pseudo; /* If we use MMIO to submit DMA packets. */ Bool using_dma; /* If we use non-DRI DMA to submit packets. */ Bool using_dri; /* If we use the DRM for DMA. */ Bool using_agp; /* If we are using AGP or not for DMA. */ KdOffscreenArea *dma_space; /* For "DMA" from framebuffer. */ void *agp_addr; /* Mapped AGP aperture */ int agp_size; int agp_key; /* Key of AGP memory for DMA */ CARD32 *ring_addr; /* Beginning of ring buffer. */ int ring_write; /* Index of write ptr in ring. */ int ring_read; /* Index of read ptr in ring. */ int ring_len; dmaBuf *indirectBuffer; int indirectStart; int mmio_avail; int cce_pri_size; int cce_pri_avail; #ifdef USE_DRI Bool dma_started; drmSize registerSize; drmHandle registerHandle; drmHandle fbHandle; drmSize gartSize; drmHandle agpMemHandle; /* Handle from drmAgpAlloc */ unsigned long gartOffset; unsigned char *AGP; /* Map */ int agpMode; drmSize pciSize; drmHandle pciMemHandle; /* ring buffer data */ unsigned long ringStart; /* Offset into AGP space */ drmHandle ringHandle; /* Handle from drmAddMap */ drmSize ringMapSize; /* Size of map */ int ringSize; /* Size of ring (MB) */ unsigned char *ring; /* Map */ unsigned long ringReadOffset; /* Offset into AGP space */ drmHandle ringReadPtrHandle; /* Handle from drmAddMap */ drmSize ringReadMapSize; /* Size of map */ unsigned char *ringReadPtr; /* Map */ /* vertex/indirect buffer data */ unsigned long bufStart; /* Offset into AGP space */ drmHandle bufHandle; /* Handle from drmAddMap */ drmSize bufMapSize; /* Size of map */ int bufSize; /* Size of buffers (MB) */ unsigned char *buf; /* Map */ int bufNumBufs; /* Number of buffers */ drmBufMapPtr buffers; /* Buffer map */ /* AGP Texture data */ unsigned long gartTexStart; /* Offset into AGP space */ drmHandle gartTexHandle; /* Handle from drmAddMap */ drmSize gartTexMapSize; /* Size of map */ int gartTexSize; /* Size of AGP tex space (MB) */ unsigned char *gartTex; /* Map */ int log2GARTTexGran; int DMAusecTimeout; /* CCE timeout in usecs */ /* DRI screen private data */ int frontOffset; int frontPitch; int backOffset; int backPitch; int depthOffset; int depthPitch; int spanOffset; int textureOffset; int textureSize; int log2TexGran; int irqEnabled; int serverContext; DRIInfoPtr pDRIInfo; #ifdef GLXEXT int numVisualConfigs; __GLXvisualConfig *pVisualConfigs; ATIConfigPrivPtr pVisualConfigsPriv; #endif /* GLXEXT */ #endif /* USE_DRI */ } ATIScreenInfo; #define getATIScreenInfo(kd) ((ATIScreenInfo *) ((kd)->screen->driver)) #define ATIScreenInfo(kd) ATIScreenInfo *atis = getATIScreenInfo(kd) typedef union { float f; CARD32 i; } fi_type; /* Surely there's a better way to go about this */ static inline CARD32 ATIFloatAsInt(float val) { fi_type fi; fi.f = val; return fi.i; } #define GET_FLOAT_BITS(x) ATIFloatAsInt(x) /* ati.c */ Bool ATIMapReg(KdCardInfo *card, ATICardInfo *atic); void ATIUnmapReg(KdCardInfo *card, ATICardInfo *atic); void R300CGWorkaround(ATIScreenInfo *atis); /* ati_draw.c */ void ATIDrawSetup(ScreenPtr pScreen); Bool ATIDrawInit(ScreenPtr pScreen); void ATIDrawEnable(ScreenPtr pScreen); void ATIDrawSync(ScreenPtr pScreen); void ATIDrawDisable(ScreenPtr pScreen); void ATIDrawFini(ScreenPtr pScreen); /* ati_dri.c */ #ifdef USE_DRI Bool ATIDRIScreenInit(ScreenPtr pScreen); void ATIDRICloseScreen(ScreenPtr pScreen); void ATIDRIDMAStart(ATIScreenInfo *atis); void ATIDRIDMAStop(ATIScreenInfo *atis); void ATIDRIDMAReset(ATIScreenInfo *atis); void ATIDRIDispatchIndirect(ATIScreenInfo *atis, Bool discard); drmBufPtr ATIDRIGetBuffer(ATIScreenInfo *atis); #endif /* USE_DRI */ /* ati_cursor.c */ Bool ATICursorInit(ScreenPtr pScreen); void ATICursorEnable(ScreenPtr pScreen); void ATICursorDisable(ScreenPtr pScreen); void ATICursorFini(ScreenPtr pScreen); void ATIRecolorCursor(ScreenPtr pScreen, int ndef, xColorItem *pdef); int ATILog2(int val); /* ati_video.c */ Bool ATIInitVideo(ScreenPtr pScreen); void ATIFiniVideo(ScreenPtr pScreen); extern KdCardFuncs ATIFuncs; #endif /* _ATI_H_ */