Merge remote-tracking branch 'agraf/s390-for-upstream' into staging
# By Alexander Graf (1) and others # Via Alexander Graf * agraf/s390-for-upstream: s390: update s390-ccw.img s390/ipl: Fix boot order s390/IPL: Allow boot from other ssid than 0 Message-id: 1375092324-23943-1-git-send-email-agraf@suse.de Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
commit
b0a71c3b39
|
@ -154,17 +154,19 @@ static void s390_ipl_reset(DeviceState *dev)
|
||||||
env->psw.mask = IPL_PSW_MASK;
|
env->psw.mask = IPL_PSW_MASK;
|
||||||
|
|
||||||
if (!ipl->kernel) {
|
if (!ipl->kernel) {
|
||||||
/* booting firmware, tell what device to boot from */
|
/* Tell firmware, if there is a preferred boot device */
|
||||||
|
env->regs[7] = -1;
|
||||||
DeviceState *dev_st = get_boot_device(0);
|
DeviceState *dev_st = get_boot_device(0);
|
||||||
VirtioCcwDevice *ccw_dev = (VirtioCcwDevice *) object_dynamic_cast(
|
if (dev_st) {
|
||||||
OBJECT(&(dev_st->parent_obj)), "virtio-blk-ccw");
|
VirtioCcwDevice *ccw_dev = (VirtioCcwDevice *) object_dynamic_cast(
|
||||||
|
OBJECT(qdev_get_parent_bus(dev_st)->parent),
|
||||||
|
TYPE_VIRTIO_CCW_DEVICE);
|
||||||
|
|
||||||
if (ccw_dev) {
|
if (ccw_dev) {
|
||||||
env->regs[7] = ccw_dev->sch->cssid << 24 |
|
env->regs[7] = ccw_dev->sch->cssid << 24 |
|
||||||
ccw_dev->sch->ssid << 16 |
|
ccw_dev->sch->ssid << 16 |
|
||||||
ccw_dev->sch->devno;
|
ccw_dev->sch->devno;
|
||||||
} else {
|
}
|
||||||
env->regs[7] = -1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Binary file not shown.
|
@ -93,6 +93,26 @@ struct subchannel_id {
|
||||||
__u32 sch_no : 16;
|
__u32 sch_no : 16;
|
||||||
} __attribute__ ((packed, aligned(4)));
|
} __attribute__ ((packed, aligned(4)));
|
||||||
|
|
||||||
|
struct chsc_header {
|
||||||
|
__u16 length;
|
||||||
|
__u16 code;
|
||||||
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
struct chsc_area_sda {
|
||||||
|
struct chsc_header request;
|
||||||
|
__u8 reserved1:4;
|
||||||
|
__u8 format:4;
|
||||||
|
__u8 reserved2;
|
||||||
|
__u16 operation_code;
|
||||||
|
__u32 reserved3;
|
||||||
|
__u32 reserved4;
|
||||||
|
__u32 operation_data_area[252];
|
||||||
|
struct chsc_header response;
|
||||||
|
__u32 reserved5:4;
|
||||||
|
__u32 format2:4;
|
||||||
|
__u32 reserved6:24;
|
||||||
|
} __attribute__((packed));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* TPI info structure
|
* TPI info structure
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -35,6 +35,13 @@ static void virtio_setup(uint64_t dev_info)
|
||||||
check_devno = true;
|
check_devno = true;
|
||||||
dev_no = dev_info & 0xffff;
|
dev_no = dev_info & 0xffff;
|
||||||
debug_print_int("device no. ", dev_no);
|
debug_print_int("device no. ", dev_no);
|
||||||
|
blk_schid.ssid = (dev_info >> 16) & 0x3;
|
||||||
|
if (blk_schid.ssid != 0) {
|
||||||
|
debug_print_int("ssid ", blk_schid.ssid);
|
||||||
|
if (enable_mss_facility() != 0) {
|
||||||
|
virtio_panic("Failed to enable mss facility\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < 0x10000; i++) {
|
for (i = 0; i < 0x10000; i++) {
|
||||||
|
|
|
@ -61,6 +61,7 @@ unsigned long virtio_load_direct(ulong rec_list1, ulong rec_list2,
|
||||||
bool virtio_is_blk(struct subchannel_id schid);
|
bool virtio_is_blk(struct subchannel_id schid);
|
||||||
void virtio_setup_block(struct subchannel_id schid);
|
void virtio_setup_block(struct subchannel_id schid);
|
||||||
int virtio_read(ulong sector, void *load_addr);
|
int virtio_read(ulong sector, void *load_addr);
|
||||||
|
int enable_mss_facility(void);
|
||||||
|
|
||||||
/* bootmap.c */
|
/* bootmap.c */
|
||||||
int zipl_load(void);
|
int zipl_load(void);
|
||||||
|
|
|
@ -13,6 +13,8 @@
|
||||||
|
|
||||||
struct vring block;
|
struct vring block;
|
||||||
|
|
||||||
|
static char chsc_page[PAGE_SIZE] __attribute__((__aligned__(PAGE_SIZE)));
|
||||||
|
|
||||||
static long kvm_hypercall(unsigned long nr, unsigned long param1,
|
static long kvm_hypercall(unsigned long nr, unsigned long param1,
|
||||||
unsigned long param2)
|
unsigned long param2)
|
||||||
{
|
{
|
||||||
|
@ -301,3 +303,19 @@ bool virtio_is_blk(struct subchannel_id schid)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int enable_mss_facility(void)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
struct chsc_area_sda *sda_area = (struct chsc_area_sda *) chsc_page;
|
||||||
|
|
||||||
|
memset(sda_area, 0, PAGE_SIZE);
|
||||||
|
sda_area->request.length = 0x0400;
|
||||||
|
sda_area->request.code = 0x0031;
|
||||||
|
sda_area->operation_code = 0x2;
|
||||||
|
|
||||||
|
ret = chsc(sda_area);
|
||||||
|
if ((ret == 0) && (sda_area->response.code == 0x0001)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue