Merge remote-tracking branch 'remotes/cohuck/tags/s390x-20160720' into staging

Fixes for s390x in the css area.

# gpg: Signature made Wed 20 Jul 2016 15:12:43 BST
# gpg:                using RSA key 0xDECF6B93C6F02FAF
# gpg: Good signature from "Cornelia Huck <huckc@linux.vnet.ibm.com>"
# gpg:                 aka "Cornelia Huck <cornelia.huck@de.ibm.com>"
# Primary key fingerprint: C3D0 D66D C362 4FF6 A8C0  18CE DECF 6B93 C6F0 2FAF

* remotes/cohuck/tags/s390x-20160720:
  s390x/css: provide a dev_path for css devices
  s390x/css: sch_handle_start_func() handles resume, too
  s390x/css: copy CCW format bit from ORB to SCSW

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell
2016-07-20 20:59:05 +01:00
4 changed files with 41 additions and 1 deletions

View File

@@ -59,11 +59,28 @@ static void virtual_css_bus_reset(BusState *qbus)
css_reset(); css_reset();
} }
static char *virtual_css_bus_get_dev_path(DeviceState *dev)
{
CcwDevice *ccw_dev = CCW_DEVICE(dev);
SubchDev *sch = ccw_dev->sch;
VirtualCssBridge *bridge =
VIRTUAL_CSS_BRIDGE(qdev_get_parent_bus(dev)->parent);
/*
* We can't provide a dev path for backward compatibility on
* older machines, as it is visible in the migration stream.
*/
return bridge->css_dev_path ?
g_strdup_printf("/%02x.%1x.%04x", sch->cssid, sch->ssid, sch->devno) :
NULL;
}
static void virtual_css_bus_class_init(ObjectClass *klass, void *data) static void virtual_css_bus_class_init(ObjectClass *klass, void *data)
{ {
BusClass *k = BUS_CLASS(klass); BusClass *k = BUS_CLASS(klass);
k->reset = virtual_css_bus_reset; k->reset = virtual_css_bus_reset;
k->get_dev_path = virtual_css_bus_get_dev_path;
} }
static const TypeInfo virtual_css_bus_info = { static const TypeInfo virtual_css_bus_info = {
@@ -95,6 +112,12 @@ VirtualCssBus *virtual_css_bus_init(void)
/***************** Virtual-css Bus Bridge Device ********************/ /***************** Virtual-css Bus Bridge Device ********************/
static Property virtual_css_bridge_properties[] = {
DEFINE_PROP_BOOL("css_dev_path", VirtualCssBridge, css_dev_path,
true),
DEFINE_PROP_END_OF_LIST(),
};
static void virtual_css_bridge_class_init(ObjectClass *klass, void *data) static void virtual_css_bridge_class_init(ObjectClass *klass, void *data)
{ {
HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(klass); HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(klass);
@@ -102,12 +125,13 @@ static void virtual_css_bridge_class_init(ObjectClass *klass, void *data)
hc->unplug = ccw_device_unplug; hc->unplug = ccw_device_unplug;
set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories); set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
dc->props = virtual_css_bridge_properties;
} }
static const TypeInfo virtual_css_bridge_info = { static const TypeInfo virtual_css_bridge_info = {
.name = TYPE_VIRTUAL_CSS_BRIDGE, .name = TYPE_VIRTUAL_CSS_BRIDGE,
.parent = TYPE_SYS_BUS_DEVICE, .parent = TYPE_SYS_BUS_DEVICE,
.instance_size = sizeof(SysBusDevice), .instance_size = sizeof(VirtualCssBridge),
.class_init = virtual_css_bridge_class_init, .class_init = virtual_css_bridge_class_init,
.interfaces = (InterfaceInfo[]) { .interfaces = (InterfaceInfo[]) {
{ TYPE_HOTPLUG_HANDLER }, { TYPE_HOTPLUG_HANDLER },

View File

@@ -511,6 +511,7 @@ static void sch_handle_start_func(SubchDev *sch, ORB *orb)
path = 0x80; path = 0x80;
if (!(s->ctrl & SCSW_ACTL_SUSP)) { if (!(s->ctrl & SCSW_ACTL_SUSP)) {
/* Start Function triggered via ssch, i.e. we have an ORB */
s->cstat = 0; s->cstat = 0;
s->dstat = 0; s->dstat = 0;
/* Look at the orb and try to execute the channel program. */ /* Look at the orb and try to execute the channel program. */
@@ -524,9 +525,12 @@ static void sch_handle_start_func(SubchDev *sch, ORB *orb)
return; return;
} }
sch->ccw_fmt_1 = !!(orb->ctrl0 & ORB_CTRL0_MASK_FMT); sch->ccw_fmt_1 = !!(orb->ctrl0 & ORB_CTRL0_MASK_FMT);
s->flags |= (sch->ccw_fmt_1) ? SCSW_FLAGS_MASK_FMT : 0;
sch->ccw_no_data_cnt = 0; sch->ccw_no_data_cnt = 0;
suspend_allowed = !!(orb->ctrl0 & ORB_CTRL0_MASK_SPND); suspend_allowed = !!(orb->ctrl0 & ORB_CTRL0_MASK_SPND);
} else { } else {
/* Start Function resumed via rsch, i.e. we don't have an
* ORB */
s->ctrl &= ~(SCSW_ACTL_SUSP | SCSW_ACTL_RESUME_PEND); s->ctrl &= ~(SCSW_ACTL_SUSP | SCSW_ACTL_RESUME_PEND);
/* The channel program had been suspended before. */ /* The channel program had been suspended before. */
suspend_allowed = true; suspend_allowed = true;
@@ -609,6 +613,7 @@ static void do_subchannel_work(SubchDev *sch, ORB *orb)
} else if (s->ctrl & SCSW_FCTL_HALT_FUNC) { } else if (s->ctrl & SCSW_FCTL_HALT_FUNC) {
sch_handle_halt_func(sch); sch_handle_halt_func(sch);
} else if (s->ctrl & SCSW_FCTL_START_FUNC) { } else if (s->ctrl & SCSW_FCTL_START_FUNC) {
/* Triggered by both ssch and rsch. */
sch_handle_start_func(sch, orb); sch_handle_start_func(sch, orb);
} else { } else {
/* Cannot happen. */ /* Cannot happen. */

View File

@@ -322,6 +322,10 @@ static const TypeInfo ccw_machine_info = {
.driver = TYPE_S390_IPL,\ .driver = TYPE_S390_IPL,\
.property = "iplbext_migration",\ .property = "iplbext_migration",\
.value = "off",\ .value = "off",\
}, {\
.driver = TYPE_VIRTUAL_CSS_BRIDGE,\
.property = "css_dev_path",\
.value = "off",\
}, },
#define CCW_COMPAT_2_5 \ #define CCW_COMPAT_2_5 \

View File

@@ -16,7 +16,14 @@
#include "hw/qdev-core.h" #include "hw/qdev-core.h"
/* virtual css bridge */ /* virtual css bridge */
typedef struct VirtualCssBridge {
SysBusDevice sysbus_dev;
bool css_dev_path;
} VirtualCssBridge;
#define TYPE_VIRTUAL_CSS_BRIDGE "virtual-css-bridge" #define TYPE_VIRTUAL_CSS_BRIDGE "virtual-css-bridge"
#define VIRTUAL_CSS_BRIDGE(obj) \
OBJECT_CHECK(VirtualCssBridge, (obj), TYPE_VIRTUAL_CSS_BRIDGE)
/* virtual css bus type */ /* virtual css bus type */
typedef struct VirtualCssBus { typedef struct VirtualCssBus {