aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4018-drm-amdkfd-Use-array-to-probe-kfd2kgd_calls.patch
diff options
context:
space:
mode:
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.patch322
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
+