thebeanogamer / rpms / qemu-kvm

Forked from rpms/qemu-kvm 8 months ago
Clone
a83cc2
From 4eb1f0936bfc921cad9af37f1573075148843b1d Mon Sep 17 00:00:00 2001
a83cc2
From: Eric Farman <farman@linux.ibm.com>
a83cc2
Date: Thu, 24 Jun 2021 14:15:16 -0400
a83cc2
Subject: [PATCH 04/43] s390x/css: Add passthrough IRB
a83cc2
a83cc2
RH-Author: Miroslav Rezanina <mrezanin@redhat.com>
a83cc2
RH-Bugzilla: 1957194
a83cc2
a83cc2
Wire in the subchannel callback for building the IRB
a83cc2
ESW and ECW space for passthrough devices, and copy
a83cc2
the hardware's ESW into the IRB we are building.
a83cc2
a83cc2
If the hardware presented concurrent sense, then copy
a83cc2
that sense data into the IRB's ECW space.
a83cc2
a83cc2
Signed-off-by: Eric Farman <farman@linux.ibm.com>
a83cc2
Message-Id: <20210617232537.1337506-5-farman@linux.ibm.com>
a83cc2
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
a83cc2
(cherry picked from commit c626710fc755628d0d6b88aab0514c9238a84522)
a83cc2
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
a83cc2
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
a83cc2
---
a83cc2
 hw/s390x/css.c         | 16 +++++++++++++++-
a83cc2
 hw/s390x/s390-ccw.c    |  1 +
a83cc2
 hw/vfio/ccw.c          |  4 ++++
a83cc2
 include/hw/s390x/css.h |  3 +++
a83cc2
 4 files changed, 23 insertions(+), 1 deletion(-)
a83cc2
a83cc2
diff --git a/hw/s390x/css.c b/hw/s390x/css.c
a83cc2
index e77a0e523d..c3150da4f7 100644
a83cc2
--- a/hw/s390x/css.c
a83cc2
+++ b/hw/s390x/css.c
a83cc2
@@ -1336,7 +1336,7 @@ static void copy_schib_to_guest(SCHIB *dest, const SCHIB *src)
a83cc2
     }
a83cc2
 }
a83cc2
 
a83cc2
-static void copy_esw_to_guest(ESW *dest, const ESW *src)
a83cc2
+void copy_esw_to_guest(ESW *dest, const ESW *src)
a83cc2
 {
a83cc2
     dest->word0 = cpu_to_be32(src->word0);
a83cc2
     dest->erw = cpu_to_be32(src->erw);
a83cc2
@@ -1651,6 +1651,20 @@ static void build_irb_sense_data(SubchDev *sch, IRB *irb)
a83cc2
     }
a83cc2
 }
a83cc2
 
a83cc2
+void build_irb_passthrough(SubchDev *sch, IRB *irb)
a83cc2
+{
a83cc2
+    /* Copy ESW from hardware */
a83cc2
+    irb->esw = sch->esw;
a83cc2
+
a83cc2
+    /*
a83cc2
+     * If (irb->esw.erw & ESW_ERW_SENSE) is true, then the contents
a83cc2
+     * of the ECW is sense data. If false, then it is model-dependent
a83cc2
+     * information. Either way, copy it into the IRB for the guest to
a83cc2
+     * read/decide what to do with.
a83cc2
+     */
a83cc2
+    build_irb_sense_data(sch, irb);
a83cc2
+}
a83cc2
+
a83cc2
 void build_irb_virtual(SubchDev *sch, IRB *irb)
a83cc2
 {
a83cc2
     SCHIB *schib = &sch->curr_status;
a83cc2
diff --git a/hw/s390x/s390-ccw.c b/hw/s390x/s390-ccw.c
a83cc2
index b497571863..39cbea615b 100644
a83cc2
--- a/hw/s390x/s390-ccw.c
a83cc2
+++ b/hw/s390x/s390-ccw.c
a83cc2
@@ -125,6 +125,7 @@ static void s390_ccw_realize(S390CCWDevice *cdev, char *sysfsdev, Error **errp)
a83cc2
     }
a83cc2
     sch->driver_data = cdev;
a83cc2
     sch->do_subchannel_work = do_subchannel_work_passthrough;
a83cc2
+    sch->irb_cb = build_irb_passthrough;
a83cc2
 
a83cc2
     ccw_dev->sch = sch;
a83cc2
     ret = css_sch_build_schib(sch, &cdev->hostid);
a83cc2
diff --git a/hw/vfio/ccw.c b/hw/vfio/ccw.c
a83cc2
index b2df708e4b..5f141d44a4 100644
a83cc2
--- a/hw/vfio/ccw.c
a83cc2
+++ b/hw/vfio/ccw.c
a83cc2
@@ -322,6 +322,7 @@ static void vfio_ccw_io_notifier_handler(void *opaque)
a83cc2
     SCHIB *schib = &sch->curr_status;
a83cc2
     SCSW s;
a83cc2
     IRB irb;
a83cc2
+    ESW esw;
a83cc2
     int size;
a83cc2
 
a83cc2
     if (!event_notifier_test_and_clear(&vcdev->io_notifier)) {
a83cc2
@@ -372,6 +373,9 @@ static void vfio_ccw_io_notifier_handler(void *opaque)
a83cc2
     copy_scsw_to_guest(&s, &irb.scsw);
a83cc2
     schib->scsw = s;
a83cc2
 
a83cc2
+    copy_esw_to_guest(&esw, &irb.esw);
a83cc2
+    sch->esw = esw;
a83cc2
+
a83cc2
     /* If a uint check is pending, copy sense data. */
a83cc2
     if ((schib->scsw.dstat & SCSW_DSTAT_UNIT_CHECK) &&
a83cc2
         (schib->pmcw.chars & PMCW_CHARS_MASK_CSENSE)) {
a83cc2
diff --git a/include/hw/s390x/css.h b/include/hw/s390x/css.h
a83cc2
index 7c23a13f3d..10ed1df1bb 100644
a83cc2
--- a/include/hw/s390x/css.h
a83cc2
+++ b/include/hw/s390x/css.h
a83cc2
@@ -141,6 +141,7 @@ struct SubchDev {
a83cc2
     void (*irb_cb)(SubchDev *, IRB *);
a83cc2
     SenseId id;
a83cc2
     void *driver_data;
a83cc2
+    ESW esw;
a83cc2
 };
a83cc2
 
a83cc2
 static inline void sch_gen_unit_exception(SubchDev *sch)
a83cc2
@@ -202,6 +203,7 @@ int css_sch_build_schib(SubchDev *sch, CssDevId *dev_id);
a83cc2
 unsigned int css_find_free_chpid(uint8_t cssid);
a83cc2
 uint16_t css_build_subchannel_id(SubchDev *sch);
a83cc2
 void copy_scsw_to_guest(SCSW *dest, const SCSW *src);
a83cc2
+void copy_esw_to_guest(ESW *dest, const ESW *src);
a83cc2
 void css_inject_io_interrupt(SubchDev *sch);
a83cc2
 void css_reset(void);
a83cc2
 void css_reset_sch(SubchDev *sch);
a83cc2
@@ -216,6 +218,7 @@ void css_clear_sei_pending(void);
a83cc2
 IOInstEnding s390_ccw_cmd_request(SubchDev *sch);
a83cc2
 IOInstEnding do_subchannel_work_virtual(SubchDev *sub);
a83cc2
 IOInstEnding do_subchannel_work_passthrough(SubchDev *sub);
a83cc2
+void build_irb_passthrough(SubchDev *sch, IRB *irb);
a83cc2
 void build_irb_virtual(SubchDev *sch, IRB *irb);
a83cc2
 
a83cc2
 int s390_ccw_halt(SubchDev *sch);
a83cc2
-- 
a83cc2
2.27.0
a83cc2