diff options
Diffstat (limited to 'arch/powerpc/sysdev/xics')
| -rw-r--r-- | arch/powerpc/sysdev/xics/icp-hv.c | 1 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/xics/icp-native.c | 9 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/xics/ics-opal.c | 17 | 
3 files changed, 17 insertions, 10 deletions
diff --git a/arch/powerpc/sysdev/xics/icp-hv.c b/arch/powerpc/sysdev/xics/icp-hv.c index df0fc582146..c1917cf67c3 100644 --- a/arch/powerpc/sysdev/xics/icp-hv.c +++ b/arch/powerpc/sysdev/xics/icp-hv.c @@ -12,7 +12,6 @@  #include <linux/irq.h>  #include <linux/smp.h>  #include <linux/interrupt.h> -#include <linux/init.h>  #include <linux/cpu.h>  #include <linux/of.h> diff --git a/arch/powerpc/sysdev/xics/icp-native.c b/arch/powerpc/sysdev/xics/icp-native.c index 9dee47071af..de8d9483bbe 100644 --- a/arch/powerpc/sysdev/xics/icp-native.c +++ b/arch/powerpc/sysdev/xics/icp-native.c @@ -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) diff --git a/arch/powerpc/sysdev/xics/ics-opal.c b/arch/powerpc/sysdev/xics/ics-opal.c index 39d72212655..3c6ee1b64e5 100644 --- a/arch/powerpc/sysdev/xics/ics-opal.c +++ b/arch/powerpc/sysdev/xics/ics-opal.c @@ -112,6 +112,7 @@ static int ics_opal_set_affinity(struct irq_data *d,  				 bool force)  {  	unsigned int hw_irq = (unsigned int)irqd_to_hwirq(d); +	__be16 oserver;  	int16_t server;  	int8_t priority;  	int64_t rc; @@ -120,13 +121,13 @@ static int ics_opal_set_affinity(struct irq_data *d,  	if (hw_irq == XICS_IPI || hw_irq == XICS_IRQ_SPURIOUS)  		return -1; -	rc = opal_get_xive(hw_irq, &server, &priority); +	rc = opal_get_xive(hw_irq, &oserver, &priority);  	if (rc != OPAL_SUCCESS) { -		pr_err("%s: opal_set_xive(irq=%d [hw 0x%x] server=%x)" -		       " error %lld\n", -		       __func__, d->irq, hw_irq, server, rc); +		pr_err("%s: opal_get_xive(irq=%d [hw 0x%x]) error %lld\n", +		       __func__, d->irq, hw_irq, rc);  		return -1;  	} +	server = be16_to_cpu(oserver);  	wanted_server = xics_get_irq_server(d->irq, cpumask, 1);  	if (wanted_server < 0) { @@ -181,7 +182,7 @@ static int ics_opal_map(struct ics *ics, unsigned int virq)  {  	unsigned int hw_irq = (unsigned int)virq_to_hw(virq);  	int64_t rc; -	int16_t server; +	__be16 server;  	int8_t priority;  	if (WARN_ON(hw_irq == XICS_IPI || hw_irq == XICS_IRQ_SPURIOUS)) @@ -201,7 +202,7 @@ static int ics_opal_map(struct ics *ics, unsigned int virq)  static void ics_opal_mask_unknown(struct ics *ics, unsigned long vec)  {  	int64_t rc; -	int16_t server; +	__be16 server;  	int8_t priority;  	/* Check if HAL knows about this interrupt */ @@ -215,14 +216,14 @@ static void ics_opal_mask_unknown(struct ics *ics, unsigned long vec)  static long ics_opal_get_server(struct ics *ics, unsigned long vec)  {  	int64_t rc; -	int16_t server; +	__be16 server;  	int8_t priority;  	/* Check if HAL knows about this interrupt */  	rc = opal_get_xive(vec, &server, &priority);  	if (rc != OPAL_SUCCESS)  		return -1; -	return ics_opal_unmangle_server(server); +	return ics_opal_unmangle_server(be16_to_cpu(server));  }  int __init ics_opal_init(void)  | 
