aboutsummaryrefslogtreecommitdiffstats
path: root/meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/1540-drm-amdkfd-fix-zero-reading-of-VMID-and-PASID-for-Ha.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/1540-drm-amdkfd-fix-zero-reading-of-VMID-and-PASID-for-Ha.patch')
-rw-r--r--meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/1540-drm-amdkfd-fix-zero-reading-of-VMID-and-PASID-for-Ha.patch191
1 files changed, 0 insertions, 191 deletions
diff --git a/meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/1540-drm-amdkfd-fix-zero-reading-of-VMID-and-PASID-for-Ha.patch b/meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/1540-drm-amdkfd-fix-zero-reading-of-VMID-and-PASID-for-Ha.patch
deleted file mode 100644
index 76746b0a..00000000
--- a/meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/1540-drm-amdkfd-fix-zero-reading-of-VMID-and-PASID-for-Ha.patch
+++ /dev/null
@@ -1,191 +0,0 @@
-From 69dd0218c03469b032d6760fa71df50256a118d1 Mon Sep 17 00:00:00 2001
-From: Lan Xiao <Lan.Xiao@amd.com>
-Date: Thu, 13 Oct 2016 16:03:33 -0400
-Subject: [PATCH 1540/4131] drm/amdkfd: fix zero reading of VMID and PASID for
- Hawaii
-
-Upon VM Fault, the VMID and PASID written by HW are zeros in
-Hawaii. Instead of reading from ih_ring_entry, read directly
-from the registers. This workaround fix the soft hang issues
-caused by mishandled VM Fault in Hawaii.
-
-Fix BUG: SWDEV-100220
-
-Change-Id: I1c89263e4bccde037d24f71f3efef7903d83d2f0
-Signed-off-by: Lan Xiao <Lan.Xiao@amd.com>
----
- drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c | 17 ++++++++++++++++
- drivers/gpu/drm/amd/amdkfd/cik_event_interrupt.c | 24 ++++++++++++++++++++++-
- drivers/gpu/drm/amd/amdkfd/kfd_device.c | 9 +++++++--
- drivers/gpu/drm/amd/amdkfd/kfd_interrupt.c | 7 +++++--
- drivers/gpu/drm/amd/amdkfd/kfd_priv.h | 7 +++++--
- drivers/gpu/drm/amd/include/kgd_kfd_interface.h | 1 +
- 6 files changed, 58 insertions(+), 7 deletions(-)
-
-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 3b812a8..07a843f 100644
---- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
-+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
-@@ -147,6 +147,7 @@ static int write_config_static_mem(struct kgd_dev *kgd, bool swizzle_enable,
- uint8_t element_size, uint8_t index_stride, uint8_t mtype);
- static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid,
- uint32_t page_table_base);
-+static uint32_t read_vmid_from_vmfault_reg(struct kgd_dev *kgd);
-
- /* Because of REG_GET_FIELD() being used, we put this function in the
- * asic specific file.
-@@ -204,6 +205,7 @@ static const struct kfd2kgd_calls kfd2kgd = {
- get_atc_vmid_pasid_mapping_pasid,
- .get_atc_vmid_pasid_mapping_valid =
- get_atc_vmid_pasid_mapping_valid,
-+ .read_vmid_from_vmfault_reg = read_vmid_from_vmfault_reg,
- .write_vmid_invalidate_request = write_vmid_invalidate_request,
- .alloc_memory_of_gpu = amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu,
- .free_memory_of_gpu = amdgpu_amdkfd_gpuvm_free_memory_of_gpu,
-@@ -947,3 +949,18 @@ static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid,
- WREG32(mmVM_CONTEXT8_PAGE_TABLE_BASE_ADDR + vmid - 8, page_table_base);
- }
-
-+ /**
-+ * read_vmid_from_vmfault_reg - read vmid from register
-+ *
-+ * adev: amdgpu_device pointer
-+ * @vmid: vmid pointer
-+ * read vmid from register (CIK).
-+ */
-+static uint32_t read_vmid_from_vmfault_reg(struct kgd_dev *kgd)
-+{
-+ struct amdgpu_device *adev = get_amdgpu_device(kgd);
-+
-+ uint32_t status = RREG32(mmVM_CONTEXT1_PROTECTION_FAULT_STATUS);
-+
-+ return REG_GET_FIELD(status, VM_CONTEXT1_PROTECTION_FAULT_STATUS, VMID);
-+}
-diff --git a/drivers/gpu/drm/amd/amdkfd/cik_event_interrupt.c b/drivers/gpu/drm/amd/amdkfd/cik_event_interrupt.c
-index 3f49f8e..c60a71a 100644
---- a/drivers/gpu/drm/amd/amdkfd/cik_event_interrupt.c
-+++ b/drivers/gpu/drm/amd/amdkfd/cik_event_interrupt.c
-@@ -37,12 +37,34 @@ static bool is_cpc_vm_fault(struct kfd_dev *dev,
- return true;
- return false;
- }
-+
- static bool cik_event_interrupt_isr(struct kfd_dev *dev,
-- const uint32_t *ih_ring_entry)
-+ const uint32_t *ih_ring_entry,
-+ uint32_t *patched_ihre,
-+ bool *patched_flag)
- {
- const struct cik_ih_ring_entry *ihre =
- (const struct cik_ih_ring_entry *)ih_ring_entry;
-+ const struct kfd2kgd_calls *f2g = dev->kfd2kgd;
-+ struct cik_ih_ring_entry *tmp_ihre =
-+ (struct cik_ih_ring_entry *) patched_ihre;
-+
-+ /* This workaround is due to HW/FW limitation on Hawaii that
-+ * VMID and PASID are not written into ih_ring_entry
-+ */
-+ if ((ihre->source_id == CIK_INTSRC_GFX_PAGE_INV_FAULT ||
-+ ihre->source_id == CIK_INTSRC_GFX_MEM_PROT_FAULT) &&
-+ dev->device_info->asic_family == CHIP_HAWAII) {
-+ *patched_flag = true;
-+ *tmp_ihre = *ihre;
-
-+ tmp_ihre->vmid = f2g->read_vmid_from_vmfault_reg(dev->kgd);
-+ tmp_ihre->pasid = f2g->get_atc_vmid_pasid_mapping_pasid(
-+ dev->kgd, tmp_ihre->vmid);
-+ return (tmp_ihre->pasid != 0) &&
-+ tmp_ihre->vmid >= dev->vm_info.first_vmid_kfd &&
-+ tmp_ihre->vmid <= dev->vm_info.last_vmid_kfd;
-+ }
- /* Do not process in ISR, just request it to be forwarded to WQ. */
- return (ihre->pasid != 0) &&
- (ihre->source_id == CIK_INTSRC_CP_END_OF_PIPE ||
-diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device.c b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
-index 6bab9db..dbbe3cf 100644
---- a/drivers/gpu/drm/amd/amdkfd/kfd_device.c
-+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
-@@ -674,14 +674,19 @@ static int kfd_resume(struct kfd_dev *kfd)
- /* This is called directly from KGD at ISR. */
- void kgd2kfd_interrupt(struct kfd_dev *kfd, const void *ih_ring_entry)
- {
-+ uint32_t patched_ihre[DIV_ROUND_UP(
-+ kfd->device_info->ih_ring_entry_size,
-+ sizeof(uint32_t))];
-+ bool is_patched = false;
-+
- if (!kfd->init_complete)
- return;
-
- spin_lock(&kfd->interrupt_lock);
-
- if (kfd->interrupts_active
-- && interrupt_is_wanted(kfd, ih_ring_entry)
-- && enqueue_ih_ring_entry(kfd, ih_ring_entry))
-+ && interrupt_is_wanted(kfd, ih_ring_entry, patched_ihre, &is_patched)
-+ && enqueue_ih_ring_entry(kfd, is_patched ? patched_ihre : ih_ring_entry))
- queue_work(kfd->ih_wq, &kfd->interrupt_work);
-
- spin_unlock(&kfd->interrupt_lock);
-diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_interrupt.c b/drivers/gpu/drm/amd/amdkfd/kfd_interrupt.c
-index 4d1639f..d737df0 100644
---- a/drivers/gpu/drm/amd/amdkfd/kfd_interrupt.c
-+++ b/drivers/gpu/drm/amd/amdkfd/kfd_interrupt.c
-@@ -148,12 +148,15 @@ static void interrupt_wq(struct work_struct *work)
- dev->device_info->event_interrupt_class->interrupt_wq(dev, ih_ring_entry);
- }
-
--bool interrupt_is_wanted(struct kfd_dev *dev, const uint32_t *ih_ring_entry)
-+bool interrupt_is_wanted(struct kfd_dev *dev,
-+ const uint32_t *ih_ring_entry,
-+ uint32_t *patched_ihre, bool *flag)
- {
- /* integer and bitwise OR so there is no boolean short-circuiting */
- unsigned wanted = 0;
-
-- wanted |= dev->device_info->event_interrupt_class->interrupt_isr(dev, ih_ring_entry);
-+ wanted |= dev->device_info->event_interrupt_class->interrupt_isr(dev,
-+ ih_ring_entry, patched_ihre, flag);
-
- return wanted != 0;
- }
-diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
-index 71a27f8..92b0adf 100644
---- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
-+++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
-@@ -175,7 +175,8 @@ enum asic_family_type {
- (chip) == CHIP_HAWAII)
-
- struct kfd_event_interrupt_class {
-- bool (*interrupt_isr)(struct kfd_dev *dev, const uint32_t *ih_ring_entry);
-+ bool (*interrupt_isr)(struct kfd_dev *dev, const uint32_t *ih_ring_entry,
-+ uint32_t *patched_ihre, bool *patched_flag);
- void (*interrupt_wq)(struct kfd_dev *dev, const uint32_t *ih_ring_entry);
- };
-
-@@ -805,7 +806,9 @@ int kfd_interrupt_init(struct kfd_dev *dev);
- void kfd_interrupt_exit(struct kfd_dev *dev);
- void kgd2kfd_interrupt(struct kfd_dev *kfd, const void *ih_ring_entry);
- bool enqueue_ih_ring_entry(struct kfd_dev *kfd, const void *ih_ring_entry);
--bool interrupt_is_wanted(struct kfd_dev *dev, const uint32_t *ih_ring_entry);
-+bool interrupt_is_wanted(struct kfd_dev *dev,
-+ const uint32_t *ih_ring_entry,
-+ uint32_t *patched_ihre, bool *flag);
-
- /* Power Management */
- void kgd2kfd_suspend(struct kfd_dev *kfd);
-diff --git a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
-index 10e9f60..1971537 100644
---- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
-+++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
-@@ -311,6 +311,7 @@ struct kfd2kgd_calls {
- uint16_t (*get_atc_vmid_pasid_mapping_pasid)(
- struct kgd_dev *kgd,
- uint8_t vmid);
-+ uint32_t (*read_vmid_from_vmfault_reg)(struct kgd_dev *kgd);
- void (*write_vmid_invalidate_request)(struct kgd_dev *kgd,
- uint8_t vmid);
- int (*alloc_memory_of_gpu)(struct kgd_dev *kgd, uint64_t va,
---
-2.7.4
-