diff options
author | Eial Czerwacki <eial@scalemp.com> | 2018-11-05 12:31:54 -0500 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2018-11-06 15:35:11 -0500 |
commit | a48777fdda7d13179979a889e1fb87655a783cc0 (patch) | |
tree | 8ba57d8487f07a877644b074f324b6f66c5e5cef /arch | |
parent | b082f2dd80612015cd6d9d84e52099734ec9a0e1 (diff) |
x86/vsmp: Remove dependency on pv_irq_ops
vSMP dependency on pv_irq_ops has been removed some years ago, but the code
still deals with pv_irq_ops.
In short, "cap & ctl & (1 << 4)" is always returning 0, so all
PARAVIRT/PARAVIRT_XXL code related to that can be removed.
However, the rest of the code depends on CONFIG_PCI, so fix it accordingly.
Rename set_vsmp_pv_ops to set_vsmp_ctl as the original name does not make
sense anymore.
Signed-off-by: Eial Czerwacki <eial@scalemp.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Shai Fultheim <shai@scalemp.com>
Cc: Juergen Gross <jgross@suse.com>
Link: https://lkml.kernel.org/r/1541439114-28297-1-git-send-email-eial@scalemp.com
Diffstat (limited to 'arch')
-rw-r--r-- | arch/x86/Kconfig | 1 | ||||
-rw-r--r-- | arch/x86/kernel/vsmp_64.c | 84 |
2 files changed, 7 insertions, 78 deletions
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index ba7e3464ee92..9d734f3c8234 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
@@ -525,7 +525,6 @@ config X86_VSMP | |||
525 | bool "ScaleMP vSMP" | 525 | bool "ScaleMP vSMP" |
526 | select HYPERVISOR_GUEST | 526 | select HYPERVISOR_GUEST |
527 | select PARAVIRT | 527 | select PARAVIRT |
528 | select PARAVIRT_XXL | ||
529 | depends on X86_64 && PCI | 528 | depends on X86_64 && PCI |
530 | depends on X86_EXTENDED_PLATFORM | 529 | depends on X86_EXTENDED_PLATFORM |
531 | depends on SMP | 530 | depends on SMP |
diff --git a/arch/x86/kernel/vsmp_64.c b/arch/x86/kernel/vsmp_64.c index 1eae5af491c2..891a75dbc131 100644 --- a/arch/x86/kernel/vsmp_64.c +++ b/arch/x86/kernel/vsmp_64.c | |||
@@ -26,65 +26,8 @@ | |||
26 | 26 | ||
27 | #define TOPOLOGY_REGISTER_OFFSET 0x10 | 27 | #define TOPOLOGY_REGISTER_OFFSET 0x10 |
28 | 28 | ||
29 | #if defined CONFIG_PCI && defined CONFIG_PARAVIRT_XXL | 29 | #ifdef CONFIG_PCI |
30 | /* | 30 | static void __init set_vsmp_ctl(void) |
31 | * Interrupt control on vSMPowered systems: | ||
32 | * ~AC is a shadow of IF. If IF is 'on' AC should be 'off' | ||
33 | * and vice versa. | ||
34 | */ | ||
35 | |||
36 | asmlinkage __visible unsigned long vsmp_save_fl(void) | ||
37 | { | ||
38 | unsigned long flags = native_save_fl(); | ||
39 | |||
40 | if (!(flags & X86_EFLAGS_IF) || (flags & X86_EFLAGS_AC)) | ||
41 | flags &= ~X86_EFLAGS_IF; | ||
42 | return flags; | ||
43 | } | ||
44 | PV_CALLEE_SAVE_REGS_THUNK(vsmp_save_fl); | ||
45 | |||
46 | __visible void vsmp_restore_fl(unsigned long flags) | ||
47 | { | ||
48 | if (flags & X86_EFLAGS_IF) | ||
49 | flags &= ~X86_EFLAGS_AC; | ||
50 | else | ||
51 | flags |= X86_EFLAGS_AC; | ||
52 | native_restore_fl(flags); | ||
53 | } | ||
54 | PV_CALLEE_SAVE_REGS_THUNK(vsmp_restore_fl); | ||
55 | |||
56 | asmlinkage __visible void vsmp_irq_disable(void) | ||
57 | { | ||
58 | unsigned long flags = native_save_fl(); | ||
59 | |||
60 | native_restore_fl((flags & ~X86_EFLAGS_IF) | X86_EFLAGS_AC); | ||
61 | } | ||
62 | PV_CALLEE_SAVE_REGS_THUNK(vsmp_irq_disable); | ||
63 | |||
64 | asmlinkage __visible void vsmp_irq_enable(void) | ||
65 | { | ||
66 | unsigned long flags = native_save_fl(); | ||
67 | |||
68 | native_restore_fl((flags | X86_EFLAGS_IF) & (~X86_EFLAGS_AC)); | ||
69 | } | ||
70 | PV_CALLEE_SAVE_REGS_THUNK(vsmp_irq_enable); | ||
71 | |||
72 | static unsigned __init vsmp_patch(u8 type, void *ibuf, | ||
73 | unsigned long addr, unsigned len) | ||
74 | { | ||
75 | switch (type) { | ||
76 | case PARAVIRT_PATCH(irq.irq_enable): | ||
77 | case PARAVIRT_PATCH(irq.irq_disable): | ||
78 | case PARAVIRT_PATCH(irq.save_fl): | ||
79 | case PARAVIRT_PATCH(irq.restore_fl): | ||
80 | return paravirt_patch_default(type, ibuf, addr, len); | ||
81 | default: | ||
82 | return native_patch(type, ibuf, addr, len); | ||
83 | } | ||
84 | |||
85 | } | ||
86 | |||
87 | static void __init set_vsmp_pv_ops(void) | ||
88 | { | 31 | { |
89 | void __iomem *address; | 32 | void __iomem *address; |
90 | unsigned int cap, ctl, cfg; | 33 | unsigned int cap, ctl, cfg; |
@@ -109,28 +52,12 @@ static void __init set_vsmp_pv_ops(void) | |||
109 | } | 52 | } |
110 | #endif | 53 | #endif |
111 | 54 | ||
112 | if (cap & ctl & (1 << 4)) { | ||
113 | /* Setup irq ops and turn on vSMP IRQ fastpath handling */ | ||
114 | pv_ops.irq.irq_disable = PV_CALLEE_SAVE(vsmp_irq_disable); | ||
115 | pv_ops.irq.irq_enable = PV_CALLEE_SAVE(vsmp_irq_enable); | ||
116 | pv_ops.irq.save_fl = PV_CALLEE_SAVE(vsmp_save_fl); | ||
117 | pv_ops.irq.restore_fl = PV_CALLEE_SAVE(vsmp_restore_fl); | ||
118 | pv_ops.init.patch = vsmp_patch; | ||
119 | ctl &= ~(1 << 4); | ||
120 | } | ||
121 | writel(ctl, address + 4); | 55 | writel(ctl, address + 4); |
122 | ctl = readl(address + 4); | 56 | ctl = readl(address + 4); |
123 | pr_info("vSMP CTL: control set to:0x%08x\n", ctl); | 57 | pr_info("vSMP CTL: control set to:0x%08x\n", ctl); |
124 | 58 | ||
125 | early_iounmap(address, 8); | 59 | early_iounmap(address, 8); |
126 | } | 60 | } |
127 | #else | ||
128 | static void __init set_vsmp_pv_ops(void) | ||
129 | { | ||
130 | } | ||
131 | #endif | ||
132 | |||
133 | #ifdef CONFIG_PCI | ||
134 | static int is_vsmp = -1; | 61 | static int is_vsmp = -1; |
135 | 62 | ||
136 | static void __init detect_vsmp_box(void) | 63 | static void __init detect_vsmp_box(void) |
@@ -164,11 +91,14 @@ static int is_vsmp_box(void) | |||
164 | { | 91 | { |
165 | return 0; | 92 | return 0; |
166 | } | 93 | } |
94 | static void __init set_vsmp_ctl(void) | ||
95 | { | ||
96 | } | ||
167 | #endif | 97 | #endif |
168 | 98 | ||
169 | static void __init vsmp_cap_cpus(void) | 99 | static void __init vsmp_cap_cpus(void) |
170 | { | 100 | { |
171 | #if !defined(CONFIG_X86_VSMP) && defined(CONFIG_SMP) | 101 | #if !defined(CONFIG_X86_VSMP) && defined(CONFIG_SMP) && defined(CONFIG_PCI) |
172 | void __iomem *address; | 102 | void __iomem *address; |
173 | unsigned int cfg, topology, node_shift, maxcpus; | 103 | unsigned int cfg, topology, node_shift, maxcpus; |
174 | 104 | ||
@@ -221,6 +151,6 @@ void __init vsmp_init(void) | |||
221 | 151 | ||
222 | vsmp_cap_cpus(); | 152 | vsmp_cap_cpus(); |
223 | 153 | ||
224 | set_vsmp_pv_ops(); | 154 | set_vsmp_ctl(); |
225 | return; | 155 | return; |
226 | } | 156 | } |