hc
2024-05-13 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e
kernel/arch/s390/include/asm/ipl.h
....@@ -12,74 +12,42 @@
1212 #include <asm/types.h>
1313 #include <asm/cio.h>
1414 #include <asm/setup.h>
15
+#include <uapi/asm/ipl.h>
1516
16
-#define NSS_NAME_SIZE 8
17
+struct ipl_parameter_block {
18
+ struct ipl_pl_hdr hdr;
19
+ union {
20
+ struct ipl_pb_hdr pb0_hdr;
21
+ struct ipl_pb0_common common;
22
+ struct ipl_pb0_fcp fcp;
23
+ struct ipl_pb0_ccw ccw;
24
+ struct ipl_pb0_nvme nvme;
25
+ char raw[PAGE_SIZE - sizeof(struct ipl_pl_hdr)];
26
+ };
27
+} __packed __aligned(PAGE_SIZE);
1728
18
-#define IPL_PARM_BLK_FCP_LEN (sizeof(struct ipl_list_hdr) + \
19
- sizeof(struct ipl_block_fcp))
29
+#define NSS_NAME_SIZE 8
2030
21
-#define IPL_PARM_BLK0_FCP_LEN (sizeof(struct ipl_block_fcp) + 16)
31
+#define IPL_BP_FCP_LEN (sizeof(struct ipl_pl_hdr) + \
32
+ sizeof(struct ipl_pb0_fcp))
33
+#define IPL_BP0_FCP_LEN (sizeof(struct ipl_pb0_fcp))
2234
23
-#define IPL_PARM_BLK_CCW_LEN (sizeof(struct ipl_list_hdr) + \
24
- sizeof(struct ipl_block_ccw))
35
+#define IPL_BP_NVME_LEN (sizeof(struct ipl_pl_hdr) + \
36
+ sizeof(struct ipl_pb0_nvme))
37
+#define IPL_BP0_NVME_LEN (sizeof(struct ipl_pb0_nvme))
2538
26
-#define IPL_PARM_BLK0_CCW_LEN (sizeof(struct ipl_block_ccw) + 16)
39
+#define IPL_BP_CCW_LEN (sizeof(struct ipl_pl_hdr) + \
40
+ sizeof(struct ipl_pb0_ccw))
41
+#define IPL_BP0_CCW_LEN (sizeof(struct ipl_pb0_ccw))
2742
2843 #define IPL_MAX_SUPPORTED_VERSION (0)
2944
30
-struct ipl_list_hdr {
31
- u32 len;
32
- u8 reserved1[3];
33
- u8 version;
34
- u32 blk0_len;
35
- u8 pbt;
36
- u8 flags;
37
- u16 reserved2;
38
- u8 loadparm[8];
39
-} __attribute__((packed));
45
+#define IPL_RB_CERT_UNKNOWN ((unsigned short)-1)
4046
41
-struct ipl_block_fcp {
42
- u8 reserved1[305-1];
43
- u8 opt;
44
- u8 reserved2[3];
45
- u16 reserved3;
46
- u16 devno;
47
- u8 reserved4[4];
48
- u64 wwpn;
49
- u64 lun;
50
- u32 bootprog;
51
- u8 reserved5[12];
52
- u64 br_lba;
53
- u32 scp_data_len;
54
- u8 reserved6[260];
55
- u8 scp_data[];
56
-} __attribute__((packed));
57
-
58
-#define DIAG308_VMPARM_SIZE 64
59
-#define DIAG308_SCPDATA_SIZE (PAGE_SIZE - (sizeof(struct ipl_list_hdr) + \
60
- offsetof(struct ipl_block_fcp, scp_data)))
61
-
62
-struct ipl_block_ccw {
63
- u8 reserved1[84];
64
- u16 reserved2 : 13;
65
- u8 ssid : 3;
66
- u16 devno;
67
- u8 vm_flags;
68
- u8 reserved3[3];
69
- u32 vm_parm_len;
70
- u8 nss_name[8];
71
- u8 vm_parm[DIAG308_VMPARM_SIZE];
72
- u8 reserved4[8];
73
-} __attribute__((packed));
74
-
75
-struct ipl_parameter_block {
76
- struct ipl_list_hdr hdr;
77
- union {
78
- struct ipl_block_fcp fcp;
79
- struct ipl_block_ccw ccw;
80
- char raw[PAGE_SIZE - sizeof(struct ipl_list_hdr)];
81
- } ipl_info;
82
-} __packed __aligned(PAGE_SIZE);
47
+#define DIAG308_VMPARM_SIZE (64)
48
+#define DIAG308_SCPDATA_OFFSET offsetof(struct ipl_parameter_block, \
49
+ fcp.scp_data)
50
+#define DIAG308_SCPDATA_SIZE (PAGE_SIZE - DIAG308_SCPDATA_OFFSET)
8351
8452 struct save_area;
8553 struct save_area * __init save_area_alloc(bool is_boot_cpu);
....@@ -88,9 +56,8 @@
8856 void __init save_area_add_vxrs(struct save_area *, __vector128 *vxrs);
8957
9058 extern void s390_reset_system(void);
91
-extern void ipl_store_parameters(void);
92
-extern size_t append_ipl_vmparm(char *, size_t);
93
-extern size_t append_ipl_scpdata(char *, size_t);
59
+extern size_t ipl_block_get_ascii_vmparm(char *dest, size_t size,
60
+ const struct ipl_parameter_block *ipb);
9461
9562 enum ipl_type {
9663 IPL_TYPE_UNKNOWN = 1,
....@@ -98,6 +65,8 @@
9865 IPL_TYPE_FCP = 4,
9966 IPL_TYPE_FCP_DUMP = 8,
10067 IPL_TYPE_NSS = 16,
68
+ IPL_TYPE_NVME = 32,
69
+ IPL_TYPE_NVME_DUMP = 64,
10170 };
10271
10372 struct ipl_info
....@@ -113,6 +82,10 @@
11382 u64 lun;
11483 } fcp;
11584 struct {
85
+ u32 fid;
86
+ u32 nsid;
87
+ } nvme;
88
+ struct {
11689 char name[NSS_NAME_SIZE + 1];
11790 } nss;
11891 } data;
....@@ -121,6 +94,39 @@
12194 extern struct ipl_info ipl_info;
12295 extern void setup_ipl(void);
12396 extern void set_os_info_reipl_block(void);
97
+
98
+static inline bool is_ipl_type_dump(void)
99
+{
100
+ return (ipl_info.type == IPL_TYPE_FCP_DUMP) ||
101
+ (ipl_info.type == IPL_TYPE_NVME_DUMP);
102
+}
103
+
104
+struct ipl_report {
105
+ struct ipl_parameter_block *ipib;
106
+ struct list_head components;
107
+ struct list_head certificates;
108
+ size_t size;
109
+};
110
+
111
+struct ipl_report_component {
112
+ struct list_head list;
113
+ struct ipl_rb_component_entry entry;
114
+};
115
+
116
+struct ipl_report_certificate {
117
+ struct list_head list;
118
+ struct ipl_rb_certificate_entry entry;
119
+ void *key;
120
+};
121
+
122
+struct kexec_buf;
123
+struct ipl_report *ipl_report_init(struct ipl_parameter_block *ipib);
124
+void *ipl_report_finish(struct ipl_report *report);
125
+int ipl_report_free(struct ipl_report *report);
126
+int ipl_report_add_component(struct ipl_report *report, struct kexec_buf *kbuf,
127
+ unsigned char flags, unsigned short cert);
128
+int ipl_report_add_certificate(struct ipl_report *report, void *key,
129
+ unsigned long addr, unsigned long len);
124130
125131 /*
126132 * DIAG 308 support
....@@ -131,25 +137,7 @@
131137 DIAG308_LOAD_NORMAL_DUMP = 4,
132138 DIAG308_SET = 5,
133139 DIAG308_STORE = 6,
134
-};
135
-
136
-enum diag308_ipl_type {
137
- DIAG308_IPL_TYPE_FCP = 0,
138
- DIAG308_IPL_TYPE_CCW = 2,
139
-};
140
-
141
-enum diag308_opt {
142
- DIAG308_IPL_OPT_IPL = 0x10,
143
- DIAG308_IPL_OPT_DUMP = 0x20,
144
-};
145
-
146
-enum diag308_flags {
147
- DIAG308_FLAGS_LP_VALID = 0x80,
148
-};
149
-
150
-enum diag308_vm_flags {
151
- DIAG308_VM_FLAGS_NSS_VALID = 0x80,
152
- DIAG308_VM_FLAGS_VP_VALID = 0x40,
140
+ DIAG308_LOAD_NORMAL = 7,
153141 };
154142
155143 enum diag308_rc {
....@@ -158,7 +146,6 @@
158146 };
159147
160148 extern int diag308(unsigned long subcode, void *addr);
161
-extern void diag308_reset(void);
162149 extern void store_status(void (*fn)(void *), void *data);
163150 extern void lgr_info_log(void);
164151