mirror of
https://gitlab.freedesktop.org/mesa/drm.git
synced 2026-05-09 05:08:04 +02:00
bring the bsd-3-0-0 branch up-to-date with the trunk
This commit is contained in:
parent
fd4d82a496
commit
783ba16f26
14 changed files with 1034 additions and 803 deletions
|
|
@ -265,6 +265,30 @@ void *DRM(ioremap_nocache)(unsigned long offset, unsigned long size)
|
|||
}
|
||||
#endif
|
||||
|
||||
void *DRM(ioremap_nocache)(unsigned long offset, unsigned long size)
|
||||
{
|
||||
void *pt;
|
||||
|
||||
if (!size) {
|
||||
DRM_MEM_ERROR(DRM_MEM_MAPPINGS,
|
||||
"Mapping 0 bytes at 0x%08lx\n", offset);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* FIXME FOR BSD */
|
||||
if (!(pt = ioremap_nocache(offset, size))) {
|
||||
DRM_OS_SPINLOCK(&DRM(mem_lock));
|
||||
++DRM(mem_stats)[DRM_MEM_MAPPINGS].fail_count;
|
||||
DRM_OS_SPINUNLOCK(&DRM(mem_lock));
|
||||
return NULL;
|
||||
}
|
||||
DRM_OS_SPINLOCK(&DRM(mem_lock));
|
||||
++DRM(mem_stats)[DRM_MEM_MAPPINGS].succeed_count;
|
||||
DRM(mem_stats)[DRM_MEM_MAPPINGS].bytes_allocated += size;
|
||||
DRM_OS_SPINUNLOCK(&DRM(mem_lock));
|
||||
return pt;
|
||||
}
|
||||
|
||||
void DRM(ioremapfree)(void *pt, unsigned long size)
|
||||
{
|
||||
int alloc_count;
|
||||
|
|
|
|||
|
|
@ -265,6 +265,30 @@ void *DRM(ioremap_nocache)(unsigned long offset, unsigned long size)
|
|||
}
|
||||
#endif
|
||||
|
||||
void *DRM(ioremap_nocache)(unsigned long offset, unsigned long size)
|
||||
{
|
||||
void *pt;
|
||||
|
||||
if (!size) {
|
||||
DRM_MEM_ERROR(DRM_MEM_MAPPINGS,
|
||||
"Mapping 0 bytes at 0x%08lx\n", offset);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* FIXME FOR BSD */
|
||||
if (!(pt = ioremap_nocache(offset, size))) {
|
||||
DRM_OS_SPINLOCK(&DRM(mem_lock));
|
||||
++DRM(mem_stats)[DRM_MEM_MAPPINGS].fail_count;
|
||||
DRM_OS_SPINUNLOCK(&DRM(mem_lock));
|
||||
return NULL;
|
||||
}
|
||||
DRM_OS_SPINLOCK(&DRM(mem_lock));
|
||||
++DRM(mem_stats)[DRM_MEM_MAPPINGS].succeed_count;
|
||||
DRM(mem_stats)[DRM_MEM_MAPPINGS].bytes_allocated += size;
|
||||
DRM_OS_SPINUNLOCK(&DRM(mem_lock));
|
||||
return pt;
|
||||
}
|
||||
|
||||
void DRM(ioremapfree)(void *pt, unsigned long size)
|
||||
{
|
||||
int alloc_count;
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@
|
|||
#include "i830_drm.h"
|
||||
#include "i830_drv.h"
|
||||
#include <linux/interrupt.h> /* For task queue support */
|
||||
#include <linux/delay.h>
|
||||
|
||||
/* in case we don't have a 2.3.99-pre6 kernel or later: */
|
||||
#ifndef VM_DONTCOPY
|
||||
|
|
@ -58,7 +59,6 @@
|
|||
do { \
|
||||
int _head; \
|
||||
int _tail; \
|
||||
int _i; \
|
||||
do { \
|
||||
_head = I830_READ(LP_RING + RING_HEAD) & HEAD_ADDR; \
|
||||
_tail = I830_READ(LP_RING + RING_TAIL) & TAIL_ADDR; \
|
||||
|
|
@ -369,9 +369,7 @@ static int i830_wait_ring(drm_device_t *dev, int n)
|
|||
unsigned int last_head = I830_READ(LP_RING + RING_HEAD) & HEAD_ADDR;
|
||||
|
||||
end = jiffies + (HZ*3);
|
||||
while (ring->space < n) {
|
||||
int i;
|
||||
|
||||
while (ring->space < n) {
|
||||
ring->head = I830_READ(LP_RING + RING_HEAD) & HEAD_ADDR;
|
||||
ring->space = ring->head - (ring->tail+8);
|
||||
if (ring->space < 0) ring->space += ring->Size;
|
||||
|
|
|
|||
|
|
@ -39,11 +39,11 @@
|
|||
|
||||
#define DRIVER_NAME "radeon"
|
||||
#define DRIVER_DESC "ATI Radeon"
|
||||
#define DRIVER_DATE "20010405"
|
||||
#define DRIVER_DATE "20020611"
|
||||
|
||||
#define DRIVER_MAJOR 1
|
||||
#define DRIVER_MINOR 2
|
||||
#define DRIVER_PATCHLEVEL 0
|
||||
#define DRIVER_MINOR 3
|
||||
#define DRIVER_PATCHLEVEL 1
|
||||
|
||||
/* Interface history:
|
||||
*
|
||||
|
|
@ -51,6 +51,10 @@
|
|||
* 1.2 - Add vertex2 ioctl (keith)
|
||||
* - Add stencil capability to clear ioctl (gareth, keith)
|
||||
* - Increase MAX_TEXTURE_LEVELS (brian)
|
||||
* 1.3 - Add cmdbuf ioctl (keith)
|
||||
* - Add support for new radeon packets (keith)
|
||||
* - Add getparam ioctl (keith)
|
||||
* - Add flip-buffers ioctl, deprecate fullscreen foo (keith).
|
||||
*/
|
||||
#define DRIVER_IOCTLS \
|
||||
[DRM_IOCTL_NR(DRM_IOCTL_DMA)] = { radeon_cp_buffers, 1, 0 }, \
|
||||
|
|
@ -68,17 +72,10 @@
|
|||
[DRM_IOCTL_NR(DRM_IOCTL_RADEON_TEXTURE)] = { radeon_cp_texture, 1, 0 }, \
|
||||
[DRM_IOCTL_NR(DRM_IOCTL_RADEON_STIPPLE)] = { radeon_cp_stipple, 1, 0 }, \
|
||||
[DRM_IOCTL_NR(DRM_IOCTL_RADEON_INDIRECT)] = { radeon_cp_indirect, 1, 1 }, \
|
||||
[DRM_IOCTL_NR(DRM_IOCTL_RADEON_VERTEX2)] = { radeon_cp_vertex2, 1, 0 },
|
||||
|
||||
|
||||
#if 0
|
||||
/* GH: Count data sent to card via ring or vertex/indirect buffers.
|
||||
*/
|
||||
#define __HAVE_COUNTERS 3
|
||||
#define __HAVE_COUNTER6 _DRM_STAT_IRQ
|
||||
#define __HAVE_COUNTER7 _DRM_STAT_PRIMARY
|
||||
#define __HAVE_COUNTER8 _DRM_STAT_SECONDARY
|
||||
#endif
|
||||
[DRM_IOCTL_NR(DRM_IOCTL_RADEON_VERTEX2)] = { radeon_cp_vertex2, 1, 0 }, \
|
||||
[DRM_IOCTL_NR(DRM_IOCTL_RADEON_CMDBUF)] = { radeon_cp_cmdbuf, 1, 0 }, \
|
||||
[DRM_IOCTL_NR(DRM_IOCTL_RADEON_GETPARAM)] = { radeon_cp_getparam, 1, 0 }, \
|
||||
[DRM_IOCTL_NR(DRM_IOCTL_RADEON_FLIP)] = { radeon_cp_flip, 1, 0 },
|
||||
|
||||
|
||||
#include "drm_agpsupport.h"
|
||||
|
|
|
|||
|
|
@ -84,6 +84,10 @@ typedef unsigned int drm_magic_t;
|
|||
/* Warning: If you change this structure, make sure you change
|
||||
* XF86DRIClipRectRec in the server as well */
|
||||
|
||||
/* KW: Actually it's illegal to change either for
|
||||
* backwards-compatibility reasons.
|
||||
*/
|
||||
|
||||
typedef struct drm_clip_rect {
|
||||
unsigned short x1;
|
||||
unsigned short y1;
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@
|
|||
#include "i830_drm.h"
|
||||
#include "i830_drv.h"
|
||||
#include <linux/interrupt.h> /* For task queue support */
|
||||
#include <linux/delay.h>
|
||||
|
||||
/* in case we don't have a 2.3.99-pre6 kernel or later: */
|
||||
#ifndef VM_DONTCOPY
|
||||
|
|
@ -58,7 +59,6 @@
|
|||
do { \
|
||||
int _head; \
|
||||
int _tail; \
|
||||
int _i; \
|
||||
do { \
|
||||
_head = I830_READ(LP_RING + RING_HEAD) & HEAD_ADDR; \
|
||||
_tail = I830_READ(LP_RING + RING_TAIL) & TAIL_ADDR; \
|
||||
|
|
@ -369,9 +369,7 @@ static int i830_wait_ring(drm_device_t *dev, int n)
|
|||
unsigned int last_head = I830_READ(LP_RING + RING_HEAD) & HEAD_ADDR;
|
||||
|
||||
end = jiffies + (HZ*3);
|
||||
while (ring->space < n) {
|
||||
int i;
|
||||
|
||||
while (ring->space < n) {
|
||||
ring->head = I830_READ(LP_RING + RING_HEAD) & HEAD_ADDR;
|
||||
ring->space = ring->head - (ring->tail+8);
|
||||
if (ring->space < 0) ring->space += ring->Size;
|
||||
|
|
|
|||
|
|
@ -34,8 +34,8 @@
|
|||
#ifndef __R128_DRV_H__
|
||||
#define __R128_DRV_H__
|
||||
|
||||
#define GET_RING_HEAD( ring ) le32_to_cpu( *(ring)->head )
|
||||
#define SET_RING_HEAD( ring, val ) *(ring)->head = cpu_to_le32( val )
|
||||
#define GET_RING_HEAD(ring) readl( (volatile u32 *) (ring)->head )
|
||||
#define SET_RING_HEAD(ring,val) writel( (val), (volatile u32 *) (ring)->head )
|
||||
|
||||
typedef struct drm_r128_freelist {
|
||||
unsigned int age;
|
||||
|
|
@ -384,44 +384,11 @@ extern int r128_cce_indirect( struct inode *inode, struct file *filp,
|
|||
#define R128_BASE(reg) ((unsigned long)(dev_priv->mmio->handle))
|
||||
#define R128_ADDR(reg) (R128_BASE( reg ) + reg)
|
||||
|
||||
#define R128_DEREF(reg) *(volatile u32 *)R128_ADDR( reg )
|
||||
#ifdef __alpha__
|
||||
#define R128_READ(reg) (_R128_READ((u32 *)R128_ADDR(reg)))
|
||||
static inline u32 _R128_READ(u32 *addr)
|
||||
{
|
||||
mb();
|
||||
return *(volatile u32 *)addr;
|
||||
}
|
||||
#define R128_WRITE(reg,val) \
|
||||
do { \
|
||||
wmb(); \
|
||||
R128_DEREF(reg) = val; \
|
||||
} while (0)
|
||||
#else
|
||||
#define R128_READ(reg) le32_to_cpu( R128_DEREF( reg ) )
|
||||
#define R128_WRITE(reg,val) \
|
||||
do { \
|
||||
R128_DEREF( reg ) = cpu_to_le32( val ); \
|
||||
} while (0)
|
||||
#endif
|
||||
#define R128_READ(reg) readl( (volatile u32 *) R128_ADDR(reg) )
|
||||
#define R128_WRITE(reg,val) writel( (val), (volatile u32 *) R128_ADDR(reg) )
|
||||
|
||||
#define R128_DEREF8(reg) *(volatile u8 *)R128_ADDR( reg )
|
||||
#ifdef __alpha__
|
||||
#define R128_READ8(reg) _R128_READ8((u8 *)R128_ADDR(reg))
|
||||
static inline u8 _R128_READ8(u8 *addr)
|
||||
{
|
||||
mb();
|
||||
return *(volatile u8 *)addr;
|
||||
}
|
||||
#define R128_WRITE8(reg,val) \
|
||||
do { \
|
||||
wmb(); \
|
||||
R128_DEREF8(reg) = val; \
|
||||
} while (0)
|
||||
#else
|
||||
#define R128_READ8(reg) R128_DEREF8( reg )
|
||||
#define R128_WRITE8(reg,val) do { R128_DEREF8( reg ) = val; } while (0)
|
||||
#endif
|
||||
#define R128_READ8(reg) readb( (volatile u8 *) R128_ADDR(reg) )
|
||||
#define R128_WRITE8(reg,val) writeb( (val), (volatile u8 *) R128_ADDR(reg) )
|
||||
|
||||
#define R128_WRITE_PLL(addr,val) \
|
||||
do { \
|
||||
|
|
@ -493,7 +460,11 @@ do { \
|
|||
* Ring control
|
||||
*/
|
||||
|
||||
#if defined(__powerpc__)
|
||||
#define r128_flush_write_combine() (void) GET_RING_HEAD( &dev_priv->ring )
|
||||
#else
|
||||
#define r128_flush_write_combine() mb()
|
||||
#endif
|
||||
|
||||
|
||||
#define R128_VERBOSE 0
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@
|
|||
|
||||
#define RADEON_FIFO_DEBUG 0
|
||||
|
||||
#if defined(__alpha__)
|
||||
#if defined(__alpha__) || defined(__powerpc__)
|
||||
# define PCIGART_ENABLED
|
||||
#else
|
||||
# undef PCIGART_ENABLED
|
||||
|
|
@ -461,6 +461,7 @@ int radeon_do_cp_idle( drm_radeon_private_t *dev_priv )
|
|||
RADEON_WAIT_UNTIL_IDLE();
|
||||
|
||||
ADVANCE_RING();
|
||||
COMMIT_RING();
|
||||
|
||||
return radeon_do_wait_for_idle( dev_priv );
|
||||
}
|
||||
|
|
@ -485,6 +486,7 @@ static void radeon_do_cp_start( drm_radeon_private_t *dev_priv )
|
|||
RADEON_WAIT_UNTIL_IDLE();
|
||||
|
||||
ADVANCE_RING();
|
||||
COMMIT_RING();
|
||||
}
|
||||
|
||||
/* Reset the Command Processor. This will not flush any pending
|
||||
|
|
@ -631,7 +633,11 @@ static void radeon_cp_init_ring_buffer( drm_device_t *dev,
|
|||
}
|
||||
|
||||
/* Set ring buffer size */
|
||||
#ifdef __BIG_ENDIAN
|
||||
RADEON_WRITE( RADEON_CP_RB_CNTL, dev_priv->ring.size_l2qw | RADEON_BUF_SWAP_32BIT );
|
||||
#else
|
||||
RADEON_WRITE( RADEON_CP_RB_CNTL, dev_priv->ring.size_l2qw );
|
||||
#endif
|
||||
|
||||
radeon_do_wait_for_idle( dev_priv );
|
||||
|
||||
|
|
@ -747,7 +753,7 @@ static int radeon_do_init_cp( drm_device_t *dev, drm_radeon_init_t *init )
|
|||
*/
|
||||
dev_priv->depth_clear.rb3d_cntl = (RADEON_PLANE_MASK_ENABLE |
|
||||
(dev_priv->color_fmt << 10) |
|
||||
RADEON_ZBLOCK16);
|
||||
(1<<15));
|
||||
|
||||
dev_priv->depth_clear.rb3d_zstencilcntl =
|
||||
(dev_priv->depth_fmt |
|
||||
|
|
@ -966,9 +972,7 @@ static int radeon_do_init_cp( drm_device_t *dev, drm_radeon_init_t *init )
|
|||
radeon_cp_load_microcode( dev_priv );
|
||||
radeon_cp_init_ring_buffer( dev, dev_priv );
|
||||
|
||||
#if ROTATE_BUFS
|
||||
dev_priv->last_buf = 0;
|
||||
#endif
|
||||
|
||||
dev->dev_private = (void *)dev_priv;
|
||||
|
||||
|
|
@ -1148,116 +1152,27 @@ int radeon_engine_reset( struct inode *inode, struct file *filp,
|
|||
* Fullscreen mode
|
||||
*/
|
||||
|
||||
static int radeon_do_init_pageflip( drm_device_t *dev )
|
||||
{
|
||||
drm_radeon_private_t *dev_priv = dev->dev_private;
|
||||
DRM_DEBUG( "%s\n", __FUNCTION__ );
|
||||
|
||||
dev_priv->crtc_offset = RADEON_READ( RADEON_CRTC_OFFSET );
|
||||
dev_priv->crtc_offset_cntl = RADEON_READ( RADEON_CRTC_OFFSET_CNTL );
|
||||
|
||||
RADEON_WRITE( RADEON_CRTC_OFFSET, dev_priv->front_offset );
|
||||
RADEON_WRITE( RADEON_CRTC_OFFSET_CNTL,
|
||||
dev_priv->crtc_offset_cntl |
|
||||
RADEON_CRTC_OFFSET_FLIP_CNTL );
|
||||
|
||||
dev_priv->page_flipping = 1;
|
||||
dev_priv->current_page = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int radeon_do_cleanup_pageflip( drm_device_t *dev )
|
||||
{
|
||||
drm_radeon_private_t *dev_priv = dev->dev_private;
|
||||
DRM_DEBUG( "%s\n", __FUNCTION__ );
|
||||
|
||||
RADEON_WRITE( RADEON_CRTC_OFFSET, dev_priv->crtc_offset );
|
||||
RADEON_WRITE( RADEON_CRTC_OFFSET_CNTL, dev_priv->crtc_offset_cntl );
|
||||
|
||||
dev_priv->page_flipping = 0;
|
||||
dev_priv->current_page = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* KW: Deprecated to say the least:
|
||||
*/
|
||||
int radeon_fullscreen( struct inode *inode, struct file *filp,
|
||||
unsigned int cmd, unsigned long arg )
|
||||
{
|
||||
drm_file_t *priv = filp->private_data;
|
||||
drm_device_t *dev = priv->dev;
|
||||
drm_radeon_fullscreen_t fs;
|
||||
|
||||
LOCK_TEST_WITH_RETURN( dev );
|
||||
|
||||
if ( copy_from_user( &fs, (drm_radeon_fullscreen_t *)arg,
|
||||
sizeof(fs) ) )
|
||||
return -EFAULT;
|
||||
|
||||
switch ( fs.func ) {
|
||||
case RADEON_INIT_FULLSCREEN:
|
||||
return radeon_do_init_pageflip( dev );
|
||||
case RADEON_CLEANUP_FULLSCREEN:
|
||||
return radeon_do_cleanup_pageflip( dev );
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* ================================================================
|
||||
* Freelist management
|
||||
*/
|
||||
#define RADEON_BUFFER_USED 0xffffffff
|
||||
#define RADEON_BUFFER_FREE 0
|
||||
|
||||
#if 0
|
||||
static int radeon_freelist_init( drm_device_t *dev )
|
||||
{
|
||||
drm_device_dma_t *dma = dev->dma;
|
||||
drm_radeon_private_t *dev_priv = dev->dev_private;
|
||||
drm_buf_t *buf;
|
||||
drm_radeon_buf_priv_t *buf_priv;
|
||||
drm_radeon_freelist_t *entry;
|
||||
int i;
|
||||
|
||||
dev_priv->head = DRM(alloc)( sizeof(drm_radeon_freelist_t),
|
||||
DRM_MEM_DRIVER );
|
||||
if ( dev_priv->head == NULL )
|
||||
return -ENOMEM;
|
||||
|
||||
memset( dev_priv->head, 0, sizeof(drm_radeon_freelist_t) );
|
||||
dev_priv->head->age = RADEON_BUFFER_USED;
|
||||
|
||||
for ( i = 0 ; i < dma->buf_count ; i++ ) {
|
||||
buf = dma->buflist[i];
|
||||
buf_priv = buf->dev_private;
|
||||
|
||||
entry = DRM(alloc)( sizeof(drm_radeon_freelist_t),
|
||||
DRM_MEM_DRIVER );
|
||||
if ( !entry ) return -ENOMEM;
|
||||
|
||||
entry->age = RADEON_BUFFER_FREE;
|
||||
entry->buf = buf;
|
||||
entry->prev = dev_priv->head;
|
||||
entry->next = dev_priv->head->next;
|
||||
if ( !entry->next )
|
||||
dev_priv->tail = entry;
|
||||
|
||||
buf_priv->discard = 0;
|
||||
buf_priv->dispatched = 0;
|
||||
buf_priv->list_entry = entry;
|
||||
|
||||
dev_priv->head->next = entry;
|
||||
|
||||
if ( dev_priv->head->next )
|
||||
dev_priv->head->next->prev = entry;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
#endif
|
||||
/* Original comment: FIXME: ROTATE_BUFS is a hack to cycle through
|
||||
* bufs until freelist code is used. Note this hides a problem with
|
||||
* the scratch register * (used to keep track of last buffer
|
||||
* completed) being written to before * the last buffer has actually
|
||||
* completed rendering.
|
||||
*
|
||||
* KW: It's also a good way to find free buffers quickly.
|
||||
*/
|
||||
|
||||
drm_buf_t *radeon_freelist_get( drm_device_t *dev )
|
||||
{
|
||||
|
|
@ -1266,57 +1181,24 @@ drm_buf_t *radeon_freelist_get( drm_device_t *dev )
|
|||
drm_radeon_buf_priv_t *buf_priv;
|
||||
drm_buf_t *buf;
|
||||
int i, t;
|
||||
#if ROTATE_BUFS
|
||||
int start;
|
||||
#endif
|
||||
|
||||
/* FIXME: Optimize -- use freelist code */
|
||||
|
||||
for ( i = 0 ; i < dma->buf_count ; i++ ) {
|
||||
buf = dma->buflist[i];
|
||||
buf_priv = buf->dev_private;
|
||||
if ( buf->pid == 0 ) {
|
||||
DRM_DEBUG( " ret buf=%d last=%d pid=0\n",
|
||||
buf->idx, dev_priv->last_buf );
|
||||
return buf;
|
||||
}
|
||||
DRM_DEBUG( " skipping buf=%d pid=%d\n",
|
||||
buf->idx, buf->pid );
|
||||
}
|
||||
|
||||
#if ROTATE_BUFS
|
||||
if ( ++dev_priv->last_buf >= dma->buf_count )
|
||||
dev_priv->last_buf = 0;
|
||||
|
||||
start = dev_priv->last_buf;
|
||||
#endif
|
||||
|
||||
for ( t = 0 ; t < dev_priv->usec_timeout ; t++ ) {
|
||||
#if 0
|
||||
/* FIXME: Disable this for now */
|
||||
u32 done_age = dev_priv->scratch[RADEON_LAST_DISPATCH];
|
||||
#else
|
||||
u32 done_age = RADEON_READ( RADEON_LAST_DISPATCH_REG );
|
||||
#endif
|
||||
#if ROTATE_BUFS
|
||||
for ( i = start ; i < dma->buf_count ; i++ ) {
|
||||
#else
|
||||
for ( i = 0 ; i < dma->buf_count ; i++ ) {
|
||||
#endif
|
||||
buf = dma->buflist[i];
|
||||
buf_priv = buf->dev_private;
|
||||
if ( buf->pending && buf_priv->age <= done_age ) {
|
||||
/* The buffer has been processed, so it
|
||||
* can now be used.
|
||||
*/
|
||||
if ( buf->pid == 0 || (buf->pending &&
|
||||
buf_priv->age <= done_age) ) {
|
||||
buf->pending = 0;
|
||||
DRM_DEBUG( " ret buf=%d last=%d age=%d done=%d\n", buf->idx, dev_priv->last_buf, buf_priv->age, done_age );
|
||||
return buf;
|
||||
}
|
||||
DRM_DEBUG( " skipping buf=%d age=%d done=%d\n",
|
||||
buf->idx, buf_priv->age,
|
||||
done_age );
|
||||
#if ROTATE_BUFS
|
||||
start = 0;
|
||||
#endif
|
||||
}
|
||||
udelay( 1 );
|
||||
}
|
||||
|
|
@ -1328,14 +1210,10 @@ drm_buf_t *radeon_freelist_get( drm_device_t *dev )
|
|||
void radeon_freelist_reset( drm_device_t *dev )
|
||||
{
|
||||
drm_device_dma_t *dma = dev->dma;
|
||||
#if ROTATE_BUFS
|
||||
drm_radeon_private_t *dev_priv = dev->dev_private;
|
||||
#endif
|
||||
int i;
|
||||
|
||||
#if ROTATE_BUFS
|
||||
dev_priv->last_buf = 0;
|
||||
#endif
|
||||
for ( i = 0 ; i < dma->buf_count ; i++ ) {
|
||||
drm_buf_t *buf = dma->buflist[i];
|
||||
drm_radeon_buf_priv_t *buf_priv = buf->dev_private;
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
*
|
||||
* Copyright 2000 Precision Insight, Inc., Cedar Park, Texas.
|
||||
* Copyright 2000 VA Linux Systems, Inc., Fremont, California.
|
||||
* Copyright 2002 Tungsten Graphics, Inc., Cedar Park, Texas.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
|
|
@ -38,7 +39,8 @@
|
|||
#ifndef __RADEON_SAREA_DEFINES__
|
||||
#define __RADEON_SAREA_DEFINES__
|
||||
|
||||
/* What needs to be changed for the current vertex buffer?
|
||||
/* Old style state flags, required for sarea interface (1.1 and 1.2
|
||||
* clears) and 1.2 drm_vertex2 ioctl.
|
||||
*/
|
||||
#define RADEON_UPLOAD_CONTEXT 0x00000001
|
||||
#define RADEON_UPLOAD_VERTFMT 0x00000002
|
||||
|
|
@ -58,8 +60,68 @@
|
|||
#define RADEON_UPLOAD_CLIPRECTS 0x00008000 /* handled client-side */
|
||||
#define RADEON_REQUIRE_QUIESCENCE 0x00010000
|
||||
#define RADEON_UPLOAD_ZBIAS 0x00020000 /* version 1.2 and newer */
|
||||
#define RADEON_UPLOAD_ALL 0x0002ffff
|
||||
#define RADEON_UPLOAD_CONTEXT_ALL 0x000201ff
|
||||
#define RADEON_UPLOAD_ALL 0x003effff
|
||||
#define RADEON_UPLOAD_CONTEXT_ALL 0x003e01ff
|
||||
|
||||
|
||||
/* New style per-packet identifiers for use in cmd_buffer ioctl with
|
||||
* the RADEON_EMIT_PACKET command. Comments relate new packets to old
|
||||
* state bits and the packet size:
|
||||
*/
|
||||
#define RADEON_EMIT_PP_MISC 0 /* context/7 */
|
||||
#define RADEON_EMIT_PP_CNTL 1 /* context/3 */
|
||||
#define RADEON_EMIT_RB3D_COLORPITCH 2 /* context/1 */
|
||||
#define RADEON_EMIT_RE_LINE_PATTERN 3 /* line/2 */
|
||||
#define RADEON_EMIT_SE_LINE_WIDTH 4 /* line/1 */
|
||||
#define RADEON_EMIT_PP_LUM_MATRIX 5 /* bumpmap/1 */
|
||||
#define RADEON_EMIT_PP_ROT_MATRIX_0 6 /* bumpmap/2 */
|
||||
#define RADEON_EMIT_RB3D_STENCILREFMASK 7 /* masks/3 */
|
||||
#define RADEON_EMIT_SE_VPORT_XSCALE 8 /* viewport/6 */
|
||||
#define RADEON_EMIT_SE_CNTL 9 /* setup/2 */
|
||||
#define RADEON_EMIT_SE_CNTL_STATUS 10 /* setup/1 */
|
||||
#define RADEON_EMIT_RE_MISC 11 /* misc/1 */
|
||||
#define RADEON_EMIT_PP_TXFILTER_0 12 /* tex0/6 */
|
||||
#define RADEON_EMIT_PP_BORDER_COLOR_0 13 /* tex0/1 */
|
||||
#define RADEON_EMIT_PP_TXFILTER_1 14 /* tex1/6 */
|
||||
#define RADEON_EMIT_PP_BORDER_COLOR_1 15 /* tex1/1 */
|
||||
#define RADEON_EMIT_PP_TXFILTER_2 16 /* tex2/6 */
|
||||
#define RADEON_EMIT_PP_BORDER_COLOR_2 17 /* tex2/1 */
|
||||
#define RADEON_EMIT_SE_ZBIAS_FACTOR 18 /* zbias/2 */
|
||||
#define RADEON_EMIT_SE_TCL_OUTPUT_VTX_FMT 19 /* tcl/11 */
|
||||
#define RADEON_EMIT_SE_TCL_MATERIAL_EMMISSIVE_RED 20 /* material/17 */
|
||||
#define RADEON_MAX_STATE_PACKETS 21
|
||||
|
||||
|
||||
/* Commands understood by cmd_buffer ioctl. More can be added but
|
||||
* obviously these can't be removed or changed:
|
||||
*/
|
||||
#define RADEON_CMD_PACKET 1 /* emit one of the register packets above */
|
||||
#define RADEON_CMD_SCALARS 2 /* emit scalar data */
|
||||
#define RADEON_CMD_VECTORS 3 /* emit vector data */
|
||||
#define RADEON_CMD_DMA_DISCARD 4 /* discard current dma buf */
|
||||
#define RADEON_CMD_PACKET3 5 /* emit hw packet */
|
||||
#define RADEON_CMD_PACKET3_CLIP 6 /* emit hw packet wrapped in cliprects */
|
||||
|
||||
|
||||
typedef union {
|
||||
int i;
|
||||
struct {
|
||||
char cmd_type, pad0, pad1, pad2;
|
||||
} header;
|
||||
struct {
|
||||
char cmd_type, packet_id, pad0, pad1;
|
||||
} packet;
|
||||
struct {
|
||||
char cmd_type, offset, stride, count;
|
||||
} scalars;
|
||||
struct {
|
||||
char cmd_type, offset, stride, count;
|
||||
} vectors;
|
||||
struct {
|
||||
char cmd_type, buf_idx, pad0, pad1;
|
||||
} dma;
|
||||
} drm_radeon_cmd_header_t;
|
||||
|
||||
|
||||
#define RADEON_FRONT 0x1
|
||||
#define RADEON_BACK 0x2
|
||||
|
|
@ -82,7 +144,6 @@
|
|||
/* Byte offsets for indirect buffer data
|
||||
*/
|
||||
#define RADEON_INDEX_PRIM_OFFSET 20
|
||||
#define RADEON_HOSTDATA_BLIT_OFFSET 32
|
||||
|
||||
#define RADEON_SCRATCH_REG_OFFSET 32
|
||||
|
||||
|
|
@ -181,8 +242,6 @@ typedef struct {
|
|||
unsigned int pp_border_color;
|
||||
} drm_radeon_texture_regs_t;
|
||||
|
||||
/* Space is crucial; there is some redunancy here:
|
||||
*/
|
||||
typedef struct {
|
||||
unsigned int start;
|
||||
unsigned int finish;
|
||||
|
|
@ -192,6 +251,7 @@ typedef struct {
|
|||
unsigned int vc_format; /* vertex format */
|
||||
} drm_radeon_prim_t;
|
||||
|
||||
|
||||
typedef struct {
|
||||
drm_radeon_context_regs_t context;
|
||||
drm_radeon_texture_regs_t tex[RADEON_MAX_TEXTURE_UNITS];
|
||||
|
|
@ -231,6 +291,8 @@ typedef struct {
|
|||
drm_radeon_tex_region_t tex_list[RADEON_NR_TEX_HEAPS][RADEON_NR_TEX_REGIONS+1];
|
||||
int tex_age[RADEON_NR_TEX_HEAPS];
|
||||
int ctx_owner;
|
||||
int pfState; /* number of 3d windows (0,1,2ormore) */
|
||||
int pfCurrentPage; /* which buffer is being displayed? */
|
||||
} drm_radeon_sarea_t;
|
||||
|
||||
|
||||
|
|
@ -258,6 +320,9 @@ typedef struct {
|
|||
#define DRM_IOCTL_RADEON_INDIRECT DRM_IOWR(0x4d, drm_radeon_indirect_t)
|
||||
#define DRM_IOCTL_RADEON_TEXTURE DRM_IOWR(0x4e, drm_radeon_texture_t)
|
||||
#define DRM_IOCTL_RADEON_VERTEX2 DRM_IOW( 0x4f, drm_radeon_vertex_t)
|
||||
#define DRM_IOCTL_RADEON_CMDBUF DRM_IOW( 0x50, drm_radeon_cmd_buffer_t)
|
||||
#define DRM_IOCTL_RADEON_GETPARAM DRM_IOWR(0x51, drm_radeon_getparam_t)
|
||||
#define DRM_IOCTL_RADEON_FLIP DRM_IO( 0x52)
|
||||
|
||||
typedef struct drm_radeon_init {
|
||||
enum {
|
||||
|
|
@ -324,6 +389,18 @@ typedef struct drm_radeon_vertex {
|
|||
int discard; /* Client finished with buffer? */
|
||||
} drm_radeon_vertex_t;
|
||||
|
||||
typedef struct drm_radeon_indices {
|
||||
int prim;
|
||||
int idx;
|
||||
int start;
|
||||
int end;
|
||||
int discard; /* Client finished with buffer? */
|
||||
} drm_radeon_indices_t;
|
||||
|
||||
/* v1.2 - obsoletes drm_radeon_vertex and drm_radeon_indices
|
||||
* - allows multiple primitives and state changes in a single ioctl
|
||||
* - supports driver change to emit native primitives
|
||||
*/
|
||||
typedef struct drm_radeon_vertex2 {
|
||||
int idx; /* Index of vertex buffer */
|
||||
int discard; /* Client finished with buffer? */
|
||||
|
|
@ -333,13 +410,22 @@ typedef struct drm_radeon_vertex2 {
|
|||
drm_radeon_prim_t *prim;
|
||||
} drm_radeon_vertex2_t;
|
||||
|
||||
typedef struct drm_radeon_indices {
|
||||
int prim;
|
||||
int idx;
|
||||
int start;
|
||||
int end;
|
||||
int discard; /* Client finished with buffer? */
|
||||
} drm_radeon_indices_t;
|
||||
/* v1.3 - obsoletes drm_radeon_vertex2
|
||||
* - allows arbitarily large cliprect list
|
||||
* - allows updating of tcl packet, vector and scalar state
|
||||
* - allows memory-efficient description of state updates
|
||||
* - allows state to be emitted without a primitive
|
||||
* (for clears, ctx switches)
|
||||
* - allows more than one dma buffer to be referenced per ioctl
|
||||
* - supports tcl driver
|
||||
* - may be extended in future versions with new cmd types, packets
|
||||
*/
|
||||
typedef struct drm_radeon_cmd_buffer {
|
||||
int bufsz;
|
||||
char *buf;
|
||||
int nbox;
|
||||
drm_clip_rect_t *boxes;
|
||||
} drm_radeon_cmd_buffer_t;
|
||||
|
||||
typedef struct drm_radeon_tex_image {
|
||||
unsigned int x, y; /* Blit coordinates */
|
||||
|
|
@ -367,4 +453,15 @@ typedef struct drm_radeon_indirect {
|
|||
int discard;
|
||||
} drm_radeon_indirect_t;
|
||||
|
||||
|
||||
/* 1.3: An ioctl to get parameters that aren't available to the 3d
|
||||
* client any other way.
|
||||
*/
|
||||
#define RADEON_PARAM_AGP_BUFFER_OFFSET 0x1
|
||||
|
||||
typedef struct drm_radeon_getparam {
|
||||
int param;
|
||||
int *value;
|
||||
} drm_radeon_getparam_t;
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -39,11 +39,11 @@
|
|||
|
||||
#define DRIVER_NAME "radeon"
|
||||
#define DRIVER_DESC "ATI Radeon"
|
||||
#define DRIVER_DATE "20010405"
|
||||
#define DRIVER_DATE "20020611"
|
||||
|
||||
#define DRIVER_MAJOR 1
|
||||
#define DRIVER_MINOR 2
|
||||
#define DRIVER_PATCHLEVEL 0
|
||||
#define DRIVER_MINOR 3
|
||||
#define DRIVER_PATCHLEVEL 1
|
||||
|
||||
/* Interface history:
|
||||
*
|
||||
|
|
@ -51,6 +51,10 @@
|
|||
* 1.2 - Add vertex2 ioctl (keith)
|
||||
* - Add stencil capability to clear ioctl (gareth, keith)
|
||||
* - Increase MAX_TEXTURE_LEVELS (brian)
|
||||
* 1.3 - Add cmdbuf ioctl (keith)
|
||||
* - Add support for new radeon packets (keith)
|
||||
* - Add getparam ioctl (keith)
|
||||
* - Add flip-buffers ioctl, deprecate fullscreen foo (keith).
|
||||
*/
|
||||
#define DRIVER_IOCTLS \
|
||||
[DRM_IOCTL_NR(DRM_IOCTL_DMA)] = { radeon_cp_buffers, 1, 0 }, \
|
||||
|
|
@ -68,17 +72,10 @@
|
|||
[DRM_IOCTL_NR(DRM_IOCTL_RADEON_TEXTURE)] = { radeon_cp_texture, 1, 0 }, \
|
||||
[DRM_IOCTL_NR(DRM_IOCTL_RADEON_STIPPLE)] = { radeon_cp_stipple, 1, 0 }, \
|
||||
[DRM_IOCTL_NR(DRM_IOCTL_RADEON_INDIRECT)] = { radeon_cp_indirect, 1, 1 }, \
|
||||
[DRM_IOCTL_NR(DRM_IOCTL_RADEON_VERTEX2)] = { radeon_cp_vertex2, 1, 0 },
|
||||
|
||||
|
||||
#if 0
|
||||
/* GH: Count data sent to card via ring or vertex/indirect buffers.
|
||||
*/
|
||||
#define __HAVE_COUNTERS 3
|
||||
#define __HAVE_COUNTER6 _DRM_STAT_IRQ
|
||||
#define __HAVE_COUNTER7 _DRM_STAT_PRIMARY
|
||||
#define __HAVE_COUNTER8 _DRM_STAT_SECONDARY
|
||||
#endif
|
||||
[DRM_IOCTL_NR(DRM_IOCTL_RADEON_VERTEX2)] = { radeon_cp_vertex2, 1, 0 }, \
|
||||
[DRM_IOCTL_NR(DRM_IOCTL_RADEON_CMDBUF)] = { radeon_cp_cmdbuf, 1, 0 }, \
|
||||
[DRM_IOCTL_NR(DRM_IOCTL_RADEON_GETPARAM)] = { radeon_cp_getparam, 1, 0 }, \
|
||||
[DRM_IOCTL_NR(DRM_IOCTL_RADEON_FLIP)] = { radeon_cp_flip, 1, 0 },
|
||||
|
||||
|
||||
#include "drm_agpsupport.h"
|
||||
|
|
|
|||
|
|
@ -31,6 +31,9 @@
|
|||
#ifndef __RADEON_DRV_H__
|
||||
#define __RADEON_DRV_H__
|
||||
|
||||
#define GET_RING_HEAD(ring) readl( (volatile u32 *) (ring)->head )
|
||||
#define SET_RING_HEAD(ring,val) writel( (val), (volatile u32 *) (ring)->head )
|
||||
|
||||
typedef struct drm_radeon_freelist {
|
||||
unsigned int age;
|
||||
drm_buf_t *buf;
|
||||
|
|
@ -71,14 +74,7 @@ typedef struct drm_radeon_private {
|
|||
|
||||
drm_radeon_freelist_t *head;
|
||||
drm_radeon_freelist_t *tail;
|
||||
/* FIXME: ROTATE_BUFS is a hask to cycle through bufs until freelist
|
||||
code is used. Note this hides a problem with the scratch register
|
||||
(used to keep track of last buffer completed) being written to before
|
||||
the last buffer has actually completed rendering. */
|
||||
#define ROTATE_BUFS 1
|
||||
#if ROTATE_BUFS
|
||||
int last_buf;
|
||||
#endif
|
||||
volatile u32 *scratch;
|
||||
|
||||
int usec_timeout;
|
||||
|
|
@ -120,10 +116,6 @@ typedef struct drm_radeon_private {
|
|||
|
||||
typedef struct drm_radeon_buf_priv {
|
||||
u32 age;
|
||||
int prim;
|
||||
int discard;
|
||||
int dispatched;
|
||||
drm_radeon_freelist_t *list_entry;
|
||||
} drm_radeon_buf_priv_t;
|
||||
|
||||
/* radeon_cp.c */
|
||||
|
|
@ -152,7 +144,7 @@ extern int radeon_wait_ring( drm_radeon_private_t *dev_priv, int n );
|
|||
static inline void
|
||||
radeon_update_ring_snapshot( drm_radeon_ring_buffer_t *ring )
|
||||
{
|
||||
ring->space = (*(volatile int *)ring->head - ring->tail) * sizeof(u32);
|
||||
ring->space = (GET_RING_HEAD(ring) - ring->tail) * sizeof(u32);
|
||||
if ( ring->space <= 0 )
|
||||
ring->space += ring->size;
|
||||
}
|
||||
|
|
@ -178,6 +170,13 @@ extern int radeon_cp_indirect( struct inode *inode, struct file *filp,
|
|||
unsigned int cmd, unsigned long arg );
|
||||
extern int radeon_cp_vertex2( struct inode *inode, struct file *filp,
|
||||
unsigned int cmd, unsigned long arg );
|
||||
extern int radeon_cp_cmdbuf( struct inode *inode, struct file *filp,
|
||||
unsigned int cmd, unsigned long arg );
|
||||
extern int radeon_cp_getparam( struct inode *inode, struct file *filp,
|
||||
unsigned int cmd, unsigned long arg );
|
||||
extern int radeon_cp_flip( struct inode *inode, struct file *filp,
|
||||
unsigned int cmd, unsigned long arg );
|
||||
|
||||
|
||||
|
||||
/* Register definitions, register access macros and drmAddMap constants
|
||||
|
|
@ -206,8 +205,6 @@ extern int radeon_cp_vertex2( struct inode *inode, struct file *filp,
|
|||
# define RADEON_CRTC_OFFSET_FLIP_CNTL (1 << 16)
|
||||
|
||||
#define RADEON_RB3D_COLORPITCH 0x1c48
|
||||
#define RADEON_RB3D_DEPTHCLEARVALUE 0x1c30
|
||||
#define RADEON_RB3D_DEPTHXY_OFFSET 0x1c60
|
||||
|
||||
#define RADEON_DP_GUI_MASTER_CNTL 0x146c
|
||||
# define RADEON_GMC_SRC_PITCH_OFFSET_CNTL (1 << 0)
|
||||
|
|
@ -255,6 +252,12 @@ extern int radeon_cp_vertex2( struct inode *inode, struct file *filp,
|
|||
# define RADEON_ISYNC_WAIT_IDLEGUI (1 << 4)
|
||||
# define RADEON_ISYNC_CPSCRATCH_IDLEGUI (1 << 5)
|
||||
|
||||
#define RADEON_RBBM_GUICNTL 0x172c
|
||||
# define RADEON_HOST_DATA_SWAP_NONE (0 << 0)
|
||||
# define RADEON_HOST_DATA_SWAP_16BIT (1 << 0)
|
||||
# define RADEON_HOST_DATA_SWAP_32BIT (2 << 0)
|
||||
# define RADEON_HOST_DATA_SWAP_HDW (3 << 0)
|
||||
|
||||
#define RADEON_MC_AGP_LOCATION 0x014c
|
||||
#define RADEON_MC_FB_LOCATION 0x0148
|
||||
#define RADEON_MCLK_CNTL 0x0012
|
||||
|
|
@ -292,9 +295,6 @@ extern int radeon_cp_vertex2( struct inode *inode, struct file *filp,
|
|||
# define RADEON_ROP_ENABLE (1 << 6)
|
||||
# define RADEON_STENCIL_ENABLE (1 << 7)
|
||||
# define RADEON_Z_ENABLE (1 << 8)
|
||||
# define RADEON_DEPTH_XZ_OFFEST_ENABLE (1 << 9)
|
||||
# define RADEON_ZBLOCK8 (0 << 15)
|
||||
# define RADEON_ZBLOCK16 (1 << 15)
|
||||
#define RADEON_RB3D_DEPTHOFFSET 0x1c24
|
||||
#define RADEON_RB3D_PLANEMASK 0x1d84
|
||||
#define RADEON_RB3D_STENCILREFMASK 0x1d7c
|
||||
|
|
@ -360,6 +360,15 @@ extern int radeon_cp_vertex2( struct inode *inode, struct file *filp,
|
|||
#define RADEON_SE_LINE_WIDTH 0x1db8
|
||||
#define RADEON_SE_VPORT_XSCALE 0x1d98
|
||||
#define RADEON_SE_ZBIAS_FACTOR 0x1db0
|
||||
#define RADEON_SE_TCL_MATERIAL_EMMISSIVE_RED 0x2210
|
||||
#define RADEON_SE_TCL_OUTPUT_VTX_FMT 0x2254
|
||||
#define RADEON_SE_TCL_VECTOR_INDX_REG 0x2200
|
||||
# define RADEON_VEC_INDX_OCTWORD_STRIDE_SHIFT 16
|
||||
# define RADEON_VEC_INDX_DWORD_COUNT_SHIFT 28
|
||||
#define RADEON_SE_TCL_VECTOR_DATA_REG 0x2204
|
||||
#define RADEON_SE_TCL_SCALAR_INDX_REG 0x2208
|
||||
# define RADEON_SCAL_INDX_DWORD_STRIDE_SHIFT 16
|
||||
#define RADEON_SE_TCL_SCALAR_DATA_REG 0x220C
|
||||
#define RADEON_SURFACE_ACCESS_FLAGS 0x0bf8
|
||||
#define RADEON_SURFACE_ACCESS_CLR 0x0bfc
|
||||
#define RADEON_SURFACE_CNTL 0x0b00
|
||||
|
|
@ -424,6 +433,7 @@ extern int radeon_cp_vertex2( struct inode *inode, struct file *filp,
|
|||
|
||||
#define RADEON_CP_RB_BASE 0x0700
|
||||
#define RADEON_CP_RB_CNTL 0x0704
|
||||
# define RADEON_BUF_SWAP_32BIT (2 << 16)
|
||||
#define RADEON_CP_RB_RPTR_ADDR 0x070c
|
||||
#define RADEON_CP_RB_RPTR 0x0710
|
||||
#define RADEON_CP_RB_WPTR 0x0714
|
||||
|
|
@ -460,8 +470,10 @@ extern int radeon_cp_vertex2( struct inode *inode, struct file *filp,
|
|||
#define RADEON_CP_PACKET3 0xC0000000
|
||||
# define RADEON_3D_RNDR_GEN_INDX_PRIM 0x00002300
|
||||
# define RADEON_WAIT_FOR_IDLE 0x00002600
|
||||
# define RADEON_3D_DRAW_VBUF 0x00002800
|
||||
# define RADEON_3D_DRAW_IMMD 0x00002900
|
||||
# define RADEON_3D_CLEAR_ZMASK 0x00003200
|
||||
# define RADEON_3D_DRAW_INDX 0x00002A00
|
||||
# define RADEON_3D_LOAD_VBPNTR 0x00002F00
|
||||
# define RADEON_CNTL_HOSTDATA_BLT 0x00009400
|
||||
# define RADEON_CNTL_PAINT_MULTI 0x00009A00
|
||||
# define RADEON_CNTL_BITBLT_MULTI 0x00009B00
|
||||
|
|
@ -473,6 +485,7 @@ extern int radeon_cp_vertex2( struct inode *inode, struct file *filp,
|
|||
#define RADEON_CP_PACKET1_REG1_MASK 0x003ff800
|
||||
|
||||
#define RADEON_VTX_Z_PRESENT (1 << 31)
|
||||
#define RADEON_VTX_PKCOLOR_PRESENT (1 << 3)
|
||||
|
||||
#define RADEON_PRIM_TYPE_NONE (0 << 0)
|
||||
#define RADEON_PRIM_TYPE_POINT (1 << 0)
|
||||
|
|
@ -530,41 +543,11 @@ extern int radeon_cp_vertex2( struct inode *inode, struct file *filp,
|
|||
#define RADEON_BASE(reg) ((unsigned long)(dev_priv->mmio->handle))
|
||||
#define RADEON_ADDR(reg) (RADEON_BASE( reg ) + reg)
|
||||
|
||||
#define RADEON_DEREF(reg) *(volatile u32 *)RADEON_ADDR( reg )
|
||||
#ifdef __alpha__
|
||||
#define RADEON_READ(reg) (_RADEON_READ((u32 *)RADEON_ADDR( reg )))
|
||||
static inline u32 _RADEON_READ(u32 *addr)
|
||||
{
|
||||
mb();
|
||||
return *(volatile u32 *)addr;
|
||||
}
|
||||
#define RADEON_WRITE(reg,val) \
|
||||
do { \
|
||||
wmb(); \
|
||||
RADEON_DEREF(reg) = val; \
|
||||
} while (0)
|
||||
#else
|
||||
#define RADEON_READ(reg) RADEON_DEREF( reg )
|
||||
#define RADEON_WRITE(reg, val) do { RADEON_DEREF( reg ) = val; } while (0)
|
||||
#endif
|
||||
#define RADEON_READ(reg) readl( (volatile u32 *) RADEON_ADDR(reg) )
|
||||
#define RADEON_WRITE(reg,val) writel( (val), (volatile u32 *) RADEON_ADDR(reg) )
|
||||
|
||||
#define RADEON_DEREF8(reg) *(volatile u8 *)RADEON_ADDR( reg )
|
||||
#ifdef __alpha__
|
||||
#define RADEON_READ8(reg) _RADEON_READ8((u8 *)RADEON_ADDR( reg ))
|
||||
static inline u8 _RADEON_READ8(u8 *addr)
|
||||
{
|
||||
mb();
|
||||
return *(volatile u8 *)addr;
|
||||
}
|
||||
#define RADEON_WRITE8(reg,val) \
|
||||
do { \
|
||||
wmb(); \
|
||||
RADEON_DEREF8( reg ) = val; \
|
||||
} while (0)
|
||||
#else
|
||||
#define RADEON_READ8(reg) RADEON_DEREF8( reg )
|
||||
#define RADEON_WRITE8(reg, val) do { RADEON_DEREF8( reg ) = val; } while (0)
|
||||
#endif
|
||||
#define RADEON_READ8(reg) readb( (volatile u8 *) RADEON_ADDR(reg) )
|
||||
#define RADEON_WRITE8(reg,val) writeb( (val), (volatile u8 *) RADEON_ADDR(reg) )
|
||||
|
||||
#define RADEON_WRITE_PLL( addr, val ) \
|
||||
do { \
|
||||
|
|
@ -661,6 +644,15 @@ do { \
|
|||
goto __ring_space_done; \
|
||||
udelay( 1 ); \
|
||||
} \
|
||||
DRM_ERROR( "ring space check from memory failed, reading register...\n" ); \
|
||||
/* If ring space check fails from RAM, try reading the \
|
||||
register directly */ \
|
||||
ring->space = 4 * ( RADEON_READ( RADEON_CP_RB_RPTR ) - ring->tail ); \
|
||||
if ( ring->space <= 0 ) \
|
||||
ring->space += ring->size; \
|
||||
if ( ring->space >= ring->high_mark ) \
|
||||
goto __ring_space_done; \
|
||||
\
|
||||
DRM_ERROR( "ring space check failed!\n" ); \
|
||||
return -EBUSY; \
|
||||
} \
|
||||
|
|
@ -698,12 +690,16 @@ do { \
|
|||
* Ring control
|
||||
*/
|
||||
|
||||
#if defined(__powerpc__)
|
||||
#define radeon_flush_write_combine() (void) GET_RING_HEAD( &dev_priv->ring )
|
||||
#else
|
||||
#define radeon_flush_write_combine() mb()
|
||||
#endif
|
||||
|
||||
|
||||
#define RADEON_VERBOSE 0
|
||||
|
||||
#define RING_LOCALS int write; unsigned int mask; volatile u32 *ring;
|
||||
#define RING_LOCALS int write, _nr; unsigned int mask; volatile u32 *ring;
|
||||
|
||||
#define BEGIN_RING( n ) do { \
|
||||
if ( RADEON_VERBOSE ) { \
|
||||
|
|
@ -711,9 +707,10 @@ do { \
|
|||
n, __FUNCTION__ ); \
|
||||
} \
|
||||
if ( dev_priv->ring.space <= (n) * sizeof(u32) ) { \
|
||||
COMMIT_RING(); \
|
||||
radeon_wait_ring( dev_priv, (n) * sizeof(u32) ); \
|
||||
} \
|
||||
dev_priv->ring.space -= (n) * sizeof(u32); \
|
||||
_nr = n; dev_priv->ring.space -= (n) * sizeof(u32); \
|
||||
ring = dev_priv->ring.start; \
|
||||
write = dev_priv->ring.tail; \
|
||||
mask = dev_priv->ring.tail_mask; \
|
||||
|
|
@ -724,9 +721,17 @@ do { \
|
|||
DRM_INFO( "ADVANCE_RING() wr=0x%06x tail=0x%06x\n", \
|
||||
write, dev_priv->ring.tail ); \
|
||||
} \
|
||||
radeon_flush_write_combine(); \
|
||||
dev_priv->ring.tail = write; \
|
||||
RADEON_WRITE( RADEON_CP_RB_WPTR, write ); \
|
||||
if (((dev_priv->ring.tail + _nr) & mask) != write) { \
|
||||
DRM_ERROR( \
|
||||
"ADVANCE_RING(): mismatch: nr: %x write: %x\n", \
|
||||
((dev_priv->ring.tail + _nr) & mask), \
|
||||
write); \
|
||||
} else \
|
||||
dev_priv->ring.tail = write; \
|
||||
} while (0)
|
||||
|
||||
#define COMMIT_RING() do { \
|
||||
RADEON_WRITE( RADEON_CP_RB_WPTR, dev_priv->ring.tail ); \
|
||||
} while (0)
|
||||
|
||||
#define OUT_RING( x ) do { \
|
||||
|
|
@ -743,6 +748,30 @@ do { \
|
|||
OUT_RING( val ); \
|
||||
} while (0)
|
||||
|
||||
|
||||
#define OUT_RING_USER_TABLE( tab, sz ) do { \
|
||||
int _size = (sz); \
|
||||
int *_tab = (tab); \
|
||||
\
|
||||
if (write + _size > mask) { \
|
||||
int i = (mask+1) - write; \
|
||||
if (__copy_from_user( (int *)(ring+write), \
|
||||
_tab, i*4 )) \
|
||||
return -EFAULT; \
|
||||
write = 0; \
|
||||
_size -= i; \
|
||||
_tab += i; \
|
||||
} \
|
||||
\
|
||||
if (_size && __copy_from_user( (int *)(ring+write), \
|
||||
_tab, _size*4 )) \
|
||||
return -EFAULT; \
|
||||
\
|
||||
write += _size; \
|
||||
write &= mask; \
|
||||
} while (0)
|
||||
|
||||
|
||||
#define RADEON_PERFORMANCE_BOXES 0
|
||||
|
||||
#endif /* __RADEON_DRV_H__ */
|
||||
|
|
|
|||
1232
linux/radeon_state.c
1232
linux/radeon_state.c
File diff suppressed because it is too large
Load diff
|
|
@ -84,6 +84,10 @@ typedef unsigned int drm_magic_t;
|
|||
/* Warning: If you change this structure, make sure you change
|
||||
* XF86DRIClipRectRec in the server as well */
|
||||
|
||||
/* KW: Actually it's illegal to change either for
|
||||
* backwards-compatibility reasons.
|
||||
*/
|
||||
|
||||
typedef struct drm_clip_rect {
|
||||
unsigned short x1;
|
||||
unsigned short y1;
|
||||
|
|
|
|||
|
|
@ -84,6 +84,10 @@ typedef unsigned int drm_magic_t;
|
|||
/* Warning: If you change this structure, make sure you change
|
||||
* XF86DRIClipRectRec in the server as well */
|
||||
|
||||
/* KW: Actually it's illegal to change either for
|
||||
* backwards-compatibility reasons.
|
||||
*/
|
||||
|
||||
typedef struct drm_clip_rect {
|
||||
unsigned short x1;
|
||||
unsigned short y1;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue