diff options
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.patch | 191 |
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 - |