183262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter/* 283262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * Functions for assembling fcx enabled I/O control blocks. 383262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * 483262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * Copyright IBM Corp. 2008 583262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * Author(s): Peter Oberparleiter <peter.oberparleiter@de.ibm.com> 683262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter */ 783262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter 883262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter#ifndef _ASM_S390_FCX_H 983262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter#define _ASM_S390_FCX_H _ASM_S390_FCX_H 1083262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter 1183262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter#include <linux/types.h> 1283262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter 1383262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter#define TCW_FORMAT_DEFAULT 0 1483262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter#define TCW_TIDAW_FORMAT_DEFAULT 0 158a80b10895cee6ab5afe66ef0b26ad70cbd423b3Peter Oberparleiter#define TCW_FLAGS_INPUT_TIDA (1 << (23 - 5)) 168a80b10895cee6ab5afe66ef0b26ad70cbd423b3Peter Oberparleiter#define TCW_FLAGS_TCCB_TIDA (1 << (23 - 6)) 178a80b10895cee6ab5afe66ef0b26ad70cbd423b3Peter Oberparleiter#define TCW_FLAGS_OUTPUT_TIDA (1 << (23 - 7)) 1883262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter#define TCW_FLAGS_TIDAW_FORMAT(x) ((x) & 3) << (23 - 9) 1983262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter#define TCW_FLAGS_GET_TIDAW_FORMAT(x) (((x) >> (23 - 9)) & 3) 2083262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter 2183262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter/** 2283262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * struct tcw - Transport Control Word (TCW) 2383262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @format: TCW format 2483262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @flags: TCW flags 2583262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @tccbl: Transport-Command-Control-Block Length 2683262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @r: Read Operations 2783262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @w: Write Operations 2883262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @output: Output-Data Address 2983262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @input: Input-Data Address 3083262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @tsb: Transport-Status-Block Address 3183262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @tccb: Transport-Command-Control-Block Address 3283262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @output_count: Output Count 3383262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @input_count: Input Count 3483262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @intrg: Interrogate TCW Address 3583262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter */ 3683262d6349e60b9d10798d489719d80029c00798Peter Oberparleiterstruct tcw { 3783262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 format:2; 3883262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 :6; 3983262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 flags:24; 4083262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 :8; 4183262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 tccbl:6; 4283262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 r:1; 4383262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 w:1; 4483262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 :16; 4583262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u64 output; 4683262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u64 input; 4783262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u64 tsb; 4883262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u64 tccb; 4983262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 output_count; 5083262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 input_count; 5183262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 :32; 5283262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 :32; 5383262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 :32; 5483262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 intrg; 5583262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter} __attribute__ ((packed, aligned(64))); 5683262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter 578a80b10895cee6ab5afe66ef0b26ad70cbd423b3Peter Oberparleiter#define TIDAW_FLAGS_LAST (1 << (7 - 0)) 588a80b10895cee6ab5afe66ef0b26ad70cbd423b3Peter Oberparleiter#define TIDAW_FLAGS_SKIP (1 << (7 - 1)) 598a80b10895cee6ab5afe66ef0b26ad70cbd423b3Peter Oberparleiter#define TIDAW_FLAGS_DATA_INT (1 << (7 - 2)) 608a80b10895cee6ab5afe66ef0b26ad70cbd423b3Peter Oberparleiter#define TIDAW_FLAGS_TTIC (1 << (7 - 3)) 618a80b10895cee6ab5afe66ef0b26ad70cbd423b3Peter Oberparleiter#define TIDAW_FLAGS_INSERT_CBC (1 << (7 - 4)) 6283262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter 6383262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter/** 6483262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * struct tidaw - Transport-Indirect-Addressing Word (TIDAW) 6583262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @flags: TIDAW flags. Can be an arithmetic OR of the following constants: 6683262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * %TIDAW_FLAGS_LAST, %TIDAW_FLAGS_SKIP, %TIDAW_FLAGS_DATA_INT, 6783262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * %TIDAW_FLAGS_TTIC, %TIDAW_FLAGS_INSERT_CBC 6883262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @count: Count 6983262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @addr: Address 7083262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter */ 7183262d6349e60b9d10798d489719d80029c00798Peter Oberparleiterstruct tidaw { 7283262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 flags:8; 7383262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 :24; 7483262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 count; 7583262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u64 addr; 7683262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter} __attribute__ ((packed, aligned(16))); 7783262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter 7883262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter/** 7983262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * struct tsa_iostat - I/O-Status Transport-Status Area (IO-Stat TSA) 8083262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @dev_time: Device Time 8183262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @def_time: Defer Time 8283262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @queue_time: Queue Time 8383262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @dev_busy_time: Device-Busy Time 8483262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @dev_act_time: Device-Active-Only Time 8583262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @sense: Sense Data (if present) 8683262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter */ 8783262d6349e60b9d10798d489719d80029c00798Peter Oberparleiterstruct tsa_iostat { 8883262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 dev_time; 8983262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 def_time; 9083262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 queue_time; 9183262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 dev_busy_time; 9283262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 dev_act_time; 9383262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u8 sense[32]; 9483262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter} __attribute__ ((packed)); 9583262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter 9683262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter/** 9783262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * struct tsa_ddpcs - Device-Detected-Program-Check Transport-Status Area (DDPC TSA) 9883262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @rc: Reason Code 9983262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @rcq: Reason Code Qualifier 10083262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @sense: Sense Data (if present) 10183262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter */ 10283262d6349e60b9d10798d489719d80029c00798Peter Oberparleiterstruct tsa_ddpc { 10383262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 :24; 10483262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 rc:8; 10583262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u8 rcq[16]; 10683262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u8 sense[32]; 10783262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter} __attribute__ ((packed)); 10883262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter 1098a80b10895cee6ab5afe66ef0b26ad70cbd423b3Peter Oberparleiter#define TSA_INTRG_FLAGS_CU_STATE_VALID (1 << (7 - 0)) 1108a80b10895cee6ab5afe66ef0b26ad70cbd423b3Peter Oberparleiter#define TSA_INTRG_FLAGS_DEV_STATE_VALID (1 << (7 - 1)) 1118a80b10895cee6ab5afe66ef0b26ad70cbd423b3Peter Oberparleiter#define TSA_INTRG_FLAGS_OP_STATE_VALID (1 << (7 - 2)) 11283262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter 11383262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter/** 11483262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * struct tsa_intrg - Interrogate Transport-Status Area (Intrg. TSA) 11583262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @format: Format 11683262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @flags: Flags. Can be an arithmetic OR of the following constants: 11783262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * %TSA_INTRG_FLAGS_CU_STATE_VALID, %TSA_INTRG_FLAGS_DEV_STATE_VALID, 11883262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * %TSA_INTRG_FLAGS_OP_STATE_VALID 11983262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @cu_state: Controle-Unit State 12083262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @dev_state: Device State 12183262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @op_state: Operation State 12283262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @sd_info: State-Dependent Information 12383262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @dl_id: Device-Level Identifier 12483262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @dd_data: Device-Dependent Data 12583262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter */ 12683262d6349e60b9d10798d489719d80029c00798Peter Oberparleiterstruct tsa_intrg { 12783262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 format:8; 12883262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 flags:8; 12983262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 cu_state:8; 13083262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 dev_state:8; 13183262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 op_state:8; 13283262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 :24; 13383262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u8 sd_info[12]; 13483262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 dl_id; 13583262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u8 dd_data[28]; 13683262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter} __attribute__ ((packed)); 13783262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter 13883262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter#define TSB_FORMAT_NONE 0 13983262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter#define TSB_FORMAT_IOSTAT 1 14083262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter#define TSB_FORMAT_DDPC 2 14183262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter#define TSB_FORMAT_INTRG 3 14283262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter 1438a80b10895cee6ab5afe66ef0b26ad70cbd423b3Peter Oberparleiter#define TSB_FLAGS_DCW_OFFSET_VALID (1 << (7 - 0)) 1448a80b10895cee6ab5afe66ef0b26ad70cbd423b3Peter Oberparleiter#define TSB_FLAGS_COUNT_VALID (1 << (7 - 1)) 1458a80b10895cee6ab5afe66ef0b26ad70cbd423b3Peter Oberparleiter#define TSB_FLAGS_CACHE_MISS (1 << (7 - 2)) 1468a80b10895cee6ab5afe66ef0b26ad70cbd423b3Peter Oberparleiter#define TSB_FLAGS_TIME_VALID (1 << (7 - 3)) 14783262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter#define TSB_FLAGS_FORMAT(x) ((x) & 7) 14883262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter#define TSB_FORMAT(t) ((t)->flags & 7) 14983262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter 15083262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter/** 15183262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * struct tsb - Transport-Status Block (TSB) 15283262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @length: Length 15383262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @flags: Flags. Can be an arithmetic OR of the following constants: 15483262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * %TSB_FLAGS_DCW_OFFSET_VALID, %TSB_FLAGS_COUNT_VALID, %TSB_FLAGS_CACHE_MISS, 15583262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * %TSB_FLAGS_TIME_VALID 15683262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @dcw_offset: DCW Offset 15783262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @count: Count 15883262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @tsa: Transport-Status-Area 15983262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter */ 16083262d6349e60b9d10798d489719d80029c00798Peter Oberparleiterstruct tsb { 16183262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 length:8; 16283262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 flags:8; 16383262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 dcw_offset:16; 16483262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 count; 16583262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 :32; 16683262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter union { 16783262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter struct tsa_iostat iostat; 16883262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter struct tsa_ddpc ddpc; 16983262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter struct tsa_intrg intrg; 17083262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter } __attribute__ ((packed)) tsa; 17183262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter} __attribute__ ((packed, aligned(8))); 17283262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter 17383262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter#define DCW_INTRG_FORMAT_DEFAULT 0 17483262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter 17583262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter#define DCW_INTRG_RC_UNSPECIFIED 0 17683262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter#define DCW_INTRG_RC_TIMEOUT 1 17783262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter 17883262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter#define DCW_INTRG_RCQ_UNSPECIFIED 0 17983262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter#define DCW_INTRG_RCQ_PRIMARY 1 18083262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter#define DCW_INTRG_RCQ_SECONDARY 2 18183262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter 1828a80b10895cee6ab5afe66ef0b26ad70cbd423b3Peter Oberparleiter#define DCW_INTRG_FLAGS_MPM (1 << (7 - 0)) 1838a80b10895cee6ab5afe66ef0b26ad70cbd423b3Peter Oberparleiter#define DCW_INTRG_FLAGS_PPR (1 << (7 - 1)) 1848a80b10895cee6ab5afe66ef0b26ad70cbd423b3Peter Oberparleiter#define DCW_INTRG_FLAGS_CRIT (1 << (7 - 2)) 18583262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter 18683262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter/** 18783262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * struct dcw_intrg_data - Interrogate DCW data 18883262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @format: Format. Should be %DCW_INTRG_FORMAT_DEFAULT 18983262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @rc: Reason Code. Can be one of %DCW_INTRG_RC_UNSPECIFIED, 19083262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * %DCW_INTRG_RC_TIMEOUT 19183262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @rcq: Reason Code Qualifier: Can be one of %DCW_INTRG_RCQ_UNSPECIFIED, 19283262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * %DCW_INTRG_RCQ_PRIMARY, %DCW_INTRG_RCQ_SECONDARY 19383262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @lpm: Logical-Path Mask 19483262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @pam: Path-Available Mask 19583262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @pim: Path-Installed Mask 19683262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @timeout: Timeout 19783262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @flags: Flags. Can be an arithmetic OR of %DCW_INTRG_FLAGS_MPM, 19883262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * %DCW_INTRG_FLAGS_PPR, %DCW_INTRG_FLAGS_CRIT 19983262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @time: Time 20083262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @prog_id: Program Identifier 20183262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @prog_data: Program-Dependent Data 20283262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter */ 20383262d6349e60b9d10798d489719d80029c00798Peter Oberparleiterstruct dcw_intrg_data { 20483262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 format:8; 20583262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 rc:8; 20683262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 rcq:8; 20783262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 lpm:8; 20883262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 pam:8; 20983262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 pim:8; 21083262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 timeout:16; 21183262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 flags:8; 21283262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 :24; 21383262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 :32; 21483262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u64 time; 21583262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u64 prog_id; 21683262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u8 prog_data[0]; 21783262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter} __attribute__ ((packed)); 21883262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter 2198a80b10895cee6ab5afe66ef0b26ad70cbd423b3Peter Oberparleiter#define DCW_FLAGS_CC (1 << (7 - 1)) 22083262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter 22183262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter#define DCW_CMD_WRITE 0x01 22283262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter#define DCW_CMD_READ 0x02 22383262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter#define DCW_CMD_CONTROL 0x03 22483262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter#define DCW_CMD_SENSE 0x04 22583262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter#define DCW_CMD_SENSE_ID 0xe4 22683262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter#define DCW_CMD_INTRG 0x40 22783262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter 22883262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter/** 22983262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * struct dcw - Device-Command Word (DCW) 23083262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @cmd: Command Code. Can be one of %DCW_CMD_WRITE, %DCW_CMD_READ, 23183262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * %DCW_CMD_CONTROL, %DCW_CMD_SENSE, %DCW_CMD_SENSE_ID, %DCW_CMD_INTRG 23283262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @flags: Flags. Can be an arithmetic OR of %DCW_FLAGS_CC 23383262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @cd_count: Control-Data Count 23483262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @count: Count 23583262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @cd: Control Data 23683262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter */ 23783262d6349e60b9d10798d489719d80029c00798Peter Oberparleiterstruct dcw { 23883262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 cmd:8; 23983262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 flags:8; 24083262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 :8; 24183262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 cd_count:8; 24283262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 count; 24383262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u8 cd[0]; 24483262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter} __attribute__ ((packed)); 24583262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter 24683262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter#define TCCB_FORMAT_DEFAULT 0x7f 24783262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter#define TCCB_MAX_DCW 30 24883262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter#define TCCB_MAX_SIZE (sizeof(struct tccb_tcah) + \ 24983262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter TCCB_MAX_DCW * sizeof(struct dcw) + \ 25083262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter sizeof(struct tccb_tcat)) 251d7b604891b7ce7de93e3758ec6b3b7b7964e1884Peter Oberparleiter#define TCCB_SAC_DEFAULT 0x1ffe 252d7b604891b7ce7de93e3758ec6b3b7b7964e1884Peter Oberparleiter#define TCCB_SAC_INTRG 0x1fff 25383262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter 25483262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter/** 25583262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * struct tccb_tcah - Transport-Command-Area Header (TCAH) 25683262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @format: Format. Should be %TCCB_FORMAT_DEFAULT 25783262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @tcal: Transport-Command-Area Length 25883262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @sac: Service-Action Code. Can be one of %TCCB_SAC_DEFAULT, %TCCB_SAC_INTRG 25983262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @prio: Priority 26083262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter */ 26183262d6349e60b9d10798d489719d80029c00798Peter Oberparleiterstruct tccb_tcah { 26283262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 format:8; 26383262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 :24; 26483262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 :24; 26583262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 tcal:8; 26683262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 sac:16; 26783262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 :8; 26883262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 prio:8; 26983262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 :32; 27083262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter} __attribute__ ((packed)); 27183262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter 27283262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter/** 27383262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * struct tccb_tcat - Transport-Command-Area Trailer (TCAT) 27483262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @count: Transport Count 27583262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter */ 27683262d6349e60b9d10798d489719d80029c00798Peter Oberparleiterstruct tccb_tcat { 27783262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 :32; 27883262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u32 count; 27983262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter} __attribute__ ((packed)); 28083262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter 28183262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter/** 28283262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * struct tccb - (partial) Transport-Command-Control Block (TCCB) 28383262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @tcah: TCAH 28483262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter * @tca: Transport-Command Area 28583262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter */ 28683262d6349e60b9d10798d489719d80029c00798Peter Oberparleiterstruct tccb { 28783262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter struct tccb_tcah tcah; 28883262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter u8 tca[0]; 28983262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter} __attribute__ ((packed, aligned(8))); 29083262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter 29183262d6349e60b9d10798d489719d80029c00798Peter Oberparleiterstruct tcw *tcw_get_intrg(struct tcw *tcw); 29283262d6349e60b9d10798d489719d80029c00798Peter Oberparleitervoid *tcw_get_data(struct tcw *tcw); 29383262d6349e60b9d10798d489719d80029c00798Peter Oberparleiterstruct tccb *tcw_get_tccb(struct tcw *tcw); 29483262d6349e60b9d10798d489719d80029c00798Peter Oberparleiterstruct tsb *tcw_get_tsb(struct tcw *tcw); 29583262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter 29683262d6349e60b9d10798d489719d80029c00798Peter Oberparleitervoid tcw_init(struct tcw *tcw, int r, int w); 29783262d6349e60b9d10798d489719d80029c00798Peter Oberparleitervoid tcw_finalize(struct tcw *tcw, int num_tidaws); 29883262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter 29983262d6349e60b9d10798d489719d80029c00798Peter Oberparleitervoid tcw_set_intrg(struct tcw *tcw, struct tcw *intrg_tcw); 30083262d6349e60b9d10798d489719d80029c00798Peter Oberparleitervoid tcw_set_data(struct tcw *tcw, void *data, int use_tidal); 30183262d6349e60b9d10798d489719d80029c00798Peter Oberparleitervoid tcw_set_tccb(struct tcw *tcw, struct tccb *tccb); 30283262d6349e60b9d10798d489719d80029c00798Peter Oberparleitervoid tcw_set_tsb(struct tcw *tcw, struct tsb *tsb); 30383262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter 30483262d6349e60b9d10798d489719d80029c00798Peter Oberparleitervoid tccb_init(struct tccb *tccb, size_t tccb_size, u32 sac); 30583262d6349e60b9d10798d489719d80029c00798Peter Oberparleitervoid tsb_init(struct tsb *tsb); 30683262d6349e60b9d10798d489719d80029c00798Peter Oberparleiterstruct dcw *tccb_add_dcw(struct tccb *tccb, size_t tccb_size, u8 cmd, u8 flags, 30783262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter void *cd, u8 cd_count, u32 count); 30883262d6349e60b9d10798d489719d80029c00798Peter Oberparleiterstruct tidaw *tcw_add_tidaw(struct tcw *tcw, int num_tidaws, u8 flags, 30983262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter void *addr, u32 count); 31083262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter 31183262d6349e60b9d10798d489719d80029c00798Peter Oberparleiter#endif /* _ASM_S390_FCX_H */ 312