vserver 1.9.3
[linux-2.6.git] / drivers / char / drm / gamma_dma.c
index 7802f51..7e01ca1 100644 (file)
@@ -116,7 +116,7 @@ static inline int gamma_dma_is_ready(drm_device_t *dev)
        return (!GAMMA_READ(GAMMA_DMACOUNT));
 }
 
-irqreturn_t gamma_irq_handler( DRM_IRQ_ARGS )
+irqreturn_t gamma_driver_irq_handler( DRM_IRQ_ARGS )
 {
        drm_device_t     *dev = (drm_device_t *)arg;
        drm_device_dma_t *dma = dev->dma;
@@ -639,12 +639,12 @@ static int gamma_do_init_dma( drm_device_t *dev, drm_gamma_init_t *init )
                        break;
                }
        }
-
-       DRM_FIND_MAP( dev_priv->mmio0, init->mmio0 );
-       DRM_FIND_MAP( dev_priv->mmio1, init->mmio1 );
-       DRM_FIND_MAP( dev_priv->mmio2, init->mmio2 );
-       DRM_FIND_MAP( dev_priv->mmio3, init->mmio3 );
-
+       
+       dev_priv->mmio0 = drm_core_findmap(dev, init->mmio0);
+       dev_priv->mmio1 = drm_core_findmap(dev, init->mmio1);
+       dev_priv->mmio2 = drm_core_findmap(dev, init->mmio2);
+       dev_priv->mmio3 = drm_core_findmap(dev, init->mmio3);
+       
        dev_priv->sarea_priv = (drm_gamma_sarea_t *)
                ((u8 *)dev_priv->sarea->handle +
                 init->sarea_priv_offset);
@@ -661,9 +661,8 @@ static int gamma_do_init_dma( drm_device_t *dev, drm_gamma_init_t *init )
 
                buf = dma->buflist[GLINT_DRI_BUF_COUNT];
        } else {
-               DRM_FIND_MAP( dev_priv->buffers, init->buffers_offset );
-
-               DRM_IOREMAP( dev_priv->buffers, dev );
+               dev->agp_buffer_map = drm_core_findmap(dev, init->buffers_offset);
+               drm_core_ioremap( dev->agp_buffer_map, dev);
 
                buf = dma->buflist[GLINT_DRI_BUF_COUNT];
                pgt = buf->address;
@@ -690,19 +689,18 @@ int gamma_do_cleanup_dma( drm_device_t *dev )
 {
        DRM_DEBUG( "%s\n", __FUNCTION__ );
 
-#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 (drm_core_check_feature(dev, DRIVER_HAVE_IRQ))
+               if ( dev->irq_enabled ) 
+                       DRM(irq_uninstall)(dev);
 
        if ( dev->dev_private ) {
-               drm_gamma_private_t *dev_priv = dev->dev_private;
 
-               if ( dev_priv->buffers != NULL )
-                       DRM_IOREMAPFREE( dev_priv->buffers, dev );
+               if ( dev->agp_buffer_map != NULL )
+                       drm_core_ioremapfree( dev->agp_buffer_map, dev );
 
                DRM(free)( dev->dev_private, sizeof(drm_gamma_private_t),
                           DRM_MEM_DRIVER );
@@ -868,7 +866,7 @@ int gamma_setsareactx(struct inode *inode, struct file *filp,
        return 0;
 }
 
-void DRM(driver_irq_preinstall)( drm_device_t *dev ) {
+void gamma_driver_irq_preinstall( drm_device_t *dev ) {
        drm_gamma_private_t *dev_priv =
                                (drm_gamma_private_t *)dev->dev_private;
 
@@ -879,7 +877,7 @@ void DRM(driver_irq_preinstall)( drm_device_t *dev ) {
        GAMMA_WRITE( GAMMA_GDMACONTROL,         0x00000000 );
 }
 
-void DRM(driver_irq_postinstall)( drm_device_t *dev ) {
+void gamma_driver_irq_postinstall( drm_device_t *dev ) {
        drm_gamma_private_t *dev_priv =
                                (drm_gamma_private_t *)dev->dev_private;
 
@@ -891,7 +889,7 @@ void DRM(driver_irq_postinstall)( drm_device_t *dev ) {
        GAMMA_WRITE( GAMMA_GDELAYTIMER,         0x00039090 );
 }
 
-void DRM(driver_irq_uninstall)( drm_device_t *dev ) {
+void gamma_driver_irq_uninstall( drm_device_t *dev ) {
        drm_gamma_private_t *dev_priv =
                                (drm_gamma_private_t *)dev->dev_private;
        if (!dev_priv)
@@ -904,3 +902,45 @@ void DRM(driver_irq_uninstall)( drm_device_t *dev ) {
        GAMMA_WRITE( GAMMA_COMMANDINTENABLE,    0x00000000 );
        GAMMA_WRITE( GAMMA_GINTENABLE,          0x00000000 );
 }
+
+extern drm_ioctl_desc_t DRM(ioctls)[];
+
+static int gamma_driver_preinit(drm_device_t *dev)
+{
+       /* reset the finish ioctl */
+       DRM(ioctls)[DRM_IOCTL_NR(DRM_IOCTL_FINISH)].func = DRM(finish);
+       return 0;
+}
+
+static void gamma_driver_pretakedown(drm_device_t *dev)
+{
+       gamma_do_cleanup_dma(dev);
+}
+
+static void gamma_driver_dma_ready(drm_device_t *dev)
+{
+       gamma_dma_ready(dev);
+}
+
+static int gamma_driver_dma_quiescent(drm_device_t *dev)
+{
+       drm_gamma_private_t *dev_priv = (
+               drm_gamma_private_t *)dev->dev_private;
+       if (dev_priv->num_rast == 2)
+               gamma_dma_quiescent_dual(dev);
+       else gamma_dma_quiescent_single(dev);
+       return 0;
+}
+
+void gamma_driver_register_fns(drm_device_t *dev)
+{
+       dev->driver_features = DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_PCI_DMA | DRIVER_HAVE_DMA | DRIVER_HAVE_IRQ;
+       DRM(fops).read = gamma_fops_read;
+       DRM(fops).poll = gamma_fops_poll;
+       dev->fn_tbl.preinit = gamma_driver_preinit;
+       dev->fn_tbl.pretakedown = gamma_driver_pretakedown;
+       dev->fn_tbl.dma_ready = gamma_driver_dma_ready;
+       dev->fn_tbl.dma_quiescent = gamma_driver_dma_quiescent;
+       dev->fn_tbl.dma_flush_block_and_flush = gamma_flush_block_and_flush;
+       dev->fn_tbl.dma_flush_unblock = gamma_flush_unblock;
+}