1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 *    Copyright IBM Corp. 2007
4 *    Author(s): Heiko Carstens <heiko.carstens@de.ibm.com>
5 */
6
7#ifndef _ASM_S390_SCLP_H
8#define _ASM_S390_SCLP_H
9
10#include <linux/types.h>
11#include <asm/chpid.h>
12#include <asm/cpu.h>
13
14#define SCLP_CHP_INFO_MASK_SIZE		32
15#define SCLP_MAX_CORES			256
16
17struct sclp_chp_info {
18	u8 recognized[SCLP_CHP_INFO_MASK_SIZE];
19	u8 standby[SCLP_CHP_INFO_MASK_SIZE];
20	u8 configured[SCLP_CHP_INFO_MASK_SIZE];
21};
22
23#define LOADPARM_LEN 8
24
25struct sclp_ipl_info {
26	int is_valid;
27	int has_dump;
28	char loadparm[LOADPARM_LEN];
29};
30
31struct sclp_core_entry {
32	u8 core_id;
33	u8 reserved0;
34	u8 : 4;
35	u8 sief2 : 1;
36	u8 skey : 1;
37	u8 : 2;
38	u8 : 2;
39	u8 gpere : 1;
40	u8 siif : 1;
41	u8 sigpif : 1;
42	u8 : 3;
43	u8 reserved2[3];
44	u8 : 2;
45	u8 ib : 1;
46	u8 cei : 1;
47	u8 : 4;
48	u8 reserved3[6];
49	u8 type;
50	u8 reserved1;
51} __attribute__((packed));
52
53struct sclp_core_info {
54	unsigned int configured;
55	unsigned int standby;
56	unsigned int combined;
57	struct sclp_core_entry core[SCLP_MAX_CORES];
58};
59
60struct sclp_info {
61	unsigned char has_linemode : 1;
62	unsigned char has_vt220 : 1;
63	unsigned char has_siif : 1;
64	unsigned char has_sigpif : 1;
65	unsigned char has_core_type : 1;
66	unsigned char has_sprp : 1;
67	unsigned char has_hvs : 1;
68	unsigned char has_esca : 1;
69	unsigned char has_sief2 : 1;
70	unsigned char has_64bscao : 1;
71	unsigned char has_gpere : 1;
72	unsigned char has_cmma : 1;
73	unsigned char has_gsls : 1;
74	unsigned char has_ib : 1;
75	unsigned char has_cei : 1;
76	unsigned char has_pfmfi : 1;
77	unsigned char has_ibs : 1;
78	unsigned char has_skey : 1;
79	unsigned char has_kss : 1;
80	unsigned char has_gisaf : 1;
81	unsigned char has_diag318 : 1;
82	unsigned char has_sipl : 1;
83	unsigned char has_dirq : 1;
84	unsigned int ibc;
85	unsigned int mtid;
86	unsigned int mtid_cp;
87	unsigned int mtid_prev;
88	unsigned long rzm;
89	unsigned long rnmax;
90	unsigned long hamax;
91	unsigned int max_cores;
92	unsigned long hsa_size;
93	unsigned long facilities;
94	unsigned int hmfai;
95};
96extern struct sclp_info sclp;
97
98struct zpci_report_error_header {
99	u8 version;	/* Interface version byte */
100	u8 action;	/* Action qualifier byte
101			 * 0: Adapter Reset Request
102			 * 1: Deconfigure and repair action requested
103			 *	(OpenCrypto Problem Call Home)
104			 * 2: Informational Report
105			 *	(OpenCrypto Successful Diagnostics Execution)
106			 */
107	u16 length;	/* Length of Subsequent Data (up to 4K – SCLP header */
108	u8 data[0];	/* Subsequent Data passed verbatim to SCLP ET 24 */
109} __packed;
110
111int sclp_early_read_info(void);
112int sclp_early_read_storage_info(void);
113int sclp_early_get_core_info(struct sclp_core_info *info);
114void sclp_early_get_ipl_info(struct sclp_ipl_info *info);
115void sclp_early_detect(void);
116void sclp_early_printk(const char *s);
117void __sclp_early_printk(const char *s, unsigned int len);
118
119int sclp_early_get_memsize(unsigned long *mem);
120int sclp_early_get_hsa_size(unsigned long *hsa_size);
121int _sclp_get_core_info(struct sclp_core_info *info);
122int sclp_core_configure(u8 core);
123int sclp_core_deconfigure(u8 core);
124int sclp_sdias_blk_count(void);
125int sclp_sdias_copy(void *dest, int blk_num, int nr_blks);
126int sclp_chp_configure(struct chp_id chpid);
127int sclp_chp_deconfigure(struct chp_id chpid);
128int sclp_chp_read_info(struct sclp_chp_info *info);
129int sclp_pci_configure(u32 fid);
130int sclp_pci_deconfigure(u32 fid);
131int sclp_ap_configure(u32 apid);
132int sclp_ap_deconfigure(u32 apid);
133int sclp_pci_report(struct zpci_report_error_header *report, u32 fh, u32 fid);
134int memcpy_hsa_kernel(void *dest, unsigned long src, size_t count);
135int memcpy_hsa_user(void __user *dest, unsigned long src, size_t count);
136void sclp_ocf_cpc_name_copy(char *dst);
137
138static inline int sclp_get_core_info(struct sclp_core_info *info, int early)
139{
140	if (early)
141		return sclp_early_get_core_info(info);
142	return _sclp_get_core_info(info);
143}
144
145#endif /* _ASM_S390_SCLP_H */
146