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