]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
powerpc/powernv: Enable POWER8 doorbell IPIs
authorMichael Neuling <mikey@neuling.org>
Wed, 11 Jun 2014 05:59:28 +0000 (15:59 +1000)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Wed, 11 Jun 2014 07:05:12 +0000 (17:05 +1000)
This patch enables POWER8 doorbell IPIs on powernv.

Since doorbells can only IPI within a core, we test to see when we can use
doorbells and if not we fall back to XICS.  This also enables hypervisor
doorbells to wakeup us up from nap/sleep via the LPCR PECEDH bit.

Based on tests by Anton, the best case IPI latency between two threads dropped
from 894ns to 512ns.

Signed-off-by: Michael Neuling <mikey@neuling.org>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
arch/powerpc/kernel/cpu_setup_power.S
arch/powerpc/platforms/powernv/Kconfig
arch/powerpc/platforms/powernv/smp.c
arch/powerpc/platforms/pseries/Kconfig
arch/powerpc/sysdev/xics/icp-native.c

index 1557e7c2c7e15bc45120eedde3d288792676f235..46733535cc0b482a1ea35fe8411c556fb26fcb3b 100644 (file)
@@ -56,6 +56,7 @@ _GLOBAL(__setup_cpu_power8)
        li      r0,0
        mtspr   SPRN_LPID,r0
        mfspr   r3,SPRN_LPCR
+       ori     r3, r3, LPCR_PECEDH
        bl      __init_LPCR
        bl      __init_HFSCR
        bl      __init_tlb_power8
@@ -74,6 +75,7 @@ _GLOBAL(__restore_cpu_power8)
        li      r0,0
        mtspr   SPRN_LPID,r0
        mfspr   r3,SPRN_LPCR
+       ori     r3, r3, LPCR_PECEDH
        bl      __init_LPCR
        bl      __init_HFSCR
        bl      __init_tlb_power8
index c252ee95bddf31b17e676f0d46a852880502f131..45a8ed0585cd17cd1aef9675d759e7342c8ca334 100644 (file)
@@ -17,6 +17,7 @@ config PPC_POWERNV
        select CPU_FREQ_GOV_USERSPACE
        select CPU_FREQ_GOV_ONDEMAND
        select CPU_FREQ_GOV_CONSERVATIVE
+       select PPC_DOORBELL
        default y
 
 config PPC_POWERNV_RTAS
index 0062a43a2e0d8e96698cf0cb090adce0170b4581..5fcfcf44e3a9b949e6536ebcf53038645286fde6 100644 (file)
@@ -32,6 +32,7 @@
 #include <asm/opal.h>
 #include <asm/runlatch.h>
 #include <asm/code-patching.h>
+#include <asm/dbell.h>
 
 #include "powernv.h"
 
@@ -46,6 +47,11 @@ static void pnv_smp_setup_cpu(int cpu)
 {
        if (cpu != boot_cpuid)
                xics_setup_cpu();
+
+#ifdef CONFIG_PPC_DOORBELL
+       if (cpu_has_feature(CPU_FTR_DBELL))
+               doorbell_setup_this_cpu();
+#endif
 }
 
 int pnv_smp_kick_cpu(int nr)
index 2cb8b776c84a5660e5ef225cc004fbdcc9109f96..756b482f819a425a1dcd74bdfe0ab178f6b0617d 100644 (file)
@@ -21,6 +21,7 @@ config PPC_PSERIES
        select HAVE_CONTEXT_TRACKING
        select HOTPLUG_CPU if SMP
        select ARCH_RANDOM
+       select PPC_DOORBELL
        default y
 
 config PPC_SPLPAR
index 9dee47071af8a74bc61cf433da5366d8faef1d11..de8d9483bbe89136042d0685680c6bddc815849a 100644 (file)
@@ -26,6 +26,7 @@
 #include <asm/errno.h>
 #include <asm/xics.h>
 #include <asm/kvm_ppc.h>
+#include <asm/dbell.h>
 
 struct icp_ipl {
        union {
@@ -145,7 +146,13 @@ static unsigned int icp_native_get_irq(void)
 static void icp_native_cause_ipi(int cpu, unsigned long data)
 {
        kvmppc_set_host_ipi(cpu, 1);
-       icp_native_set_qirr(cpu, IPI_PRIORITY);
+#ifdef CONFIG_PPC_DOORBELL
+       if (cpu_has_feature(CPU_FTR_DBELL) &&
+           (cpumask_test_cpu(cpu, cpu_sibling_mask(smp_processor_id()))))
+               doorbell_cause_ipi(cpu, data);
+       else
+#endif
+               icp_native_set_qirr(cpu, IPI_PRIORITY);
 }
 
 void xics_wake_cpu(int cpu)