|
 |
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 |
|