This control will be used by the H_INT_SYNC hcall from QEMU.

Signed-off-by: Cédric Le Goater <c...@kaod.org>
---
 arch/powerpc/include/uapi/asm/kvm.h        |  1 +
 arch/powerpc/kvm/book3s_xive_native.c      | 34 ++++++++++++++++++++++
 Documentation/virtual/kvm/devices/xive.txt |  9 ++++++
 3 files changed, 44 insertions(+)

diff --git a/arch/powerpc/include/uapi/asm/kvm.h 
b/arch/powerpc/include/uapi/asm/kvm.h
index 7ae8cb22af7d..289c504b7c1d 100644
--- a/arch/powerpc/include/uapi/asm/kvm.h
+++ b/arch/powerpc/include/uapi/asm/kvm.h
@@ -681,6 +681,7 @@ struct kvm_ppc_cpu_char {
 #define KVM_DEV_XIVE_GRP_SOURCE                2       /* 64-bit source 
attributes */
 #define KVM_DEV_XIVE_GRP_SOURCE_CONFIG 3       /* 64-bit source attributes */
 #define KVM_DEV_XIVE_GRP_EQ_CONFIG     4       /* 64-bit eq attributes */
+#define KVM_DEV_XIVE_GRP_SOURCE_SYNC   5       /* 64-bit source attributes */
 
 /* Layout of 64-bit XIVE source attribute values */
 #define KVM_XIVE_LEVEL_SENSITIVE       (1ULL << 0)
diff --git a/arch/powerpc/kvm/book3s_xive_native.c 
b/arch/powerpc/kvm/book3s_xive_native.c
index bb3e121c918a..dd2a9d411fe7 100644
--- a/arch/powerpc/kvm/book3s_xive_native.c
+++ b/arch/powerpc/kvm/book3s_xive_native.c
@@ -341,6 +341,36 @@ static int kvmppc_xive_native_set_source_config(struct 
kvmppc_xive *xive,
                                                       priority, eisn);
 }
 
+static int kvmppc_xive_native_sync_source(struct kvmppc_xive *xive,
+                                         long irq, u64 addr)
+{
+       struct kvmppc_xive_src_block *sb;
+       struct kvmppc_xive_irq_state *state;
+       struct xive_irq_data *xd;
+       u32 hw_num;
+       u16 src;
+
+       pr_devel("%s irq=0x%lx", __func__, irq);
+
+       sb = kvmppc_xive_find_source(xive, irq, &src);
+       if (!sb)
+               return -ENOENT;
+
+       state = &sb->irq_state[src];
+
+       if (!state->valid)
+               return -EINVAL;
+
+       arch_spin_lock(&sb->lock);
+
+       kvmppc_xive_select_irq(state, &hw_num, &xd);
+       xive_native_sync_source(hw_num);
+
+       arch_spin_unlock(&sb->lock);
+
+       return 0;
+}
+
 static int xive_native_validate_queue_size(u32 qsize)
 {
        switch (qsize) {
@@ -631,6 +661,9 @@ static int kvmppc_xive_native_set_attr(struct kvm_device 
*dev,
        case KVM_DEV_XIVE_GRP_EQ_CONFIG:
                return kvmppc_xive_native_set_queue_config(xive, attr->attr,
                                                           attr->addr);
+       case KVM_DEV_XIVE_GRP_SOURCE_SYNC:
+               return kvmppc_xive_native_sync_source(xive, attr->attr,
+                                                     attr->addr);
        }
        return -ENXIO;
 }
@@ -660,6 +693,7 @@ static int kvmppc_xive_native_has_attr(struct kvm_device 
*dev,
                break;
        case KVM_DEV_XIVE_GRP_SOURCE:
        case KVM_DEV_XIVE_GRP_SOURCE_CONFIG:
+       case KVM_DEV_XIVE_GRP_SOURCE_SYNC:
                if (attr->attr >= KVMPPC_XIVE_FIRST_IRQ &&
                    attr->attr < KVMPPC_XIVE_NR_IRQS)
                        return 0;
diff --git a/Documentation/virtual/kvm/devices/xive.txt 
b/Documentation/virtual/kvm/devices/xive.txt
index f1d007f485a9..267634eae9e0 100644
--- a/Documentation/virtual/kvm/devices/xive.txt
+++ b/Documentation/virtual/kvm/devices/xive.txt
@@ -86,3 +86,12 @@ the legacy interrupt mode, referred as XICS (POWER7/8).
     -EFAULT: Invalid user pointer for attr->addr.
     -ENOMEM: Invalid queue address
     -EIO:    Configuration of the underlying HW failed
+
+  5. KVM_DEV_XIVE_GRP_SOURCE_SYNC (write only)
+  Synchronize the source to flush event notification
+  Attributes:
+    Interrupt source number  (64-bit)
+  Errors:
+    -ENOENT: Unknown source number
+    -EINVAL: Not initialized source number, invalid priority or
+             invalid CPU number.
-- 
2.20.1

Reply via email to