text: /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
  #ifndef _ASM_S390_UAPI_IPL_H
  #define _ASM_S390_UAPI_IPL_H
  
  #include <linux/types.h>
  
  /* IPL Parameter List header */
  struct ipl_pl_hdr {
  	__u32 len;
  	__u8  flags;
  	__u8  reserved1[2];
  	__u8  version;
  } __packed;
  
  #define IPL_PL_FLAG_IPLPS	0x80
  #define IPL_PL_FLAG_SIPL	0x40
  #define IPL_PL_FLAG_IPLSR	0x20
  
  /* IPL Parameter Block header */
  struct ipl_pb_hdr {
  	__u32 len;
  	__u8  pbt;
  } __packed;
  
  /* IPL Parameter Block types */
  enum ipl_pbt {
  	IPL_PBT_FCP = 0,
  	IPL_PBT_SCP_DATA = 1,
  	IPL_PBT_CCW = 2,
  	IPL_PBT_NVME = 4,
  };
  
  /* IPL Parameter Block 0 with common fields */
  struct ipl_pb0_common {
  	__u32 len;
  	__u8  pbt;
  	__u8  flags;
  	__u8  reserved1[2];
  	__u8  loadparm[8];
  	__u8  reserved2[84];
  } __packed;
  
  #define IPL_PB0_FLAG_LOADPARM	0x80
  
  /* IPL Parameter Block 0 for FCP */
  struct ipl_pb0_fcp {
  	__u32 len;
  	__u8  pbt;
  	__u8  reserved1[3];
  	__u8  loadparm[8];
  	__u8  reserved2[304];
  	__u8  opt;
  	__u8  reserved3[3];
  	__u8  cssid;
  	__u8  reserved4[1];
  	__u16 devno;
  	__u8  reserved5[4];
  	__u64 wwpn;
  	__u64 lun;
  	__u32 bootprog;
  	__u8  reserved6[12];
  	__u64 br_lba;
  	__u32 scp_data_len;
  	__u8  reserved7[260];
  	__u8  scp_data[];
  } __packed;
  
  #define IPL_PB0_FCP_OPT_IPL	0x10
  #define IPL_PB0_FCP_OPT_DUMP	0x20
  
  /* IPL Parameter Block 0 for NVMe */
  struct ipl_pb0_nvme {
  	__u32 len;
  	__u8  pbt;
  	__u8  reserved1[3];
  	__u8  loadparm[8];
  	__u8  reserved2[304];
  	__u8  opt;
  	__u8  reserved3[3];
  	__u32 fid;
  	__u8 reserved4[12];
  	__u32 nsid;
  	__u8 reserved5[4];
  	__u32 bootprog;
  	__u8 reserved6[12];
  	__u64 br_lba;
  	__u32 scp_data_len;
  	__u8  reserved7[260];
  	__u8  scp_data[];
  } __packed;
  
  #define IPL_PB0_NVME_OPT_IPL	0x10
  #define IPL_PB0_NVME_OPT_DUMP	0x20
  
  /* IPL Parameter Block 0 for CCW */
  struct ipl_pb0_ccw {
  	__u32 len;
  	__u8  pbt;
  	__u8  flags;
  	__u8  reserved1[2];
  	__u8  loadparm[8];
  	__u8  reserved2[84];
  	__u16 reserved3 : 13;
  	__u8  ssid : 3;
  	__u16 devno;
  	__u8  vm_flags;
  	__u8  reserved4[3];
  	__u32 vm_parm_len;
  	__u8  nss_name[8];
  	__u8  vm_parm[64];
  	__u8  reserved5[8];
  } __packed;
  
  #define IPL_PB0_CCW_VM_FLAG_NSS		0x80
  #define IPL_PB0_CCW_VM_FLAG_VP		0x40
  
  /* IPL Parameter Block 1 for additional SCP data */
  struct ipl_pb1_scp_data {
  	__u32 len;
  	__u8  pbt;
  	__u8  scp_data[];
  } __packed;
  
  /* IPL Report List header */
  struct ipl_rl_hdr {
  	__u32 len;
  	__u8  flags;
  	__u8  reserved1[2];
  	__u8  version;
  	__u8  reserved2[8];
  } __packed;
  
  /* IPL Report Block header */
  struct ipl_rb_hdr {
  	__u32 len;
  	__u8  rbt;
  	__u8  reserved1[11];
  } __packed;
  
  /* IPL Report Block types */
  enum ipl_rbt {
  	IPL_RBT_CERTIFICATES = 1,
  	IPL_RBT_COMPONENTS = 2,
  };
  
  /* IPL Report Block for the certificate list */
  struct ipl_rb_certificate_entry {
  	__u64 addr;
  	__u64 len;
  } __packed;
  
  struct ipl_rb_certificates {
  	__u32 len;
  	__u8  rbt;
  	__u8  reserved1[11];
  	struct ipl_rb_certificate_entry entries[];
  } __packed;
  
  /* IPL Report Block for the component list */
  struct ipl_rb_component_entry {
  	__u64 addr;
  	__u64 len;
  	__u8  flags;
  	__u8  reserved1[5];
  	__u16 certificate_index;
  	__u8  reserved2[8];
  };
  
  #define IPL_RB_COMPONENT_FLAG_SIGNED	0x80
  #define IPL_RB_COMPONENT_FLAG_VERIFIED	0x40
  
  struct ipl_rb_components {
  	__u32 len;
  	__u8  rbt;
  	__u8  reserved1[11];
  	struct ipl_rb_component_entry entries[];
  } __packed;
  
  #endif
  