]> Git Repo - linux.git/blobdiff - drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
Merge tag 'landlock_v34' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris...
[linux.git] / drivers / gpu / drm / amd / amdgpu / amdgpu_vram_mgr.c
index c89b66bb70e2e7c03de3723c304121907029e8d3..bce105e2973e8c7224fe582e7f5185fbb27d7ce2 100644 (file)
@@ -25,6 +25,7 @@
 #include <linux/dma-mapping.h>
 #include "amdgpu.h"
 #include "amdgpu_vm.h"
+#include "amdgpu_res_cursor.h"
 #include "amdgpu_atomfirmware.h"
 #include "atom.h"
 
@@ -52,7 +53,7 @@ static ssize_t amdgpu_mem_info_vram_total_show(struct device *dev,
        struct drm_device *ddev = dev_get_drvdata(dev);
        struct amdgpu_device *adev = drm_to_adev(ddev);
 
-       return snprintf(buf, PAGE_SIZE, "%llu\n", adev->gmc.real_vram_size);
+       return sysfs_emit(buf, "%llu\n", adev->gmc.real_vram_size);
 }
 
 /**
@@ -69,7 +70,7 @@ static ssize_t amdgpu_mem_info_vis_vram_total_show(struct device *dev,
        struct drm_device *ddev = dev_get_drvdata(dev);
        struct amdgpu_device *adev = drm_to_adev(ddev);
 
-       return snprintf(buf, PAGE_SIZE, "%llu\n", adev->gmc.visible_vram_size);
+       return sysfs_emit(buf, "%llu\n", adev->gmc.visible_vram_size);
 }
 
 /**
@@ -87,8 +88,7 @@ static ssize_t amdgpu_mem_info_vram_used_show(struct device *dev,
        struct amdgpu_device *adev = drm_to_adev(ddev);
        struct ttm_resource_manager *man = ttm_manager_type(&adev->mman.bdev, TTM_PL_VRAM);
 
-       return snprintf(buf, PAGE_SIZE, "%llu\n",
-                       amdgpu_vram_mgr_usage(man));
+       return sysfs_emit(buf, "%llu\n", amdgpu_vram_mgr_usage(man));
 }
 
 /**
@@ -106,8 +106,7 @@ static ssize_t amdgpu_mem_info_vis_vram_used_show(struct device *dev,
        struct amdgpu_device *adev = drm_to_adev(ddev);
        struct ttm_resource_manager *man = ttm_manager_type(&adev->mman.bdev, TTM_PL_VRAM);
 
-       return snprintf(buf, PAGE_SIZE, "%llu\n",
-                       amdgpu_vram_mgr_vis_usage(man));
+       return sysfs_emit(buf, "%llu\n", amdgpu_vram_mgr_vis_usage(man));
 }
 
 static ssize_t amdgpu_mem_info_vram_vendor(struct device *dev,
@@ -119,27 +118,27 @@ static ssize_t amdgpu_mem_info_vram_vendor(struct device *dev,
 
        switch (adev->gmc.vram_vendor) {
        case SAMSUNG:
-               return snprintf(buf, PAGE_SIZE, "samsung\n");
+               return sysfs_emit(buf, "samsung\n");
        case INFINEON:
-               return snprintf(buf, PAGE_SIZE, "infineon\n");
+               return sysfs_emit(buf, "infineon\n");
        case ELPIDA:
-               return snprintf(buf, PAGE_SIZE, "elpida\n");
+               return sysfs_emit(buf, "elpida\n");
        case ETRON:
-               return snprintf(buf, PAGE_SIZE, "etron\n");
+               return sysfs_emit(buf, "etron\n");
        case NANYA:
-               return snprintf(buf, PAGE_SIZE, "nanya\n");
+               return sysfs_emit(buf, "nanya\n");
        case HYNIX:
-               return snprintf(buf, PAGE_SIZE, "hynix\n");
+               return sysfs_emit(buf, "hynix\n");
        case MOSEL:
-               return snprintf(buf, PAGE_SIZE, "mosel\n");
+               return sysfs_emit(buf, "mosel\n");
        case WINBOND:
-               return snprintf(buf, PAGE_SIZE, "winbond\n");
+               return sysfs_emit(buf, "winbond\n");
        case ESMT:
-               return snprintf(buf, PAGE_SIZE, "esmt\n");
+               return sysfs_emit(buf, "esmt\n");
        case MICRON:
-               return snprintf(buf, PAGE_SIZE, "micron\n");
+               return sysfs_emit(buf, "micron\n");
        default:
-               return snprintf(buf, PAGE_SIZE, "unknown\n");
+               return sysfs_emit(buf, "unknown\n");
        }
 }
 
@@ -567,6 +566,8 @@ static void amdgpu_vram_mgr_del(struct ttm_resource_manager *man,
  *
  * @adev: amdgpu device pointer
  * @mem: TTM memory object
+ * @offset: byte offset from the base of VRAM BO
+ * @length: number of bytes to export in sg_table
  * @dev: the other device
  * @dir: dma direction
  * @sgt: resulting sg table
@@ -575,39 +576,47 @@ static void amdgpu_vram_mgr_del(struct ttm_resource_manager *man,
  */
 int amdgpu_vram_mgr_alloc_sgt(struct amdgpu_device *adev,
                              struct ttm_resource *mem,
+                             u64 offset, u64 length,
                              struct device *dev,
                              enum dma_data_direction dir,
                              struct sg_table **sgt)
 {
-       struct drm_mm_node *node;
+       struct amdgpu_res_cursor cursor;
        struct scatterlist *sg;
        int num_entries = 0;
-       unsigned int pages;
        int i, r;
 
        *sgt = kmalloc(sizeof(**sgt), GFP_KERNEL);
        if (!*sgt)
                return -ENOMEM;
 
-       for (pages = mem->num_pages, node = mem->mm_node;
-            pages; pages -= node->size, ++node)
-               ++num_entries;
+       /* Determine the number of DRM_MM nodes to export */
+       amdgpu_res_first(mem, offset, length, &cursor);
+       while (cursor.remaining) {
+               num_entries++;
+               amdgpu_res_next(&cursor, cursor.size);
+       }
 
        r = sg_alloc_table(*sgt, num_entries, GFP_KERNEL);
        if (r)
                goto error_free;
 
+       /* Initialize scatterlist nodes of sg_table */
        for_each_sgtable_sg((*sgt), sg, i)
                sg->length = 0;
 
-       node = mem->mm_node;
+       /*
+        * Walk down DRM_MM nodes to populate scatterlist nodes
+        * @note: Use iterator api to get first the DRM_MM node
+        * and the number of bytes from it. Access the following
+        * DRM_MM node(s) if more buffer needs to exported
+        */
+       amdgpu_res_first(mem, offset, length, &cursor);
        for_each_sgtable_sg((*sgt), sg, i) {
-               phys_addr_t phys = (node->start << PAGE_SHIFT) +
-                       adev->gmc.aper_base;
-               size_t size = node->size << PAGE_SHIFT;
+               phys_addr_t phys = cursor.start + adev->gmc.aper_base;
+               size_t size = cursor.size;
                dma_addr_t addr;
 
-               ++node;
                addr = dma_map_resource(dev, phys, size, dir,
                                        DMA_ATTR_SKIP_CPU_SYNC);
                r = dma_mapping_error(dev, addr);
@@ -617,7 +626,10 @@ int amdgpu_vram_mgr_alloc_sgt(struct amdgpu_device *adev,
                sg_set_page(sg, NULL, size, 0);
                sg_dma_address(sg) = addr;
                sg_dma_len(sg) = size;
+
+               amdgpu_res_next(&cursor, cursor.size);
        }
+
        return 0;
 
 error_unmap:
@@ -639,15 +651,13 @@ error_free:
 /**
  * amdgpu_vram_mgr_free_sgt - allocate and fill a sg table
  *
- * @adev: amdgpu device pointer
  * @dev: device pointer
  * @dir: data direction of resource to unmap
  * @sgt: sg table to free
  *
  * Free a previously allocate sg table.
  */
-void amdgpu_vram_mgr_free_sgt(struct amdgpu_device *adev,
-                             struct device *dev,
+void amdgpu_vram_mgr_free_sgt(struct device *dev,
                              enum dma_data_direction dir,
                              struct sg_table *sgt)
 {
This page took 0.033689 seconds and 4 git commands to generate.