Message ID | 1366658298-9275-6-git-send-email-agraf@suse.de |
---|---|
State | New |
Headers | show |
On 22/04/13 21:18, Alexander Graf wrote: > This C file is the main driving piece of the s390 ccw firmware. It > provides a search for a workable block device, sets it as the default > to boot off of and boots from it. > > Signed-off-by: Alexander Graf <agraf@suse.de> > --- > pc-bios/s390-ccw/main.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++ > 1 files changed, 56 insertions(+), 0 deletions(-) > create mode 100644 pc-bios/s390-ccw/main.c > > diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c > new file mode 100644 > index 0000000..0913aac > --- /dev/null > +++ b/pc-bios/s390-ccw/main.c > @@ -0,0 +1,56 @@ > +/* > + * S390 virtio-ccw loading program > + * > + * Copyright (c) 2013 Alexander Graf <agraf@suse.de> > + * > + * This work is licensed under the terms of the GNU GPL, version 2 or (at > + * your option) any later version. See the COPYING file in the top-level > + * directory. > + */ > + > +#include "s390-ccw.h" > + > +struct subchannel_id blk_schid; > +char stack[PAGE_SIZE * 8] __attribute__((__aligned__(PAGE_SIZE))); > + > +void virtio_panic(const char *string) > +{ > + sclp_print(string); > + while (1) { } > +} > + > +static void virtio_setup(void) > +{ > + struct irb irb; > + int i; > + int r; > + bool found = false; > + > + blk_schid.one = 1; > + > + for (i = 0; i < 0x10000; i++) { > + blk_schid.sch_no = i; > + r = tsch(blk_schid, &irb); > + if (r != 3) { > + if (virtio_is_blk(blk_schid)) { > + found = true; > + break; > + } > + } > + } > + > + if (!found) { > + virtio_panic("No virtio-blk device found!\n"); > + } > + > + virtio_setup_block(blk_schid); > +} > + > +int main(void) > +{ > + sclp_setup(); The sclp patch should probably be moved before this one... > + virtio_setup(); > + if (zipl_load() < 0) ...as well as the bootmap loader > + sclp_print("Failed to load OS from hard disk\n"); > + while (1) { } This would waste host cpus spinning, no? Please do a disabled wait. The easiest way might be a short assember routine: .globl disabled_wait disabled_wait: larl %r1,disabled_wait_psw lpswe 0(%r1) .align 8 disabled_wait_psw: .quad 0x0002000180000000,0x0000000000000000
On Mon, 22 Apr 2013 21:18:11 +0200 Alexander Graf <agraf@suse.de> wrote: > This C file is the main driving piece of the s390 ccw firmware. It > provides a search for a workable block device, sets it as the default > to boot off of and boots from it. > > Signed-off-by: Alexander Graf <agraf@suse.de> > --- > pc-bios/s390-ccw/main.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++ > 1 files changed, 56 insertions(+), 0 deletions(-) > create mode 100644 pc-bios/s390-ccw/main.c > > diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c > new file mode 100644 > index 0000000..0913aac > --- /dev/null > +++ b/pc-bios/s390-ccw/main.c > @@ -0,0 +1,56 @@ > +/* > + * S390 virtio-ccw loading program > + * > + * Copyright (c) 2013 Alexander Graf <agraf@suse.de> > + * > + * This work is licensed under the terms of the GNU GPL, version 2 or (at > + * your option) any later version. See the COPYING file in the top-level > + * directory. > + */ > + > +#include "s390-ccw.h" > + > +struct subchannel_id blk_schid; > +char stack[PAGE_SIZE * 8] __attribute__((__aligned__(PAGE_SIZE))); > + > +void virtio_panic(const char *string) > +{ > + sclp_print(string); > + while (1) { } > +} > + > +static void virtio_setup(void) > +{ > + struct irb irb; > + int i; > + int r; > + bool found = false; > + > + blk_schid.one = 1; > + > + for (i = 0; i < 0x10000; i++) { > + blk_schid.sch_no = i; > + r = tsch(blk_schid, &irb); You want to do a stsch() loop here, not a tsch() loop :) As a bonus, you can exit the loop on cc == 3. r = stsch(blk_schid, &schib); if (r == 3) { break; } > + if (r != 3) { if (schib.pmcw.dnv) { > + if (virtio_is_blk(blk_schid)) { > + found = true; > + break; > + } > + } > + } > + > + if (!found) { > + virtio_panic("No virtio-blk device found!\n"); > + } > + > + virtio_setup_block(blk_schid); The virtio_is_blk() and virtio_setup_block() functions should go into a preceding patch, no? > +} > + > +int main(void) > +{ > + sclp_setup(); > + virtio_setup(); > + if (zipl_load() < 0) > + sclp_print("Failed to load OS from hard disk\n"); > + while (1) { } > +}
On 04/23/2013 10:58 AM, Cornelia Huck wrote: > On Mon, 22 Apr 2013 21:18:11 +0200 > Alexander Graf<agraf@suse.de> wrote: > >> This C file is the main driving piece of the s390 ccw firmware. It >> provides a search for a workable block device, sets it as the default >> to boot off of and boots from it. >> >> Signed-off-by: Alexander Graf<agraf@suse.de> >> --- >> pc-bios/s390-ccw/main.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++ >> 1 files changed, 56 insertions(+), 0 deletions(-) >> create mode 100644 pc-bios/s390-ccw/main.c >> >> diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c >> new file mode 100644 >> index 0000000..0913aac >> --- /dev/null >> +++ b/pc-bios/s390-ccw/main.c >> @@ -0,0 +1,56 @@ >> +/* >> + * S390 virtio-ccw loading program >> + * >> + * Copyright (c) 2013 Alexander Graf<agraf@suse.de> >> + * >> + * This work is licensed under the terms of the GNU GPL, version 2 or (at >> + * your option) any later version. See the COPYING file in the top-level >> + * directory. >> + */ >> + >> +#include "s390-ccw.h" >> + >> +struct subchannel_id blk_schid; >> +char stack[PAGE_SIZE * 8] __attribute__((__aligned__(PAGE_SIZE))); >> + >> +void virtio_panic(const char *string) >> +{ >> + sclp_print(string); >> + while (1) { } >> +} >> + >> +static void virtio_setup(void) >> +{ >> + struct irb irb; >> + int i; >> + int r; >> + bool found = false; >> + >> + blk_schid.one = 1; >> + >> + for (i = 0; i< 0x10000; i++) { >> + blk_schid.sch_no = i; >> + r = tsch(blk_schid,&irb); > You want to do a stsch() loop here, not a tsch() loop :) What does stsch buy us over tsch? > As a bonus, you can exit the loop on cc == 3. > > r = stsch(blk_schid,&schib); > if (r == 3) { > break; > } > >> + if (r != 3) { > if (schib.pmcw.dnv) { > >> + if (virtio_is_blk(blk_schid)) { >> + found = true; >> + break; >> + } >> + } >> + } >> + >> + if (!found) { >> + virtio_panic("No virtio-blk device found!\n"); >> + } >> + >> + virtio_setup_block(blk_schid); > The virtio_is_blk() and virtio_setup_block() functions should go into a > preceding patch, no? The code doesn't get compiled before the end of the series anyway, so ordering might be slightly off :) Alex
On Tue, 23 Apr 2013 13:35:47 +0200 Alexander Graf <agraf@suse.de> wrote: > On 04/23/2013 10:58 AM, Cornelia Huck wrote: > > On Mon, 22 Apr 2013 21:18:11 +0200 > > Alexander Graf<agraf@suse.de> wrote: > > > >> This C file is the main driving piece of the s390 ccw firmware. It > >> provides a search for a workable block device, sets it as the default > >> to boot off of and boots from it. > >> > >> Signed-off-by: Alexander Graf<agraf@suse.de> > >> --- > >> pc-bios/s390-ccw/main.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++ > >> 1 files changed, 56 insertions(+), 0 deletions(-) > >> create mode 100644 pc-bios/s390-ccw/main.c > >> > >> diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c > >> new file mode 100644 > >> index 0000000..0913aac > >> --- /dev/null > >> +++ b/pc-bios/s390-ccw/main.c > >> @@ -0,0 +1,56 @@ > >> +/* > >> + * S390 virtio-ccw loading program > >> + * > >> + * Copyright (c) 2013 Alexander Graf<agraf@suse.de> > >> + * > >> + * This work is licensed under the terms of the GNU GPL, version 2 or (at > >> + * your option) any later version. See the COPYING file in the top-level > >> + * directory. > >> + */ > >> + > >> +#include "s390-ccw.h" > >> + > >> +struct subchannel_id blk_schid; > >> +char stack[PAGE_SIZE * 8] __attribute__((__aligned__(PAGE_SIZE))); > >> + > >> +void virtio_panic(const char *string) > >> +{ > >> + sclp_print(string); > >> + while (1) { } > >> +} > >> + > >> +static void virtio_setup(void) > >> +{ > >> + struct irb irb; > >> + int i; > >> + int r; > >> + bool found = false; > >> + > >> + blk_schid.one = 1; > >> + > >> + for (i = 0; i< 0x10000; i++) { > >> + blk_schid.sch_no = i; > >> + r = tsch(blk_schid,&irb); > > You want to do a stsch() loop here, not a tsch() loop :) > > What does stsch buy us over tsch? A stsch() loop is the canonical way to find devices. tsch() is for updating subchannel status. And: > > As a bonus, you can exit the loop on cc == 3. :) > > > > r = stsch(blk_schid,&schib); > > if (r == 3) { > > break; > > } > > > >> + if (r != 3) { > > if (schib.pmcw.dnv) { > > > >> + if (virtio_is_blk(blk_schid)) { > >> + found = true; > >> + break; > >> + } > >> + } > >> + } > >> + > >> + if (!found) { > >> + virtio_panic("No virtio-blk device found!\n"); > >> + } > >> + > >> + virtio_setup_block(blk_schid); > > The virtio_is_blk() and virtio_setup_block() functions should go into a > > preceding patch, no? > > The code doesn't get compiled before the end of the series anyway, so > ordering might be slightly off :) > > > Alex >
diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c new file mode 100644 index 0000000..0913aac --- /dev/null +++ b/pc-bios/s390-ccw/main.c @@ -0,0 +1,56 @@ +/* + * S390 virtio-ccw loading program + * + * Copyright (c) 2013 Alexander Graf <agraf@suse.de> + * + * This work is licensed under the terms of the GNU GPL, version 2 or (at + * your option) any later version. See the COPYING file in the top-level + * directory. + */ + +#include "s390-ccw.h" + +struct subchannel_id blk_schid; +char stack[PAGE_SIZE * 8] __attribute__((__aligned__(PAGE_SIZE))); + +void virtio_panic(const char *string) +{ + sclp_print(string); + while (1) { } +} + +static void virtio_setup(void) +{ + struct irb irb; + int i; + int r; + bool found = false; + + blk_schid.one = 1; + + for (i = 0; i < 0x10000; i++) { + blk_schid.sch_no = i; + r = tsch(blk_schid, &irb); + if (r != 3) { + if (virtio_is_blk(blk_schid)) { + found = true; + break; + } + } + } + + if (!found) { + virtio_panic("No virtio-blk device found!\n"); + } + + virtio_setup_block(blk_schid); +} + +int main(void) +{ + sclp_setup(); + virtio_setup(); + if (zipl_load() < 0) + sclp_print("Failed to load OS from hard disk\n"); + while (1) { } +}
This C file is the main driving piece of the s390 ccw firmware. It provides a search for a workable block device, sets it as the default to boot off of and boots from it. Signed-off-by: Alexander Graf <agraf@suse.de> --- pc-bios/s390-ccw/main.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 56 insertions(+), 0 deletions(-) create mode 100644 pc-bios/s390-ccw/main.c