Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d4e58e59 authored by Michael Neuling's avatar Michael Neuling Committed by Benjamin Herrenschmidt
Browse files

powerpc/powernv: Enable POWER8 doorbell IPIs



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: default avatarMichael Neuling <mikey@neuling.org>
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent 9b6a68d9
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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
+1 −0
Original line number Diff line number Diff line
@@ -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
+6 −0
Original line number Diff line number Diff line
@@ -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)
+1 −0
Original line number Diff line number Diff line
@@ -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
+8 −1
Original line number Diff line number Diff line
@@ -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,6 +146,12 @@ 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);
#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);
}