]> Git Repo - linux.git/blobdiff - drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
Merge tag 'tty-4.14-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty
[linux.git] / drivers / gpu / drm / amd / amdgpu / amdgpu_vram_mgr.c
index a2c59a08b2bd69919b23989feddff71a88855617..26e90062797173d772b4c71c2f3229ebb1bfbbbc 100644 (file)
@@ -28,6 +28,8 @@
 struct amdgpu_vram_mgr {
        struct drm_mm mm;
        spinlock_t lock;
+       atomic64_t usage;
+       atomic64_t vis_usage;
 };
 
 /**
@@ -78,6 +80,27 @@ static int amdgpu_vram_mgr_fini(struct ttm_mem_type_manager *man)
        return 0;
 }
 
+/**
+ * amdgpu_vram_mgr_vis_size - Calculate visible node size
+ *
+ * @adev: amdgpu device structure
+ * @node: MM node structure
+ *
+ * Calculate how many bytes of the MM node are inside visible VRAM
+ */
+static u64 amdgpu_vram_mgr_vis_size(struct amdgpu_device *adev,
+                                   struct drm_mm_node *node)
+{
+       uint64_t start = node->start << PAGE_SHIFT;
+       uint64_t end = (node->size + node->start) << PAGE_SHIFT;
+
+       if (start >= adev->mc.visible_vram_size)
+               return 0;
+
+       return (end > adev->mc.visible_vram_size ?
+               adev->mc.visible_vram_size : end) - start;
+}
+
 /**
  * amdgpu_vram_mgr_new - allocate new ranges
  *
@@ -93,11 +116,13 @@ static int amdgpu_vram_mgr_new(struct ttm_mem_type_manager *man,
                               const struct ttm_place *place,
                               struct ttm_mem_reg *mem)
 {
+       struct amdgpu_device *adev = amdgpu_ttm_adev(man->bdev);
        struct amdgpu_vram_mgr *mgr = man->priv;
        struct drm_mm *mm = &mgr->mm;
        struct drm_mm_node *nodes;
        enum drm_mm_insert_mode mode;
        unsigned long lpfn, num_nodes, pages_per_node, pages_left;
+       uint64_t usage = 0, vis_usage = 0;
        unsigned i;
        int r;
 
@@ -142,6 +167,9 @@ static int amdgpu_vram_mgr_new(struct ttm_mem_type_manager *man,
                if (unlikely(r))
                        goto error;
 
+               usage += nodes[i].size << PAGE_SHIFT;
+               vis_usage += amdgpu_vram_mgr_vis_size(adev, &nodes[i]);
+
                /* Calculate a virtual BO start address to easily check if
                 * everything is CPU accessible.
                 */
@@ -155,6 +183,9 @@ static int amdgpu_vram_mgr_new(struct ttm_mem_type_manager *man,
        }
        spin_unlock(&mgr->lock);
 
+       atomic64_add(usage, &mgr->usage);
+       atomic64_add(vis_usage, &mgr->vis_usage);
+
        mem->mm_node = nodes;
 
        return 0;
@@ -181,8 +212,10 @@ error:
 static void amdgpu_vram_mgr_del(struct ttm_mem_type_manager *man,
                                struct ttm_mem_reg *mem)
 {
+       struct amdgpu_device *adev = amdgpu_ttm_adev(man->bdev);
        struct amdgpu_vram_mgr *mgr = man->priv;
        struct drm_mm_node *nodes = mem->mm_node;
+       uint64_t usage = 0, vis_usage = 0;
        unsigned pages = mem->num_pages;
 
        if (!mem->mm_node)
@@ -192,31 +225,67 @@ static void amdgpu_vram_mgr_del(struct ttm_mem_type_manager *man,
        while (pages) {
                pages -= nodes->size;
                drm_mm_remove_node(nodes);
+               usage += nodes->size << PAGE_SHIFT;
+               vis_usage += amdgpu_vram_mgr_vis_size(adev, nodes);
                ++nodes;
        }
        spin_unlock(&mgr->lock);
 
+       atomic64_sub(usage, &mgr->usage);
+       atomic64_sub(vis_usage, &mgr->vis_usage);
+
        kfree(mem->mm_node);
        mem->mm_node = NULL;
 }
 
+/**
+ * amdgpu_vram_mgr_usage - how many bytes are used in this domain
+ *
+ * @man: TTM memory type manager
+ *
+ * Returns how many bytes are used in this domain.
+ */
+uint64_t amdgpu_vram_mgr_usage(struct ttm_mem_type_manager *man)
+{
+       struct amdgpu_vram_mgr *mgr = man->priv;
+
+       return atomic64_read(&mgr->usage);
+}
+
+/**
+ * amdgpu_vram_mgr_vis_usage - how many bytes are used in the visible part
+ *
+ * @man: TTM memory type manager
+ *
+ * Returns how many bytes are used in the visible part of VRAM
+ */
+uint64_t amdgpu_vram_mgr_vis_usage(struct ttm_mem_type_manager *man)
+{
+       struct amdgpu_vram_mgr *mgr = man->priv;
+
+       return atomic64_read(&mgr->vis_usage);
+}
+
 /**
  * amdgpu_vram_mgr_debug - dump VRAM table
  *
  * @man: TTM memory type manager
- * @prefix: text prefix
+ * @printer: DRM printer to use
  *
  * Dump the table content using printk.
  */
 static void amdgpu_vram_mgr_debug(struct ttm_mem_type_manager *man,
-                                 const char *prefix)
+                                 struct drm_printer *printer)
 {
        struct amdgpu_vram_mgr *mgr = man->priv;
-       struct drm_printer p = drm_debug_printer(prefix);
 
        spin_lock(&mgr->lock);
-       drm_mm_print(&mgr->mm, &p);
+       drm_mm_print(&mgr->mm, printer);
        spin_unlock(&mgr->lock);
+
+       drm_printf(printer, "man size:%llu pages, ram usage:%lluMB, vis usage:%lluMB\n",
+                  man->size, amdgpu_vram_mgr_usage(man) >> 20,
+                  amdgpu_vram_mgr_vis_usage(man) >> 20);
 }
 
 const struct ttm_mem_type_manager_func amdgpu_vram_mgr_func = {
This page took 0.040846 seconds and 4 git commands to generate.