aboutsummaryrefslogtreecommitdiffstats
path: root/meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/1632-drm-amdkfd-Handle-UCTL2-faults-as-VM-faults.patch
blob: 3c6198c4b502731c1a67b0359e01d024b6f9935d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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