vserver 1.9.3
[linux-2.6.git] / drivers / char / drm / r128_state.c
index 17ac69d..adc3266 100644 (file)
@@ -45,7 +45,7 @@ static void r128_emit_clip_rects( drm_r128_private_t *dev_priv,
        RING_LOCALS;
        DRM_DEBUG( "    %s\n", __FUNCTION__ );
 
-       BEGIN_RING( 17 );
+       BEGIN_RING( (count < 3? count: 3) * 5 + 2 );
 
        if ( count >= 1 ) {
                OUT_RING( CCE_PACKET0( R128_AUX1_SC_LEFT, 3 ) );
@@ -667,7 +667,7 @@ static void r128_cce_dispatch_indirect( drm_device_t *dev,
                 */
                if ( dwords & 1 ) {
                        u32 *data = (u32 *)
-                               ((char *)dev_priv->buffers->handle
+                               ((char *)dev->agp_buffer_map->handle
                                 + buf->offset + start);
                        data[dwords++] = cpu_to_le32( R128_CCE_PACKET2 );
                }
@@ -713,7 +713,7 @@ static void r128_cce_dispatch_indices( drm_device_t *dev,
        drm_r128_buf_priv_t *buf_priv = buf->dev_private;
        drm_r128_sarea_t *sarea_priv = dev_priv->sarea_priv;
        int format = sarea_priv->vc_format;
-       int offset = dev_priv->buffers->offset - dev_priv->cce_buffers_offset;
+       int offset = dev->agp_buffer_map->offset - dev_priv->cce_buffers_offset;
        int prim = buf_priv->prim;
        u32 *data;
        int dwords;
@@ -733,7 +733,7 @@ static void r128_cce_dispatch_indices( drm_device_t *dev,
 
                dwords = (end - start + 3) / sizeof(u32);
 
-               data = (u32 *)((char *)dev_priv->buffers->handle
+               data = (u32 *)((char *)dev->agp_buffer_map->handle
                               + buf->offset + start);
 
                data[0] = cpu_to_le32( CCE_PACKET3( R128_3D_RNDR_GEN_INDX_PRIM,
@@ -857,7 +857,7 @@ static int r128_cce_dispatch_blit( DRMFILE filp,
 
        dwords = (blit->width * blit->height) >> dword_shift;
 
-       data = (u32 *)((char *)dev_priv->buffers->handle + buf->offset);
+       data = (u32 *)((char *)dev->agp_buffer_map->handle + buf->offset);
 
        data[0] = cpu_to_le32( CCE_PACKET3( R128_CNTL_HOSTDATA_BLT, dwords + 6 ) );
        data[1] = cpu_to_le32( (R128_GMC_DST_PITCH_OFFSET_CNTL |
@@ -916,7 +916,7 @@ static int r128_cce_dispatch_write_span( drm_device_t *dev,
 
        count = depth->n;
        if (count > 4096 || count <= 0)
-               return -EMSGSIZE;
+               return DRM_ERR(EMSGSIZE);
 
        if ( DRM_COPY_FROM_USER( &x, depth->x, sizeof(x) ) ) {
                return DRM_ERR(EFAULT);
@@ -1011,8 +1011,8 @@ static int r128_cce_dispatch_write_pixels( drm_device_t *dev,
        DRM_DEBUG( "\n" );
 
        count = depth->n;
-       if (count > 4096  || count <= 0)
-               return -EMSGSIZE;
+       if (count > 4096 || count <= 0)
+               return DRM_ERR(EMSGSIZE);
 
        xbuf_size = count * sizeof(*x);
        ybuf_size = count * sizeof(*y);
@@ -1131,7 +1131,7 @@ static int r128_cce_dispatch_read_span( drm_device_t *dev,
 
        count = depth->n;
        if (count > 4096 || count <= 0)
-               return -EMSGSIZE;
+               return DRM_ERR(EMSGSIZE);
 
        if ( DRM_COPY_FROM_USER( &x, depth->x, sizeof(x) ) ) {
                return DRM_ERR(EFAULT);
@@ -1176,7 +1176,7 @@ static int r128_cce_dispatch_read_pixels( drm_device_t *dev,
 
        count = depth->n;
        if (count > 4096 || count <= 0)
-               return -EMSGSIZE;
+               return DRM_ERR(EMSGSIZE);
 
        if ( count > dev_priv->depth_pitch ) {
                count = dev_priv->depth_pitch;
@@ -1271,7 +1271,7 @@ int r128_cce_clear( DRM_IOCTL_ARGS )
 
        LOCK_TEST_WITH_RETURN( dev, filp );
 
-       DRM_COPY_FROM_USER_IOCTL( clear, (drm_r128_clear_t *) data,
+       DRM_COPY_FROM_USER_IOCTL( clear, (drm_r128_clear_t __user *) data,
                             sizeof(clear) );
 
        RING_SPACE_TEST_WITH_RETURN( dev_priv );
@@ -1280,6 +1280,7 @@ int r128_cce_clear( DRM_IOCTL_ARGS )
                sarea_priv->nbox = R128_NR_SAREA_CLIPRECTS;
 
        r128_cce_dispatch_clear( dev, &clear );
+       COMMIT_RING();
 
        /* Make sure we restore the 3D state next time.
         */
@@ -1315,8 +1316,10 @@ int r128_do_cleanup_pageflip( drm_device_t *dev )
        R128_WRITE( R128_CRTC_OFFSET,      dev_priv->crtc_offset );
        R128_WRITE( R128_CRTC_OFFSET_CNTL, dev_priv->crtc_offset_cntl );
 
-       if (dev_priv->current_page != 0)
+       if (dev_priv->current_page != 0) {
                r128_cce_dispatch_flip( dev );
+               COMMIT_RING();
+       }
 
        dev_priv->page_flipping = 0;
        return 0;
@@ -1341,6 +1344,7 @@ int r128_cce_flip( DRM_IOCTL_ARGS )
 
        r128_cce_dispatch_flip( dev );
 
+       COMMIT_RING();
        return 0;
 }
 
@@ -1362,6 +1366,7 @@ int r128_cce_swap( DRM_IOCTL_ARGS )
        dev_priv->sarea_priv->dirty |= (R128_UPLOAD_CONTEXT |
                                        R128_UPLOAD_MASKS);
 
+       COMMIT_RING();
        return 0;
 }
 
@@ -1381,7 +1386,7 @@ int r128_cce_vertex( DRM_IOCTL_ARGS )
                return DRM_ERR(EINVAL);
        }
 
-       DRM_COPY_FROM_USER_IOCTL( vertex, (drm_r128_vertex_t *) data,
+       DRM_COPY_FROM_USER_IOCTL( vertex, (drm_r128_vertex_t __user *) data,
                             sizeof(vertex) );
 
        DRM_DEBUG( "pid=%d index=%d count=%d discard=%d\n",
@@ -1421,6 +1426,7 @@ int r128_cce_vertex( DRM_IOCTL_ARGS )
 
        r128_cce_dispatch_vertex( dev, buf );
 
+       COMMIT_RING();
        return 0;
 }
 
@@ -1441,7 +1447,7 @@ int r128_cce_indices( DRM_IOCTL_ARGS )
                return DRM_ERR(EINVAL);
        }
 
-       DRM_COPY_FROM_USER_IOCTL( elts, (drm_r128_indices_t *) data,
+       DRM_COPY_FROM_USER_IOCTL( elts, (drm_r128_indices_t __user *) data,
                             sizeof(elts) );
 
        DRM_DEBUG( "pid=%d buf=%d s=%d e=%d d=%d\n", DRM_CURRENTPID,
@@ -1492,6 +1498,7 @@ int r128_cce_indices( DRM_IOCTL_ARGS )
 
        r128_cce_dispatch_indices( dev, buf, elts.start, elts.end, count );
 
+       COMMIT_RING();
        return 0;
 }
 
@@ -1501,10 +1508,11 @@ int r128_cce_blit( DRM_IOCTL_ARGS )
        drm_device_dma_t *dma = dev->dma;
        drm_r128_private_t *dev_priv = dev->dev_private;
        drm_r128_blit_t blit;
+       int ret;
 
        LOCK_TEST_WITH_RETURN( dev, filp );
 
-       DRM_COPY_FROM_USER_IOCTL( blit, (drm_r128_blit_t *) data,
+       DRM_COPY_FROM_USER_IOCTL( blit, (drm_r128_blit_t __user *) data,
                             sizeof(blit) );
 
        DRM_DEBUG( "pid=%d index=%d\n", DRM_CURRENTPID, blit.idx );
@@ -1518,7 +1526,10 @@ int r128_cce_blit( DRM_IOCTL_ARGS )
        RING_SPACE_TEST_WITH_RETURN( dev_priv );
        VB_AGE_TEST_WITH_RETURN( dev_priv );
 
-       return r128_cce_dispatch_blit( filp, dev, &blit );
+       ret = r128_cce_dispatch_blit( filp, dev, &blit );
+
+       COMMIT_RING();
+       return ret;
 }
 
 int r128_cce_depth( DRM_IOCTL_ARGS )
@@ -1526,26 +1537,29 @@ int r128_cce_depth( DRM_IOCTL_ARGS )
        DRM_DEVICE;
        drm_r128_private_t *dev_priv = dev->dev_private;
        drm_r128_depth_t depth;
+       int ret;
 
        LOCK_TEST_WITH_RETURN( dev, filp );
 
-       DRM_COPY_FROM_USER_IOCTL( depth, (drm_r128_depth_t *) data,
+       DRM_COPY_FROM_USER_IOCTL( depth, (drm_r128_depth_t __user *) data,
                             sizeof(depth) );
 
        RING_SPACE_TEST_WITH_RETURN( dev_priv );
 
+       ret = DRM_ERR(EINVAL);
        switch ( depth.func ) {
        case R128_WRITE_SPAN:
-               return r128_cce_dispatch_write_span( dev, &depth );
+               ret = r128_cce_dispatch_write_span( dev, &depth );
        case R128_WRITE_PIXELS:
-               return r128_cce_dispatch_write_pixels( dev, &depth );
+               ret = r128_cce_dispatch_write_pixels( dev, &depth );
        case R128_READ_SPAN:
-               return r128_cce_dispatch_read_span( dev, &depth );
+               ret = r128_cce_dispatch_read_span( dev, &depth );
        case R128_READ_PIXELS:
-               return r128_cce_dispatch_read_pixels( dev, &depth );
+               ret = r128_cce_dispatch_read_pixels( dev, &depth );
        }
 
-       return DRM_ERR(EINVAL);
+       COMMIT_RING();
+       return ret;
 }
 
 int r128_cce_stipple( DRM_IOCTL_ARGS )
@@ -1557,7 +1571,7 @@ int r128_cce_stipple( DRM_IOCTL_ARGS )
 
        LOCK_TEST_WITH_RETURN( dev, filp );
 
-       DRM_COPY_FROM_USER_IOCTL( stipple, (drm_r128_stipple_t *) data,
+       DRM_COPY_FROM_USER_IOCTL( stipple, (drm_r128_stipple_t __user *) data,
                             sizeof(stipple) );
 
        if ( DRM_COPY_FROM_USER( &mask, stipple.mask,
@@ -1568,6 +1582,7 @@ int r128_cce_stipple( DRM_IOCTL_ARGS )
 
        r128_cce_dispatch_stipple( dev, mask );
 
+       COMMIT_RING();
        return 0;
 }
 
@@ -1590,7 +1605,7 @@ int r128_cce_indirect( DRM_IOCTL_ARGS )
                return DRM_ERR(EINVAL);
        }
 
-       DRM_COPY_FROM_USER_IOCTL( indirect, (drm_r128_indirect_t *) data,
+       DRM_COPY_FROM_USER_IOCTL( indirect, (drm_r128_indirect_t __user *) data,
                             sizeof(indirect) );
 
        DRM_DEBUG( "indirect: idx=%d s=%d e=%d d=%d\n",
@@ -1643,6 +1658,7 @@ int r128_cce_indirect( DRM_IOCTL_ARGS )
         */
        r128_cce_dispatch_indirect( dev, buf, indirect.start, indirect.end );
 
+       COMMIT_RING();
        return 0;
 }
 
@@ -1658,7 +1674,7 @@ int r128_getparam( DRM_IOCTL_ARGS )
                return DRM_ERR(EINVAL);
        }
 
-       DRM_COPY_FROM_USER_IOCTL( param, (drm_r128_getparam_t *)data,
+       DRM_COPY_FROM_USER_IOCTL( param, (drm_r128_getparam_t __user *)data,
                             sizeof(param) );
 
        DRM_DEBUG( "pid=%d\n", DRM_CURRENTPID );
@@ -1678,3 +1694,31 @@ int r128_getparam( DRM_IOCTL_ARGS )
        
        return 0;
 }
+
+static void r128_driver_prerelease(drm_device_t *dev, DRMFILE filp)
+{
+       if ( dev->dev_private ) {
+               drm_r128_private_t *dev_priv = dev->dev_private;
+               if ( dev_priv->page_flipping ) {
+                       r128_do_cleanup_pageflip( dev );
+               }
+       }                       
+}
+
+static void r128_driver_pretakedown(drm_device_t *dev)
+{
+       r128_do_cleanup_cce( dev );
+}
+
+void r128_driver_register_fns(drm_device_t *dev)
+{
+       dev->driver_features = DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_PCI_DMA | DRIVER_SG | DRIVER_HAVE_DMA | DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED | DRIVER_IRQ_VBL;
+       dev->dev_priv_size = sizeof(drm_r128_buf_priv_t);
+       dev->fn_tbl.prerelease = r128_driver_prerelease;
+       dev->fn_tbl.pretakedown = r128_driver_pretakedown;
+       dev->fn_tbl.vblank_wait = r128_driver_vblank_wait;
+       dev->fn_tbl.irq_preinstall = r128_driver_irq_preinstall;
+       dev->fn_tbl.irq_postinstall = r128_driver_irq_postinstall;
+       dev->fn_tbl.irq_uninstall = r128_driver_irq_uninstall;
+       dev->fn_tbl.irq_handler = r128_driver_irq_handler;
+}