]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/gpu/drm/i915/i915_dma.c
drm/i915: add support for physical memory objects
[linux-2.6-omap-h63xx.git] / drivers / gpu / drm / i915 / i915_dma.c
index 3d7082af5b72b5f5287412f7b6294d9947ace12c..bbadf1c041426ca73e9fd1bf0e749c0050dbde92 100644 (file)
@@ -177,6 +177,14 @@ static int i915_initialize(struct drm_device * dev, drm_i915_init_t * init)
        drm_i915_private_t *dev_priv = dev->dev_private;
        struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv;
 
+       master_priv->sarea = drm_getsarea(dev);
+       if (master_priv->sarea) {
+               master_priv->sarea_priv = (drm_i915_sarea_t *)
+                       ((u8 *)master_priv->sarea->handle + init->sarea_priv_offset);
+       } else {
+               DRM_DEBUG("sarea not found assuming DRI2 userspace\n");
+       }
+
        if (init->ring_size != 0) {
                if (dev_priv->ring.ring_obj != NULL) {
                        i915_dma_cleanup(dev);
@@ -827,6 +835,7 @@ static int i915_probe_agp(struct drm_device *dev, unsigned long *aperture_size,
        struct pci_dev *bridge_dev;
        u16 tmp = 0;
        unsigned long overhead;
+       unsigned long stolen;
 
        bridge_dev = pci_get_bus_and_slot(0, PCI_DEVFN(0,0));
        if (!bridge_dev) {
@@ -866,36 +875,55 @@ static int i915_probe_agp(struct drm_device *dev, unsigned long *aperture_size,
        else
                overhead = (*aperture_size / 1024) + 4096;
 
-       switch (tmp & INTEL_855_GMCH_GMS_MASK) {
+       switch (tmp & INTEL_GMCH_GMS_MASK) {
+       case INTEL_855_GMCH_GMS_DISABLED:
+               DRM_ERROR("video memory is disabled\n");
+               return -1;
        case INTEL_855_GMCH_GMS_STOLEN_1M:
-               break; /* 1M already */
+               stolen = 1 * 1024 * 1024;
+               break;
        case INTEL_855_GMCH_GMS_STOLEN_4M:
-               *preallocated_size *= 4;
+               stolen = 4 * 1024 * 1024;
                break;
        case INTEL_855_GMCH_GMS_STOLEN_8M:
-               *preallocated_size *= 8;
+               stolen = 8 * 1024 * 1024;
                break;
        case INTEL_855_GMCH_GMS_STOLEN_16M:
-               *preallocated_size *= 16;
+               stolen = 16 * 1024 * 1024;
                break;
        case INTEL_855_GMCH_GMS_STOLEN_32M:
-               *preallocated_size *= 32;
+               stolen = 32 * 1024 * 1024;
                break;
        case INTEL_915G_GMCH_GMS_STOLEN_48M:
-               *preallocated_size *= 48;
+               stolen = 48 * 1024 * 1024;
                break;
        case INTEL_915G_GMCH_GMS_STOLEN_64M:
-               *preallocated_size *= 64;
+               stolen = 64 * 1024 * 1024;
+               break;
+       case INTEL_GMCH_GMS_STOLEN_128M:
+               stolen = 128 * 1024 * 1024;
+               break;
+       case INTEL_GMCH_GMS_STOLEN_256M:
+               stolen = 256 * 1024 * 1024;
+               break;
+       case INTEL_GMCH_GMS_STOLEN_96M:
+               stolen = 96 * 1024 * 1024;
+               break;
+       case INTEL_GMCH_GMS_STOLEN_160M:
+               stolen = 160 * 1024 * 1024;
+               break;
+       case INTEL_GMCH_GMS_STOLEN_224M:
+               stolen = 224 * 1024 * 1024;
+               break;
+       case INTEL_GMCH_GMS_STOLEN_352M:
+               stolen = 352 * 1024 * 1024;
                break;
-       case INTEL_855_GMCH_GMS_DISABLED:
-               DRM_ERROR("video memory is disabled\n");
-               return -1;
        default:
                DRM_ERROR("unexpected GMCH_GMS value: 0x%02x\n",
-                       tmp & INTEL_855_GMCH_GMS_MASK);
+                       tmp & INTEL_GMCH_GMS_MASK);
                return -1;
        }
-       *preallocated_size -= overhead;
+       *preallocated_size = stolen - overhead;
 
        return 0;
 }
@@ -1132,6 +1160,8 @@ int i915_driver_unload(struct drm_device *dev)
        if (drm_core_check_feature(dev, DRIVER_MODESET)) {
                intel_modeset_cleanup(dev);
 
+               i915_gem_free_all_phys_object(dev);
+
                mutex_lock(&dev->struct_mutex);
                i915_gem_cleanup_ringbuffer(dev);
                mutex_unlock(&dev->struct_mutex);