1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef _ASM_S390_EADM_H 3*4882a593Smuzhiyun #define _ASM_S390_EADM_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #include <linux/types.h> 6*4882a593Smuzhiyun #include <linux/device.h> 7*4882a593Smuzhiyun #include <linux/blk_types.h> 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun struct arqb { 10*4882a593Smuzhiyun u64 data; 11*4882a593Smuzhiyun u16 fmt:4; 12*4882a593Smuzhiyun u16:12; 13*4882a593Smuzhiyun u16 cmd_code; 14*4882a593Smuzhiyun u16:16; 15*4882a593Smuzhiyun u16 msb_count; 16*4882a593Smuzhiyun u32 reserved[12]; 17*4882a593Smuzhiyun } __packed; 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun #define ARQB_CMD_MOVE 1 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun struct arsb { 22*4882a593Smuzhiyun u16 fmt:4; 23*4882a593Smuzhiyun u32:28; 24*4882a593Smuzhiyun u8 ef; 25*4882a593Smuzhiyun u8:8; 26*4882a593Smuzhiyun u8 ecbi; 27*4882a593Smuzhiyun u8:8; 28*4882a593Smuzhiyun u8 fvf; 29*4882a593Smuzhiyun u16:16; 30*4882a593Smuzhiyun u8 eqc; 31*4882a593Smuzhiyun u32:32; 32*4882a593Smuzhiyun u64 fail_msb; 33*4882a593Smuzhiyun u64 fail_aidaw; 34*4882a593Smuzhiyun u64 fail_ms; 35*4882a593Smuzhiyun u64 fail_scm; 36*4882a593Smuzhiyun u32 reserved[4]; 37*4882a593Smuzhiyun } __packed; 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun #define EQC_WR_PROHIBIT 22 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun struct msb { 42*4882a593Smuzhiyun u8 fmt:4; 43*4882a593Smuzhiyun u8 oc:4; 44*4882a593Smuzhiyun u8 flags; 45*4882a593Smuzhiyun u16:12; 46*4882a593Smuzhiyun u16 bs:4; 47*4882a593Smuzhiyun u32 blk_count; 48*4882a593Smuzhiyun u64 data_addr; 49*4882a593Smuzhiyun u64 scm_addr; 50*4882a593Smuzhiyun u64:64; 51*4882a593Smuzhiyun } __packed; 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun struct aidaw { 54*4882a593Smuzhiyun u8 flags; 55*4882a593Smuzhiyun u32 :24; 56*4882a593Smuzhiyun u32 :32; 57*4882a593Smuzhiyun u64 data_addr; 58*4882a593Smuzhiyun } __packed; 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun #define MSB_OC_CLEAR 0 61*4882a593Smuzhiyun #define MSB_OC_READ 1 62*4882a593Smuzhiyun #define MSB_OC_WRITE 2 63*4882a593Smuzhiyun #define MSB_OC_RELEASE 3 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun #define MSB_FLAG_BNM 0x80 66*4882a593Smuzhiyun #define MSB_FLAG_IDA 0x40 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun #define MSB_BS_4K 0 69*4882a593Smuzhiyun #define MSB_BS_1M 1 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun #define AOB_NR_MSB 124 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun struct aob { 74*4882a593Smuzhiyun struct arqb request; 75*4882a593Smuzhiyun struct arsb response; 76*4882a593Smuzhiyun struct msb msb[AOB_NR_MSB]; 77*4882a593Smuzhiyun } __packed __aligned(PAGE_SIZE); 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun struct aob_rq_header { 80*4882a593Smuzhiyun struct scm_device *scmdev; 81*4882a593Smuzhiyun char data[0]; 82*4882a593Smuzhiyun }; 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun struct scm_device { 85*4882a593Smuzhiyun u64 address; 86*4882a593Smuzhiyun u64 size; 87*4882a593Smuzhiyun unsigned int nr_max_block; 88*4882a593Smuzhiyun struct device dev; 89*4882a593Smuzhiyun struct { 90*4882a593Smuzhiyun unsigned int persistence:4; 91*4882a593Smuzhiyun unsigned int oper_state:4; 92*4882a593Smuzhiyun unsigned int data_state:4; 93*4882a593Smuzhiyun unsigned int rank:4; 94*4882a593Smuzhiyun unsigned int release:1; 95*4882a593Smuzhiyun unsigned int res_id:8; 96*4882a593Smuzhiyun } __packed attrs; 97*4882a593Smuzhiyun }; 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun #define OP_STATE_GOOD 1 100*4882a593Smuzhiyun #define OP_STATE_TEMP_ERR 2 101*4882a593Smuzhiyun #define OP_STATE_PERM_ERR 3 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun enum scm_event {SCM_CHANGE, SCM_AVAIL}; 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun struct scm_driver { 106*4882a593Smuzhiyun struct device_driver drv; 107*4882a593Smuzhiyun int (*probe) (struct scm_device *scmdev); 108*4882a593Smuzhiyun int (*remove) (struct scm_device *scmdev); 109*4882a593Smuzhiyun void (*notify) (struct scm_device *scmdev, enum scm_event event); 110*4882a593Smuzhiyun void (*handler) (struct scm_device *scmdev, void *data, 111*4882a593Smuzhiyun blk_status_t error); 112*4882a593Smuzhiyun }; 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun int scm_driver_register(struct scm_driver *scmdrv); 115*4882a593Smuzhiyun void scm_driver_unregister(struct scm_driver *scmdrv); 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun int eadm_start_aob(struct aob *aob); 118*4882a593Smuzhiyun void scm_irq_handler(struct aob *aob, blk_status_t error); 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun #endif /* _ASM_S390_EADM_H */ 121