aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/kernel/ipl.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/s390/kernel/ipl.c')
-rw-r--r--arch/s390/kernel/ipl.c42
1 files changed, 35 insertions, 7 deletions
diff --git a/arch/s390/kernel/ipl.c b/arch/s390/kernel/ipl.c
index 153e21ce2336..8342e65a140d 100644
--- a/arch/s390/kernel/ipl.c
+++ b/arch/s390/kernel/ipl.c
@@ -28,6 +28,7 @@
28#include <asm/sclp.h> 28#include <asm/sclp.h>
29#include <asm/checksum.h> 29#include <asm/checksum.h>
30#include <asm/debug.h> 30#include <asm/debug.h>
31#include <asm/os_info.h>
31#include "entry.h" 32#include "entry.h"
32 33
33#define IPL_PARM_BLOCK_VERSION 0 34#define IPL_PARM_BLOCK_VERSION 0
@@ -951,6 +952,13 @@ static struct attribute_group reipl_nss_attr_group = {
951 .attrs = reipl_nss_attrs, 952 .attrs = reipl_nss_attrs,
952}; 953};
953 954
955static void set_reipl_block_actual(struct ipl_parameter_block *reipl_block)
956{
957 reipl_block_actual = reipl_block;
958 os_info_entry_add(OS_INFO_REIPL_BLOCK, reipl_block_actual,
959 reipl_block->hdr.len);
960}
961
954/* reipl type */ 962/* reipl type */
955 963
956static int reipl_set_type(enum ipl_type type) 964static int reipl_set_type(enum ipl_type type)
@@ -966,7 +974,7 @@ static int reipl_set_type(enum ipl_type type)
966 reipl_method = REIPL_METHOD_CCW_VM; 974 reipl_method = REIPL_METHOD_CCW_VM;
967 else 975 else
968 reipl_method = REIPL_METHOD_CCW_CIO; 976 reipl_method = REIPL_METHOD_CCW_CIO;
969 reipl_block_actual = reipl_block_ccw; 977 set_reipl_block_actual(reipl_block_ccw);
970 break; 978 break;
971 case IPL_TYPE_FCP: 979 case IPL_TYPE_FCP:
972 if (diag308_set_works) 980 if (diag308_set_works)
@@ -975,7 +983,7 @@ static int reipl_set_type(enum ipl_type type)
975 reipl_method = REIPL_METHOD_FCP_RO_VM; 983 reipl_method = REIPL_METHOD_FCP_RO_VM;
976 else 984 else
977 reipl_method = REIPL_METHOD_FCP_RO_DIAG; 985 reipl_method = REIPL_METHOD_FCP_RO_DIAG;
978 reipl_block_actual = reipl_block_fcp; 986 set_reipl_block_actual(reipl_block_fcp);
979 break; 987 break;
980 case IPL_TYPE_FCP_DUMP: 988 case IPL_TYPE_FCP_DUMP:
981 reipl_method = REIPL_METHOD_FCP_DUMP; 989 reipl_method = REIPL_METHOD_FCP_DUMP;
@@ -985,7 +993,7 @@ static int reipl_set_type(enum ipl_type type)
985 reipl_method = REIPL_METHOD_NSS_DIAG; 993 reipl_method = REIPL_METHOD_NSS_DIAG;
986 else 994 else
987 reipl_method = REIPL_METHOD_NSS; 995 reipl_method = REIPL_METHOD_NSS;
988 reipl_block_actual = reipl_block_nss; 996 set_reipl_block_actual(reipl_block_nss);
989 break; 997 break;
990 case IPL_TYPE_UNKNOWN: 998 case IPL_TYPE_UNKNOWN:
991 reipl_method = REIPL_METHOD_DEFAULT; 999 reipl_method = REIPL_METHOD_DEFAULT;
@@ -1257,6 +1265,29 @@ static int __init reipl_fcp_init(void)
1257 return 0; 1265 return 0;
1258} 1266}
1259 1267
1268static int __init reipl_type_init(void)
1269{
1270 enum ipl_type reipl_type = ipl_info.type;
1271 struct ipl_parameter_block *reipl_block;
1272 unsigned long size;
1273
1274 reipl_block = os_info_old_entry(OS_INFO_REIPL_BLOCK, &size);
1275 if (!reipl_block)
1276 goto out;
1277 /*
1278 * If we have an OS info reipl block, this will be used
1279 */
1280 if (reipl_block->hdr.pbt == DIAG308_IPL_TYPE_FCP) {
1281 memcpy(reipl_block_fcp, reipl_block, size);
1282 reipl_type = IPL_TYPE_FCP;
1283 } else if (reipl_block->hdr.pbt == DIAG308_IPL_TYPE_CCW) {
1284 memcpy(reipl_block_ccw, reipl_block, size);
1285 reipl_type = IPL_TYPE_CCW;
1286 }
1287out:
1288 return reipl_set_type(reipl_type);
1289}
1290
1260static int __init reipl_init(void) 1291static int __init reipl_init(void)
1261{ 1292{
1262 int rc; 1293 int rc;
@@ -1278,10 +1309,7 @@ static int __init reipl_init(void)
1278 rc = reipl_nss_init(); 1309 rc = reipl_nss_init();
1279 if (rc) 1310 if (rc)
1280 return rc; 1311 return rc;
1281 rc = reipl_set_type(ipl_info.type); 1312 return reipl_type_init();
1282 if (rc)
1283 return rc;
1284 return 0;
1285} 1313}
1286 1314
1287static struct shutdown_action __refdata reipl_action = { 1315static struct shutdown_action __refdata reipl_action = {