[PATCH 1/6] drm/amdkfd: Consolidate duplicate memory banks info in topology
Alex Deucher
alexdeucher at gmail.com
Fri Jul 13 19:24:48 UTC 2018
On Thu, Jul 12, 2018 at 5:24 PM, Felix Kuehling <Felix.Kuehling at amd.com> wrote:
> From: Yong Zhao <yong.zhao at amd.com>
>
> If there are several memory banks that has the same properties in CRAT,
> we aggregate them into one memory bank. This cleans up memory banks on
> APUs (e.g. Raven) where the CRAT reports each memory channel as a
> separate bank. This only confuses user mode, which only deals with
> virtual memory.
>
> Signed-off-by: Yong Zhao <yong.zhao at amd.com>
> Reviewed-by: Felix Kuehling <Felix.Kuehling at amd.com>
> Signed-off-by: Felix Kuehling <Felix.Kuehling at amd.com>
Acked-by: Alex Deucher <alexander.deucher at amd.com>
> ---
> drivers/gpu/drm/amd/amdkfd/kfd_crat.c | 57 ++++++++++++++++++++++++++++-------
> 1 file changed, 46 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_crat.c b/drivers/gpu/drm/amd/amdkfd/kfd_crat.c
> index 296b3f2..ee49960 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_crat.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_crat.c
> @@ -189,6 +189,21 @@ static int kfd_parse_subtype_cu(struct crat_subtype_computeunit *cu,
> return 0;
> }
>
> +static struct kfd_mem_properties *
> +find_subtype_mem(uint32_t heap_type, uint32_t flags, uint32_t width,
> + struct kfd_topology_device *dev)
> +{
> + struct kfd_mem_properties *props;
> +
> + list_for_each_entry(props, &dev->mem_props, list) {
> + if (props->heap_type == heap_type
> + && props->flags == flags
> + && props->width == width)
> + return props;
> + }
> +
> + return NULL;
> +}
> /* kfd_parse_subtype_mem - parse memory subtypes and attach it to correct
> * topology device present in the device_list
> */
> @@ -197,36 +212,56 @@ static int kfd_parse_subtype_mem(struct crat_subtype_memory *mem,
> {
> struct kfd_mem_properties *props;
> struct kfd_topology_device *dev;
> + uint32_t heap_type;
> + uint64_t size_in_bytes;
> + uint32_t flags = 0;
> + uint32_t width;
>
> pr_debug("Found memory entry in CRAT table with proximity_domain=%d\n",
> mem->proximity_domain);
> list_for_each_entry(dev, device_list, list) {
> if (mem->proximity_domain == dev->proximity_domain) {
> - props = kfd_alloc_struct(props);
> - if (!props)
> - return -ENOMEM;
> -
> /* We're on GPU node */
> if (dev->node_props.cpu_cores_count == 0) {
> /* APU */
> if (mem->visibility_type == 0)
> - props->heap_type =
> + heap_type =
> HSA_MEM_HEAP_TYPE_FB_PRIVATE;
> /* dGPU */
> else
> - props->heap_type = mem->visibility_type;
> + heap_type = mem->visibility_type;
> } else
> - props->heap_type = HSA_MEM_HEAP_TYPE_SYSTEM;
> + heap_type = HSA_MEM_HEAP_TYPE_SYSTEM;
>
> if (mem->flags & CRAT_MEM_FLAGS_HOT_PLUGGABLE)
> - props->flags |= HSA_MEM_FLAGS_HOT_PLUGGABLE;
> + flags |= HSA_MEM_FLAGS_HOT_PLUGGABLE;
> if (mem->flags & CRAT_MEM_FLAGS_NON_VOLATILE)
> - props->flags |= HSA_MEM_FLAGS_NON_VOLATILE;
> + flags |= HSA_MEM_FLAGS_NON_VOLATILE;
>
> - props->size_in_bytes =
> + size_in_bytes =
> ((uint64_t)mem->length_high << 32) +
> mem->length_low;
> - props->width = mem->width;
> + width = mem->width;
> +
> + /* Multiple banks of the same type are aggregated into
> + * one. User mode doesn't care about multiple physical
> + * memory segments. It's managed as a single virtual
> + * heap for user mode.
> + */
> + props = find_subtype_mem(heap_type, flags, width, dev);
> + if (props) {
> + props->size_in_bytes += size_in_bytes;
> + break;
> + }
> +
> + props = kfd_alloc_struct(props);
> + if (!props)
> + return -ENOMEM;
> +
> + props->heap_type = heap_type;
> + props->flags = flags;
> + props->size_in_bytes = size_in_bytes;
> + props->width = width;
>
> dev->node_props.mem_banks_count++;
> list_add_tail(&props->list, &dev->mem_props);
> --
> 2.7.4
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
More information about the amd-gfx
mailing list