linux/arch/s390/include/asm/etr.h
<<
>>
Prefs
   1/*
   2 *  include/asm-s390/etr.h
   3 *
   4 *  Copyright IBM Corp. 2006
   5 *  Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com)
   6 */
   7#ifndef __S390_ETR_H
   8#define __S390_ETR_H
   9
  10/* ETR attachment control register */
  11struct etr_eacr {
  12        unsigned int e0         : 1;    /* port 0 stepping control */
  13        unsigned int e1         : 1;    /* port 1 stepping control */
  14        unsigned int _pad0      : 5;    /* must be 00100 */
  15        unsigned int dp         : 1;    /* data port control */
  16        unsigned int p0         : 1;    /* port 0 change recognition control */
  17        unsigned int p1         : 1;    /* port 1 change recognition control */
  18        unsigned int _pad1      : 3;    /* must be 000 */
  19        unsigned int ea         : 1;    /* ETR alert control */
  20        unsigned int es         : 1;    /* ETR sync check control */
  21        unsigned int sl         : 1;    /* switch to local control */
  22} __attribute__ ((packed));
  23
  24/* Port state returned by steai */
  25enum etr_psc {
  26        etr_psc_operational = 0,
  27        etr_psc_semi_operational = 1,
  28        etr_psc_protocol_error =  4,
  29        etr_psc_no_symbols = 8,
  30        etr_psc_no_signal = 12,
  31        etr_psc_pps_mode = 13
  32};
  33
  34/* Logical port state returned by stetr */
  35enum etr_lpsc {
  36        etr_lpsc_operational_step = 0,
  37        etr_lpsc_operational_alt = 1,
  38        etr_lpsc_semi_operational = 2,
  39        etr_lpsc_protocol_error =  4,
  40        etr_lpsc_no_symbol_sync = 8,
  41        etr_lpsc_no_signal = 12,
  42        etr_lpsc_pps_mode = 13
  43};
  44
  45/* ETR status words */
  46struct etr_esw {
  47        struct etr_eacr eacr;           /* attachment control register */
  48        unsigned int y          : 1;    /* stepping mode */
  49        unsigned int _pad0      : 5;    /* must be 00000 */
  50        unsigned int p          : 1;    /* stepping port number */
  51        unsigned int q          : 1;    /* data port number */
  52        unsigned int psc0       : 4;    /* port 0 state code */
  53        unsigned int psc1       : 4;    /* port 1 state code */
  54} __attribute__ ((packed));
  55
  56/* Second level data register status word */
  57struct etr_slsw {
  58        unsigned int vv1        : 1;    /* copy of validity bit data frame 1 */
  59        unsigned int vv2        : 1;    /* copy of validity bit data frame 2 */
  60        unsigned int vv3        : 1;    /* copy of validity bit data frame 3 */
  61        unsigned int vv4        : 1;    /* copy of validity bit data frame 4 */
  62        unsigned int _pad0      : 19;   /* must by all zeroes */
  63        unsigned int n          : 1;    /* EAF port number */
  64        unsigned int v1         : 1;    /* validity bit ETR data frame 1 */
  65        unsigned int v2         : 1;    /* validity bit ETR data frame 2 */
  66        unsigned int v3         : 1;    /* validity bit ETR data frame 3 */
  67        unsigned int v4         : 1;    /* validity bit ETR data frame 4 */
  68        unsigned int _pad1      : 4;    /* must be 0000 */
  69} __attribute__ ((packed));
  70
  71/* ETR data frames */
  72struct etr_edf1 {
  73        unsigned int u          : 1;    /* untuned bit */
  74        unsigned int _pad0      : 1;    /* must be 0 */
  75        unsigned int r          : 1;    /* service request bit */
  76        unsigned int _pad1      : 4;    /* must be 0000 */
  77        unsigned int a          : 1;    /* time adjustment bit */
  78        unsigned int net_id     : 8;    /* ETR network id */
  79        unsigned int etr_id     : 8;    /* id of ETR which sends data frames */
  80        unsigned int etr_pn     : 8;    /* port number of ETR output port */
  81} __attribute__ ((packed));
  82
  83struct etr_edf2 {
  84        unsigned int etv        : 32;   /* Upper 32 bits of TOD. */
  85} __attribute__ ((packed));
  86
  87struct etr_edf3 {
  88        unsigned int rc         : 8;    /* failure reason code */
  89        unsigned int _pad0      : 3;    /* must be 000 */
  90        unsigned int c          : 1;    /* ETR coupled bit */
  91        unsigned int tc         : 4;    /* ETR type code */
  92        unsigned int blto       : 8;    /* biased local time offset */
  93                                        /* (blto - 128) * 15 = minutes */
  94        unsigned int buo        : 8;    /* biased utc offset */
  95                                        /* (buo - 128) = leap seconds */
  96} __attribute__ ((packed));
  97
  98struct etr_edf4 {
  99        unsigned int ed         : 8;    /* ETS device dependent data */
 100        unsigned int _pad0      : 1;    /* must be 0 */
 101        unsigned int buc        : 5;    /* biased ut1 correction */
 102                                        /* (buc - 16) * 0.1 seconds */
 103        unsigned int em         : 6;    /* ETS error magnitude */
 104        unsigned int dc         : 6;    /* ETS drift code */
 105        unsigned int sc         : 6;    /* ETS steering code */
 106} __attribute__ ((packed));
 107
 108/*
 109 * ETR attachment information block, two formats
 110 * format 1 has 4 reserved words with a size of 64 bytes
 111 * format 2 has 16 reserved words with a size of 96 bytes
 112 */
 113struct etr_aib {
 114        struct etr_esw esw;
 115        struct etr_slsw slsw;
 116        unsigned long long tsp;
 117        struct etr_edf1 edf1;
 118        struct etr_edf2 edf2;
 119        struct etr_edf3 edf3;
 120        struct etr_edf4 edf4;
 121        unsigned int reserved[16];
 122} __attribute__ ((packed,aligned(8)));
 123
 124/* ETR interruption parameter */
 125struct etr_irq_parm {
 126        unsigned int _pad0      : 8;
 127        unsigned int pc0        : 1;    /* port 0 state change */
 128        unsigned int pc1        : 1;    /* port 1 state change */
 129        unsigned int _pad1      : 3;
 130        unsigned int eai        : 1;    /* ETR alert indication */
 131        unsigned int _pad2      : 18;
 132} __attribute__ ((packed));
 133
 134/* Query TOD offset result */
 135struct etr_ptff_qto {
 136        unsigned long long physical_clock;
 137        unsigned long long tod_offset;
 138        unsigned long long logical_tod_offset;
 139        unsigned long long tod_epoch_difference;
 140} __attribute__ ((packed));
 141
 142/* Inline assembly helper functions */
 143static inline int etr_setr(struct etr_eacr *ctrl)
 144{
 145        int rc = -ENOSYS;
 146
 147        asm volatile(
 148                "       .insn   s,0xb2160000,0(%2)\n"
 149                "0:     la      %0,0\n"
 150                "1:\n"
 151                EX_TABLE(0b,1b)
 152                : "+d" (rc) : "m" (*ctrl), "a" (ctrl));
 153        return rc;
 154}
 155
 156/* Stores a format 1 aib with 64 bytes */
 157static inline int etr_stetr(struct etr_aib *aib)
 158{
 159        int rc = -ENOSYS;
 160
 161        asm volatile(
 162                "       .insn   s,0xb2170000,0(%2)\n"
 163                "0:     la      %0,0\n"
 164                "1:\n"
 165                EX_TABLE(0b,1b)
 166                : "+d" (rc) : "m" (*aib), "a" (aib));
 167        return rc;
 168}
 169
 170/* Stores a format 2 aib with 96 bytes for specified port */
 171static inline int etr_steai(struct etr_aib *aib, unsigned int func)
 172{
 173        register unsigned int reg0 asm("0") = func;
 174        int rc = -ENOSYS;
 175
 176        asm volatile(
 177                "       .insn   s,0xb2b30000,0(%2)\n"
 178                "0:     la      %0,0\n"
 179                "1:\n"
 180                EX_TABLE(0b,1b)
 181                : "+d" (rc) : "m" (*aib), "a" (aib), "d" (reg0));
 182        return rc;
 183}
 184
 185/* Function codes for the steai instruction. */
 186#define ETR_STEAI_STEPPING_PORT         0x10
 187#define ETR_STEAI_ALTERNATE_PORT        0x11
 188#define ETR_STEAI_PORT_0                0x12
 189#define ETR_STEAI_PORT_1                0x13
 190
 191static inline int etr_ptff(void *ptff_block, unsigned int func)
 192{
 193        register unsigned int reg0 asm("0") = func;
 194        register unsigned long reg1 asm("1") = (unsigned long) ptff_block;
 195        int rc = -ENOSYS;
 196
 197        asm volatile(
 198                "       .word   0x0104\n"
 199                "       ipm     %0\n"
 200                "       srl     %0,28\n"
 201                : "=d" (rc), "=m" (ptff_block)
 202                : "d" (reg0), "d" (reg1), "m" (ptff_block) : "cc");
 203        return rc;
 204}
 205
 206/* Function codes for the ptff instruction. */
 207#define ETR_PTFF_QAF    0x00    /* query available functions */
 208#define ETR_PTFF_QTO    0x01    /* query tod offset */
 209#define ETR_PTFF_QSI    0x02    /* query steering information */
 210#define ETR_PTFF_ATO    0x40    /* adjust tod offset */
 211#define ETR_PTFF_STO    0x41    /* set tod offset */
 212#define ETR_PTFF_SFS    0x42    /* set fine steering rate */
 213#define ETR_PTFF_SGS    0x43    /* set gross steering rate */
 214
 215/* Functions needed by the machine check handler */
 216void etr_switch_to_local(void);
 217void etr_sync_check(void);
 218
 219/* STP interruption parameter */
 220struct stp_irq_parm {
 221        unsigned int _pad0      : 14;
 222        unsigned int tsc        : 1;    /* Timing status change */
 223        unsigned int lac        : 1;    /* Link availability change */
 224        unsigned int tcpc       : 1;    /* Time control parameter change */
 225        unsigned int _pad2      : 15;
 226} __attribute__ ((packed));
 227
 228#define STP_OP_SYNC     1
 229#define STP_OP_CTRL     3
 230
 231struct stp_sstpi {
 232        unsigned int rsvd0;
 233        unsigned int rsvd1 : 8;
 234        unsigned int stratum : 8;
 235        unsigned int vbits : 16;
 236        unsigned int leaps : 16;
 237        unsigned int tmd : 4;
 238        unsigned int ctn : 4;
 239        unsigned int rsvd2 : 3;
 240        unsigned int c : 1;
 241        unsigned int tst : 4;
 242        unsigned int tzo : 16;
 243        unsigned int dsto : 16;
 244        unsigned int ctrl : 16;
 245        unsigned int rsvd3 : 16;
 246        unsigned int tto;
 247        unsigned int rsvd4;
 248        unsigned int ctnid[3];
 249        unsigned int rsvd5;
 250        unsigned int todoff[4];
 251        unsigned int rsvd6[48];
 252} __attribute__ ((packed));
 253
 254/* Functions needed by the machine check handler */
 255void stp_sync_check(void);
 256void stp_island_check(void);
 257
 258#endif /* __S390_ETR_H */
 259