vserver 1.9.3
[linux-2.6.git] / drivers / char / drm / mga_dma.c
index 76fbf71..54b64c7 100644 (file)
@@ -500,7 +500,7 @@ static int mga_do_init_dma( drm_device_t *dev, drm_mga_init_t *init )
                return DRM_ERR(EINVAL);
        }
 
-       DRM_FIND_MAP( dev_priv->mmio, init->mmio_offset );
+       dev_priv->mmio = drm_core_findmap(dev, init->mmio_offset);
        if(!dev_priv->mmio) {
                DRM_ERROR( "failed to find mmio region!\n" );
                /* Assign dev_private so we can do cleanup. */
@@ -508,7 +508,7 @@ static int mga_do_init_dma( drm_device_t *dev, drm_mga_init_t *init )
                mga_do_cleanup_dma( dev );
                return DRM_ERR(EINVAL);
        }
-       DRM_FIND_MAP( dev_priv->status, init->status_offset );
+       dev_priv->status = drm_core_findmap(dev, init->status_offset);
        if(!dev_priv->status) {
                DRM_ERROR( "failed to find status page!\n" );
                /* Assign dev_private so we can do cleanup. */
@@ -516,8 +516,7 @@ static int mga_do_init_dma( drm_device_t *dev, drm_mga_init_t *init )
                mga_do_cleanup_dma( dev );
                return DRM_ERR(EINVAL);
        }
-
-       DRM_FIND_MAP( dev_priv->warp, init->warp_offset );
+       dev_priv->warp = drm_core_findmap(dev, init->warp_offset);
        if(!dev_priv->warp) {
                DRM_ERROR( "failed to find warp microcode region!\n" );
                /* Assign dev_private so we can do cleanup. */
@@ -525,7 +524,7 @@ static int mga_do_init_dma( drm_device_t *dev, drm_mga_init_t *init )
                mga_do_cleanup_dma( dev );
                return DRM_ERR(EINVAL);
        }
-       DRM_FIND_MAP( dev_priv->primary, init->primary_offset );
+       dev_priv->primary = drm_core_findmap(dev, init->primary_offset);
        if(!dev_priv->primary) {
                DRM_ERROR( "failed to find primary dma region!\n" );
                /* Assign dev_private so we can do cleanup. */
@@ -533,8 +532,8 @@ static int mga_do_init_dma( drm_device_t *dev, drm_mga_init_t *init )
                mga_do_cleanup_dma( dev );
                return DRM_ERR(EINVAL);
        }
-       DRM_FIND_MAP( dev_priv->buffers, init->buffers_offset );
-       if(!dev_priv->buffers) {
+       dev->agp_buffer_map = drm_core_findmap(dev, init->buffers_offset);
+       if(!dev->agp_buffer_map) {
                DRM_ERROR( "failed to find dma buffer region!\n" );
                /* Assign dev_private so we can do cleanup. */
                dev->dev_private = (void *)dev_priv;
@@ -546,13 +545,13 @@ static int mga_do_init_dma( drm_device_t *dev, drm_mga_init_t *init )
                (drm_mga_sarea_t *)((u8 *)dev_priv->sarea->handle +
                                    init->sarea_priv_offset);
 
-       DRM_IOREMAP( dev_priv->warp, dev );
-       DRM_IOREMAP( dev_priv->primary, dev );
-       DRM_IOREMAP( dev_priv->buffers, dev );
+       drm_core_ioremap( dev_priv->warp, dev );
+       drm_core_ioremap( dev_priv->primary, dev );
+       drm_core_ioremap( dev->agp_buffer_map, dev );
 
        if(!dev_priv->warp->handle ||
           !dev_priv->primary->handle ||
-          !dev_priv->buffers->handle ) {
+          !dev->agp_buffer_map->handle ) {
                DRM_ERROR( "failed to ioremap agp regions!\n" );
                /* Assign dev_private so we can do cleanup. */
                dev->dev_private = (void *)dev_priv;
@@ -631,23 +630,21 @@ int mga_do_cleanup_dma( drm_device_t *dev )
 {
        DRM_DEBUG( "\n" );
 
-#if __HAVE_IRQ
        /* Make sure interrupts are disabled here because the uninstall ioctl
         * may not have been called from userspace and after dev_private
         * is freed, it's too late.
         */
        if ( dev->irq_enabled ) DRM(irq_uninstall)(dev);
-#endif
 
        if ( dev->dev_private ) {
                drm_mga_private_t *dev_priv = dev->dev_private;
 
                if ( dev_priv->warp != NULL )
-                       DRM_IOREMAPFREE( dev_priv->warp, dev );
+                       drm_core_ioremapfree( dev_priv->warp, dev );
                if ( dev_priv->primary != NULL )
-                       DRM_IOREMAPFREE( dev_priv->primary, dev );
-               if ( dev_priv->buffers != NULL )
-                       DRM_IOREMAPFREE( dev_priv->buffers, dev );
+                       drm_core_ioremapfree( dev_priv->primary, dev );
+               if ( dev->agp_buffer_map != NULL )
+                       drm_core_ioremapfree( dev->agp_buffer_map, dev );
 
                if ( dev_priv->head != NULL ) {
                        mga_freelist_cleanup( dev );
@@ -800,3 +797,31 @@ int mga_dma_buffers( DRM_IOCTL_ARGS )
 
        return ret;
 }
+
+static void mga_driver_pretakedown(drm_device_t *dev)
+{
+       mga_do_cleanup_dma( dev );
+}
+
+static int mga_driver_dma_quiescent(drm_device_t *dev)
+{
+       drm_mga_private_t *dev_priv = dev->dev_private;
+       return mga_do_wait_for_idle( dev_priv );
+}
+
+void mga_driver_register_fns(drm_device_t *dev)
+{
+       dev->driver_features = DRIVER_USE_AGP | DRIVER_REQUIRE_AGP | DRIVER_USE_MTRR | DRIVER_HAVE_DMA | DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED | DRIVER_IRQ_VBL;
+       dev->fn_tbl.pretakedown = mga_driver_pretakedown;
+       dev->fn_tbl.dma_quiescent = mga_driver_dma_quiescent;
+       dev->fn_tbl.vblank_wait = mga_driver_vblank_wait;
+       dev->fn_tbl.irq_preinstall = mga_driver_irq_preinstall;
+       dev->fn_tbl.irq_postinstall = mga_driver_irq_postinstall;
+       dev->fn_tbl.irq_uninstall = mga_driver_irq_uninstall;
+       dev->fn_tbl.irq_handler = mga_driver_irq_handler;
+       
+       dev->counters += 3;
+       dev->types[6] = _DRM_STAT_IRQ;
+       dev->types[7] = _DRM_STAT_PRIMARY;
+       dev->types[8] = _DRM_STAT_SECONDARY;
+}