[PATCH 2/7] radeonkfd/amdkfd: Implement get_local_mem_info()
Oded Gabbay
oded.gabbay at gmail.com
Sun Sep 11 10:40:55 UTC 2016
On Sat, Sep 10, 2016 at 4:31 AM, Edward O'Callaghan
<funfunctor at folklore1984.net> wrote:
> Signed-off-by: Edward O'Callaghan <funfunctor at folklore1984.net>
Please give a little explanation why this new function is needed.
In addition, I don't think "radeonkfd/amdkfd: .." is good as we never
used this kind of title before.
Let's just use "drm/amdkfd: ..." as this change only relevant for
amdkfd, even if it changes radeon and amdgpu files.
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 32 ++++++++++++++++++++---
> drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | 3 ++-
> drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c | 2 +-
> drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c | 2 +-
> drivers/gpu/drm/amd/amdkfd/kfd_topology.c | 6 ++++-
> drivers/gpu/drm/amd/include/kgd_kfd_interface.h | 13 +++++++--
> drivers/gpu/drm/radeon/radeon_kfd.c | 22 +++++++++++++---
> 7 files changed, 66 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
> index d080d08..63a2e84 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
> @@ -226,14 +226,38 @@ void free_gtt_mem(struct kgd_dev *kgd, void *mem_obj)
> kfree(mem);
> }
>
> -uint64_t get_vmem_size(struct kgd_dev *kgd)
> +void get_local_mem_info(struct kgd_dev *kgd,
> + struct kfd_local_mem_info *mem_info)
> {
Maybe check with BUG_ON that mem_info is not NULL ?
> - struct amdgpu_device *rdev =
> - (struct amdgpu_device *)kgd;
> + struct amdgpu_device *rdev = (struct amdgpu_device *)kgd;
I think the amdgpu coding convention is to use adev (rdev is used in
radeon). Maybe another patch to replace all rdev with adev in this
file ?
> + uint64_t address_mask;
> + resource_size_t aper_limit;
>
> BUG_ON(kgd == NULL);
>
> - return rdev->mc.real_vram_size;
> + memset(mem_info, 0, sizeof(*mem_info));
> +
> + address_mask = ~((1UL << 40) - 1);
> + aper_limit = rdev->mc.aper_base + rdev->mc.aper_size;
> +
> + if (!(rdev->mc.aper_base & address_mask ||
> + aper_limit & address_mask)) {
Could you please add a comment explaining this if statement ? I don't
understand exactly what you meant here.
> + mem_info->local_mem_size_public = rdev->mc.visible_vram_size;
> + mem_info->local_mem_size_private = rdev->mc.real_vram_size -
> + rdev->mc.visible_vram_size;
> + } else {
> + mem_info->local_mem_size_public = 0;
> + mem_info->local_mem_size_private = rdev->mc.real_vram_size;
> + }
> + mem_info->vram_width = rdev->mc.vram_width;
> +
> + if (amdgpu_powerplay || rdev->pm.funcs->get_mclk)
I think its better to use "adev->pp_enabled" instead of directly
checking amdgpu_powerplay. e.g. See what's done inside
amdgpu_dpm_get_mclk
> + mem_info->mem_clk_max = amdgpu_dpm_get_mclk(rdev, false) / 100;
Why divide it by 100 ? In the radeon_kfd.c version you didn't do it.
> +
> + pr_debug("amdgpu: address base: 0x%llx limit 0x%llx public 0x%llx private 0x%llx\n",
> + rdev->mc.aper_base, aper_limit,
> + mem_info->local_mem_size_public,
> + mem_info->local_mem_size_private);
> }
>
> uint64_t get_gpu_clock_counter(struct kgd_dev *kgd)
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
> index de530f68d..31da026 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
> @@ -57,7 +57,8 @@ int alloc_gtt_mem(struct kgd_dev *kgd, size_t size,
> void **mem_obj, uint64_t *gpu_addr,
> void **cpu_ptr);
> void free_gtt_mem(struct kgd_dev *kgd, void *mem_obj);
> -uint64_t get_vmem_size(struct kgd_dev *kgd);
> +void get_local_mem_info(struct kgd_dev *kgd,
> + struct kfd_local_mem_info *mem_info);
> uint64_t get_gpu_clock_counter(struct kgd_dev *kgd);
>
> uint32_t get_max_engine_clock_in_mhz(struct kgd_dev *kgd);
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
> index 362bedc..dc69cf7 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
> @@ -131,7 +131,7 @@ static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type);
> static const struct kfd2kgd_calls kfd2kgd = {
> .init_gtt_mem_allocation = alloc_gtt_mem,
> .free_gtt_mem = free_gtt_mem,
> - .get_vmem_size = get_vmem_size,
> + .get_local_mem_info = get_local_mem_info,
> .get_gpu_clock_counter = get_gpu_clock_counter,
> .get_max_engine_clock_in_mhz = get_max_engine_clock_in_mhz,
> .program_sh_mem_settings = kgd_program_sh_mem_settings,
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
> index 04b744d..342a037 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
> @@ -90,7 +90,7 @@ static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type);
> static const struct kfd2kgd_calls kfd2kgd = {
> .init_gtt_mem_allocation = alloc_gtt_mem,
> .free_gtt_mem = free_gtt_mem,
> - .get_vmem_size = get_vmem_size,
> + .get_local_mem_info = get_local_mem_info,
> .get_gpu_clock_counter = get_gpu_clock_counter,
> .get_max_engine_clock_in_mhz = get_max_engine_clock_in_mhz,
> .program_sh_mem_settings = kgd_program_sh_mem_settings,
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
> index 1e50647..6ea7bd8 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
> @@ -1088,6 +1088,7 @@ static void kfd_debug_print_topology(void)
>
> static uint32_t kfd_generate_gpu_id(struct kfd_dev *gpu)
> {
> + struct kfd_local_mem_info local_mem_info;
> uint32_t hashout;
> uint32_t buf[7];
> uint64_t local_mem_size;
> @@ -1096,7 +1097,10 @@ static uint32_t kfd_generate_gpu_id(struct kfd_dev *gpu)
> if (!gpu)
> return 0;
>
> - local_mem_size = gpu->kfd2kgd->get_vmem_size(gpu->kgd);
> + gpu->kfd2kgd->get_local_mem_info(gpu->kgd, &local_mem_info);
> +
> + local_mem_size = local_mem_info.local_mem_size_private +
> + local_mem_info.local_mem_size_public;
What about the rest of the local_mem_info data ? Don't we should save
it somewhere ?
>
> buf[0] = gpu->pdev->devfn;
> buf[1] = gpu->pdev->subsystem_vendor;
> diff --git a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
> index a09d9f3..14ec3e4 100644
> --- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
> +++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
> @@ -39,6 +39,14 @@ struct kgd_dev;
>
> struct kgd_mem;
>
> +/* For getting GPU local memory information from KGD */
> +struct kfd_local_mem_info {
> + uint64_t local_mem_size_private;
> + uint64_t local_mem_size_public;
> + uint32_t vram_width;
> + uint32_t mem_clk_max;
> +};
> +
> enum kgd_memory_pool {
> KGD_POOL_SYSTEM_CACHEABLE = 1,
> KGD_POOL_SYSTEM_WRITECOMBINE = 2,
> @@ -85,7 +93,7 @@ struct kgd2kfd_shared_resources {
> *
> * @free_gtt_mem: Frees a buffer that was allocated on the gart aperture
> *
> - * @get_vmem_size: Retrieves (physical) size of VRAM
> + * @get_local_mem_info: Retrieves information about GPU local memory
> *
> * @get_gpu_clock_counter: Retrieves GPU clock counter
> *
> @@ -129,7 +137,8 @@ struct kfd2kgd_calls {
>
> void (*free_gtt_mem)(struct kgd_dev *kgd, void *mem_obj);
>
> - uint64_t (*get_vmem_size)(struct kgd_dev *kgd);
> + void(*get_local_mem_info)(struct kgd_dev *kgd,
> + struct kfd_local_mem_info *mem_info);
> uint64_t (*get_gpu_clock_counter)(struct kgd_dev *kgd);
>
> uint32_t (*get_max_engine_clock_in_mhz)(struct kgd_dev *kgd);
> diff --git a/drivers/gpu/drm/radeon/radeon_kfd.c b/drivers/gpu/drm/radeon/radeon_kfd.c
> index 87a9ebb..d3249db 100644
> --- a/drivers/gpu/drm/radeon/radeon_kfd.c
> +++ b/drivers/gpu/drm/radeon/radeon_kfd.c
> @@ -54,7 +54,8 @@ static int alloc_gtt_mem(struct kgd_dev *kgd, size_t size,
>
> static void free_gtt_mem(struct kgd_dev *kgd, void *mem_obj);
>
> -static uint64_t get_vmem_size(struct kgd_dev *kgd);
> +static void get_local_mem_info(struct kgd_dev *kgd,
> + struct kfd_local_mem_info *mem_info);
> static uint64_t get_gpu_clock_counter(struct kgd_dev *kgd);
>
> static uint32_t get_max_engine_clock_in_mhz(struct kgd_dev *kgd);
> @@ -107,7 +108,7 @@ static void write_vmid_invalidate_request(struct kgd_dev *kgd, uint8_t vmid);
> static const struct kfd2kgd_calls kfd2kgd = {
> .init_gtt_mem_allocation = alloc_gtt_mem,
> .free_gtt_mem = free_gtt_mem,
> - .get_vmem_size = get_vmem_size,
> + .get_local_mem_info = get_local_mem_info,
> .get_gpu_clock_counter = get_gpu_clock_counter,
> .get_max_engine_clock_in_mhz = get_max_engine_clock_in_mhz,
> .program_sh_mem_settings = kgd_program_sh_mem_settings,
> @@ -301,13 +302,26 @@ static void free_gtt_mem(struct kgd_dev *kgd, void *mem_obj)
> kfree(mem);
> }
>
> -static uint64_t get_vmem_size(struct kgd_dev *kgd)
> +static void get_local_mem_info(struct kgd_dev *kgd,
> + struct kfd_local_mem_info *mem_info)
> {
> struct radeon_device *rdev = (struct radeon_device *)kgd;
>
> BUG_ON(kgd == NULL);
>
> - return rdev->mc.real_vram_size;
> + memset(mem_info, 0, sizeof(*mem_info));
> +
> + mem_info->local_mem_size_public = rdev->mc.visible_vram_size;
> + mem_info->local_mem_size_private = rdev->mc.real_vram_size -
> + rdev->mc.visible_vram_size;
> +
> + mem_info->vram_width = rdev->mc.vram_width;
> + mem_info->mem_clk_max = radeon_dpm_get_mclk(rdev, false);
> +
> + pr_debug("radeon: address base: 0x%llx public 0x%llx private 0x%llx\n",
> + rdev->mc.aper_base,
> + mem_info->local_mem_size_public,
> + mem_info->local_mem_size_private);
> }
>
> static uint64_t get_gpu_clock_counter(struct kgd_dev *kgd)
> --
> 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