162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef S390_CHSC_H
362306a36Sopenharmony_ci#define S390_CHSC_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include <linux/types.h>
662306a36Sopenharmony_ci#include <linux/device.h>
762306a36Sopenharmony_ci#include <asm/css_chars.h>
862306a36Sopenharmony_ci#include <asm/chpid.h>
962306a36Sopenharmony_ci#include <asm/chsc.h>
1062306a36Sopenharmony_ci#include <asm/schid.h>
1162306a36Sopenharmony_ci#include <asm/qdio.h>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#define CHSC_SDA_OC_MSS   0x2
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#define NR_MEASUREMENT_CHARS 5
1662306a36Sopenharmony_cistruct cmg_chars {
1762306a36Sopenharmony_ci	u32 values[NR_MEASUREMENT_CHARS];
1862306a36Sopenharmony_ci};
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#define NR_MEASUREMENT_ENTRIES 8
2162306a36Sopenharmony_cistruct cmg_entry {
2262306a36Sopenharmony_ci	u32 values[NR_MEASUREMENT_ENTRIES];
2362306a36Sopenharmony_ci};
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_cistruct channel_path_desc_fmt1 {
2662306a36Sopenharmony_ci	u8 flags;
2762306a36Sopenharmony_ci	u8 lsn;
2862306a36Sopenharmony_ci	u8 desc;
2962306a36Sopenharmony_ci	u8 chpid;
3062306a36Sopenharmony_ci	u32:16;
3162306a36Sopenharmony_ci	u8 esc;
3262306a36Sopenharmony_ci	u8 chpp;
3362306a36Sopenharmony_ci	u32 unused[2];
3462306a36Sopenharmony_ci	u16 chid;
3562306a36Sopenharmony_ci	u32:16;
3662306a36Sopenharmony_ci	u16 mdc;
3762306a36Sopenharmony_ci	u16:13;
3862306a36Sopenharmony_ci	u8 r:1;
3962306a36Sopenharmony_ci	u8 s:1;
4062306a36Sopenharmony_ci	u8 f:1;
4162306a36Sopenharmony_ci	u32 zeros[2];
4262306a36Sopenharmony_ci};
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_cistruct channel_path_desc_fmt3 {
4562306a36Sopenharmony_ci	struct channel_path_desc_fmt1 fmt1_desc;
4662306a36Sopenharmony_ci	u8 util_str[64];
4762306a36Sopenharmony_ci};
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_cistruct channel_path;
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_cistruct css_chsc_char {
5262306a36Sopenharmony_ci	u64 res;
5362306a36Sopenharmony_ci	u64 : 20;
5462306a36Sopenharmony_ci	u32 secm : 1; /* bit 84 */
5562306a36Sopenharmony_ci	u32 : 1;
5662306a36Sopenharmony_ci	u32 scmc : 1; /* bit 86 */
5762306a36Sopenharmony_ci	u32 : 20;
5862306a36Sopenharmony_ci	u32 scssc : 1;  /* bit 107 */
5962306a36Sopenharmony_ci	u32 scsscf : 1; /* bit 108 */
6062306a36Sopenharmony_ci	u32:7;
6162306a36Sopenharmony_ci	u32 pnso:1; /* bit 116 */
6262306a36Sopenharmony_ci	u32:11;
6362306a36Sopenharmony_ci} __packed;
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ciextern struct css_chsc_char css_chsc_characteristics;
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_cistruct chsc_ssd_info {
6862306a36Sopenharmony_ci	u8 path_mask;
6962306a36Sopenharmony_ci	u8 fla_valid_mask;
7062306a36Sopenharmony_ci	struct chp_id chpid[8];
7162306a36Sopenharmony_ci	u16 fla[8];
7262306a36Sopenharmony_ci};
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_cistruct chsc_ssqd_area {
7562306a36Sopenharmony_ci	struct chsc_header request;
7662306a36Sopenharmony_ci	u16:10;
7762306a36Sopenharmony_ci	u8 ssid:2;
7862306a36Sopenharmony_ci	u8 fmt:4;
7962306a36Sopenharmony_ci	u16 first_sch;
8062306a36Sopenharmony_ci	u16:16;
8162306a36Sopenharmony_ci	u16 last_sch;
8262306a36Sopenharmony_ci	u32:32;
8362306a36Sopenharmony_ci	struct chsc_header response;
8462306a36Sopenharmony_ci	u32:32;
8562306a36Sopenharmony_ci	struct qdio_ssqd_desc qdio_ssqd;
8662306a36Sopenharmony_ci} __packed __aligned(PAGE_SIZE);
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_cistruct chsc_scssc_area {
8962306a36Sopenharmony_ci	struct chsc_header request;
9062306a36Sopenharmony_ci	u16 operation_code;
9162306a36Sopenharmony_ci	u16:16;
9262306a36Sopenharmony_ci	u32:32;
9362306a36Sopenharmony_ci	u32:32;
9462306a36Sopenharmony_ci	u64 summary_indicator_addr;
9562306a36Sopenharmony_ci	u64 subchannel_indicator_addr;
9662306a36Sopenharmony_ci	u32 ks:4;
9762306a36Sopenharmony_ci	u32 kc:4;
9862306a36Sopenharmony_ci	u32:21;
9962306a36Sopenharmony_ci	u32 isc:3;
10062306a36Sopenharmony_ci	u32 word_with_d_bit;
10162306a36Sopenharmony_ci	u32:32;
10262306a36Sopenharmony_ci	struct subchannel_id schid;
10362306a36Sopenharmony_ci	u32 reserved[1004];
10462306a36Sopenharmony_ci	struct chsc_header response;
10562306a36Sopenharmony_ci	u32:32;
10662306a36Sopenharmony_ci} __packed __aligned(PAGE_SIZE);
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_cistruct chsc_scpd {
10962306a36Sopenharmony_ci	struct chsc_header request;
11062306a36Sopenharmony_ci	u32:2;
11162306a36Sopenharmony_ci	u32 m:1;
11262306a36Sopenharmony_ci	u32 c:1;
11362306a36Sopenharmony_ci	u32 fmt:4;
11462306a36Sopenharmony_ci	u32 cssid:8;
11562306a36Sopenharmony_ci	u32:4;
11662306a36Sopenharmony_ci	u32 rfmt:4;
11762306a36Sopenharmony_ci	u32 first_chpid:8;
11862306a36Sopenharmony_ci	u32:24;
11962306a36Sopenharmony_ci	u32 last_chpid:8;
12062306a36Sopenharmony_ci	u32 zeroes1;
12162306a36Sopenharmony_ci	struct chsc_header response;
12262306a36Sopenharmony_ci	u32:32;
12362306a36Sopenharmony_ci	u8 data[];
12462306a36Sopenharmony_ci} __packed __aligned(PAGE_SIZE);
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_cistruct chsc_sda_area {
12762306a36Sopenharmony_ci	struct chsc_header request;
12862306a36Sopenharmony_ci	u8 :4;
12962306a36Sopenharmony_ci	u8 format:4;
13062306a36Sopenharmony_ci	u8 :8;
13162306a36Sopenharmony_ci	u16 operation_code;
13262306a36Sopenharmony_ci	u32 :32;
13362306a36Sopenharmony_ci	u32 :32;
13462306a36Sopenharmony_ci	u32 operation_data_area[252];
13562306a36Sopenharmony_ci	struct chsc_header response;
13662306a36Sopenharmony_ci	u32 :4;
13762306a36Sopenharmony_ci	u32 format2:4;
13862306a36Sopenharmony_ci	u32 :24;
13962306a36Sopenharmony_ci} __packed __aligned(PAGE_SIZE);
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ciextern int chsc_get_ssd_info(struct subchannel_id schid,
14262306a36Sopenharmony_ci			     struct chsc_ssd_info *ssd);
14362306a36Sopenharmony_ciextern int chsc_determine_css_characteristics(void);
14462306a36Sopenharmony_ciextern int chsc_init(void);
14562306a36Sopenharmony_ciextern void chsc_init_cleanup(void);
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_ciint __chsc_enable_facility(struct chsc_sda_area *sda_area, int operation_code);
14862306a36Sopenharmony_ciextern int chsc_enable_facility(int);
14962306a36Sopenharmony_cistruct channel_subsystem;
15062306a36Sopenharmony_ciextern int chsc_secm(struct channel_subsystem *, int);
15162306a36Sopenharmony_ciint __chsc_do_secm(struct channel_subsystem *css, int enable);
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_ciint chsc_chp_vary(struct chp_id chpid, int on);
15462306a36Sopenharmony_ciint chsc_determine_channel_path_desc(struct chp_id chpid, int fmt, int rfmt,
15562306a36Sopenharmony_ci				     int c, int m, void *page);
15662306a36Sopenharmony_ciint chsc_determine_fmt0_channel_path_desc(struct chp_id chpid,
15762306a36Sopenharmony_ci					  struct channel_path_desc_fmt0 *desc);
15862306a36Sopenharmony_ciint chsc_determine_fmt1_channel_path_desc(struct chp_id chpid,
15962306a36Sopenharmony_ci					  struct channel_path_desc_fmt1 *desc);
16062306a36Sopenharmony_ciint chsc_determine_fmt3_channel_path_desc(struct chp_id chpid,
16162306a36Sopenharmony_ci					  struct channel_path_desc_fmt3 *desc);
16262306a36Sopenharmony_civoid chsc_chp_online(struct chp_id chpid);
16362306a36Sopenharmony_civoid chsc_chp_offline(struct chp_id chpid);
16462306a36Sopenharmony_ciint chsc_get_channel_measurement_chars(struct channel_path *chp);
16562306a36Sopenharmony_ciint chsc_ssqd(struct subchannel_id schid, struct chsc_ssqd_area *ssqd);
16662306a36Sopenharmony_ciint chsc_sadc(struct subchannel_id schid, struct chsc_scssc_area *scssc,
16762306a36Sopenharmony_ci	      u64 summary_indicator_addr, u64 subchannel_indicator_addr,
16862306a36Sopenharmony_ci	      u8 isc);
16962306a36Sopenharmony_ciint chsc_sgib(u32 origin);
17062306a36Sopenharmony_ciint chsc_error_from_response(int response);
17162306a36Sopenharmony_ci
17262306a36Sopenharmony_ciint chsc_siosl(struct subchannel_id schid);
17362306a36Sopenharmony_ci
17462306a36Sopenharmony_ci/* Functions and definitions to query storage-class memory. */
17562306a36Sopenharmony_cistruct sale {
17662306a36Sopenharmony_ci	u64 sa;
17762306a36Sopenharmony_ci	u32 p:4;
17862306a36Sopenharmony_ci	u32 op_state:4;
17962306a36Sopenharmony_ci	u32 data_state:4;
18062306a36Sopenharmony_ci	u32 rank:4;
18162306a36Sopenharmony_ci	u32 r:1;
18262306a36Sopenharmony_ci	u32:7;
18362306a36Sopenharmony_ci	u32 rid:8;
18462306a36Sopenharmony_ci	u32:32;
18562306a36Sopenharmony_ci} __packed;
18662306a36Sopenharmony_ci
18762306a36Sopenharmony_cistruct chsc_scm_info {
18862306a36Sopenharmony_ci	struct chsc_header request;
18962306a36Sopenharmony_ci	u32:32;
19062306a36Sopenharmony_ci	u64 reqtok;
19162306a36Sopenharmony_ci	u32 reserved1[4];
19262306a36Sopenharmony_ci	struct chsc_header response;
19362306a36Sopenharmony_ci	u64:56;
19462306a36Sopenharmony_ci	u8 rq;
19562306a36Sopenharmony_ci	u32 mbc;
19662306a36Sopenharmony_ci	u64 msa;
19762306a36Sopenharmony_ci	u16 is;
19862306a36Sopenharmony_ci	u16 mmc;
19962306a36Sopenharmony_ci	u32 mci;
20062306a36Sopenharmony_ci	u64 nr_scm_ini;
20162306a36Sopenharmony_ci	u64 nr_scm_unini;
20262306a36Sopenharmony_ci	u32 reserved2[10];
20362306a36Sopenharmony_ci	u64 restok;
20462306a36Sopenharmony_ci	struct sale scmal[248];
20562306a36Sopenharmony_ci} __packed __aligned(PAGE_SIZE);
20662306a36Sopenharmony_ci
20762306a36Sopenharmony_ciint chsc_scm_info(struct chsc_scm_info *scm_area, u64 token);
20862306a36Sopenharmony_ci
20962306a36Sopenharmony_ciint chsc_pnso(struct subchannel_id schid, struct chsc_pnso_area *pnso_area,
21062306a36Sopenharmony_ci	      u8 oc, struct chsc_pnso_resume_token resume_token, int cnc);
21162306a36Sopenharmony_ci
21262306a36Sopenharmony_ciint __init chsc_get_cssid_iid(int idx, u8 *cssid, u8 *iid);
21362306a36Sopenharmony_ci
21462306a36Sopenharmony_ci#ifdef CONFIG_SCM_BUS
21562306a36Sopenharmony_ciint scm_update_information(void);
21662306a36Sopenharmony_ciint scm_process_availability_information(void);
21762306a36Sopenharmony_ci#else /* CONFIG_SCM_BUS */
21862306a36Sopenharmony_cistatic inline int scm_update_information(void) { return 0; }
21962306a36Sopenharmony_cistatic inline int scm_process_availability_information(void) { return 0; }
22062306a36Sopenharmony_ci#endif /* CONFIG_SCM_BUS */
22162306a36Sopenharmony_ci
22262306a36Sopenharmony_ci
22362306a36Sopenharmony_ci#endif
224