/*1* Functions for assembling fcx enabled I/O control blocks.2*3* Copyright IBM Corp. 20084* Author(s): Peter Oberparleiter <[email protected]>5*/67#ifndef _ASM_S390_FCX_H8#define _ASM_S390_FCX_H _ASM_S390_FCX_H910#include <linux/types.h>1112#define TCW_FORMAT_DEFAULT 013#define TCW_TIDAW_FORMAT_DEFAULT 014#define TCW_FLAGS_INPUT_TIDA 1 << (23 - 5)15#define TCW_FLAGS_TCCB_TIDA 1 << (23 - 6)16#define TCW_FLAGS_OUTPUT_TIDA 1 << (23 - 7)17#define TCW_FLAGS_TIDAW_FORMAT(x) ((x) & 3) << (23 - 9)18#define TCW_FLAGS_GET_TIDAW_FORMAT(x) (((x) >> (23 - 9)) & 3)1920/**21* struct tcw - Transport Control Word (TCW)22* @format: TCW format23* @flags: TCW flags24* @tccbl: Transport-Command-Control-Block Length25* @r: Read Operations26* @w: Write Operations27* @output: Output-Data Address28* @input: Input-Data Address29* @tsb: Transport-Status-Block Address30* @tccb: Transport-Command-Control-Block Address31* @output_count: Output Count32* @input_count: Input Count33* @intrg: Interrogate TCW Address34*/35struct tcw {36u32 format:2;37u32 :6;38u32 flags:24;39u32 :8;40u32 tccbl:6;41u32 r:1;42u32 w:1;43u32 :16;44u64 output;45u64 input;46u64 tsb;47u64 tccb;48u32 output_count;49u32 input_count;50u32 :32;51u32 :32;52u32 :32;53u32 intrg;54} __attribute__ ((packed, aligned(64)));5556#define TIDAW_FLAGS_LAST 1 << (7 - 0)57#define TIDAW_FLAGS_SKIP 1 << (7 - 1)58#define TIDAW_FLAGS_DATA_INT 1 << (7 - 2)59#define TIDAW_FLAGS_TTIC 1 << (7 - 3)60#define TIDAW_FLAGS_INSERT_CBC 1 << (7 - 4)6162/**63* struct tidaw - Transport-Indirect-Addressing Word (TIDAW)64* @flags: TIDAW flags. Can be an arithmetic OR of the following constants:65* %TIDAW_FLAGS_LAST, %TIDAW_FLAGS_SKIP, %TIDAW_FLAGS_DATA_INT,66* %TIDAW_FLAGS_TTIC, %TIDAW_FLAGS_INSERT_CBC67* @count: Count68* @addr: Address69*/70struct tidaw {71u32 flags:8;72u32 :24;73u32 count;74u64 addr;75} __attribute__ ((packed, aligned(16)));7677/**78* struct tsa_iostat - I/O-Status Transport-Status Area (IO-Stat TSA)79* @dev_time: Device Time80* @def_time: Defer Time81* @queue_time: Queue Time82* @dev_busy_time: Device-Busy Time83* @dev_act_time: Device-Active-Only Time84* @sense: Sense Data (if present)85*/86struct tsa_iostat {87u32 dev_time;88u32 def_time;89u32 queue_time;90u32 dev_busy_time;91u32 dev_act_time;92u8 sense[32];93} __attribute__ ((packed));9495/**96* struct tsa_ddpcs - Device-Detected-Program-Check Transport-Status Area (DDPC TSA)97* @rc: Reason Code98* @rcq: Reason Code Qualifier99* @sense: Sense Data (if present)100*/101struct tsa_ddpc {102u32 :24;103u32 rc:8;104u8 rcq[16];105u8 sense[32];106} __attribute__ ((packed));107108#define TSA_INTRG_FLAGS_CU_STATE_VALID 1 << (7 - 0)109#define TSA_INTRG_FLAGS_DEV_STATE_VALID 1 << (7 - 1)110#define TSA_INTRG_FLAGS_OP_STATE_VALID 1 << (7 - 2)111112/**113* struct tsa_intrg - Interrogate Transport-Status Area (Intrg. TSA)114* @format: Format115* @flags: Flags. Can be an arithmetic OR of the following constants:116* %TSA_INTRG_FLAGS_CU_STATE_VALID, %TSA_INTRG_FLAGS_DEV_STATE_VALID,117* %TSA_INTRG_FLAGS_OP_STATE_VALID118* @cu_state: Controle-Unit State119* @dev_state: Device State120* @op_state: Operation State121* @sd_info: State-Dependent Information122* @dl_id: Device-Level Identifier123* @dd_data: Device-Dependent Data124*/125struct tsa_intrg {126u32 format:8;127u32 flags:8;128u32 cu_state:8;129u32 dev_state:8;130u32 op_state:8;131u32 :24;132u8 sd_info[12];133u32 dl_id;134u8 dd_data[28];135} __attribute__ ((packed));136137#define TSB_FORMAT_NONE 0138#define TSB_FORMAT_IOSTAT 1139#define TSB_FORMAT_DDPC 2140#define TSB_FORMAT_INTRG 3141142#define TSB_FLAGS_DCW_OFFSET_VALID 1 << (7 - 0)143#define TSB_FLAGS_COUNT_VALID 1 << (7 - 1)144#define TSB_FLAGS_CACHE_MISS 1 << (7 - 2)145#define TSB_FLAGS_TIME_VALID 1 << (7 - 3)146#define TSB_FLAGS_FORMAT(x) ((x) & 7)147#define TSB_FORMAT(t) ((t)->flags & 7)148149/**150* struct tsb - Transport-Status Block (TSB)151* @length: Length152* @flags: Flags. Can be an arithmetic OR of the following constants:153* %TSB_FLAGS_DCW_OFFSET_VALID, %TSB_FLAGS_COUNT_VALID, %TSB_FLAGS_CACHE_MISS,154* %TSB_FLAGS_TIME_VALID155* @dcw_offset: DCW Offset156* @count: Count157* @tsa: Transport-Status-Area158*/159struct tsb {160u32 length:8;161u32 flags:8;162u32 dcw_offset:16;163u32 count;164u32 :32;165union {166struct tsa_iostat iostat;167struct tsa_ddpc ddpc;168struct tsa_intrg intrg;169} __attribute__ ((packed)) tsa;170} __attribute__ ((packed, aligned(8)));171172#define DCW_INTRG_FORMAT_DEFAULT 0173174#define DCW_INTRG_RC_UNSPECIFIED 0175#define DCW_INTRG_RC_TIMEOUT 1176177#define DCW_INTRG_RCQ_UNSPECIFIED 0178#define DCW_INTRG_RCQ_PRIMARY 1179#define DCW_INTRG_RCQ_SECONDARY 2180181#define DCW_INTRG_FLAGS_MPM 1 < (7 - 0)182#define DCW_INTRG_FLAGS_PPR 1 < (7 - 1)183#define DCW_INTRG_FLAGS_CRIT 1 < (7 - 2)184185/**186* struct dcw_intrg_data - Interrogate DCW data187* @format: Format. Should be %DCW_INTRG_FORMAT_DEFAULT188* @rc: Reason Code. Can be one of %DCW_INTRG_RC_UNSPECIFIED,189* %DCW_INTRG_RC_TIMEOUT190* @rcq: Reason Code Qualifier: Can be one of %DCW_INTRG_RCQ_UNSPECIFIED,191* %DCW_INTRG_RCQ_PRIMARY, %DCW_INTRG_RCQ_SECONDARY192* @lpm: Logical-Path Mask193* @pam: Path-Available Mask194* @pim: Path-Installed Mask195* @timeout: Timeout196* @flags: Flags. Can be an arithmetic OR of %DCW_INTRG_FLAGS_MPM,197* %DCW_INTRG_FLAGS_PPR, %DCW_INTRG_FLAGS_CRIT198* @time: Time199* @prog_id: Program Identifier200* @prog_data: Program-Dependent Data201*/202struct dcw_intrg_data {203u32 format:8;204u32 rc:8;205u32 rcq:8;206u32 lpm:8;207u32 pam:8;208u32 pim:8;209u32 timeout:16;210u32 flags:8;211u32 :24;212u32 :32;213u64 time;214u64 prog_id;215u8 prog_data[0];216} __attribute__ ((packed));217218#define DCW_FLAGS_CC 1 << (7 - 1)219220#define DCW_CMD_WRITE 0x01221#define DCW_CMD_READ 0x02222#define DCW_CMD_CONTROL 0x03223#define DCW_CMD_SENSE 0x04224#define DCW_CMD_SENSE_ID 0xe4225#define DCW_CMD_INTRG 0x40226227/**228* struct dcw - Device-Command Word (DCW)229* @cmd: Command Code. Can be one of %DCW_CMD_WRITE, %DCW_CMD_READ,230* %DCW_CMD_CONTROL, %DCW_CMD_SENSE, %DCW_CMD_SENSE_ID, %DCW_CMD_INTRG231* @flags: Flags. Can be an arithmetic OR of %DCW_FLAGS_CC232* @cd_count: Control-Data Count233* @count: Count234* @cd: Control Data235*/236struct dcw {237u32 cmd:8;238u32 flags:8;239u32 :8;240u32 cd_count:8;241u32 count;242u8 cd[0];243} __attribute__ ((packed));244245#define TCCB_FORMAT_DEFAULT 0x7f246#define TCCB_MAX_DCW 30247#define TCCB_MAX_SIZE (sizeof(struct tccb_tcah) + \248TCCB_MAX_DCW * sizeof(struct dcw) + \249sizeof(struct tccb_tcat))250#define TCCB_SAC_DEFAULT 0x1ffe251#define TCCB_SAC_INTRG 0x1fff252253/**254* struct tccb_tcah - Transport-Command-Area Header (TCAH)255* @format: Format. Should be %TCCB_FORMAT_DEFAULT256* @tcal: Transport-Command-Area Length257* @sac: Service-Action Code. Can be one of %TCCB_SAC_DEFAULT, %TCCB_SAC_INTRG258* @prio: Priority259*/260struct tccb_tcah {261u32 format:8;262u32 :24;263u32 :24;264u32 tcal:8;265u32 sac:16;266u32 :8;267u32 prio:8;268u32 :32;269} __attribute__ ((packed));270271/**272* struct tccb_tcat - Transport-Command-Area Trailer (TCAT)273* @count: Transport Count274*/275struct tccb_tcat {276u32 :32;277u32 count;278} __attribute__ ((packed));279280/**281* struct tccb - (partial) Transport-Command-Control Block (TCCB)282* @tcah: TCAH283* @tca: Transport-Command Area284*/285struct tccb {286struct tccb_tcah tcah;287u8 tca[0];288} __attribute__ ((packed, aligned(8)));289290struct tcw *tcw_get_intrg(struct tcw *tcw);291void *tcw_get_data(struct tcw *tcw);292struct tccb *tcw_get_tccb(struct tcw *tcw);293struct tsb *tcw_get_tsb(struct tcw *tcw);294295void tcw_init(struct tcw *tcw, int r, int w);296void tcw_finalize(struct tcw *tcw, int num_tidaws);297298void tcw_set_intrg(struct tcw *tcw, struct tcw *intrg_tcw);299void tcw_set_data(struct tcw *tcw, void *data, int use_tidal);300void tcw_set_tccb(struct tcw *tcw, struct tccb *tccb);301void tcw_set_tsb(struct tcw *tcw, struct tsb *tsb);302303void tccb_init(struct tccb *tccb, size_t tccb_size, u32 sac);304void tsb_init(struct tsb *tsb);305struct dcw *tccb_add_dcw(struct tccb *tccb, size_t tccb_size, u8 cmd, u8 flags,306void *cd, u8 cd_count, u32 count);307struct tidaw *tcw_add_tidaw(struct tcw *tcw, int num_tidaws, u8 flags,308void *addr, u32 count);309310#endif /* _ASM_S390_FCX_H */311312313