]> Git Repo - linux.git/blobdiff - drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
Merge tag 'powerpc-4.16-1' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc...
[linux.git] / drivers / gpu / drm / amd / amdgpu / amdgpu_gart.c
index fe818501c520ba4dc332314ef848b7e48a4a2e32..0a4f34afaaaa321dc2a0680a227660d8ecefd0d3 100644 (file)
  */
 
 /**
- * amdgpu_gart_table_ram_alloc - allocate system ram for gart page table
+ * amdgpu_dummy_page_init - init dummy page used by the driver
  *
  * @adev: amdgpu_device pointer
  *
- * Allocate system memory for GART page table
- * (r1xx-r3xx, non-pcie r4xx, rs400).  These asics require the
- * gart table to be in system memory.
- * Returns 0 for success, -ENOMEM for failure.
+ * Allocate the dummy page used by the driver (all asics).
+ * This dummy page is used by the driver as a filler for gart entries
+ * when pages are taken out of the GART
+ * Returns 0 on sucess, -ENOMEM on failure.
  */
-int amdgpu_gart_table_ram_alloc(struct amdgpu_device *adev)
+static int amdgpu_gart_dummy_page_init(struct amdgpu_device *adev)
 {
-       void *ptr;
-
-       ptr = pci_alloc_consistent(adev->pdev, adev->gart.table_size,
-                                  &adev->gart.table_addr);
-       if (ptr == NULL) {
+       if (adev->dummy_page.page)
+               return 0;
+       adev->dummy_page.page = alloc_page(GFP_DMA32 | GFP_KERNEL | __GFP_ZERO);
+       if (adev->dummy_page.page == NULL)
+               return -ENOMEM;
+       adev->dummy_page.addr = pci_map_page(adev->pdev, adev->dummy_page.page,
+                                       0, PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
+       if (pci_dma_mapping_error(adev->pdev, adev->dummy_page.addr)) {
+               dev_err(&adev->pdev->dev, "Failed to DMA MAP the dummy page\n");
+               __free_page(adev->dummy_page.page);
+               adev->dummy_page.page = NULL;
                return -ENOMEM;
        }
-#ifdef CONFIG_X86
-       if (0) {
-               set_memory_uc((unsigned long)ptr,
-                             adev->gart.table_size >> PAGE_SHIFT);
-       }
-#endif
-       adev->gart.ptr = ptr;
-       memset((void *)adev->gart.ptr, 0, adev->gart.table_size);
        return 0;
 }
 
 /**
- * amdgpu_gart_table_ram_free - free system ram for gart page table
+ * amdgpu_dummy_page_fini - free dummy page used by the driver
  *
  * @adev: amdgpu_device pointer
  *
- * Free system memory for GART page table
- * (r1xx-r3xx, non-pcie r4xx, rs400).  These asics require the
- * gart table to be in system memory.
+ * Frees the dummy page used by the driver (all asics).
  */
-void amdgpu_gart_table_ram_free(struct amdgpu_device *adev)
+static void amdgpu_gart_dummy_page_fini(struct amdgpu_device *adev)
 {
-       if (adev->gart.ptr == NULL) {
+       if (adev->dummy_page.page == NULL)
                return;
-       }
-#ifdef CONFIG_X86
-       if (0) {
-               set_memory_wb((unsigned long)adev->gart.ptr,
-                             adev->gart.table_size >> PAGE_SHIFT);
-       }
-#endif
-       pci_free_consistent(adev->pdev, adev->gart.table_size,
-                           (void *)adev->gart.ptr,
-                           adev->gart.table_addr);
-       adev->gart.ptr = NULL;
-       adev->gart.table_addr = 0;
+       pci_unmap_page(adev->pdev, adev->dummy_page.addr,
+                       PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
+       __free_page(adev->dummy_page.page);
+       adev->dummy_page.page = NULL;
 }
 
 /**
@@ -365,7 +353,7 @@ int amdgpu_gart_init(struct amdgpu_device *adev)
                DRM_ERROR("Page size is smaller than GPU page size!\n");
                return -EINVAL;
        }
-       r = amdgpu_dummy_page_init(adev);
+       r = amdgpu_gart_dummy_page_init(adev);
        if (r)
                return r;
        /* Compute table size */
@@ -377,10 +365,8 @@ int amdgpu_gart_init(struct amdgpu_device *adev)
 #ifdef CONFIG_DRM_AMDGPU_GART_DEBUGFS
        /* Allocate pages table */
        adev->gart.pages = vzalloc(sizeof(void *) * adev->gart.num_cpu_pages);
-       if (adev->gart.pages == NULL) {
-               amdgpu_gart_fini(adev);
+       if (adev->gart.pages == NULL)
                return -ENOMEM;
-       }
 #endif
 
        return 0;
@@ -395,14 +381,9 @@ int amdgpu_gart_init(struct amdgpu_device *adev)
  */
 void amdgpu_gart_fini(struct amdgpu_device *adev)
 {
-       if (adev->gart.ready) {
-               /* unbind pages */
-               amdgpu_gart_unbind(adev, 0, adev->gart.num_cpu_pages);
-       }
-       adev->gart.ready = false;
 #ifdef CONFIG_DRM_AMDGPU_GART_DEBUGFS
        vfree(adev->gart.pages);
        adev->gart.pages = NULL;
 #endif
-       amdgpu_dummy_page_fini(adev);
+       amdgpu_gart_dummy_page_fini(adev);
 }
This page took 0.038685 seconds and 4 git commands to generate.