On GFXIP9.4.3 APU, allow the memory reporting as per the ttm pages limit in NPS1 mode. Signed-off-by: Rajneesh Bhardwaj <rajneesh.bhardwaj@xxxxxxx> --- drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c index 005ea719d2fd..fadc4d2ed071 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c @@ -25,6 +25,7 @@ #include <linux/pci.h> #include <drm/drm_cache.h> +#include <drm/ttm/ttm_tt.h> #include "amdgpu.h" #include "gmc_v9_0.h" @@ -1896,7 +1897,8 @@ static void gmc_v9_0_init_acpi_mem_ranges(struct amdgpu_device *adev, struct amdgpu_mem_partition_info *mem_ranges) { - int num_ranges = 0, ret, mem_groups; + int num_ranges = 0, ret, num_nodes; + uint64_t node_size_ttm_override = 0; struct amdgpu_numa_info numa_info; int node_ids[MAX_MEM_RANGES]; int num_xcc, xcc_id; @@ -1904,7 +1906,8 @@ gmc_v9_0_init_acpi_mem_ranges(struct amdgpu_device *adev, num_xcc = NUM_XCC(adev->gfx.xcc_mask); xcc_mask = (1U << num_xcc) - 1; - mem_groups = hweight32(adev->aid_mask); + num_nodes = num_online_nodes(); + node_size_ttm_override = (ttm_tt_pages_limit() << PAGE_SHIFT) / num_nodes; for_each_inst(xcc_id, xcc_mask) { ret = amdgpu_acpi_get_mem_info(adev, xcc_id, &numa_info); @@ -1912,7 +1915,6 @@ gmc_v9_0_init_acpi_mem_ranges(struct amdgpu_device *adev, continue; if (numa_info.nid == NUMA_NO_NODE) { - mem_ranges[0].size = numa_info.size; mem_ranges[0].numa.node = numa_info.nid; num_ranges = 1; break; @@ -1930,11 +1932,16 @@ gmc_v9_0_init_acpi_mem_ranges(struct amdgpu_device *adev, adev->gmc.num_mem_partitions = num_ranges; - /* If there is only partition, don't use entire size */ - if (adev->gmc.num_mem_partitions == 1) { - mem_ranges[0].size = mem_ranges[0].size * (mem_groups - 1); - do_div(mem_ranges[0].size, mem_groups); - } + /* In NPS1 mode, we should restrict the vram reporting + * tied to the ttm_pages_limit which is 1/2 of the + * system memory. For other partition modes, the HBM is + * uniformly divided already per numa node reported. If + * user wants to go beyond the default ttm limit and + * maximize the ROCm allocations, they can go up to max + * ttm and sysmem limits. + */ + if (adev->gmc.num_mem_partitions == 1) + mem_ranges[0].size = node_size_ttm_override; } static void -- 2.34.1