drm/ttm: wire up the new pool as default one v2
[linux-2.6-microblaze.git] / drivers / gpu / drm / vmwgfx / vmwgfx_drv.c
index fb39826..7bd1be2 100644 (file)
@@ -372,7 +372,7 @@ static int vmw_dummy_query_bo_create(struct vmw_private *dev_priv)
                return -ENOMEM;
 
        ret = vmw_bo_init(dev_priv, vbo, PAGE_SIZE,
-                         &vmw_sys_ne_placement, false,
+                         &vmw_sys_placement, false, true,
                          &vmw_bo_bo_free);
        if (unlikely(ret != 0))
                return ret;
@@ -468,7 +468,10 @@ out_no_query_bo:
        if (dev_priv->cman)
                vmw_cmdbuf_remove_pool(dev_priv->cman);
        if (dev_priv->has_mob) {
-               (void) ttm_bo_evict_mm(&dev_priv->bdev, VMW_PL_MOB);
+               struct ttm_resource_manager *man;
+
+               man = ttm_manager_type(&dev_priv->bdev, VMW_PL_MOB);
+               ttm_resource_manager_evict_all(&dev_priv->bdev, man);
                vmw_otables_takedown(dev_priv);
        }
        if (dev_priv->cman)
@@ -501,7 +504,10 @@ static void vmw_release_device_early(struct vmw_private *dev_priv)
                vmw_cmdbuf_remove_pool(dev_priv->cman);
 
        if (dev_priv->has_mob) {
-               ttm_bo_evict_mm(&dev_priv->bdev, VMW_PL_MOB);
+               struct ttm_resource_manager *man;
+
+               man = ttm_manager_type(&dev_priv->bdev, VMW_PL_MOB);
+               ttm_resource_manager_evict_all(&dev_priv->bdev, man);
                vmw_otables_takedown(dev_priv);
        }
 }
@@ -620,6 +626,28 @@ static int vmw_dma_masks(struct vmw_private *dev_priv)
        return ret;
 }
 
+static int vmw_vram_manager_init(struct vmw_private *dev_priv)
+{
+       int ret;
+#ifdef CONFIG_TRANSPARENT_HUGEPAGE
+       ret = vmw_thp_init(dev_priv);
+#else
+       ret = ttm_range_man_init(&dev_priv->bdev, TTM_PL_VRAM, false,
+                                dev_priv->vram_size >> PAGE_SHIFT);
+#endif
+       ttm_resource_manager_set_used(ttm_manager_type(&dev_priv->bdev, TTM_PL_VRAM), false);
+       return ret;
+}
+
+static void vmw_vram_manager_fini(struct vmw_private *dev_priv)
+{
+#ifdef CONFIG_TRANSPARENT_HUGEPAGE
+       vmw_thp_fini(dev_priv);
+#else
+       ttm_range_man_fini(&dev_priv->bdev, TTM_PL_VRAM);
+#endif
+}
+
 static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
 {
        struct vmw_private *dev_priv;
@@ -850,10 +878,11 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
        drm_vma_offset_manager_init(&dev_priv->vma_manager,
                                    DRM_FILE_PAGE_OFFSET_START,
                                    DRM_FILE_PAGE_OFFSET_SIZE);
-       ret = ttm_bo_device_init(&dev_priv->bdev,
-                                &vmw_bo_driver,
+       ret = ttm_bo_device_init(&dev_priv->bdev, &vmw_bo_driver,
+                                dev_priv->dev->dev,
                                 dev->anon_inode->i_mapping,
                                 &dev_priv->vma_manager,
+                                dev_priv->map_mode == vmw_dma_alloc_coherent,
                                 false);
        if (unlikely(ret != 0)) {
                DRM_ERROR("Failed initializing TTM buffer object driver.\n");
@@ -864,18 +893,23 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
         * Enable VRAM, but initially don't use it until SVGA is enabled and
         * unhidden.
         */
-       ret = ttm_bo_init_mm(&dev_priv->bdev, TTM_PL_VRAM,
-                            (dev_priv->vram_size >> PAGE_SHIFT));
+
+       ret = vmw_vram_manager_init(dev_priv);
        if (unlikely(ret != 0)) {
                DRM_ERROR("Failed initializing memory manager for VRAM.\n");
                goto out_no_vram;
        }
-       dev_priv->bdev.man[TTM_PL_VRAM].use_type = false;
 
+       /*
+        * "Guest Memory Regions" is an aperture like feature with
+        *  one slot per bo. There is an upper limit of the number of
+        *  slots as well as the bo size.
+        */
        dev_priv->has_gmr = true;
+       /* TODO: This is most likely not correct */
        if (((dev_priv->capabilities & (SVGA_CAP_GMR | SVGA_CAP_GMR2)) == 0) ||
-           refuse_dma || ttm_bo_init_mm(&dev_priv->bdev, VMW_PL_GMR,
-                                        VMW_PL_GMR) != 0) {
+           refuse_dma ||
+           vmw_gmrid_man_init(dev_priv, VMW_PL_GMR) != 0) {
                DRM_INFO("No GMR memory available. "
                         "Graphics memory resources are very limited.\n");
                dev_priv->has_gmr = false;
@@ -883,8 +917,8 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
 
        if (dev_priv->capabilities & SVGA_CAP_GBOBJECTS && !refuse_dma) {
                dev_priv->has_mob = true;
-               if (ttm_bo_init_mm(&dev_priv->bdev, VMW_PL_MOB,
-                                  VMW_PL_MOB) != 0) {
+
+               if (vmw_gmrid_man_init(dev_priv, VMW_PL_MOB) != 0) {
                        DRM_INFO("No MOB memory available. "
                                 "3D will be disabled.\n");
                        dev_priv->has_mob = false;
@@ -961,10 +995,10 @@ out_no_fifo:
        vmw_kms_close(dev_priv);
 out_no_kms:
        if (dev_priv->has_mob)
-               (void) ttm_bo_clean_mm(&dev_priv->bdev, VMW_PL_MOB);
+               vmw_gmrid_man_fini(dev_priv, VMW_PL_MOB);
        if (dev_priv->has_gmr)
-               (void) ttm_bo_clean_mm(&dev_priv->bdev, VMW_PL_GMR);
-       (void)ttm_bo_clean_mm(&dev_priv->bdev, TTM_PL_VRAM);
+               vmw_gmrid_man_fini(dev_priv, VMW_PL_GMR);
+       vmw_vram_manager_fini(dev_priv);
 out_no_vram:
        (void)ttm_bo_device_release(&dev_priv->bdev);
 out_no_bdev:
@@ -1012,12 +1046,12 @@ static void vmw_driver_unload(struct drm_device *dev)
        vmw_overlay_close(dev_priv);
 
        if (dev_priv->has_gmr)
-               (void)ttm_bo_clean_mm(&dev_priv->bdev, VMW_PL_GMR);
-       (void)ttm_bo_clean_mm(&dev_priv->bdev, TTM_PL_VRAM);
+               vmw_gmrid_man_fini(dev_priv, VMW_PL_GMR);
 
        vmw_release_device_early(dev_priv);
        if (dev_priv->has_mob)
-               (void) ttm_bo_clean_mm(&dev_priv->bdev, VMW_PL_MOB);
+               vmw_gmrid_man_fini(dev_priv, VMW_PL_MOB);
+       vmw_vram_manager_fini(dev_priv);
        (void) ttm_bo_device_release(&dev_priv->bdev);
        drm_vma_offset_manager_destroy(&dev_priv->vma_manager);
        vmw_release_device_late(dev_priv);
@@ -1159,10 +1193,12 @@ static void vmw_master_drop(struct drm_device *dev,
  */
 static void __vmw_svga_enable(struct vmw_private *dev_priv)
 {
+       struct ttm_resource_manager *man = ttm_manager_type(&dev_priv->bdev, TTM_PL_VRAM);
+
        spin_lock(&dev_priv->svga_lock);
-       if (!dev_priv->bdev.man[TTM_PL_VRAM].use_type) {
+       if (!ttm_resource_manager_used(man)) {
                vmw_write(dev_priv, SVGA_REG_ENABLE, SVGA_REG_ENABLE);
-               dev_priv->bdev.man[TTM_PL_VRAM].use_type = true;
+               ttm_resource_manager_set_used(man, true);
        }
        spin_unlock(&dev_priv->svga_lock);
 }
@@ -1188,9 +1224,11 @@ void vmw_svga_enable(struct vmw_private *dev_priv)
  */
 static void __vmw_svga_disable(struct vmw_private *dev_priv)
 {
+       struct ttm_resource_manager *man = ttm_manager_type(&dev_priv->bdev, TTM_PL_VRAM);
+
        spin_lock(&dev_priv->svga_lock);
-       if (dev_priv->bdev.man[TTM_PL_VRAM].use_type) {
-               dev_priv->bdev.man[TTM_PL_VRAM].use_type = false;
+       if (ttm_resource_manager_used(man)) {
+               ttm_resource_manager_set_used(man, false);
                vmw_write(dev_priv, SVGA_REG_ENABLE,
                          SVGA_REG_ENABLE_HIDE |
                          SVGA_REG_ENABLE_ENABLE);
@@ -1207,6 +1245,7 @@ static void __vmw_svga_disable(struct vmw_private *dev_priv)
  */
 void vmw_svga_disable(struct vmw_private *dev_priv)
 {
+       struct ttm_resource_manager *man = ttm_manager_type(&dev_priv->bdev, TTM_PL_VRAM);
        /*
         * Disabling SVGA will turn off device modesetting capabilities, so
         * notify KMS about that so that it doesn't cache atomic state that
@@ -1222,10 +1261,10 @@ void vmw_svga_disable(struct vmw_private *dev_priv)
        vmw_kms_lost_device(dev_priv->dev);
        ttm_write_lock(&dev_priv->reservation_sem, false);
        spin_lock(&dev_priv->svga_lock);
-       if (dev_priv->bdev.man[TTM_PL_VRAM].use_type) {
-               dev_priv->bdev.man[TTM_PL_VRAM].use_type = false;
+       if (ttm_resource_manager_used(man)) {
+               ttm_resource_manager_set_used(man, false);
                spin_unlock(&dev_priv->svga_lock);
-               if (ttm_bo_evict_mm(&dev_priv->bdev, TTM_PL_VRAM))
+               if (ttm_resource_manager_evict_all(&dev_priv->bdev, man))
                        DRM_ERROR("Failed evicting VRAM buffers.\n");
                vmw_write(dev_priv, SVGA_REG_ENABLE,
                          SVGA_REG_ENABLE_HIDE |
@@ -1332,6 +1371,10 @@ static int vmw_pm_freeze(struct device *kdev)
        struct pci_dev *pdev = to_pci_dev(kdev);
        struct drm_device *dev = pci_get_drvdata(pdev);
        struct vmw_private *dev_priv = vmw_priv(dev);
+       struct ttm_operation_ctx ctx = {
+               .interruptible = false,
+               .no_wait_gpu = false
+       };
        int ret;
 
        /*
@@ -1352,7 +1395,7 @@ static int vmw_pm_freeze(struct device *kdev)
        vmw_execbuf_release_pinned_bo(dev_priv);
        vmw_resource_evict_all(dev_priv);
        vmw_release_device_early(dev_priv);
-       ttm_bo_swapout_all();
+       while (ttm_bo_swapout(&ctx) == 0);
        if (dev_priv->enable_fb)
                vmw_fifo_resource_dec(dev_priv);
        if (atomic_read(&dev_priv->num_fifo_resources) != 0) {