192f2ca38SAlexander Graf /* 292f2ca38SAlexander Graf * S390 virtio-ccw loading program 392f2ca38SAlexander Graf * 492f2ca38SAlexander Graf * Copyright (c) 2013 Alexander Graf <agraf@suse.de> 592f2ca38SAlexander Graf * 692f2ca38SAlexander Graf * This work is licensed under the terms of the GNU GPL, version 2 or (at 792f2ca38SAlexander Graf * your option) any later version. See the COPYING file in the top-level 892f2ca38SAlexander Graf * directory. 992f2ca38SAlexander Graf */ 1092f2ca38SAlexander Graf 1192f2ca38SAlexander Graf #include "s390-ccw.h" 1292f2ca38SAlexander Graf 1392f2ca38SAlexander Graf struct subchannel_id blk_schid; 1492f2ca38SAlexander Graf char stack[PAGE_SIZE * 8] __attribute__((__aligned__(PAGE_SIZE))); 1592f2ca38SAlexander Graf 1692f2ca38SAlexander Graf void virtio_panic(const char *string) 1792f2ca38SAlexander Graf { 1892f2ca38SAlexander Graf sclp_print(string); 197f61cbc1SChristian Borntraeger disabled_wait(); 2092f2ca38SAlexander Graf while (1) { } 2192f2ca38SAlexander Graf } 2292f2ca38SAlexander Graf 2392f2ca38SAlexander Graf static void virtio_setup(void) 2492f2ca38SAlexander Graf { 25*22d67ab5SCornelia Huck struct schib schib; 2692f2ca38SAlexander Graf int i; 2792f2ca38SAlexander Graf int r; 2892f2ca38SAlexander Graf bool found = false; 2992f2ca38SAlexander Graf 3092f2ca38SAlexander Graf blk_schid.one = 1; 3192f2ca38SAlexander Graf 3292f2ca38SAlexander Graf for (i = 0; i < 0x10000; i++) { 3392f2ca38SAlexander Graf blk_schid.sch_no = i; 34*22d67ab5SCornelia Huck r = stsch_err(blk_schid, &schib); 35*22d67ab5SCornelia Huck if (r == 3) { 36*22d67ab5SCornelia Huck break; 37*22d67ab5SCornelia Huck } 38*22d67ab5SCornelia Huck if (schib.pmcw.dnv) { 3992f2ca38SAlexander Graf if (virtio_is_blk(blk_schid)) { 4092f2ca38SAlexander Graf found = true; 4192f2ca38SAlexander Graf break; 4292f2ca38SAlexander Graf } 4392f2ca38SAlexander Graf } 4492f2ca38SAlexander Graf } 4592f2ca38SAlexander Graf 4692f2ca38SAlexander Graf if (!found) { 4792f2ca38SAlexander Graf virtio_panic("No virtio-blk device found!\n"); 4892f2ca38SAlexander Graf } 4992f2ca38SAlexander Graf 5092f2ca38SAlexander Graf virtio_setup_block(blk_schid); 5192f2ca38SAlexander Graf } 5292f2ca38SAlexander Graf 5392f2ca38SAlexander Graf int main(void) 5492f2ca38SAlexander Graf { 5592f2ca38SAlexander Graf sclp_setup(); 5692f2ca38SAlexander Graf virtio_setup(); 5792f2ca38SAlexander Graf if (zipl_load() < 0) 5892f2ca38SAlexander Graf sclp_print("Failed to load OS from hard disk\n"); 597f61cbc1SChristian Borntraeger disabled_wait(); 6092f2ca38SAlexander Graf while (1) { } 6192f2ca38SAlexander Graf } 62