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