Skip to content

Commit

Permalink
Merge remote-tracking branch 'agraf/s390-for-upstream' into staging
Browse files Browse the repository at this point in the history
# 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>
  • Loading branch information
Anthony Liguori committed Jul 29, 2013
2 parents f60a0d6 + 867b18d commit b0a71c3
Show file tree
Hide file tree
Showing 6 changed files with 58 additions and 10 deletions.
22 changes: 12 additions & 10 deletions hw/s390x/ipl.c
Expand Up @@ -154,17 +154,19 @@ static void s390_ipl_reset(DeviceState *dev)
env->psw.mask = IPL_PSW_MASK;

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);
VirtioCcwDevice *ccw_dev = (VirtioCcwDevice *) object_dynamic_cast(
OBJECT(&(dev_st->parent_obj)), "virtio-blk-ccw");

if (ccw_dev) {
env->regs[7] = ccw_dev->sch->cssid << 24 |
ccw_dev->sch->ssid << 16 |
ccw_dev->sch->devno;
} else {
env->regs[7] = -1;
if (dev_st) {
VirtioCcwDevice *ccw_dev = (VirtioCcwDevice *) object_dynamic_cast(
OBJECT(qdev_get_parent_bus(dev_st)->parent),
TYPE_VIRTIO_CCW_DEVICE);

if (ccw_dev) {
env->regs[7] = ccw_dev->sch->cssid << 24 |
ccw_dev->sch->ssid << 16 |
ccw_dev->sch->devno;
}
}
}

Expand Down
Binary file modified pc-bios/s390-ccw.img
Binary file not shown.
20 changes: 20 additions & 0 deletions pc-bios/s390-ccw/cio.h
Expand Up @@ -93,6 +93,26 @@ struct subchannel_id {
__u32 sch_no : 16;
} __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
*/
Expand Down
7 changes: 7 additions & 0 deletions pc-bios/s390-ccw/main.c
Expand Up @@ -35,6 +35,13 @@ static void virtio_setup(uint64_t dev_info)
check_devno = true;
dev_no = dev_info & 0xffff;
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++) {
Expand Down
1 change: 1 addition & 0 deletions pc-bios/s390-ccw/s390-ccw.h
Expand Up @@ -61,6 +61,7 @@ unsigned long virtio_load_direct(ulong rec_list1, ulong rec_list2,
bool virtio_is_blk(struct subchannel_id schid);
void virtio_setup_block(struct subchannel_id schid);
int virtio_read(ulong sector, void *load_addr);
int enable_mss_facility(void);

/* bootmap.c */
int zipl_load(void);
Expand Down
18 changes: 18 additions & 0 deletions pc-bios/s390-ccw/virtio.c
Expand Up @@ -13,6 +13,8 @@

struct vring block;

static char chsc_page[PAGE_SIZE] __attribute__((__aligned__(PAGE_SIZE)));

static long kvm_hypercall(unsigned long nr, unsigned long param1,
unsigned long param2)
{
Expand Down Expand Up @@ -301,3 +303,19 @@ bool virtio_is_blk(struct subchannel_id schid)
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;
}

0 comments on commit b0a71c3

Please sign in to comment.