diff options
Diffstat (limited to 'meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/1632-drm-amdkfd-Handle-UCTL2-faults-as-VM-faults.patch')
-rw-r--r-- | meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/1632-drm-amdkfd-Handle-UCTL2-faults-as-VM-faults.patch | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/1632-drm-amdkfd-Handle-UCTL2-faults-as-VM-faults.patch b/meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/1632-drm-amdkfd-Handle-UCTL2-faults-as-VM-faults.patch new file mode 100644 index 00000000..3c6198c4 --- /dev/null +++ b/meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/1632-drm-amdkfd-Handle-UCTL2-faults-as-VM-faults.patch @@ -0,0 +1,65 @@ +From 4955649dfea31a4b1b17898dd6ee3f6c175b93e0 Mon Sep 17 00:00:00 2001 +From: Felix Kuehling <Felix.Kuehling@amd.com> +Date: Mon, 27 Mar 2017 17:57:51 -0400 +Subject: [PATCH 1632/4131] drm/amdkfd: Handle UCTL2 faults as VM faults + +Also get VM fault info from the IH ring entry for Vega10. All the +information is available in the IH ring entry and AMDGPU does not +store VM fault info in its VM fault handler any more. + +Change-Id: I803d8f2f5d2b89b3b721c13d7b69eb9de4cf5c6c +Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com> +--- + drivers/gpu/drm/amd/amdkfd/kfd_int_process_v9.c | 27 ++++++++++++++----------- + 1 file changed, 15 insertions(+), 12 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_int_process_v9.c b/drivers/gpu/drm/amd/amdkfd/kfd_int_process_v9.c +index a479820..b2c6b52 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_int_process_v9.c ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_int_process_v9.c +@@ -65,7 +65,8 @@ static bool event_interrupt_isr_v9(struct kfd_dev *dev, + source_id == SOC15_INTSRC_SDMA_TRAP || + source_id == SOC15_INTSRC_SQ_INTERRUPT_MSG || + source_id == SOC15_INTSRC_CP_BAD_OPCODE || +- client_id == SOC15_IH_CLIENTID_VMC)) { ++ client_id == SOC15_IH_CLIENTID_VMC || ++ client_id == SOC15_IH_CLIENTID_UTCL2)) { + + /* + * KFD want to handle this INT, but MEC firmware did +@@ -108,19 +109,21 @@ static void event_interrupt_wq_v9(struct kfd_dev *dev, + kfd_signal_event_interrupt(pasid, 0, 0); /*todo */ + else if (source_id == SOC15_INTSRC_CP_BAD_OPCODE) + kfd_signal_hw_exception_event(pasid); +- else if (client_id == SOC15_IH_CLIENTID_VMC) { +- struct kfd_vm_fault_info info; ++ else if (client_id == SOC15_IH_CLIENTID_VMC || ++ client_id == SOC15_IH_CLIENTID_UTCL2) { ++ struct kfd_vm_fault_info info = {0}; ++ uint16_t ring_id = SOC15_RING_ID_FROM_IH_ENTRY(ih_ring_entry); ++ ++ info.vmid = vmid; ++ info.mc_id = client_id; ++ info.page_addr = ih_ring_entry[4] | ++ (uint64_t)(ih_ring_entry[5] & 0xf) << 32; ++ info.prot_valid = ring_id & 0x08; ++ info.prot_read = ring_id & 0x10; ++ info.prot_write = ring_id & 0x20; + +- memset(&info, 0, sizeof(info)); +- dev->kfd2kgd->get_vm_fault_info(dev->kgd, &info); + kfd_process_vm_fault(dev->dqm, pasid); +- if (!info.page_addr && !info.status) +- return; +- +- if (info.vmid == vmid) +- kfd_signal_vm_fault_event(dev, pasid, &info); +- else +- kfd_signal_vm_fault_event(dev, pasid, NULL); ++ kfd_signal_vm_fault_event(dev, pasid, &info); + } + } + +-- +2.7.4 + |