diff options
Diffstat (limited to 'arch/s390/kernel/ipl.c')
-rw-r--r-- | arch/s390/kernel/ipl.c | 42 |
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 | ||
955 | static 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 | ||
956 | static int reipl_set_type(enum ipl_type type) | 964 | static 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 | ||
1268 | static 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 | } | ||
1287 | out: | ||
1288 | return reipl_set_type(reipl_type); | ||
1289 | } | ||
1290 | |||
1260 | static int __init reipl_init(void) | 1291 | static 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 | ||
1287 | static struct shutdown_action __refdata reipl_action = { | 1315 | static struct shutdown_action __refdata reipl_action = { |