aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/4687-x86-MCE-AMD-mce-code-changes-to-fix-the-crash.patch
blob: 32d5be4a4fbd194ad353f89fc5da3185a0b93f07 (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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
From 427a2867957665d24bd4216e35366c74cc057c82 Mon Sep 17 00:00:00 2001
From: Chaudhary Amit Kumar <chaudharyamit.kumar@amd.com>
Date: Thu, 10 Jan 2019 14:57:12 +0530
Subject: [PATCH 4687/5725] x86/MCE/AMD: mce code changes to fix the crash 
 which is

occuring when doing suspend resume on Dibbler V1000.

Up stream Patches commits from where the code is taken
11cf887728a3d1de77cc12ce247b64ef32608891:  x86/MCE/AMD: Read MCx_MISC block addresses on any CPU
8a331f4a0863bea758561c921b94b4d28f7c4029 : x86/mce/AMD: Carve out SMCA get_block_address() code
fbf96cf904dc154a28338fe68f72902e9af57afc : x86/MCE/AMD: Define a function to get SMCA bank type

This patch fixes the below crash seen when user gives the command
"systemctl suspend" for S3.

 CPU: 0 PID: 1830 Comm: systemd-sleep Not tainted 4.14.14-1-amd-oct3-allpatches+ #3
 Hardware name: AMD Dibbler/Dibbler, BIOS RDB1107CB 09/13/2018
 task: ffff96d541174500 task.stack: ffffb8bd41df0000
 RIP: 0010:smp_call_function_single+0xe2/0xf0
 RSP: 0018:ffffb8bd41df3c40 EFLAGS: 00010046
 RAX: 0000000000000000 RBX: ffffb8bd41df3cd4 RCX: 0000000000000001
 RDX: ffffb8bd41df3c90 RSI: ffffffff98c3c2a0 RDI: 0000000000000000
 RBP: ffffb8bd41df3c70 R08: 0000000000000001 R09: 0000000000010000
 R10: ffffb8bd41df3c90 R11: ffffffff99c6ad20 R12: 0000000000000001
 R13: 0000000000000000 R14: 0000000000000000 R15: ffffb8bd41df3d14
 FS:  00007fc832f29940(0000) GS:ffff96d54a200000(0000) knlGS:0000000000000000
 CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
 CR2: 00005633e8039eb8 CR3: 00000001409ba000 CR4: 00000000003406f0
 Call Trace:
  ? rdmsr_safe_on_cpu+0x4b/0x70
  rdmsr_safe_on_cpu+0x4b/0x70
  get_block_address.isra.2+0x75/0xf0
  mce_amd_feature_init+0x69/0x2b0
  mce_syscore_resume+0x1e/0x30
  syscore_resume+0x47/0x170
  suspend_devices_and_enter+0x6fd/0x760
  pm_suspend+0x30c/0x380
  state_store+0x71/0xd0
  kernfs_fop_write+0x10f/0x190
  __vfs_write+0x26/0x150
  ? common_file_perm+0x44/0x140
  ? security_file_permission+0x3c/0xb0
  vfs_write+0xb3/0x1a0
  SyS_write+0x42/0x90
  do_syscall_64+0x6e/0x120
  entry_SYSCALL_64_after_hwframe+0x3d/0xa2
  RIP: 0033:0x7fc832a4a154
  RSP: 002b:00007ffe0a53c7e8 EFLAGS: 00000246 ORIG_RAX: 0000000000000001
  RAX: ffffffffffffffda RBX: 0000000000000004 RCX: 00007fc832a4a154
  RDX: 0000000000000004 RSI: 00005633e8038eb0 RDI: 0000000000000004
  RBP: 00005633e8038eb0 R08: 00005633e8037370 R09: 00007fc832f29940
  R10: 000000000000000a R11: 0000000000000246 R12: 00005633e8037290
  R13: 0000000000000004 R14: 00007fc832d222a0 R15: 00007fc832d21760
  Code: fe ff ff 8b 55 e8 83 e2 01 74 0a f3 90 8b 55 e8 83 e2 01 75 f6 48 83 c4 28 41 5a 5d 49 8d 62 f8 c3 8b 05 f2 76 9e 01 85 c0 75 85 <0f> 0b eb 81 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 f6 46
							 ---[ end trace 21ebe5b8c411c5d7 ]---

Signed-off-by: Kalyan Alle <kalyan.alle@amd.com>
Signed-off-by: Chaudhary Amit Kumar <chaudharyamit.kumar@amd.com>
---
 arch/x86/kernel/cpu/mcheck/mce_amd.c | 17 ++++++++---------
 1 file changed, 8 insertions(+), 9 deletions(-)
 mode change 100644 => 100755 arch/x86/kernel/cpu/mcheck/mce_amd.c

diff --git a/arch/x86/kernel/cpu/mcheck/mce_amd.c b/arch/x86/kernel/cpu/mcheck/mce_amd.c
old mode 100644
new mode 100755
index dbcb010..63250b3
--- a/arch/x86/kernel/cpu/mcheck/mce_amd.c
+++ b/arch/x86/kernel/cpu/mcheck/mce_amd.c
@@ -434,8 +434,7 @@ static void deferred_error_interrupt_enable(struct cpuinfo_x86 *c)
 	wrmsr(MSR_CU_DEF_ERR, low, high);
 }
 
-static u32 smca_get_block_address(unsigned int cpu, unsigned int bank,
-				  unsigned int block)
+static u32 smca_get_block_address(unsigned int bank, unsigned int block)
 {
 	u32 low, high;
 	u32 addr = 0;
@@ -454,13 +453,13 @@ static u32 smca_get_block_address(unsigned int cpu, unsigned int bank,
 	 * For SMCA enabled processors, BLKPTR field of the first MISC register
 	 * (MCx_MISC0) indicates presence of additional MISC regs set (MISC1-4).
 	 */
-	if (rdmsr_safe_on_cpu(cpu, MSR_AMD64_SMCA_MCx_CONFIG(bank), &low, &high))
+	if (rdmsr_safe(MSR_AMD64_SMCA_MCx_CONFIG(bank), &low, &high))
 		goto out;
 
 	if (!(low & MCI_CONFIG_MCAX))
 		goto out;
 
-	if (!rdmsr_safe_on_cpu(cpu, MSR_AMD64_SMCA_MCx_MISC(bank), &low, &high) &&
+	if (!rdmsr_safe(MSR_AMD64_SMCA_MCx_MISC(bank), &low, &high) &&
 	    (low & MASK_BLKPTR_LO))
 		addr = MSR_AMD64_SMCA_MCx_MISCy(bank, block - 1);
 
@@ -469,8 +468,8 @@ static u32 smca_get_block_address(unsigned int cpu, unsigned int bank,
 	return addr;
 }
 
-static u32 get_block_address(unsigned int cpu, u32 current_addr, u32 low, u32 high,
-			     unsigned int bank, unsigned int block)
+static u32 get_block_address(u32 current_addr, u32 low, u32 high,
+                            unsigned int bank, unsigned int block)
 {
 	u32 addr = 0, offset = 0;
 
@@ -478,7 +477,7 @@ static u32 get_block_address(unsigned int cpu, u32 current_addr, u32 low, u32 hi
 		return addr;
 
 	if (mce_flags.smca)
-		return smca_get_block_address(cpu, bank, block);
+		return smca_get_block_address(bank, block);
 
 	/* Fall back to method we used for older processors: */
 	switch (block) {
@@ -556,7 +555,7 @@ void mce_amd_feature_init(struct cpuinfo_x86 *c)
 			smca_configure(bank, cpu);
 
 		for (block = 0; block < NR_BLOCKS; ++block) {
-			address = get_block_address(cpu, address, low, high, bank, block);
+			address = get_block_address(address, low, high, bank, block);
 			if (!address)
 				break;
 
@@ -1173,7 +1172,7 @@ static int allocate_threshold_blocks(unsigned int cpu, unsigned int bank,
 	if (err)
 		goto out_free;
 recurse:
-	address = get_block_address(cpu, address, low, high, bank, ++block);
+	address = get_block_address(address, low, high, bank, ++block);
 	if (!address)
 		return 0;
 
-- 
2.7.4