diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4018-drm-amdkfd-Use-array-to-probe-kfd2kgd_calls.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4018-drm-amdkfd-Use-array-to-probe-kfd2kgd_calls.patch | 322 |
1 files changed, 322 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4018-drm-amdkfd-Use-array-to-probe-kfd2kgd_calls.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4018-drm-amdkfd-Use-array-to-probe-kfd2kgd_calls.patch new file mode 100644 index 00000000..471575be --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4018-drm-amdkfd-Use-array-to-probe-kfd2kgd_calls.patch @@ -0,0 +1,322 @@ +From 8163b2a036a633ae41a6793b2f620f7c0a048f7e Mon Sep 17 00:00:00 2001 +From: Yong Zhao <Yong.Zhao@amd.com> +Date: Fri, 27 Sep 2019 22:03:42 -0400 +Subject: [PATCH 4018/4256] drm/amdkfd: Use array to probe kfd2kgd_calls + +This is the same idea as the kfd device info probe and move all the +probe control together for easy maintenance and fix the build when CIK support is +disabled. + +Change-Id: I85c98bb08eb2a4a1a80c3b913c32691cc74602d1 +Signed-off-by: Yong Zhao <Yong.Zhao@amd.com> +Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 65 +------------------ + drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | 6 -- + .../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 | 45 +++++++++++-- + 8 files changed, 47 insertions(+), 105 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c +index 9a3ab7fde205..1783883e40b6 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c +@@ -69,48 +69,11 @@ 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; +@@ -733,33 +696,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 a41fe657ba2a..65120f05fd58 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h +@@ -138,11 +138,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); + int amdgpu_amdkfd_copy_mem_to_mem(struct kgd_dev *kgd, struct kgd_mem *src_mem, + uint64_t src_offset, struct kgd_mem *dst_mem, + uint64_t dest_offset, uint64_t size, struct dma_fence **f, +@@ -262,7 +257,6 @@ void amdgpu_amdkfd_debug_mem_fence(struct kgd_dev *kgd); + 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 f0b19f20d1af..db39c6653cce 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_arcturus.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_arcturus.c +@@ -263,7 +263,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, +@@ -294,9 +294,3 @@ static const struct kfd2kgd_calls kfd2kgd = { + .get_iq_wait_times = kgd_gfx_v9_get_iq_wait_times, + .build_grace_period_packet_info = kgd_gfx_v9_build_grace_period_packet_info, + }; +- +-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 c1f194f9c515..b5091e31c83f 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.c +@@ -816,7 +816,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 = { ++const struct kfd2kgd_calls gfx_v10_kfd2kgd = { + .program_sh_mem_settings = kgd_program_sh_mem_settings, + .set_pasid_vmid_mapping = kgd_set_pasid_vmid_mapping, + .init_interrupts = kgd_init_interrupts, +@@ -840,8 +840,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 f0ef2e64f592..495b15ed28cd 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c +@@ -754,7 +754,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, +@@ -778,8 +778,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 17a31c1b1272..0118e6f18355 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c +@@ -787,7 +787,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, +@@ -811,8 +811,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 9c4992d8f4b7..530b8ada1f8f 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c +@@ -1012,7 +1012,7 @@ void kgd_gfx_v9_build_grace_period_packet_info(struct kgd_dev *kgd, + *reg_offset = mmCP_IQ_WAIT_TIME2; + } + +-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, +@@ -1043,8 +1043,3 @@ static const struct kfd2kgd_calls kfd2kgd = { + .get_iq_wait_times = kgd_gfx_v9_get_iq_wait_times, + .build_grace_period_packet_info = kgd_gfx_v9_build_grace_period_packet_info, + }; +- +-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 d7e687062dd7..bdf890912ff8 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_device.c ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_device.c +@@ -39,6 +39,41 @@ + */ + static atomic_t kfd_locked = ATOMIC_INIT(0); + ++#ifdef CONFIG_DRM_AMDGPU_CIK ++extern const struct kfd2kgd_calls gfx_v7_kfd2kgd; ++#endif ++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 ++#ifdef CONFIG_DRM_AMDGPU_CIK ++ [CHIP_KAVERI] = &gfx_v7_kfd2kgd, ++#endif ++ [CHIP_CARRIZO] = &gfx_v8_kfd2kgd, ++ [CHIP_RAVEN] = &gfx_v9_kfd2kgd, ++#endif ++#ifdef CONFIG_DRM_AMDGPU_CIK ++ [CHIP_HAWAII] = &gfx_v7_kfd2kgd, ++#endif ++ [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 +489,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; +-- +2.17.1 + |