Patchwork [05/12] S390: ccw firmware: Add main program

login
register
mail settings
Submitter Alexander Graf
Date April 22, 2013, 7:18 p.m.
Message ID <1366658298-9275-6-git-send-email-agraf@suse.de>
Download mbox | patch
Permalink /patch/238643/
State New
Headers show

Comments

Alexander Graf - April 22, 2013, 7:18 p.m.
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
Christian Borntraeger - April 23, 2013, 8:43 a.m.
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
Cornelia Huck - April 23, 2013, 8:58 a.m.
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) { }
> +}
Alexander Graf - April 23, 2013, 11:35 a.m.
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
Cornelia Huck - April 23, 2013, 11:51 a.m.
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
>

Patch

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) { }
+}