412 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			412 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			C
		
	
	
	
| /*
 | |
|  * $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 <kdrive-config.h>
 | |
| #endif
 | |
| 
 | |
| #ifdef KDRIVEFBDEV
 | |
| #include <fbdev.h>
 | |
| #endif
 | |
| #ifdef KDRIVEVESA
 | |
| #include <vesa.h>
 | |
| #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;
 | |
| 	char *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;
 | |
| 	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;
 | |
| 	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
 | |
| 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_ */
 |