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;
}