diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/4157-drm-amdkfd-signal-hw_exception-event-on-GPU-reset.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.14.71/4157-drm-amdkfd-signal-hw_exception-event-on-GPU-reset.patch | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/4157-drm-amdkfd-signal-hw_exception-event-on-GPU-reset.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/4157-drm-amdkfd-signal-hw_exception-event-on-GPU-reset.patch new file mode 100644 index 00000000..84f38194 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/4157-drm-amdkfd-signal-hw_exception-event-on-GPU-reset.patch @@ -0,0 +1,82 @@ +From a8850728a13479e09bde246d3399c8ccc90a48bc Mon Sep 17 00:00:00 2001 +From: Shaoyun Liu <Shaoyun.Liu@amd.com> +Date: Tue, 3 Apr 2018 16:11:00 -0400 +Subject: [PATCH 4157/5725] drm/amdkfd: signal hw_exception event on GPU reset + +Change-Id: I8fae18208103920796f81858f359a9cec563125c +Signed-off-by: Shaoyun Liu <Shaoyun.Liu@amd.com> +Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com> +Signed-off-by: Kalyan Alle <kalyan.alle@amd.com> +--- + drivers/gpu/drm/amd/amdkfd/kfd_events.c | 24 +++++++++++++++++++++++- + drivers/gpu/drm/amd/amdkfd/kfd_events.h | 1 + + include/uapi/linux/kfd_ioctl.h | 8 ++++++++ + 3 files changed, 32 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_events.c b/drivers/gpu/drm/amd/amdkfd/kfd_events.c +index 09c1c31..24d8a21 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_events.c ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_events.c +@@ -1012,5 +1012,27 @@ void kfd_signal_vm_fault_event(struct kfd_dev *dev, unsigned int pasid, + + void kfd_signal_reset_event(struct kfd_dev *dev) + { +- /*todo*/ ++ struct kfd_hsa_hw_exception_data hw_exception_data; ++ struct kfd_process *p; ++ struct kfd_event *ev; ++ unsigned int temp; ++ uint32_t id, idx; ++ ++ /* Whole gpu reset caused by GPU hang , and memory is lost */ ++ memset(&hw_exception_data, 0, sizeof(hw_exception_data)); ++ hw_exception_data.gpu_id = dev->id; ++ hw_exception_data.memory_lost = 1; ++ ++ idx = srcu_read_lock(&kfd_processes_srcu); ++ hash_for_each_rcu(kfd_processes_table, temp, p, kfd_processes) { ++ mutex_lock(&p->event_mutex); ++ id = KFD_FIRST_NONSIGNAL_EVENT_ID; ++ idr_for_each_entry_continue(&p->event_idr, ev, id) ++ if (ev->type == KFD_EVENT_TYPE_HW_EXCEPTION) { ++ ev->hw_exception_data = hw_exception_data; ++ set_event(ev); ++ } ++ mutex_unlock(&p->event_mutex); ++ } ++ srcu_read_unlock(&kfd_processes_srcu, idx); + } +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_events.h b/drivers/gpu/drm/amd/amdkfd/kfd_events.h +index abca5bf..c7ac6c7 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_events.h ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_events.h +@@ -66,6 +66,7 @@ struct kfd_event { + /* type specific data */ + union { + struct kfd_hsa_memory_exception_data memory_exception_data; ++ struct kfd_hsa_hw_exception_data hw_exception_data; + }; + }; + +diff --git a/include/uapi/linux/kfd_ioctl.h b/include/uapi/linux/kfd_ioctl.h +index ec0574e..85d833e 100644 +--- a/include/uapi/linux/kfd_ioctl.h ++++ b/include/uapi/linux/kfd_ioctl.h +@@ -251,6 +251,14 @@ struct kfd_hsa_memory_exception_data { + uint32_t pad; + }; + ++/* hw exception data */ ++struct kfd_hsa_hw_exception_data { ++ uint32_t reset_type; ++ uint32_t reset_cause; ++ uint32_t memory_lost; ++ uint32_t gpu_id; ++}; ++ + /* Event data */ + struct kfd_event_data { + union { +-- +2.7.4 + |