Instead of a dynamic allocation, use stack variable and let the caller
pass the maximum ranges that can be held in the buffer.

Signed-off-by: Lijo Lazar <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c | 23 +++++++++----------
 drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.h |  2 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c       | 10 ++++----
 3 files changed, 16 insertions(+), 19 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
index fad53d8344b1..948c5f40f366 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
@@ -1932,11 +1932,10 @@ static int amdgpu_discovery_refresh_nps_info(struct 
amdgpu_device *adev,
 
 int amdgpu_discovery_get_nps_info(struct amdgpu_device *adev,
                                  uint32_t *nps_type,
-                                 struct amdgpu_gmc_memrange **ranges,
+                                 struct amdgpu_gmc_memrange *ranges,
                                  int *range_cnt, bool refresh)
 {
        uint8_t *discovery_bin = adev->discovery.bin;
-       struct amdgpu_gmc_memrange *mem_ranges;
        struct binary_header *bhdr;
        union nps_info *nps_info;
        union nps_info nps_data;
@@ -1973,22 +1972,22 @@ int amdgpu_discovery_get_nps_info(struct amdgpu_device 
*adev,
 
        switch (le16_to_cpu(nps_info->v1.header.version_major)) {
        case 1:
-               mem_ranges = kvcalloc(nps_info->v1.count,
-                                     sizeof(*mem_ranges),
-                                     GFP_KERNEL);
-               if (!mem_ranges)
-                       return -ENOMEM;
                *nps_type = nps_info->v1.nps_type;
+               if (*range_cnt < nps_info->v1.count) {
+                       dev_dbg(adev->dev,
+                               "not enough space for nps ranges: %d < %d\n",
+                               *range_cnt, nps_info->v1.count);
+                       return -ENOSPC;
+               }
                *range_cnt = nps_info->v1.count;
                for (i = 0; i < *range_cnt; i++) {
-                       mem_ranges[i].base_address =
+                       ranges[i].base_address =
                                nps_info->v1.instance_info[i].base_address;
-                       mem_ranges[i].limit_address =
+                       ranges[i].limit_address =
                                nps_info->v1.instance_info[i].limit_address;
-                       mem_ranges[i].nid_mask = -1;
-                       mem_ranges[i].flags = 0;
+                       ranges[i].nid_mask = -1;
+                       ranges[i].flags = 0;
                }
-               *ranges = mem_ranges;
                break;
        default:
                dev_err(adev->dev, "Unhandled NPS info table %d.%d\n",
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.h
index c8242992c912..1220c0327275 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.h
@@ -45,7 +45,7 @@ int amdgpu_discovery_set_ip_blocks(struct amdgpu_device 
*adev);
 
 int amdgpu_discovery_get_nps_info(struct amdgpu_device *adev,
                                  uint32_t *nps_type,
-                                 struct amdgpu_gmc_memrange **ranges,
+                                 struct amdgpu_gmc_memrange *ranges,
                                  int *range_cnt, bool refresh);
 
 void amdgpu_discovery_dump(struct amdgpu_device *adev, struct drm_printer *p);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
index 20e1395b3988..f165d4e401e8 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
@@ -1374,18 +1374,18 @@ int amdgpu_gmc_get_nps_memranges(struct amdgpu_device 
*adev,
                                 struct amdgpu_mem_partition_info *mem_ranges,
                                 uint8_t *exp_ranges)
 {
-       struct amdgpu_gmc_memrange *ranges;
+       struct amdgpu_gmc_memrange ranges[AMDGPU_MAX_MEM_RANGES];
        int range_cnt, ret, i, j;
        uint32_t nps_type;
        bool refresh;
 
        if (!mem_ranges || !exp_ranges)
                return -EINVAL;
-
+       range_cnt = AMDGPU_MAX_MEM_RANGES;
        refresh = (adev->init_lvl->level != AMDGPU_INIT_LEVEL_MINIMAL_XGMI) &&
                  (adev->gmc.reset_flags & AMDGPU_GMC_INIT_RESET_NPS);
-       ret = amdgpu_discovery_get_nps_info(adev, &nps_type, &ranges,
-                                           &range_cnt, refresh);
+       ret = amdgpu_discovery_get_nps_info(adev, &nps_type, ranges, &range_cnt,
+                                           refresh);
 
        if (ret)
                return ret;
@@ -1446,8 +1446,6 @@ int amdgpu_gmc_get_nps_memranges(struct amdgpu_device 
*adev,
        if (!*exp_ranges)
                *exp_ranges = range_cnt;
 err:
-       kvfree(ranges);
-
        return ret;
 }
 
-- 
2.49.0

Reply via email to