summaryrefslogtreecommitdiffstats
path: root/sys/dev/drm/mga_state.c
diff options
context:
space:
mode:
authoranholt <anholt@FreeBSD.org>2003-03-09 02:08:30 +0000
committeranholt <anholt@FreeBSD.org>2003-03-09 02:08:30 +0000
commitccdf4ef2d9288d035e56820efb0e79db6acf5ba8 (patch)
treeef9d3b03548e9f28bd5c265be746871660c0c16a /sys/dev/drm/mga_state.c
parent0b60094f80a8137660b368df0b80fb0179b92d04 (diff)
downloadFreeBSD-src-ccdf4ef2d9288d035e56820efb0e79db6acf5ba8.zip
FreeBSD-src-ccdf4ef2d9288d035e56820efb0e79db6acf5ba8.tar.gz
Update the DRM to latest from DRI CVS. This is approximately the version
included in XFree86 4.3, but includes some fixes. Notable changes include Radeon 8500-9100 support, PCI Radeon/Rage 128 support, transform & lighting support for Radeons, and vblank syncing support for r128, radeon, and mga. The gamma driver was removed due to lack of any users.
Diffstat (limited to 'sys/dev/drm/mga_state.c')
-rw-r--r--sys/dev/drm/mga_state.c129
1 files changed, 86 insertions, 43 deletions
diff --git a/sys/dev/drm/mga_state.c b/sys/dev/drm/mga_state.c
index f1b7ac1..2f44db3 100644
--- a/sys/dev/drm/mga_state.c
+++ b/sys/dev/drm/mga_state.c
@@ -26,7 +26,7 @@
*
* Authors:
* Jeff Hartmann <jhartmann@valinux.com>
- * Keith Whitwell <keithw@valinux.com>
+ * Keith Whitwell <keith@tungstengraphics.com>
*
* Rewritten by:
* Gareth Hughes <gareth@valinux.com>
@@ -34,12 +34,11 @@
* $FreeBSD$
*/
-#define __NO_VERSION__
#include "dev/drm/mga.h"
#include "dev/drm/drmP.h"
+#include "dev/drm/drm.h"
#include "dev/drm/mga_drm.h"
#include "dev/drm/mga_drv.h"
-#include "dev/drm/drm.h"
/* ================================================================
@@ -166,6 +165,9 @@ static __inline__ void mga_g400_emit_tex0( drm_mga_private_t *dev_priv )
drm_mga_texture_regs_t *tex = &sarea_priv->tex_state[0];
DMA_LOCALS;
+/* printk("mga_g400_emit_tex0 %x %x %x\n", tex->texorg, */
+/* tex->texctl, tex->texctl2); */
+
BEGIN_DMA( 6 );
DMA_BLOCK( MGA_TEXCTL2, tex->texctl2 | MGA_G400_TC2_MAGIC,
@@ -207,6 +209,9 @@ static __inline__ void mga_g400_emit_tex1( drm_mga_private_t *dev_priv )
drm_mga_texture_regs_t *tex = &sarea_priv->tex_state[1];
DMA_LOCALS;
+/* printk("mga_g400_emit_tex1 %x %x %x\n", tex->texorg, */
+/* tex->texctl, tex->texctl2); */
+
BEGIN_DMA( 5 );
DMA_BLOCK( MGA_TEXCTL2, (tex->texctl2 |
@@ -275,6 +280,8 @@ static __inline__ void mga_g400_emit_pipe( drm_mga_private_t *dev_priv )
unsigned int pipe = sarea_priv->warp_pipe;
DMA_LOCALS;
+/* printk("mga_g400_emit_pipe %x\n", pipe); */
+
BEGIN_DMA( 10 );
DMA_BLOCK( MGA_WIADDR2, MGA_WMODE_SUSPEND,
@@ -415,7 +422,7 @@ static int mga_verify_context( drm_mga_private_t *dev_priv )
ctx->dstorg, dev_priv->front_offset,
dev_priv->back_offset );
ctx->dstorg = 0;
- return DRM_OS_ERR(EINVAL);
+ return DRM_ERR(EINVAL);
}
return 0;
@@ -435,7 +442,7 @@ static int mga_verify_tex( drm_mga_private_t *dev_priv, int unit )
DRM_ERROR( "*** bad TEXORG: 0x%x, unit %d\n",
tex->texorg, unit );
tex->texorg = 0;
- return DRM_OS_ERR(EINVAL);
+ return DRM_ERR(EINVAL);
}
return 0;
@@ -477,13 +484,13 @@ static int mga_verify_iload( drm_mga_private_t *dev_priv,
dstorg + length > (dev_priv->texture_offset +
dev_priv->texture_size) ) {
DRM_ERROR( "*** bad iload DSTORG: 0x%x\n", dstorg );
- return DRM_OS_ERR(EINVAL);
+ return DRM_ERR(EINVAL);
}
if ( length & MGA_ILOAD_MASK ) {
DRM_ERROR( "*** bad iload length: 0x%x\n",
length & MGA_ILOAD_MASK );
- return DRM_OS_ERR(EINVAL);
+ return DRM_ERR(EINVAL);
}
return 0;
@@ -496,7 +503,7 @@ static int mga_verify_blit( drm_mga_private_t *dev_priv,
(dstorg & 0x3) == (MGA_SRCACC_PCI | MGA_SRCMAP_SYSMEM) ) {
DRM_ERROR( "*** bad blit: src=0x%x dst=0x%x\n",
srcorg, dstorg );
- return DRM_OS_ERR(EINVAL);
+ return DRM_ERR(EINVAL);
}
return 0;
}
@@ -516,7 +523,7 @@ static void mga_dma_dispatch_clear( drm_device_t *dev,
int nbox = sarea_priv->nbox;
int i;
DMA_LOCALS;
- DRM_DEBUG( "%s:\n", __func__ );
+ DRM_DEBUG( "\n" );
BEGIN_DMA( 1 );
@@ -610,7 +617,7 @@ static void mga_dma_dispatch_swap( drm_device_t *dev )
int nbox = sarea_priv->nbox;
int i;
DMA_LOCALS;
- DRM_DEBUG( "%s:\n", __func__ );
+ DRM_DEBUG( "\n" );
sarea_priv->last_frame.head = dev_priv->prim.tail;
sarea_priv->last_frame.wrap = dev_priv->prim.last_wrap;
@@ -656,7 +663,7 @@ static void mga_dma_dispatch_swap( drm_device_t *dev )
FLUSH_DMA();
- DRM_DEBUG( "%s... done.\n", __func__ );
+ DRM_DEBUG( "%s... done.\n", __FUNCTION__ );
}
static void mga_dma_dispatch_vertex( drm_device_t *dev, drm_buf_t *buf )
@@ -764,8 +771,7 @@ static void mga_dma_dispatch_iload( drm_device_t *dev, drm_buf_t *buf,
u32 srcorg = buf->bus_address | MGA_SRCACC_AGP | MGA_SRCMAP_SYSMEM;
u32 y2;
DMA_LOCALS;
- DRM_DEBUG( "%s: buf=%d used=%d\n",
- __func__, buf->idx, buf->used );
+ DRM_DEBUG( "buf=%d used=%d\n", buf->idx, buf->used );
y2 = length / 64;
@@ -819,7 +825,7 @@ static void mga_dma_dispatch_blit( drm_device_t *dev,
int nbox = sarea_priv->nbox;
u32 scandir = 0, i;
DMA_LOCALS;
- DRM_DEBUG( "%s:\n", __func__ );
+ DRM_DEBUG( "\n" );
BEGIN_DMA( 4 + nbox );
@@ -876,16 +882,16 @@ static void mga_dma_dispatch_blit( drm_device_t *dev,
*
*/
-int mga_dma_clear( DRM_OS_IOCTL )
+int mga_dma_clear( DRM_IOCTL_ARGS )
{
- DRM_OS_DEVICE;
+ DRM_DEVICE;
drm_mga_private_t *dev_priv = dev->dev_private;
drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
drm_mga_clear_t clear;
LOCK_TEST_WITH_RETURN( dev );
- DRM_OS_KRNFROMUSR( clear, (drm_mga_clear_t *) data, sizeof(clear) );
+ DRM_COPY_FROM_USER_IOCTL( clear, (drm_mga_clear_t *)data, sizeof(clear) );
if ( sarea_priv->nbox > MGA_NR_SAREA_CLIPRECTS )
sarea_priv->nbox = MGA_NR_SAREA_CLIPRECTS;
@@ -901,9 +907,9 @@ int mga_dma_clear( DRM_OS_IOCTL )
return 0;
}
-int mga_dma_swap( DRM_OS_IOCTL )
+int mga_dma_swap( DRM_IOCTL_ARGS )
{
- DRM_OS_DEVICE;
+ DRM_DEVICE;
drm_mga_private_t *dev_priv = dev->dev_private;
drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
@@ -923,9 +929,9 @@ int mga_dma_swap( DRM_OS_IOCTL )
return 0;
}
-int mga_dma_vertex( DRM_OS_IOCTL )
+int mga_dma_vertex( DRM_IOCTL_ARGS )
{
- DRM_OS_DEVICE;
+ DRM_DEVICE;
drm_mga_private_t *dev_priv = dev->dev_private;
drm_device_dma_t *dma = dev->dma;
drm_buf_t *buf;
@@ -934,9 +940,11 @@ int mga_dma_vertex( DRM_OS_IOCTL )
LOCK_TEST_WITH_RETURN( dev );
- DRM_OS_KRNFROMUSR( vertex, (drm_mga_vertex_t *) data, sizeof(vertex) );
+ DRM_COPY_FROM_USER_IOCTL( vertex,
+ (drm_mga_vertex_t *)data,
+ sizeof(vertex) );
- if(vertex.idx < 0 || vertex.idx > dma->buf_count) return DRM_OS_ERR(EINVAL);
+ if(vertex.idx < 0 || vertex.idx > dma->buf_count) return DRM_ERR(EINVAL);
buf = dma->buflist[vertex.idx];
buf_priv = buf->dev_private;
@@ -950,7 +958,7 @@ int mga_dma_vertex( DRM_OS_IOCTL )
buf_priv->dispatched = 0;
mga_freelist_put( dev, buf );
}
- return DRM_OS_ERR(EINVAL);
+ return DRM_ERR(EINVAL);
}
WRAP_TEST_WITH_RETURN( dev_priv );
@@ -960,9 +968,9 @@ int mga_dma_vertex( DRM_OS_IOCTL )
return 0;
}
-int mga_dma_indices( DRM_OS_IOCTL )
+int mga_dma_indices( DRM_IOCTL_ARGS )
{
- DRM_OS_DEVICE;
+ DRM_DEVICE;
drm_mga_private_t *dev_priv = dev->dev_private;
drm_device_dma_t *dma = dev->dma;
drm_buf_t *buf;
@@ -971,9 +979,11 @@ int mga_dma_indices( DRM_OS_IOCTL )
LOCK_TEST_WITH_RETURN( dev );
- DRM_OS_KRNFROMUSR( indices, (drm_mga_indices_t *) data, sizeof(indices) );
+ DRM_COPY_FROM_USER_IOCTL( indices,
+ (drm_mga_indices_t *)data,
+ sizeof(indices) );
- if(indices.idx < 0 || indices.idx > dma->buf_count) return DRM_OS_ERR(EINVAL);
+ if(indices.idx < 0 || indices.idx > dma->buf_count) return DRM_ERR(EINVAL);
buf = dma->buflist[indices.idx];
buf_priv = buf->dev_private;
@@ -987,7 +997,7 @@ int mga_dma_indices( DRM_OS_IOCTL )
buf_priv->dispatched = 0;
mga_freelist_put( dev, buf );
}
- return DRM_OS_ERR(EINVAL);
+ return DRM_ERR(EINVAL);
}
WRAP_TEST_WITH_RETURN( dev_priv );
@@ -997,35 +1007,35 @@ int mga_dma_indices( DRM_OS_IOCTL )
return 0;
}
-int mga_dma_iload( DRM_OS_IOCTL )
+int mga_dma_iload( DRM_IOCTL_ARGS )
{
- DRM_OS_DEVICE;
+ DRM_DEVICE;
drm_device_dma_t *dma = dev->dma;
drm_mga_private_t *dev_priv = dev->dev_private;
drm_buf_t *buf;
drm_mga_buf_priv_t *buf_priv;
drm_mga_iload_t iload;
- DRM_DEBUG( "%s:\n", __func__ );
+ DRM_DEBUG( "\n" );
LOCK_TEST_WITH_RETURN( dev );
- DRM_OS_KRNFROMUSR( iload, (drm_mga_iload_t *) data, sizeof(iload) );
+ DRM_COPY_FROM_USER_IOCTL( iload, (drm_mga_iload_t *)data, sizeof(iload) );
#if 0
- if ( mga_do_wait_for_idle( dev_priv ) ) {
+ if ( mga_do_wait_for_idle( dev_priv ) < 0 ) {
if ( MGA_DMA_DEBUG )
- DRM_INFO( "%s: -EBUSY\n", __func__ );
- return DRM_OS_ERR(EBUSY);
+ DRM_INFO( "%s: -EBUSY\n", __FUNCTION__ );
+ return DRM_ERR(EBUSY);
}
#endif
- if(iload.idx < 0 || iload.idx > dma->buf_count) return DRM_OS_ERR(EINVAL);
+ if(iload.idx < 0 || iload.idx > dma->buf_count) return DRM_ERR(EINVAL);
buf = dma->buflist[iload.idx];
buf_priv = buf->dev_private;
if ( mga_verify_iload( dev_priv, iload.dstorg, iload.length ) ) {
mga_freelist_put( dev, buf );
- return DRM_OS_ERR(EINVAL);
+ return DRM_ERR(EINVAL);
}
WRAP_TEST_WITH_RETURN( dev_priv );
@@ -1039,23 +1049,23 @@ int mga_dma_iload( DRM_OS_IOCTL )
return 0;
}
-int mga_dma_blit( DRM_OS_IOCTL )
+int mga_dma_blit( DRM_IOCTL_ARGS )
{
- DRM_OS_DEVICE;
+ DRM_DEVICE;
drm_mga_private_t *dev_priv = dev->dev_private;
drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
drm_mga_blit_t blit;
- DRM_DEBUG( "%s:\n", __func__ );
+ DRM_DEBUG( "\n" );
LOCK_TEST_WITH_RETURN( dev );
- DRM_OS_KRNFROMUSR( blit, (drm_mga_blit_t *) data, sizeof(blit) );
+ DRM_COPY_FROM_USER_IOCTL( blit, (drm_mga_blit_t *)data, sizeof(blit) );
if ( sarea_priv->nbox > MGA_NR_SAREA_CLIPRECTS )
sarea_priv->nbox = MGA_NR_SAREA_CLIPRECTS;
if ( mga_verify_blit( dev_priv, blit.srcorg, blit.dstorg ) )
- return DRM_OS_ERR(EINVAL);
+ return DRM_ERR(EINVAL);
WRAP_TEST_WITH_RETURN( dev_priv );
@@ -1067,3 +1077,36 @@ int mga_dma_blit( DRM_OS_IOCTL )
return 0;
}
+
+int mga_getparam( DRM_IOCTL_ARGS )
+{
+ DRM_DEVICE;
+ drm_mga_private_t *dev_priv = dev->dev_private;
+ drm_mga_getparam_t param;
+ int value;
+
+ if ( !dev_priv ) {
+ DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ );
+ return DRM_ERR(EINVAL);
+ }
+
+ DRM_COPY_FROM_USER_IOCTL( param, (drm_mga_getparam_t *)data,
+ sizeof(param) );
+
+ DRM_DEBUG( "pid=%d\n", DRM_CURRENTPID );
+
+ switch( param.param ) {
+ case MGA_PARAM_IRQ_NR:
+ value = dev->irq;
+ break;
+ default:
+ return DRM_ERR(EINVAL);
+ }
+
+ if ( DRM_COPY_TO_USER( param.value, &value, sizeof(int) ) ) {
+ DRM_ERROR( "copy_to_user\n" );
+ return DRM_ERR(EFAULT);
+ }
+
+ return 0;
+}
OpenPOWER on IntegriCloud