Merge branch 'for-linus' of git://git.kernel.dk/linux-block
[pandora-kernel.git] / drivers / gpu / drm / nouveau / nouveau_mem.c
index 5ee14d2..f9ae2fc 100644 (file)
@@ -397,7 +397,7 @@ nouveau_mem_vram_init(struct drm_device *dev)
                if (pci_dma_supported(dev->pdev, DMA_BIT_MASK(40)))
                        dma_bits = 40;
        } else
-       if (0 && drm_pci_device_is_pcie(dev) &&
+       if (0 && pci_is_pcie(dev->pdev) &&
            dev_priv->chipset  > 0x40 &&
            dev_priv->chipset != 0x45) {
                if (pci_dma_supported(dev->pdev, DMA_BIT_MASK(39)))
@@ -423,38 +423,6 @@ nouveau_mem_vram_init(struct drm_device *dev)
                return ret;
        }
 
-       /* reserve space at end of VRAM for PRAMIN */
-       if (dev_priv->card_type >= NV_50) {
-               dev_priv->ramin_rsvd_vram = 1 * 1024 * 1024;
-       } else
-       if (dev_priv->card_type >= NV_40) {
-               u32 vs = hweight8((nv_rd32(dev, 0x001540) & 0x0000ff00) >> 8);
-               u32 rsvd;
-
-               /* estimate grctx size, the magics come from nv40_grctx.c */
-               if      (dev_priv->chipset == 0x40) rsvd = 0x6aa0 * vs;
-               else if (dev_priv->chipset  < 0x43) rsvd = 0x4f00 * vs;
-               else if (nv44_graph_class(dev))     rsvd = 0x4980 * vs;
-               else                                rsvd = 0x4a40 * vs;
-               rsvd += 16 * 1024;
-               rsvd *= dev_priv->engine.fifo.channels;
-
-               /* pciegart table */
-               if (drm_pci_device_is_pcie(dev))
-                       rsvd += 512 * 1024;
-
-               /* object storage */
-               rsvd += 512 * 1024;
-
-               dev_priv->ramin_rsvd_vram = round_up(rsvd, 4096);
-       } else {
-               dev_priv->ramin_rsvd_vram = 512 * 1024;
-       }
-
-       ret = dev_priv->engine.vram.init(dev);
-       if (ret)
-               return ret;
-
        NV_INFO(dev, "Detected %dMiB VRAM\n", (int)(dev_priv->vram_size >> 20));
        if (dev_priv->vram_sys_base) {
                NV_INFO(dev, "Stolen system memory at: 0x%010llx\n",
@@ -479,7 +447,7 @@ nouveau_mem_vram_init(struct drm_device *dev)
        }
 
        if (dev_priv->card_type < NV_50) {
-               ret = nouveau_bo_new(dev, NULL, 256*1024, 0, TTM_PL_FLAG_VRAM,
+               ret = nouveau_bo_new(dev, 256*1024, 0, TTM_PL_FLAG_VRAM,
                                     0, 0, &dev_priv->vga_ram);
                if (ret == 0)
                        ret = nouveau_bo_pin(dev_priv->vga_ram,
@@ -729,37 +697,31 @@ nouveau_mem_timing_fini(struct drm_device *dev)
 }
 
 static int
-nouveau_vram_manager_init(struct ttm_mem_type_manager *man, unsigned long p_size)
+nouveau_vram_manager_init(struct ttm_mem_type_manager *man, unsigned long psize)
 {
-       struct drm_nouveau_private *dev_priv = nouveau_bdev(man->bdev);
-       struct nouveau_mm *mm;
-       u64 size, block, rsvd;
-       int ret;
-
-       rsvd  = (256 * 1024); /* vga memory */
-       size  = (p_size << PAGE_SHIFT) - rsvd;
-       block = dev_priv->vram_rblock_size;
-
-       ret = nouveau_mm_init(&mm, rsvd >> 12, size >> 12, block >> 12);
-       if (ret)
-               return ret;
-
-       man->priv = mm;
+       /* nothing to do */
        return 0;
 }
 
 static int
 nouveau_vram_manager_fini(struct ttm_mem_type_manager *man)
 {
-       struct nouveau_mm *mm = man->priv;
-       int ret;
+       /* nothing to do */
+       return 0;
+}
 
-       ret = nouveau_mm_fini(&mm);
-       if (ret)
-               return ret;
+static inline void
+nouveau_mem_node_cleanup(struct nouveau_mem *node)
+{
+       if (node->vma[0].node) {
+               nouveau_vm_unmap(&node->vma[0]);
+               nouveau_vm_put(&node->vma[0]);
+       }
 
-       man->priv = NULL;
-       return 0;
+       if (node->vma[1].node) {
+               nouveau_vm_unmap(&node->vma[1]);
+               nouveau_vm_put(&node->vma[1]);
+       }
 }
 
 static void
@@ -768,14 +730,9 @@ nouveau_vram_manager_del(struct ttm_mem_type_manager *man,
 {
        struct drm_nouveau_private *dev_priv = nouveau_bdev(man->bdev);
        struct nouveau_vram_engine *vram = &dev_priv->engine.vram;
-       struct nouveau_mem *node = mem->mm_node;
        struct drm_device *dev = dev_priv->dev;
 
-       if (node->tmp_vma.node) {
-               nouveau_vm_unmap(&node->tmp_vma);
-               nouveau_vm_put(&node->tmp_vma);
-       }
-
+       nouveau_mem_node_cleanup(mem->mm_node);
        vram->put(dev, (struct nouveau_mem **)&mem->mm_node);
 }
 
@@ -794,7 +751,7 @@ nouveau_vram_manager_new(struct ttm_mem_type_manager *man,
        int ret;
 
        if (nvbo->tile_flags & NOUVEAU_GEM_TILE_NONCONTIG)
-               size_nc = 1 << nvbo->vma.node->type;
+               size_nc = 1 << nvbo->page_shift;
 
        ret = vram->get(dev, mem->num_pages << PAGE_SHIFT,
                        mem->page_alignment << PAGE_SHIFT, size_nc,
@@ -804,9 +761,7 @@ nouveau_vram_manager_new(struct ttm_mem_type_manager *man,
                return (ret == -ENOSPC) ? 0 : ret;
        }
 
-       node->page_shift = 12;
-       if (nvbo->vma.node)
-               node->page_shift = nvbo->vma.node->type;
+       node->page_shift = nvbo->page_shift;
 
        mem->mm_node = node;
        mem->start   = node->offset >> PAGE_SHIFT;
@@ -862,15 +817,9 @@ static void
 nouveau_gart_manager_del(struct ttm_mem_type_manager *man,
                         struct ttm_mem_reg *mem)
 {
-       struct nouveau_mem *node = mem->mm_node;
-
-       if (node->tmp_vma.node) {
-               nouveau_vm_unmap(&node->tmp_vma);
-               nouveau_vm_put(&node->tmp_vma);
-       }
-
+       nouveau_mem_node_cleanup(mem->mm_node);
+       kfree(mem->mm_node);
        mem->mm_node = NULL;
-       kfree(node);
 }
 
 static int
@@ -880,11 +829,7 @@ nouveau_gart_manager_new(struct ttm_mem_type_manager *man,
                         struct ttm_mem_reg *mem)
 {
        struct drm_nouveau_private *dev_priv = nouveau_bdev(bo->bdev);
-       struct nouveau_bo *nvbo = nouveau_bo(bo);
-       struct nouveau_vma *vma = &nvbo->vma;
-       struct nouveau_vm *vm = vma->vm;
        struct nouveau_mem *node;
-       int ret;
 
        if (unlikely((mem->num_pages << PAGE_SHIFT) >=
                     dev_priv->gart_info.aper_size))
@@ -893,24 +838,8 @@ nouveau_gart_manager_new(struct ttm_mem_type_manager *man,
        node = kzalloc(sizeof(*node), GFP_KERNEL);
        if (!node)
                return -ENOMEM;
+       node->page_shift = 12;
 
-       /* This node must be for evicting large-paged VRAM
-        * to system memory.  Due to a nv50 limitation of
-        * not being able to mix large/small pages within
-        * the same PDE, we need to create a temporary
-        * small-paged VMA for the eviction.
-        */
-       if (vma->node->type != vm->spg_shift) {
-               ret = nouveau_vm_get(vm, (u64)vma->node->length << 12,
-                                    vm->spg_shift, NV_MEM_ACCESS_RW,
-                                    &node->tmp_vma);
-               if (ret) {
-                       kfree(node);
-                       return ret;
-               }
-       }
-
-       node->page_shift = nvbo->vma.node->type;
        mem->mm_node = node;
        mem->start   = 0;
        return 0;