1  /* SPDX-License-Identifier: GPL-2.0 */
2  /*
3   *  S390 version
4   *    Copyright IBM Corp. 1999, 2017
5   */
6  #ifndef _ASM_S390_SETUP_H
7  #define _ASM_S390_SETUP_H
8  
9  #include <linux/bits.h>
10  #include <uapi/asm/setup.h>
11  #include <linux/build_bug.h>
12  
13  #define PARMAREA		0x10400
14  
15  #define COMMAND_LINE_SIZE CONFIG_COMMAND_LINE_SIZE
16  /*
17   * Machine features detected in early.c
18   */
19  
20  #define MACHINE_FLAG_VM		BIT(0)
21  #define MACHINE_FLAG_KVM	BIT(1)
22  #define MACHINE_FLAG_LPAR	BIT(2)
23  #define MACHINE_FLAG_DIAG9C	BIT(3)
24  #define MACHINE_FLAG_ESOP	BIT(4)
25  #define MACHINE_FLAG_IDTE	BIT(5)
26  #define MACHINE_FLAG_EDAT1	BIT(7)
27  #define MACHINE_FLAG_EDAT2	BIT(8)
28  #define MACHINE_FLAG_TOPOLOGY	BIT(10)
29  #define MACHINE_FLAG_TE		BIT(11)
30  #define MACHINE_FLAG_TLB_LC	BIT(12)
31  #define MACHINE_FLAG_VX		BIT(13)
32  #define MACHINE_FLAG_TLB_GUEST	BIT(14)
33  #define MACHINE_FLAG_NX		BIT(15)
34  #define MACHINE_FLAG_GS		BIT(16)
35  #define MACHINE_FLAG_SCC	BIT(17)
36  #define MACHINE_FLAG_PCI_MIO	BIT(18)
37  #define MACHINE_FLAG_RDP	BIT(19)
38  
39  #define LPP_MAGIC		BIT(31)
40  #define LPP_PID_MASK		_AC(0xffffffff, UL)
41  
42  /* Offsets to entry points in kernel/head.S  */
43  
44  #define STARTUP_NORMAL_OFFSET	0x10000
45  #define STARTUP_KDUMP_OFFSET	0x10010
46  
47  #define LEGACY_COMMAND_LINE_SIZE	896
48  
49  #ifndef __ASSEMBLY__
50  
51  #include <asm/lowcore.h>
52  #include <asm/types.h>
53  
54  struct parmarea {
55  	unsigned long ipl_device;			/* 0x10400 */
56  	unsigned long initrd_start;			/* 0x10408 */
57  	unsigned long initrd_size;			/* 0x10410 */
58  	unsigned long oldmem_base;			/* 0x10418 */
59  	unsigned long oldmem_size;			/* 0x10420 */
60  	unsigned long kernel_version;			/* 0x10428 */
61  	unsigned long max_command_line_size;		/* 0x10430 */
62  	char pad1[0x10480-0x10438];			/* 0x10438 - 0x10480 */
63  	char command_line[COMMAND_LINE_SIZE];		/* 0x10480 */
64  };
65  
66  extern struct parmarea parmarea;
67  
68  extern unsigned int zlib_dfltcc_support;
69  #define ZLIB_DFLTCC_DISABLED		0
70  #define ZLIB_DFLTCC_FULL		1
71  #define ZLIB_DFLTCC_DEFLATE_ONLY	2
72  #define ZLIB_DFLTCC_INFLATE_ONLY	3
73  #define ZLIB_DFLTCC_FULL_DEBUG		4
74  
75  extern int noexec_disabled;
76  extern unsigned long ident_map_size;
77  extern unsigned long pgalloc_pos;
78  extern unsigned long pgalloc_end;
79  extern unsigned long pgalloc_low;
80  extern unsigned long __amode31_base;
81  
82  /* The Write Back bit position in the physaddr is given by the SLPC PCI */
83  extern unsigned long mio_wb_bit_mask;
84  
85  #define MACHINE_IS_VM		(S390_lowcore.machine_flags & MACHINE_FLAG_VM)
86  #define MACHINE_IS_KVM		(S390_lowcore.machine_flags & MACHINE_FLAG_KVM)
87  #define MACHINE_IS_LPAR		(S390_lowcore.machine_flags & MACHINE_FLAG_LPAR)
88  
89  #define MACHINE_HAS_DIAG9C	(S390_lowcore.machine_flags & MACHINE_FLAG_DIAG9C)
90  #define MACHINE_HAS_ESOP	(S390_lowcore.machine_flags & MACHINE_FLAG_ESOP)
91  #define MACHINE_HAS_IDTE	(S390_lowcore.machine_flags & MACHINE_FLAG_IDTE)
92  #define MACHINE_HAS_EDAT1	(S390_lowcore.machine_flags & MACHINE_FLAG_EDAT1)
93  #define MACHINE_HAS_EDAT2	(S390_lowcore.machine_flags & MACHINE_FLAG_EDAT2)
94  #define MACHINE_HAS_TOPOLOGY	(S390_lowcore.machine_flags & MACHINE_FLAG_TOPOLOGY)
95  #define MACHINE_HAS_TE		(S390_lowcore.machine_flags & MACHINE_FLAG_TE)
96  #define MACHINE_HAS_TLB_LC	(S390_lowcore.machine_flags & MACHINE_FLAG_TLB_LC)
97  #define MACHINE_HAS_VX		(S390_lowcore.machine_flags & MACHINE_FLAG_VX)
98  #define MACHINE_HAS_TLB_GUEST	(S390_lowcore.machine_flags & MACHINE_FLAG_TLB_GUEST)
99  #define MACHINE_HAS_NX		(S390_lowcore.machine_flags & MACHINE_FLAG_NX)
100  #define MACHINE_HAS_GS		(S390_lowcore.machine_flags & MACHINE_FLAG_GS)
101  #define MACHINE_HAS_SCC		(S390_lowcore.machine_flags & MACHINE_FLAG_SCC)
102  #define MACHINE_HAS_PCI_MIO	(S390_lowcore.machine_flags & MACHINE_FLAG_PCI_MIO)
103  #define MACHINE_HAS_RDP		(S390_lowcore.machine_flags & MACHINE_FLAG_RDP)
104  
105  /*
106   * Console mode. Override with conmode=
107   */
108  extern unsigned int console_mode;
109  extern unsigned int console_devno;
110  extern unsigned int console_irq;
111  
112  #define CONSOLE_IS_UNDEFINED	(console_mode == 0)
113  #define CONSOLE_IS_SCLP		(console_mode == 1)
114  #define CONSOLE_IS_3215		(console_mode == 2)
115  #define CONSOLE_IS_3270		(console_mode == 3)
116  #define CONSOLE_IS_VT220	(console_mode == 4)
117  #define CONSOLE_IS_HVC		(console_mode == 5)
118  #define SET_CONSOLE_SCLP	do { console_mode = 1; } while (0)
119  #define SET_CONSOLE_3215	do { console_mode = 2; } while (0)
120  #define SET_CONSOLE_3270	do { console_mode = 3; } while (0)
121  #define SET_CONSOLE_VT220	do { console_mode = 4; } while (0)
122  #define SET_CONSOLE_HVC		do { console_mode = 5; } while (0)
123  
124  #ifdef CONFIG_PFAULT
125  extern int pfault_init(void);
126  extern void pfault_fini(void);
127  #else /* CONFIG_PFAULT */
128  #define pfault_init()		({-1;})
129  #define pfault_fini()		do { } while (0)
130  #endif /* CONFIG_PFAULT */
131  
132  #ifdef CONFIG_VMCP
133  void vmcp_cma_reserve(void);
134  #else
vmcp_cma_reserve(void)135  static inline void vmcp_cma_reserve(void) { }
136  #endif
137  
138  void report_user_fault(struct pt_regs *regs, long signr, int is_mm_fault);
139  
140  void cmma_init(void);
141  void cmma_init_nodat(void);
142  
143  extern void (*_machine_restart)(char *command);
144  extern void (*_machine_halt)(void);
145  extern void (*_machine_power_off)(void);
146  
147  extern unsigned long __kaslr_offset;
kaslr_offset(void)148  static inline unsigned long kaslr_offset(void)
149  {
150  	return __kaslr_offset;
151  }
152  
153  extern int is_full_image;
154  
155  struct initrd_data {
156  	unsigned long start;
157  	unsigned long size;
158  };
159  extern struct initrd_data initrd_data;
160  
161  struct oldmem_data {
162  	unsigned long start;
163  	unsigned long size;
164  };
165  extern struct oldmem_data oldmem_data;
166  
gen_lpswe(unsigned long addr)167  static inline u32 gen_lpswe(unsigned long addr)
168  {
169  	BUILD_BUG_ON(addr > 0xfff);
170  	return 0xb2b20000 | addr;
171  }
172  #endif /* __ASSEMBLY__ */
173  #endif /* _ASM_S390_SETUP_H */
174