diff options
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 | } |
