drivers/vfio: Support EEH error injection
authorGavin Shan <gwshan@linux.vnet.ibm.com>
Thu, 26 Mar 2015 05:42:09 +0000 (16:42 +1100)
committerMichael Ellerman <mpe@ellerman.id.au>
Tue, 12 May 2015 10:33:35 +0000 (20:33 +1000)
The patch adds one more EEH sub-command (VFIO_EEH_PE_INJECT_ERR)
to inject the specified EEH error, which is represented by
(struct vfio_eeh_pe_err), to the indicated PE for testing purpose.

Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
Acked-by: Alex Williamson <alex.williamson@redhat.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Documentation/vfio.txt
drivers/vfio/vfio_spapr_eeh.c
include/uapi/linux/vfio.h

index 96978eced34154187acdd328fe403a14ca6200f7..4c746a7e717a9a3c77c7092a0e9fb5c0bc312263 100644 (file)
@@ -385,6 +385,18 @@ The code flow from the example above should be slightly changed:
 
        ....
 
+       /* Inject EEH error, which is expected to be caused by 32-bits
+        * config load.
+        */
+       pe_op.op = VFIO_EEH_PE_INJECT_ERR;
+       pe_op.err.type = EEH_ERR_TYPE_32;
+       pe_op.err.func = EEH_ERR_FUNC_LD_CFG_ADDR;
+       pe_op.err.addr = 0ul;
+       pe_op.err.mask = 0ul;
+       ioctl(container, VFIO_EEH_PE_OP, &pe_op);
+
+       ....
+
        /* When 0xFF's returned from reading PCI config space or IO BARs
         * of the PCI device. Check the PE's state to see if that has been
         * frozen.
index 5fa42db769ee8e5d9d88edd8dbccc71102290ad1..38edeb4729a9d475445bffab51c25ead9c6ae5bb 100644 (file)
@@ -85,6 +85,16 @@ long vfio_spapr_iommu_eeh_ioctl(struct iommu_group *group,
                case VFIO_EEH_PE_CONFIGURE:
                        ret = eeh_pe_configure(pe);
                        break;
+               case VFIO_EEH_PE_INJECT_ERR:
+                       minsz = offsetofend(struct vfio_eeh_pe_op, err.mask);
+                       if (op.argsz < minsz)
+                               return -EINVAL;
+                       if (copy_from_user(&op, (void __user *)arg, minsz))
+                               return -EFAULT;
+
+                       ret = eeh_pe_inject_err(pe, op.err.type, op.err.func,
+                                               op.err.addr, op.err.mask);
+                       break;
                default:
                        ret = -EINVAL;
                }
index b57b750c222f1d5729b7b171a9131e0e1ed9ccd5..e4fa1995f613d651a2f6c9decff891692eca6e60 100644 (file)
@@ -470,12 +470,23 @@ struct vfio_iommu_spapr_tce_info {
  * - unfreeze IO/DMA for frozen PE;
  * - read PE state;
  * - reset PE;
- * - configure PE.
+ * - configure PE;
+ * - inject EEH error.
  */
+struct vfio_eeh_pe_err {
+       __u32 type;
+       __u32 func;
+       __u64 addr;
+       __u64 mask;
+};
+
 struct vfio_eeh_pe_op {
        __u32 argsz;
        __u32 flags;
        __u32 op;
+       union {
+               struct vfio_eeh_pe_err err;
+       };
 };
 
 #define VFIO_EEH_PE_DISABLE            0       /* Disable EEH functionality */
@@ -492,6 +503,7 @@ struct vfio_eeh_pe_op {
 #define VFIO_EEH_PE_RESET_HOT          6       /* Assert hot reset          */
 #define VFIO_EEH_PE_RESET_FUNDAMENTAL  7       /* Assert fundamental reset  */
 #define VFIO_EEH_PE_CONFIGURE          8       /* PE configuration          */
+#define VFIO_EEH_PE_INJECT_ERR         9       /* Inject EEH error          */
 
 #define VFIO_EEH_PE_OP                 _IO(VFIO_TYPE, VFIO_BASE + 21)