[PATCH 4/6] drm/amdkfd: Use array to probe kfd2kgd_calls

Kuehling, Felix Felix.Kuehling at amd.com
Mon Sep 30 15:42:29 UTC 2019


On 2019-09-27 11:41 p.m., Zhao, Yong wrote:
> This is the same idea as the kfd device info probe and move all the
> probe control together for easy maintenance.
>
> Change-Id: I85c98bb08eb2a4a1a80c3b913c32691cc74602d1
> Signed-off-by: Yong Zhao <Yong.Zhao at amd.com>

Nice clean-up. See one comment inline.

Also, please check that this doesn't break the build if CONFIG_HSA_AMD 
is undefined.

With that fixed and checked, this patch is

Reviewed-by: Felix Kuehling <Felix.Kuehling at amd.com>


> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c    | 65 +------------------
>   drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h    |  7 --
>   .../drm/amd/amdgpu/amdgpu_amdkfd_arcturus.c   |  8 +--
>   .../drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.c    |  7 +-
>   .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c |  7 +-
>   .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c |  7 +-
>   .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c |  7 +-
>   drivers/gpu/drm/amd/amdkfd/kfd_device.c       | 39 +++++++++--
>   8 files changed, 41 insertions(+), 106 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
> index 92666b197f6c..8c531793fe17 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
> @@ -63,47 +63,10 @@ void amdgpu_amdkfd_fini(void)
>   
>   void amdgpu_amdkfd_device_probe(struct amdgpu_device *adev)
>   {
> -	const struct kfd2kgd_calls *kfd2kgd;
>   	bool vf = amdgpu_sriov_vf(adev);
>   
> -	switch (adev->asic_type) {
> -#ifdef CONFIG_DRM_AMDGPU_CIK
> -	case CHIP_KAVERI:
> -	case CHIP_HAWAII:
> -		kfd2kgd = amdgpu_amdkfd_gfx_7_get_functions();
> -		break;
> -#endif
> -	case CHIP_CARRIZO:
> -	case CHIP_TONGA:
> -	case CHIP_FIJI:
> -	case CHIP_POLARIS10:
> -	case CHIP_POLARIS11:
> -	case CHIP_POLARIS12:
> -	case CHIP_VEGAM:
> -		kfd2kgd = amdgpu_amdkfd_gfx_8_0_get_functions();
> -		break;
> -	case CHIP_VEGA10:
> -	case CHIP_VEGA12:
> -	case CHIP_VEGA20:
> -	case CHIP_RAVEN:
> -	case CHIP_RENOIR:
> -		kfd2kgd = amdgpu_amdkfd_gfx_9_0_get_functions();
> -		break;
> -	case CHIP_ARCTURUS:
> -		kfd2kgd = amdgpu_amdkfd_arcturus_get_functions();
> -		break;
> -	case CHIP_NAVI10:
> -	case CHIP_NAVI14:
> -	case CHIP_NAVI12:
> -		kfd2kgd = amdgpu_amdkfd_gfx_10_0_get_functions();
> -		break;
> -	default:
> -		dev_info(adev->dev, "kfd not supported on this ASIC\n");
> -		return;
> -	}
> -
>   	adev->kfd.dev = kgd2kfd_probe((struct kgd_dev *)adev,
> -				      adev->pdev, kfd2kgd, adev->asic_type, vf);
> +				      adev->pdev, adev->asic_type, vf);
>   
>   	if (adev->kfd.dev)
>   		amdgpu_amdkfd_total_mem_size += adev->gmc.real_vram_size;
> @@ -711,33 +674,7 @@ int amdgpu_amdkfd_evict_userptr(struct kgd_mem *mem, struct mm_struct *mm)
>   	return 0;
>   }
>   
> -struct kfd2kgd_calls *amdgpu_amdkfd_gfx_7_get_functions(void)
> -{
> -	return NULL;
> -}
> -
> -struct kfd2kgd_calls *amdgpu_amdkfd_gfx_8_0_get_functions(void)
> -{
> -	return NULL;
> -}
> -
> -struct kfd2kgd_calls *amdgpu_amdkfd_gfx_9_0_get_functions(void)
> -{
> -	return NULL;
> -}
> -
> -struct kfd2kgd_calls *amdgpu_amdkfd_arcturus_get_functions(void)
> -{
> -	return NULL;
> -}
> -
> -struct kfd2kgd_calls *amdgpu_amdkfd_gfx_10_0_get_functions(void)
> -{
> -	return NULL;
> -}
> -
>   struct kfd_dev *kgd2kfd_probe(struct kgd_dev *kgd, struct pci_dev *pdev,
> -			      const struct kfd2kgd_calls *f2g,
>   			      unsigned int asic_type, bool vf)
>   {
>   	return NULL;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
> index 4eb2fb85de26..069d5d230810 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
> @@ -137,12 +137,6 @@ int amdgpu_amdkfd_submit_ib(struct kgd_dev *kgd, enum kgd_engine_type engine,
>   void amdgpu_amdkfd_set_compute_idle(struct kgd_dev *kgd, bool idle);
>   bool amdgpu_amdkfd_have_atomics_support(struct kgd_dev *kgd);
>   
> -struct kfd2kgd_calls *amdgpu_amdkfd_gfx_7_get_functions(void);
> -struct kfd2kgd_calls *amdgpu_amdkfd_gfx_8_0_get_functions(void);
> -struct kfd2kgd_calls *amdgpu_amdkfd_gfx_9_0_get_functions(void);
> -struct kfd2kgd_calls *amdgpu_amdkfd_arcturus_get_functions(void);
> -struct kfd2kgd_calls *amdgpu_amdkfd_gfx_10_0_get_functions(void);
> -
>   bool amdgpu_amdkfd_is_kfd_vmid(struct amdgpu_device *adev, u32 vmid);
>   
>   int amdgpu_amdkfd_pre_reset(struct amdgpu_device *adev);
> @@ -248,7 +242,6 @@ void amdgpu_amdkfd_unreserve_memory_limit(struct amdgpu_bo *bo);
>   int kgd2kfd_init(void);
>   void kgd2kfd_exit(void);
>   struct kfd_dev *kgd2kfd_probe(struct kgd_dev *kgd, struct pci_dev *pdev,
> -			      const struct kfd2kgd_calls *f2g,
>   			      unsigned int asic_type, bool vf);
>   bool kgd2kfd_device_init(struct kfd_dev *kfd,
>   			 struct drm_device *ddev,
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_arcturus.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_arcturus.c
> index 4a49dbee26a1..e1fbbebce4fd 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_arcturus.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_arcturus.c
> @@ -262,7 +262,7 @@ static int kgd_hqd_sdma_destroy(struct kgd_dev *kgd, void *mqd,
>   	return 0;
>   }
>   
> -static const struct kfd2kgd_calls kfd2kgd = {
> +const struct kfd2kgd_calls arcturus_kfd2kgd = {
>   	.program_sh_mem_settings = kgd_gfx_v9_program_sh_mem_settings,
>   	.set_pasid_vmid_mapping = kgd_gfx_v9_set_pasid_vmid_mapping,
>   	.init_interrupts = kgd_gfx_v9_init_interrupts,
> @@ -286,9 +286,3 @@ static const struct kfd2kgd_calls kfd2kgd = {
>   	.invalidate_tlbs_vmid = kgd_gfx_v9_invalidate_tlbs_vmid,
>   	.get_hive_id = amdgpu_amdkfd_get_hive_id,
>   };
> -
> -struct kfd2kgd_calls *amdgpu_amdkfd_arcturus_get_functions(void)
> -{
> -	return (struct kfd2kgd_calls *)&kfd2kgd;
> -}
> -
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.c
> index be9b873ec683..a01704bc91cd 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.c
> @@ -815,7 +815,7 @@ static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid,
>   	gfxhub_v2_0_setup_vm_pt_regs(adev, vmid, page_table_base);
>   }
>   
> -static const struct kfd2kgd_calls kfd2kgd = {
> +struct kfd2kgd_calls gfx_v10_kfd2kgd = {

This should be const. Can you fix that too while you're here?


>   	.program_sh_mem_settings = kgd_program_sh_mem_settings,
>   	.set_pasid_vmid_mapping = kgd_set_pasid_vmid_mapping,
>   	.init_interrupts = kgd_init_interrupts,
> @@ -839,8 +839,3 @@ static const struct kfd2kgd_calls kfd2kgd = {
>   	.invalidate_tlbs_vmid = invalidate_tlbs_vmid,
>   	.get_hive_id = amdgpu_amdkfd_get_hive_id,
>   };
> -
> -struct kfd2kgd_calls *amdgpu_amdkfd_gfx_10_0_get_functions()
> -{
> -	return (struct kfd2kgd_calls *)&kfd2kgd;
> -}
> 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 9c4ebcadad62..0b9cc6515e64 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
> @@ -751,7 +751,7 @@ static uint32_t read_vmid_from_vmfault_reg(struct kgd_dev *kgd)
>   	return REG_GET_FIELD(status, VM_CONTEXT1_PROTECTION_FAULT_STATUS, VMID);
>   }
>   
> -static const struct kfd2kgd_calls kfd2kgd = {
> +const struct kfd2kgd_calls gfx_v7_kfd2kgd = {
>   	.program_sh_mem_settings = kgd_program_sh_mem_settings,
>   	.set_pasid_vmid_mapping = kgd_set_pasid_vmid_mapping,
>   	.init_interrupts = kgd_init_interrupts,
> @@ -775,8 +775,3 @@ static const struct kfd2kgd_calls kfd2kgd = {
>   	.invalidate_tlbs_vmid = invalidate_tlbs_vmid,
>   	.read_vmid_from_vmfault_reg = read_vmid_from_vmfault_reg,
>   };
> -
> -struct kfd2kgd_calls *amdgpu_amdkfd_gfx_7_get_functions(void)
> -{
> -	return (struct kfd2kgd_calls *)&kfd2kgd;
> -}
> 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 f2e52b496044..3416a7f27dc7 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
> @@ -696,7 +696,7 @@ static int invalidate_tlbs_vmid(struct kgd_dev *kgd, uint16_t vmid)
>   	return 0;
>   }
>   
> -static const struct kfd2kgd_calls kfd2kgd = {
> +const struct kfd2kgd_calls gfx_v8_kfd2kgd = {
>   	.program_sh_mem_settings = kgd_program_sh_mem_settings,
>   	.set_pasid_vmid_mapping = kgd_set_pasid_vmid_mapping,
>   	.init_interrupts = kgd_init_interrupts,
> @@ -720,8 +720,3 @@ static const struct kfd2kgd_calls kfd2kgd = {
>   	.invalidate_tlbs = invalidate_tlbs,
>   	.invalidate_tlbs_vmid = invalidate_tlbs_vmid,
>   };
> -
> -struct kfd2kgd_calls *amdgpu_amdkfd_gfx_8_0_get_functions(void)
> -{
> -	return (struct kfd2kgd_calls *)&kfd2kgd;
> -}
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
> index 12f30df2174c..82ed9316b096 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
> @@ -786,7 +786,7 @@ void kgd_gfx_v9_set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmi
>   	gfxhub_v1_0_setup_vm_pt_regs(adev, vmid, page_table_base);
>   }
>   
> -static const struct kfd2kgd_calls kfd2kgd = {
> +const struct kfd2kgd_calls gfx_v9_kfd2kgd = {
>   	.program_sh_mem_settings = kgd_gfx_v9_program_sh_mem_settings,
>   	.set_pasid_vmid_mapping = kgd_gfx_v9_set_pasid_vmid_mapping,
>   	.init_interrupts = kgd_gfx_v9_init_interrupts,
> @@ -810,8 +810,3 @@ static const struct kfd2kgd_calls kfd2kgd = {
>   	.invalidate_tlbs_vmid = kgd_gfx_v9_invalidate_tlbs_vmid,
>   	.get_hive_id = amdgpu_amdkfd_get_hive_id,
>   };
> -
> -struct kfd2kgd_calls *amdgpu_amdkfd_gfx_9_0_get_functions(void)
> -{
> -	return (struct kfd2kgd_calls *)&kfd2kgd;
> -}
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device.c b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
> index 96a9e0653db2..0db273587af4 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_device.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
> @@ -39,6 +39,35 @@
>    */
>   static atomic_t kfd_locked = ATOMIC_INIT(0);
>   
> +extern const struct kfd2kgd_calls gfx_v7_kfd2kgd;
> +extern const struct kfd2kgd_calls gfx_v8_kfd2kgd;
> +extern const struct kfd2kgd_calls gfx_v9_kfd2kgd;
> +extern const struct kfd2kgd_calls arcturus_kfd2kgd;
> +extern const struct kfd2kgd_calls gfx_v10_kfd2kgd;
> +
> +static const struct kfd2kgd_calls *kfd2kgd_funcs[] = {
> +#ifdef KFD_SUPPORT_IOMMU_V2
> +	[CHIP_KAVERI] = &gfx_v7_kfd2kgd,
> +	[CHIP_CARRIZO] = &gfx_v8_kfd2kgd,
> +	[CHIP_RAVEN] = &gfx_v9_kfd2kgd,
> +#endif
> +	[CHIP_HAWAII] = &gfx_v7_kfd2kgd,
> +	[CHIP_TONGA] = &gfx_v8_kfd2kgd,
> +	[CHIP_FIJI] = &gfx_v8_kfd2kgd,
> +	[CHIP_POLARIS10] = &gfx_v8_kfd2kgd,
> +	[CHIP_POLARIS11] = &gfx_v8_kfd2kgd,
> +	[CHIP_POLARIS12] = &gfx_v8_kfd2kgd,
> +	[CHIP_VEGAM] = &gfx_v8_kfd2kgd,
> +	[CHIP_VEGA10] = &gfx_v9_kfd2kgd,
> +	[CHIP_VEGA12] = &gfx_v9_kfd2kgd,
> +	[CHIP_VEGA20] = &gfx_v9_kfd2kgd,
> +	[CHIP_RENOIR] = &gfx_v9_kfd2kgd,
> +	[CHIP_ARCTURUS] = &arcturus_kfd2kgd,
> +	[CHIP_NAVI10] = &gfx_v10_kfd2kgd,
> +	[CHIP_NAVI12] = &gfx_v10_kfd2kgd,
> +	[CHIP_NAVI14] = &gfx_v10_kfd2kgd,
> +};
> +
>   #ifdef KFD_SUPPORT_IOMMU_V2
>   static const struct kfd_device_info kaveri_device_info = {
>   	.asic_family = CHIP_KAVERI,
> @@ -454,20 +483,22 @@ static void kfd_gtt_sa_fini(struct kfd_dev *kfd);
>   static int kfd_resume(struct kfd_dev *kfd);
>   
>   struct kfd_dev *kgd2kfd_probe(struct kgd_dev *kgd,
> -	struct pci_dev *pdev, const struct kfd2kgd_calls *f2g,
> -	unsigned int asic_type, bool vf)
> +	struct pci_dev *pdev, unsigned int asic_type, bool vf)
>   {
>   	struct kfd_dev *kfd;
>   	const struct kfd_device_info *device_info;
> +	const struct kfd2kgd_calls *f2g;
>   
> -	if (asic_type >= sizeof(kfd_supported_devices) / (sizeof(void *) * 2)) {
> +	if (asic_type >= sizeof(kfd_supported_devices) / (sizeof(void *) * 2)
> +		|| asic_type >= sizeof(kfd2kgd_funcs) / sizeof(void *)) {
>   		dev_err(kfd_device, "asic_type %d out of range\n", asic_type);
>   		return NULL; /* asic_type out of range */
>   	}
>   
>   	device_info = kfd_supported_devices[asic_type][vf];
> +	f2g = kfd2kgd_funcs[asic_type];
>   
> -	if (!device_info) {
> +	if (!device_info && !f2g) {
>   		dev_err(kfd_device, "%s %s not supported in kfd\n",
>   			amdgpu_asic_name[asic_type], vf ? "VF" : "");
>   		return NULL;


More information about the amd-gfx mailing list