Skip to content

Commit

Permalink
s390/IPL: Allow boot from other ssid than 0
Browse files Browse the repository at this point in the history
We now take the subchannel set id also into account to find the boot device.
If we want to use a subchannel set other than the default set 0, we first
need to enable the mss facility.

Signed-off-by: Dominik Dingel <dingel@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Alexander Graf <agraf@suse.de>
  • Loading branch information
Dominik Dingel authored and agraf committed Jul 29, 2013
1 parent 461bdb3 commit c8cda87
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 0 deletions.
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 c8cda87

Please sign in to comment.