xref: /openbmc/linux/arch/s390/include/asm/ipl.h (revision c6557e7f2b6ae76a44653d38f835174074c42e05)
1*c6557e7fSMartin Schwidefsky /*
2*c6557e7fSMartin Schwidefsky  * s390 (re)ipl support
3*c6557e7fSMartin Schwidefsky  *
4*c6557e7fSMartin Schwidefsky  * Copyright IBM Corp. 2007
5*c6557e7fSMartin Schwidefsky  */
6*c6557e7fSMartin Schwidefsky 
7*c6557e7fSMartin Schwidefsky #ifndef _ASM_S390_IPL_H
8*c6557e7fSMartin Schwidefsky #define _ASM_S390_IPL_H
9*c6557e7fSMartin Schwidefsky 
10*c6557e7fSMartin Schwidefsky #include <asm/types.h>
11*c6557e7fSMartin Schwidefsky #include <asm/cio.h>
12*c6557e7fSMartin Schwidefsky #include <asm/setup.h>
13*c6557e7fSMartin Schwidefsky 
14*c6557e7fSMartin Schwidefsky #define IPL_PARMBLOCK_ORIGIN	0x2000
15*c6557e7fSMartin Schwidefsky 
16*c6557e7fSMartin Schwidefsky #define IPL_PARM_BLK_FCP_LEN (sizeof(struct ipl_list_hdr) + \
17*c6557e7fSMartin Schwidefsky 			      sizeof(struct ipl_block_fcp))
18*c6557e7fSMartin Schwidefsky 
19*c6557e7fSMartin Schwidefsky #define IPL_PARM_BLK0_FCP_LEN (sizeof(struct ipl_block_fcp) + 8)
20*c6557e7fSMartin Schwidefsky 
21*c6557e7fSMartin Schwidefsky #define IPL_PARM_BLK_CCW_LEN (sizeof(struct ipl_list_hdr) + \
22*c6557e7fSMartin Schwidefsky 			      sizeof(struct ipl_block_ccw))
23*c6557e7fSMartin Schwidefsky 
24*c6557e7fSMartin Schwidefsky #define IPL_PARM_BLK0_CCW_LEN (sizeof(struct ipl_block_ccw) + 8)
25*c6557e7fSMartin Schwidefsky 
26*c6557e7fSMartin Schwidefsky #define IPL_MAX_SUPPORTED_VERSION (0)
27*c6557e7fSMartin Schwidefsky 
28*c6557e7fSMartin Schwidefsky #define IPL_PARMBLOCK_START	((struct ipl_parameter_block *) \
29*c6557e7fSMartin Schwidefsky 				 IPL_PARMBLOCK_ORIGIN)
30*c6557e7fSMartin Schwidefsky #define IPL_PARMBLOCK_SIZE	(IPL_PARMBLOCK_START->hdr.len)
31*c6557e7fSMartin Schwidefsky 
32*c6557e7fSMartin Schwidefsky struct ipl_list_hdr {
33*c6557e7fSMartin Schwidefsky 	u32 len;
34*c6557e7fSMartin Schwidefsky 	u8  reserved1[3];
35*c6557e7fSMartin Schwidefsky 	u8  version;
36*c6557e7fSMartin Schwidefsky 	u32 blk0_len;
37*c6557e7fSMartin Schwidefsky 	u8  pbt;
38*c6557e7fSMartin Schwidefsky 	u8  flags;
39*c6557e7fSMartin Schwidefsky 	u16 reserved2;
40*c6557e7fSMartin Schwidefsky } __attribute__((packed));
41*c6557e7fSMartin Schwidefsky 
42*c6557e7fSMartin Schwidefsky struct ipl_block_fcp {
43*c6557e7fSMartin Schwidefsky 	u8  reserved1[313-1];
44*c6557e7fSMartin Schwidefsky 	u8  opt;
45*c6557e7fSMartin Schwidefsky 	u8  reserved2[3];
46*c6557e7fSMartin Schwidefsky 	u16 reserved3;
47*c6557e7fSMartin Schwidefsky 	u16 devno;
48*c6557e7fSMartin Schwidefsky 	u8  reserved4[4];
49*c6557e7fSMartin Schwidefsky 	u64 wwpn;
50*c6557e7fSMartin Schwidefsky 	u64 lun;
51*c6557e7fSMartin Schwidefsky 	u32 bootprog;
52*c6557e7fSMartin Schwidefsky 	u8  reserved5[12];
53*c6557e7fSMartin Schwidefsky 	u64 br_lba;
54*c6557e7fSMartin Schwidefsky 	u32 scp_data_len;
55*c6557e7fSMartin Schwidefsky 	u8  reserved6[260];
56*c6557e7fSMartin Schwidefsky 	u8  scp_data[];
57*c6557e7fSMartin Schwidefsky } __attribute__((packed));
58*c6557e7fSMartin Schwidefsky 
59*c6557e7fSMartin Schwidefsky #define DIAG308_VMPARM_SIZE	64
60*c6557e7fSMartin Schwidefsky 
61*c6557e7fSMartin Schwidefsky struct ipl_block_ccw {
62*c6557e7fSMartin Schwidefsky 	u8  load_parm[8];
63*c6557e7fSMartin Schwidefsky 	u8  reserved1[84];
64*c6557e7fSMartin Schwidefsky 	u8  reserved2[2];
65*c6557e7fSMartin Schwidefsky 	u16 devno;
66*c6557e7fSMartin Schwidefsky 	u8  vm_flags;
67*c6557e7fSMartin Schwidefsky 	u8  reserved3[3];
68*c6557e7fSMartin Schwidefsky 	u32 vm_parm_len;
69*c6557e7fSMartin Schwidefsky 	u8  nss_name[8];
70*c6557e7fSMartin Schwidefsky 	u8  vm_parm[DIAG308_VMPARM_SIZE];
71*c6557e7fSMartin Schwidefsky 	u8  reserved4[8];
72*c6557e7fSMartin Schwidefsky } __attribute__((packed));
73*c6557e7fSMartin Schwidefsky 
74*c6557e7fSMartin Schwidefsky struct ipl_parameter_block {
75*c6557e7fSMartin Schwidefsky 	struct ipl_list_hdr hdr;
76*c6557e7fSMartin Schwidefsky 	union {
77*c6557e7fSMartin Schwidefsky 		struct ipl_block_fcp fcp;
78*c6557e7fSMartin Schwidefsky 		struct ipl_block_ccw ccw;
79*c6557e7fSMartin Schwidefsky 	} ipl_info;
80*c6557e7fSMartin Schwidefsky } __attribute__((packed,aligned(4096)));
81*c6557e7fSMartin Schwidefsky 
82*c6557e7fSMartin Schwidefsky /*
83*c6557e7fSMartin Schwidefsky  * IPL validity flags
84*c6557e7fSMartin Schwidefsky  */
85*c6557e7fSMartin Schwidefsky extern u32 ipl_flags;
86*c6557e7fSMartin Schwidefsky extern u32 dump_prefix_page;
87*c6557e7fSMartin Schwidefsky extern unsigned int zfcpdump_prefix_array[];
88*c6557e7fSMartin Schwidefsky 
89*c6557e7fSMartin Schwidefsky extern void do_reipl(void);
90*c6557e7fSMartin Schwidefsky extern void do_halt(void);
91*c6557e7fSMartin Schwidefsky extern void do_poff(void);
92*c6557e7fSMartin Schwidefsky extern void ipl_save_parameters(void);
93*c6557e7fSMartin Schwidefsky extern void ipl_update_parameters(void);
94*c6557e7fSMartin Schwidefsky extern void get_ipl_vmparm(char *);
95*c6557e7fSMartin Schwidefsky 
96*c6557e7fSMartin Schwidefsky enum {
97*c6557e7fSMartin Schwidefsky 	IPL_DEVNO_VALID		= 1,
98*c6557e7fSMartin Schwidefsky 	IPL_PARMBLOCK_VALID	= 2,
99*c6557e7fSMartin Schwidefsky 	IPL_NSS_VALID		= 4,
100*c6557e7fSMartin Schwidefsky };
101*c6557e7fSMartin Schwidefsky 
102*c6557e7fSMartin Schwidefsky enum ipl_type {
103*c6557e7fSMartin Schwidefsky 	IPL_TYPE_UNKNOWN	= 1,
104*c6557e7fSMartin Schwidefsky 	IPL_TYPE_CCW		= 2,
105*c6557e7fSMartin Schwidefsky 	IPL_TYPE_FCP		= 4,
106*c6557e7fSMartin Schwidefsky 	IPL_TYPE_FCP_DUMP	= 8,
107*c6557e7fSMartin Schwidefsky 	IPL_TYPE_NSS		= 16,
108*c6557e7fSMartin Schwidefsky };
109*c6557e7fSMartin Schwidefsky 
110*c6557e7fSMartin Schwidefsky struct ipl_info
111*c6557e7fSMartin Schwidefsky {
112*c6557e7fSMartin Schwidefsky 	enum ipl_type type;
113*c6557e7fSMartin Schwidefsky 	union {
114*c6557e7fSMartin Schwidefsky 		struct {
115*c6557e7fSMartin Schwidefsky 			struct ccw_dev_id dev_id;
116*c6557e7fSMartin Schwidefsky 		} ccw;
117*c6557e7fSMartin Schwidefsky 		struct {
118*c6557e7fSMartin Schwidefsky 			struct ccw_dev_id dev_id;
119*c6557e7fSMartin Schwidefsky 			u64 wwpn;
120*c6557e7fSMartin Schwidefsky 			u64 lun;
121*c6557e7fSMartin Schwidefsky 		} fcp;
122*c6557e7fSMartin Schwidefsky 		struct {
123*c6557e7fSMartin Schwidefsky 			char name[NSS_NAME_SIZE + 1];
124*c6557e7fSMartin Schwidefsky 		} nss;
125*c6557e7fSMartin Schwidefsky 	} data;
126*c6557e7fSMartin Schwidefsky };
127*c6557e7fSMartin Schwidefsky 
128*c6557e7fSMartin Schwidefsky extern struct ipl_info ipl_info;
129*c6557e7fSMartin Schwidefsky extern void setup_ipl(void);
130*c6557e7fSMartin Schwidefsky 
131*c6557e7fSMartin Schwidefsky /*
132*c6557e7fSMartin Schwidefsky  * DIAG 308 support
133*c6557e7fSMartin Schwidefsky  */
134*c6557e7fSMartin Schwidefsky enum diag308_subcode  {
135*c6557e7fSMartin Schwidefsky 	DIAG308_REL_HSA	= 2,
136*c6557e7fSMartin Schwidefsky 	DIAG308_IPL	= 3,
137*c6557e7fSMartin Schwidefsky 	DIAG308_DUMP	= 4,
138*c6557e7fSMartin Schwidefsky 	DIAG308_SET	= 5,
139*c6557e7fSMartin Schwidefsky 	DIAG308_STORE	= 6,
140*c6557e7fSMartin Schwidefsky };
141*c6557e7fSMartin Schwidefsky 
142*c6557e7fSMartin Schwidefsky enum diag308_ipl_type {
143*c6557e7fSMartin Schwidefsky 	DIAG308_IPL_TYPE_FCP	= 0,
144*c6557e7fSMartin Schwidefsky 	DIAG308_IPL_TYPE_CCW	= 2,
145*c6557e7fSMartin Schwidefsky };
146*c6557e7fSMartin Schwidefsky 
147*c6557e7fSMartin Schwidefsky enum diag308_opt {
148*c6557e7fSMartin Schwidefsky 	DIAG308_IPL_OPT_IPL	= 0x10,
149*c6557e7fSMartin Schwidefsky 	DIAG308_IPL_OPT_DUMP	= 0x20,
150*c6557e7fSMartin Schwidefsky };
151*c6557e7fSMartin Schwidefsky 
152*c6557e7fSMartin Schwidefsky enum diag308_flags {
153*c6557e7fSMartin Schwidefsky 	DIAG308_FLAGS_LP_VALID	= 0x80,
154*c6557e7fSMartin Schwidefsky };
155*c6557e7fSMartin Schwidefsky 
156*c6557e7fSMartin Schwidefsky enum diag308_vm_flags {
157*c6557e7fSMartin Schwidefsky 	DIAG308_VM_FLAGS_NSS_VALID	= 0x80,
158*c6557e7fSMartin Schwidefsky 	DIAG308_VM_FLAGS_VP_VALID	= 0x40,
159*c6557e7fSMartin Schwidefsky };
160*c6557e7fSMartin Schwidefsky 
161*c6557e7fSMartin Schwidefsky enum diag308_rc {
162*c6557e7fSMartin Schwidefsky 	DIAG308_RC_OK		= 0x0001,
163*c6557e7fSMartin Schwidefsky 	DIAG308_RC_NOCONFIG	= 0x0102,
164*c6557e7fSMartin Schwidefsky };
165*c6557e7fSMartin Schwidefsky 
166*c6557e7fSMartin Schwidefsky extern int diag308(unsigned long subcode, void *addr);
167*c6557e7fSMartin Schwidefsky 
168*c6557e7fSMartin Schwidefsky #endif /* _ASM_S390_IPL_H */
169