Merge branch 'drm-gem'
authorEric Anholt <eric@anholt.net>
Fri, 8 Aug 2008 21:05:01 +0000 (14:05 -0700)
committerEric Anholt <eric@anholt.net>
Fri, 8 Aug 2008 21:05:01 +0000 (14:05 -0700)
Conflicts:

shared-core/i915_dma.c

This brings in kernel support and userland interface for intel GEM.

1  2 
linux-core/drm_compat.h
linux-core/i915_drv.c
linux-core/i915_opregion.c
shared-core/i915_dma.c
shared-core/i915_drv.h
shared-core/i915_irq.c

Simple merge
Simple merge
Simple merge
@@@ -1038,26 -1077,75 +1077,34 @@@ int i915_driver_load(struct drm_device 
  #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
        intel_init_chipset_flush_compat(dev);
  #endif
 +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,25)
        intel_opregion_init(dev);
  #endif
 +#endif
  
 -      I915_WRITE16(HWSTAM, 0xeffe);
 -      I915_WRITE16(IMR, 0x0);
 -      I915_WRITE16(IER, 0x0);
 -
 -      DRM_SPININIT(&dev_priv->swaps_lock, "swap");
 -      INIT_LIST_HEAD(&dev_priv->vbl_swaps.head);
 -      dev_priv->swaps_pending = 0;
 -
 -      DRM_SPININIT(&dev_priv->user_irq_lock, "userirq");
 -      dev_priv->user_irq_refcount = 0;
 -      dev_priv->irq_mask_reg = ~0;
 -
 -      ret = drm_vblank_init(dev, num_pipes);
 -      if (ret)
 -              return ret;
 -
 -      dev_priv->vblank_pipe = DRM_I915_VBLANK_PIPE_A | DRM_I915_VBLANK_PIPE_B;
 -      dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */
 -
 -      i915_enable_interrupt(dev);
 -      DRM_INIT_WAITQUEUE(&dev_priv->irq_queue);
 -
 -      /*
 -       * Initialize the hardware status page IRQ location.
 -       */
 -
 -      I915_WRITE(INSTPM, (1 << 5) | (1 << 21));
 -
+       /* Init HWS */
+       if (!I915_NEED_GFX_HWS(dev)) {
+               ret = i915_init_hardware_status(dev);
+               if(ret)
+                       return ret;
+       }
        return ret;
  }
  
  int i915_driver_unload(struct drm_device *dev)
  {
        struct drm_i915_private *dev_priv = dev->dev_private;
 -      u32 temp;
 -
 -      if (dev_priv) {
 -              dev_priv->vblank_pipe = 0;
 -
 -              dev_priv->irq_enabled = 0;
 -              I915_WRITE(HWSTAM, 0xffffffff);
 -              I915_WRITE(IMR, 0xffffffff);
 -              I915_WRITE(IER, 0x0);
 -
 -              temp = I915_READ(PIPEASTAT);
 -              I915_WRITE(PIPEASTAT, temp);
 -              temp = I915_READ(PIPEBSTAT);
 -              I915_WRITE(PIPEBSTAT, temp);
 -              temp = I915_READ(IIR);
 -              I915_WRITE(IIR, temp);
 -      }
  
-       if (dev_priv->mmio_map)
-               drm_rmmap(dev, dev_priv->mmio_map);
+       i915_free_hardware_status(dev);
+       drm_rmmap(dev, dev_priv->mmio_map);
  
  #ifdef __linux__
 +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,25)
        intel_opregion_free(dev);
  #endif
 +#endif
  
        drm_free(dev->dev_private, sizeof(drm_i915_private_t),
                 DRM_MEM_DRIVER);
Simple merge
@@@ -672,19 -720,19 +724,21 @@@ void i915_disable_vblank(struct drm_dev
        }
  }
  
 -void i915_enable_interrupt (struct drm_device *dev)
 +static void i915_enable_interrupt (struct drm_device *dev)
  {
        drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
-       
-       dev_priv->irq_enable_reg |= I915_USER_INTERRUPT;
+       dev_priv->irq_mask_reg = ~0;
+       I915_WRITE(IMR, dev_priv->irq_mask_reg);
+       I915_WRITE(IER, I915_INTERRUPT_ENABLE_MASK);
+       (void) I915_READ (IER);
  
  #ifdef __linux__
 +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,25)
        opregion_enable_asle(dev);
  #endif
 +#endif
  
-       I915_WRITE(IER, dev_priv->irq_enable_reg);
        dev_priv->irq_enabled = 1;
  }
  
@@@ -891,32 -935,6 +945,32 @@@ void i915_driver_irq_preinstall(struct 
  
  int i915_driver_irq_postinstall(struct drm_device * dev)
  {
-       dev_priv->irq_enable_reg = 0;
 +      drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
 +      int ret, num_pipes = 2;
 +
 +      DRM_SPININIT(&dev_priv->swaps_lock, "swap");
 +      INIT_LIST_HEAD(&dev_priv->vbl_swaps.head);
 +      dev_priv->swaps_pending = 0;
 +
 +      DRM_SPININIT(&dev_priv->user_irq_lock, "userirq");
 +      dev_priv->user_irq_refcount = 0;
++      dev_priv->irq_mask_reg = ~0;
 +
 +      ret = drm_vblank_init(dev, num_pipes);
 +      if (ret)
 +              return ret;
 +
 +      dev_priv->vblank_pipe = DRM_I915_VBLANK_PIPE_A | DRM_I915_VBLANK_PIPE_B;
 +      dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */
 +
 +      i915_enable_interrupt(dev);
 +      DRM_INIT_WAITQUEUE(&dev_priv->irq_queue);
 +
 +      /*
 +       * Initialize the hardware status page IRQ location.
 +       */
 +
 +      I915_WRITE(INSTPM, (1 << 5) | (1 << 21));
        return 0;
  }