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