diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/1521-drm-amdgpu-Add-sysfs-files-for-returning-VRAM-GTT-in.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.19.8/1521-drm-amdgpu-Add-sysfs-files-for-returning-VRAM-GTT-in.patch | 268 |
1 files changed, 268 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/1521-drm-amdgpu-Add-sysfs-files-for-returning-VRAM-GTT-in.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/1521-drm-amdgpu-Add-sysfs-files-for-returning-VRAM-GTT-in.patch new file mode 100644 index 00000000..2e462d57 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/1521-drm-amdgpu-Add-sysfs-files-for-returning-VRAM-GTT-in.patch @@ -0,0 +1,268 @@ +From c97de1eeb34e87866d816fc26340cfb6088615cb Mon Sep 17 00:00:00 2001 +From: Kent Russell <kent.russell@amd.com> +Date: Thu, 28 Feb 2019 07:05:02 -0500 +Subject: [PATCH 1521/2940] drm/amdgpu: Add sysfs files for returning VRAM/GTT + info v2 + +Add 6 files that return (in bytes): +The total amount of VRAM/visible VRAM/GTT +and the current total used VRAM/visible VRAM/GTT + +v2: Split used and total into separate files + +Change-Id: I0bd702b166b4253887ef76fb1bba8b9aadc7e2c5 +Signed-off-by: Kent Russell <kent.russell@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c | 59 ++++++++++ + drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 109 +++++++++++++++++++ + 2 files changed, 168 insertions(+) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c +index da7b1b92d9cf..62591d081856 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c +@@ -36,6 +36,47 @@ struct amdgpu_gtt_node { + struct ttm_buffer_object *tbo; + }; + ++/** ++ * DOC: mem_info_gtt_total ++ * ++ * The amdgpu driver provides a sysfs API for reporting current total size of ++ * the GTT. ++ * The file mem_info_gtt_total is used for this, and returns the total size of ++ * the GTT block, in bytes ++ */ ++static ssize_t amdgpu_mem_info_gtt_total_show(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ struct drm_device *ddev = dev_get_drvdata(dev); ++ struct amdgpu_device *adev = ddev->dev_private; ++ ++ return snprintf(buf, PAGE_SIZE, "%llu\n", ++ (adev->mman.bdev.man[TTM_PL_TT].size) * PAGE_SIZE); ++} ++ ++/** ++ * DOC: mem_info_gtt_used ++ * ++ * The amdgpu driver provides a sysfs API for reporting current total amount of ++ * used GTT. ++ * The file mem_info_gtt_used is used for this, and returns the current used ++ * size of the GTT block, in bytes ++ */ ++static ssize_t amdgpu_mem_info_gtt_used_show(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ struct drm_device *ddev = dev_get_drvdata(dev); ++ struct amdgpu_device *adev = ddev->dev_private; ++ ++ return snprintf(buf, PAGE_SIZE, "%llu\n", ++ amdgpu_gtt_mgr_usage(&adev->mman.bdev.man[TTM_PL_TT])); ++} ++ ++static DEVICE_ATTR(mem_info_gtt_total, S_IRUGO, ++ amdgpu_mem_info_gtt_total_show, NULL); ++static DEVICE_ATTR(mem_info_gtt_used, S_IRUGO, ++ amdgpu_mem_info_gtt_used_show, NULL); ++ + /** + * amdgpu_gtt_mgr_init - init GTT manager and DRM MM + * +@@ -50,6 +91,7 @@ static int amdgpu_gtt_mgr_init(struct ttm_mem_type_manager *man, + struct amdgpu_device *adev = amdgpu_ttm_adev(man->bdev); + struct amdgpu_gtt_mgr *mgr; + uint64_t start, size; ++ int ret; + + mgr = kzalloc(sizeof(*mgr), GFP_KERNEL); + if (!mgr) +@@ -61,6 +103,18 @@ static int amdgpu_gtt_mgr_init(struct ttm_mem_type_manager *man, + spin_lock_init(&mgr->lock); + atomic64_set(&mgr->available, p_size); + man->priv = mgr; ++ ++ ret = device_create_file(adev->dev, &dev_attr_mem_info_gtt_total); ++ if (ret) { ++ DRM_ERROR("Failed to create device file mem_info_gtt_total\n"); ++ return ret; ++ } ++ ret = device_create_file(adev->dev, &dev_attr_mem_info_gtt_used); ++ if (ret) { ++ DRM_ERROR("Failed to create device file mem_info_gtt_used\n"); ++ return ret; ++ } ++ + return 0; + } + +@@ -74,12 +128,17 @@ static int amdgpu_gtt_mgr_init(struct ttm_mem_type_manager *man, + */ + static int amdgpu_gtt_mgr_fini(struct ttm_mem_type_manager *man) + { ++ struct amdgpu_device *adev = amdgpu_ttm_adev(man->bdev); + struct amdgpu_gtt_mgr *mgr = man->priv; + spin_lock(&mgr->lock); + drm_mm_takedown(&mgr->mm); + spin_unlock(&mgr->lock); + kfree(mgr); + man->priv = NULL; ++ ++ device_remove_file(adev->dev, &dev_attr_mem_info_gtt_total); ++ device_remove_file(adev->dev, &dev_attr_mem_info_gtt_used); ++ + return 0; + } + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +index 3f9d5d00c9b3..ec9ea3fdbb4a 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +@@ -32,6 +32,85 @@ struct amdgpu_vram_mgr { + atomic64_t vis_usage; + }; + ++/** ++ * DOC: mem_info_vram_total ++ * ++ * The amdgpu driver provides a sysfs API for reporting current total VRAM ++ * available on the device ++ * The file mem_info_vram_total is used for this and returns the total ++ * amount of VRAM in bytes ++ */ ++static ssize_t amdgpu_mem_info_vram_total_show(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ struct drm_device *ddev = dev_get_drvdata(dev); ++ struct amdgpu_device *adev = ddev->dev_private; ++ ++ return snprintf(buf, PAGE_SIZE, "%llu\n", adev->gmc.real_vram_size); ++} ++ ++/** ++ * DOC: mem_info_vis_vram_total ++ * ++ * The amdgpu driver provides a sysfs API for reporting current total ++ * visible VRAM available on the device ++ * The file mem_info_vis_vram_total is used for this and returns the total ++ * amount of visible VRAM in bytes ++ */ ++static ssize_t amdgpu_mem_info_vis_vram_total_show(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ struct drm_device *ddev = dev_get_drvdata(dev); ++ struct amdgpu_device *adev = ddev->dev_private; ++ ++ return snprintf(buf, PAGE_SIZE, "%llu\n", adev->gmc.visible_vram_size); ++} ++ ++/** ++ * DOC: mem_info_vram_used ++ * ++ * The amdgpu driver provides a sysfs API for reporting current total VRAM ++ * available on the device ++ * The file mem_info_vram_used is used for this and returns the total ++ * amount of currently used VRAM in bytes ++ */ ++static ssize_t amdgpu_mem_info_vram_used_show(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ struct drm_device *ddev = dev_get_drvdata(dev); ++ struct amdgpu_device *adev = ddev->dev_private; ++ ++ return snprintf(buf, PAGE_SIZE, "%llu\n", ++ amdgpu_vram_mgr_usage(&adev->mman.bdev.man[TTM_PL_VRAM])); ++} ++ ++/** ++ * DOC: mem_info_vis_vram_used ++ * ++ * The amdgpu driver provides a sysfs API for reporting current total of ++ * used visible VRAM ++ * The file mem_info_vis_vram_used is used for this and returns the total ++ * amount of currently used visible VRAM in bytes ++ */ ++static ssize_t amdgpu_mem_info_vis_vram_used_show(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ struct drm_device *ddev = dev_get_drvdata(dev); ++ struct amdgpu_device *adev = ddev->dev_private; ++ ++ return snprintf(buf, PAGE_SIZE, "%llu\n", ++ amdgpu_vram_mgr_vis_usage(&adev->mman.bdev.man[TTM_PL_VRAM])); ++} ++ ++static DEVICE_ATTR(mem_info_vram_total, S_IRUGO, ++ amdgpu_mem_info_vram_total_show, NULL); ++static DEVICE_ATTR(mem_info_vis_vram_total, S_IRUGO, ++ amdgpu_mem_info_vis_vram_total_show,NULL); ++static DEVICE_ATTR(mem_info_vram_used, S_IRUGO, ++ amdgpu_mem_info_vram_used_show, NULL); ++static DEVICE_ATTR(mem_info_vis_vram_used, S_IRUGO, ++ amdgpu_mem_info_vis_vram_used_show, NULL); ++ + /** + * amdgpu_vram_mgr_init - init VRAM manager and DRM MM + * +@@ -43,7 +122,9 @@ struct amdgpu_vram_mgr { + static int amdgpu_vram_mgr_init(struct ttm_mem_type_manager *man, + unsigned long p_size) + { ++ struct amdgpu_device *adev = amdgpu_ttm_adev(man->bdev); + struct amdgpu_vram_mgr *mgr; ++ int ret; + + mgr = kzalloc(sizeof(*mgr), GFP_KERNEL); + if (!mgr) +@@ -52,6 +133,29 @@ static int amdgpu_vram_mgr_init(struct ttm_mem_type_manager *man, + drm_mm_init(&mgr->mm, 0, p_size); + spin_lock_init(&mgr->lock); + man->priv = mgr; ++ ++ /* Add the two VRAM-related sysfs files */ ++ ret = device_create_file(adev->dev, &dev_attr_mem_info_vram_total); ++ if (ret) { ++ DRM_ERROR("Failed to create device file mem_info_vram_total\n"); ++ return ret; ++ } ++ ret = device_create_file(adev->dev, &dev_attr_mem_info_vis_vram_total); ++ if (ret) { ++ DRM_ERROR("Failed to create device file mem_info_vis_vram_total\n"); ++ return ret; ++ } ++ ret = device_create_file(adev->dev, &dev_attr_mem_info_vram_used); ++ if (ret) { ++ DRM_ERROR("Failed to create device file mem_info_vram_used\n"); ++ return ret; ++ } ++ ret = device_create_file(adev->dev, &dev_attr_mem_info_vis_vram_used); ++ if (ret) { ++ DRM_ERROR("Failed to create device file mem_info_vis_vram_used\n"); ++ return ret; ++ } ++ + return 0; + } + +@@ -65,6 +169,7 @@ static int amdgpu_vram_mgr_init(struct ttm_mem_type_manager *man, + */ + static int amdgpu_vram_mgr_fini(struct ttm_mem_type_manager *man) + { ++ struct amdgpu_device *adev = amdgpu_ttm_adev(man->bdev); + struct amdgpu_vram_mgr *mgr = man->priv; + + spin_lock(&mgr->lock); +@@ -72,6 +177,10 @@ static int amdgpu_vram_mgr_fini(struct ttm_mem_type_manager *man) + spin_unlock(&mgr->lock); + kfree(mgr); + man->priv = NULL; ++ device_remove_file(adev->dev, &dev_attr_mem_info_vram_total); ++ device_remove_file(adev->dev, &dev_attr_mem_info_vis_vram_total); ++ device_remove_file(adev->dev, &dev_attr_mem_info_vram_used); ++ device_remove_file(adev->dev, &dev_attr_mem_info_vis_vram_used); + return 0; + } + +-- +2.17.1 + |