]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/s390/cio/cio.c
[S390] cio/ipl: Clean interface between cio and ipl code.
[karo-tx-linux.git] / drivers / s390 / cio / cio.c
index b3a56dc5f68a2fd5144dad6d7bd6abef50369fd0..21af446c1f2d4fe8d008c8a0c8c8251b012cdf33 100644 (file)
@@ -21,6 +21,7 @@
 #include <asm/irq_regs.h>
 #include <asm/setup.h>
 #include <asm/reset.h>
+#include <asm/ipl.h>
 #include "airq.h"
 #include "cio.h"
 #include "css.h"
@@ -1047,37 +1048,19 @@ void reipl_ccw_dev(struct ccw_dev_id *devid)
        do_reipl_asm(*((__u32*)&schid));
 }
 
-extern struct schib ipl_schib;
-
-/*
- * ipl_save_parameters gets called very early. It is not allowed to access
- * anything in the bss section at all. The bss section is not cleared yet,
- * but may contain some ipl parameters written by the firmware.
- * These parameters (if present) are copied to 0x2000.
- * To avoid corruption of the ipl parameters, all variables used by this
- * function must reside on the stack or in the data section.
- */
-void ipl_save_parameters(void)
+int __init cio_get_iplinfo(struct cio_iplinfo *iplinfo)
 {
        struct subchannel_id schid;
-       unsigned int *ipl_ptr;
-       void *src, *dst;
+       struct schib schib;
 
        schid = *(struct subchannel_id *)__LC_SUBCHANNEL_ID;
        if (!schid.one)
-               return;
-       if (stsch(schid, &ipl_schib))
-               return;
-       if (!ipl_schib.pmcw.dnv)
-               return;
-       ipl_devno = ipl_schib.pmcw.dev;
-       ipl_flags |= IPL_DEVNO_VALID;
-       if (!ipl_schib.pmcw.qf)
-               return;
-       ipl_flags |= IPL_PARMBLOCK_VALID;
-       ipl_ptr = (unsigned int *)__LC_IPL_PARMBLOCK_PTR;
-       src = (void *)(unsigned long)*ipl_ptr;
-       dst = (void *)IPL_PARMBLOCK_ORIGIN;
-       memmove(dst, src, PAGE_SIZE);
-       *ipl_ptr = IPL_PARMBLOCK_ORIGIN;
+               return -ENODEV;
+       if (stsch(schid, &schib))
+               return -ENODEV;
+       if (!schib.pmcw.dnv)
+               return -ENODEV;
+       iplinfo->devno = schib.pmcw.dev;
+       iplinfo->is_qdio = schib.pmcw.qf;
+       return 0;
 }