linux/arch/s390/include/asm/fcx.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3 *  Functions for assembling fcx enabled I/O control blocks.
   4 *
   5 *    Copyright IBM Corp. 2008
   6 *    Author(s): Peter Oberparleiter <peter.oberparleiter@de.ibm.com>
   7 */
   8
   9#ifndef _ASM_S390_FCX_H
  10#define _ASM_S390_FCX_H
  11
  12#include <linux/types.h>
  13
  14#define TCW_FORMAT_DEFAULT              0
  15#define TCW_TIDAW_FORMAT_DEFAULT        0
  16#define TCW_FLAGS_INPUT_TIDA            (1 << (23 - 5))
  17#define TCW_FLAGS_TCCB_TIDA             (1 << (23 - 6))
  18#define TCW_FLAGS_OUTPUT_TIDA           (1 << (23 - 7))
  19#define TCW_FLAGS_TIDAW_FORMAT(x)       ((x) & 3) << (23 - 9)
  20#define TCW_FLAGS_GET_TIDAW_FORMAT(x)   (((x) >> (23 - 9)) & 3)
  21
  22/**
  23 * struct tcw - Transport Control Word (TCW)
  24 * @format: TCW format
  25 * @flags: TCW flags
  26 * @tccbl: Transport-Command-Control-Block Length
  27 * @r: Read Operations
  28 * @w: Write Operations
  29 * @output: Output-Data Address
  30 * @input: Input-Data Address
  31 * @tsb: Transport-Status-Block Address
  32 * @tccb: Transport-Command-Control-Block Address
  33 * @output_count: Output Count
  34 * @input_count: Input Count
  35 * @intrg: Interrogate TCW Address
  36 */
  37struct tcw {
  38        u32 format:2;
  39        u32 :6;
  40        u32 flags:24;
  41        u32 :8;
  42        u32 tccbl:6;
  43        u32 r:1;
  44        u32 w:1;
  45        u32 :16;
  46        u64 output;
  47        u64 input;
  48        u64 tsb;
  49        u64 tccb;
  50        u32 output_count;
  51        u32 input_count;
  52        u32 :32;
  53        u32 :32;
  54        u32 :32;
  55        u32 intrg;
  56} __attribute__ ((packed, aligned(64)));
  57
  58#define TIDAW_FLAGS_LAST                (1 << (7 - 0))
  59#define TIDAW_FLAGS_SKIP                (1 << (7 - 1))
  60#define TIDAW_FLAGS_DATA_INT            (1 << (7 - 2))
  61#define TIDAW_FLAGS_TTIC                (1 << (7 - 3))
  62#define TIDAW_FLAGS_INSERT_CBC          (1 << (7 - 4))
  63
  64/**
  65 * struct tidaw - Transport-Indirect-Addressing Word (TIDAW)
  66 * @flags: TIDAW flags. Can be an arithmetic OR of the following constants:
  67 * %TIDAW_FLAGS_LAST, %TIDAW_FLAGS_SKIP, %TIDAW_FLAGS_DATA_INT,
  68 * %TIDAW_FLAGS_TTIC, %TIDAW_FLAGS_INSERT_CBC
  69 * @count: Count
  70 * @addr: Address
  71 */
  72struct tidaw {
  73        u32 flags:8;
  74        u32 :24;
  75        u32 count;
  76        u64 addr;
  77} __attribute__ ((packed, aligned(16)));
  78
  79/**
  80 * struct tsa_iostat - I/O-Status Transport-Status Area (IO-Stat TSA)
  81 * @dev_time: Device Time
  82 * @def_time: Defer Time
  83 * @queue_time: Queue Time
  84 * @dev_busy_time: Device-Busy Time
  85 * @dev_act_time: Device-Active-Only Time
  86 * @sense: Sense Data (if present)
  87 */
  88struct tsa_iostat {
  89        u32 dev_time;
  90        u32 def_time;
  91        u32 queue_time;
  92        u32 dev_busy_time;
  93        u32 dev_act_time;
  94        u8 sense[32];
  95} __attribute__ ((packed));
  96
  97/**
  98 * struct tsa_ddpcs - Device-Detected-Program-Check Transport-Status Area (DDPC TSA)
  99 * @rc: Reason Code
 100 * @rcq: Reason Code Qualifier
 101 * @sense: Sense Data (if present)
 102 */
 103struct tsa_ddpc {
 104        u32 :24;
 105        u32 rc:8;
 106        u8 rcq[16];
 107        u8 sense[32];
 108} __attribute__ ((packed));
 109
 110#define TSA_INTRG_FLAGS_CU_STATE_VALID          (1 << (7 - 0))
 111#define TSA_INTRG_FLAGS_DEV_STATE_VALID         (1 << (7 - 1))
 112#define TSA_INTRG_FLAGS_OP_STATE_VALID          (1 << (7 - 2))
 113
 114/**
 115 * struct tsa_intrg - Interrogate Transport-Status Area (Intrg. TSA)
 116 * @format: Format
 117 * @flags: Flags. Can be an arithmetic OR of the following constants:
 118 * %TSA_INTRG_FLAGS_CU_STATE_VALID, %TSA_INTRG_FLAGS_DEV_STATE_VALID,
 119 * %TSA_INTRG_FLAGS_OP_STATE_VALID
 120 * @cu_state: Controle-Unit State
 121 * @dev_state: Device State
 122 * @op_state: Operation State
 123 * @sd_info: State-Dependent Information
 124 * @dl_id: Device-Level Identifier
 125 * @dd_data: Device-Dependent Data
 126 */
 127struct tsa_intrg {
 128        u32 format:8;
 129        u32 flags:8;
 130        u32 cu_state:8;
 131        u32 dev_state:8;
 132        u32 op_state:8;
 133        u32 :24;
 134        u8 sd_info[12];
 135        u32 dl_id;
 136        u8 dd_data[28];
 137} __attribute__ ((packed));
 138
 139#define TSB_FORMAT_NONE         0
 140#define TSB_FORMAT_IOSTAT       1
 141#define TSB_FORMAT_DDPC         2
 142#define TSB_FORMAT_INTRG        3
 143
 144#define TSB_FLAGS_DCW_OFFSET_VALID      (1 << (7 - 0))
 145#define TSB_FLAGS_COUNT_VALID           (1 << (7 - 1))
 146#define TSB_FLAGS_CACHE_MISS            (1 << (7 - 2))
 147#define TSB_FLAGS_TIME_VALID            (1 << (7 - 3))
 148#define TSB_FLAGS_FORMAT(x)             ((x) & 7)
 149#define TSB_FORMAT(t)                   ((t)->flags & 7)
 150
 151/**
 152 * struct tsb - Transport-Status Block (TSB)
 153 * @length: Length
 154 * @flags: Flags. Can be an arithmetic OR of the following constants:
 155 * %TSB_FLAGS_DCW_OFFSET_VALID, %TSB_FLAGS_COUNT_VALID, %TSB_FLAGS_CACHE_MISS,
 156 * %TSB_FLAGS_TIME_VALID
 157 * @dcw_offset: DCW Offset
 158 * @count: Count
 159 * @tsa: Transport-Status-Area
 160 */
 161struct tsb {
 162        u32 length:8;
 163        u32 flags:8;
 164        u32 dcw_offset:16;
 165        u32 count;
 166        u32 :32;
 167        union {
 168                struct tsa_iostat iostat;
 169                struct tsa_ddpc ddpc;
 170                struct tsa_intrg intrg;
 171        } __attribute__ ((packed)) tsa;
 172} __attribute__ ((packed, aligned(8)));
 173
 174#define DCW_INTRG_FORMAT_DEFAULT        0
 175
 176#define DCW_INTRG_RC_UNSPECIFIED        0
 177#define DCW_INTRG_RC_TIMEOUT            1
 178
 179#define DCW_INTRG_RCQ_UNSPECIFIED       0
 180#define DCW_INTRG_RCQ_PRIMARY           1
 181#define DCW_INTRG_RCQ_SECONDARY         2
 182
 183#define DCW_INTRG_FLAGS_MPM             (1 << (7 - 0))
 184#define DCW_INTRG_FLAGS_PPR             (1 << (7 - 1))
 185#define DCW_INTRG_FLAGS_CRIT            (1 << (7 - 2))
 186
 187/**
 188 * struct dcw_intrg_data - Interrogate DCW data
 189 * @format: Format. Should be %DCW_INTRG_FORMAT_DEFAULT
 190 * @rc: Reason Code. Can be one of %DCW_INTRG_RC_UNSPECIFIED,
 191 * %DCW_INTRG_RC_TIMEOUT
 192 * @rcq: Reason Code Qualifier: Can be one of %DCW_INTRG_RCQ_UNSPECIFIED,
 193 * %DCW_INTRG_RCQ_PRIMARY, %DCW_INTRG_RCQ_SECONDARY
 194 * @lpm: Logical-Path Mask
 195 * @pam: Path-Available Mask
 196 * @pim: Path-Installed Mask
 197 * @timeout: Timeout
 198 * @flags: Flags. Can be an arithmetic OR of %DCW_INTRG_FLAGS_MPM,
 199 * %DCW_INTRG_FLAGS_PPR, %DCW_INTRG_FLAGS_CRIT
 200 * @time: Time
 201 * @prog_id: Program Identifier
 202 * @prog_data: Program-Dependent Data
 203 */
 204struct dcw_intrg_data {
 205        u32 format:8;
 206        u32 rc:8;
 207        u32 rcq:8;
 208        u32 lpm:8;
 209        u32 pam:8;
 210        u32 pim:8;
 211        u32 timeout:16;
 212        u32 flags:8;
 213        u32 :24;
 214        u32 :32;
 215        u64 time;
 216        u64 prog_id;
 217        u8  prog_data[0];
 218} __attribute__ ((packed));
 219
 220#define DCW_FLAGS_CC            (1 << (7 - 1))
 221
 222#define DCW_CMD_WRITE           0x01
 223#define DCW_CMD_READ            0x02
 224#define DCW_CMD_CONTROL         0x03
 225#define DCW_CMD_SENSE           0x04
 226#define DCW_CMD_SENSE_ID        0xe4
 227#define DCW_CMD_INTRG           0x40
 228
 229/**
 230 * struct dcw - Device-Command Word (DCW)
 231 * @cmd: Command Code. Can be one of %DCW_CMD_WRITE, %DCW_CMD_READ,
 232 * %DCW_CMD_CONTROL, %DCW_CMD_SENSE, %DCW_CMD_SENSE_ID, %DCW_CMD_INTRG
 233 * @flags: Flags. Can be an arithmetic OR of %DCW_FLAGS_CC
 234 * @cd_count: Control-Data Count
 235 * @count: Count
 236 * @cd: Control Data
 237 */
 238struct dcw {
 239        u32 cmd:8;
 240        u32 flags:8;
 241        u32 :8;
 242        u32 cd_count:8;
 243        u32 count;
 244        u8 cd[0];
 245} __attribute__ ((packed));
 246
 247#define TCCB_FORMAT_DEFAULT     0x7f
 248#define TCCB_MAX_DCW            30
 249#define TCCB_MAX_SIZE           (sizeof(struct tccb_tcah) + \
 250                                 TCCB_MAX_DCW * sizeof(struct dcw) + \
 251                                 sizeof(struct tccb_tcat))
 252#define TCCB_SAC_DEFAULT        0x1ffe
 253#define TCCB_SAC_INTRG          0x1fff
 254
 255/**
 256 * struct tccb_tcah - Transport-Command-Area Header (TCAH)
 257 * @format: Format. Should be %TCCB_FORMAT_DEFAULT
 258 * @tcal: Transport-Command-Area Length
 259 * @sac: Service-Action Code. Can be one of %TCCB_SAC_DEFAULT, %TCCB_SAC_INTRG
 260 * @prio: Priority
 261 */
 262struct tccb_tcah {
 263        u32 format:8;
 264        u32 :24;
 265        u32 :24;
 266        u32 tcal:8;
 267        u32 sac:16;
 268        u32 :8;
 269        u32 prio:8;
 270        u32 :32;
 271} __attribute__ ((packed));
 272
 273/**
 274 * struct tccb_tcat - Transport-Command-Area Trailer (TCAT)
 275 * @count: Transport Count
 276 */
 277struct tccb_tcat {
 278        u32 :32;
 279        u32 count;
 280} __attribute__ ((packed));
 281
 282/**
 283 * struct tccb - (partial) Transport-Command-Control Block (TCCB)
 284 * @tcah: TCAH
 285 * @tca: Transport-Command Area
 286 */
 287struct tccb {
 288        struct tccb_tcah tcah;
 289        u8 tca[0];
 290} __attribute__ ((packed, aligned(8)));
 291
 292struct tcw *tcw_get_intrg(struct tcw *tcw);
 293void *tcw_get_data(struct tcw *tcw);
 294struct tccb *tcw_get_tccb(struct tcw *tcw);
 295struct tsb *tcw_get_tsb(struct tcw *tcw);
 296
 297void tcw_init(struct tcw *tcw, int r, int w);
 298void tcw_finalize(struct tcw *tcw, int num_tidaws);
 299
 300void tcw_set_intrg(struct tcw *tcw, struct tcw *intrg_tcw);
 301void tcw_set_data(struct tcw *tcw, void *data, int use_tidal);
 302void tcw_set_tccb(struct tcw *tcw, struct tccb *tccb);
 303void tcw_set_tsb(struct tcw *tcw, struct tsb *tsb);
 304
 305void tccb_init(struct tccb *tccb, size_t tccb_size, u32 sac);
 306void tsb_init(struct tsb *tsb);
 307struct dcw *tccb_add_dcw(struct tccb *tccb, size_t tccb_size, u8 cmd, u8 flags,
 308                         void *cd, u8 cd_count, u32 count);
 309struct tidaw *tcw_add_tidaw(struct tcw *tcw, int num_tidaws, u8 flags,
 310                            void *addr, u32 count);
 311
 312#endif /* _ASM_S390_FCX_H */
 313