|
@@ -1048,37 +1048,19 @@ void reipl_ccw_dev(struct ccw_dev_id *devid)
|
|
|
do_reipl_asm(*((__u32*)&schid));
|
|
|
}
|
|
|
|
|
|
-static struct schib __initdata 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;
|
|
|
}
|