]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - arch/powerpc/sysdev/xics/icp-native.c
Merge tag 'for-linus-3.12-merge' of git://git.kernel.org/pub/scm/linux/kernel/git...
[karo-tx-linux.git] / arch / powerpc / sysdev / xics / icp-native.c
index 89db29d17c25fcea905814879b9f75b16cda58ed..9dee47071af8a74bc61cf433da5366d8faef1d11 100644 (file)
@@ -51,6 +51,12 @@ static struct icp_ipl __iomem *icp_native_regs[NR_CPUS];
 static inline unsigned int icp_native_get_xirr(void)
 {
        int cpu = smp_processor_id();
+       unsigned int xirr;
+
+       /* Handled an interrupt latched by KVM */
+       xirr = kvmppc_get_xics_latch();
+       if (xirr)
+               return xirr;
 
        return in_be32(&icp_native_regs[cpu]->xirr.word);
 }
@@ -138,6 +144,7 @@ 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);
 }
 
@@ -151,6 +158,7 @@ static irqreturn_t icp_native_ipi_action(int irq, void *dev_id)
 {
        int cpu = smp_processor_id();
 
+       kvmppc_set_host_ipi(cpu, 0);
        icp_native_set_qirr(cpu, 0xff);
 
        return smp_ipi_demux();
@@ -208,7 +216,7 @@ static int __init icp_native_init_one_node(struct device_node *np,
                                           unsigned int *indx)
 {
        unsigned int ilen;
-       const u32 *ireg;
+       const __be32 *ireg;
        int i;
        int reg_tuple_size;
        int num_servers = 0;