Logo Search packages:      
Sourcecode: linux version File versions

etr.h

/*
 *  include/asm-s390/etr.h
 *
 *  Copyright IBM Corp. 2006
 *  Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com)
 */
#ifndef __S390_ETR_H
#define __S390_ETR_H

/* ETR attachment control register */
struct etr_eacr {
      unsigned int e0         : 1;  /* port 0 stepping control */
      unsigned int e1         : 1;  /* port 1 stepping control */
      unsigned int _pad0      : 5;  /* must be 00100 */
      unsigned int dp         : 1;  /* data port control */
      unsigned int p0         : 1;  /* port 0 change recognition control */
      unsigned int p1         : 1;  /* port 1 change recognition control */
      unsigned int _pad1      : 3;  /* must be 000 */
      unsigned int ea         : 1;  /* ETR alert control */
      unsigned int es         : 1;  /* ETR sync check control */
      unsigned int sl         : 1;  /* switch to local control */
} __attribute__ ((packed));

/* Port state returned by steai */
enum etr_psc {
      etr_psc_operational = 0,
      etr_psc_semi_operational = 1,
      etr_psc_protocol_error =  4,
      etr_psc_no_symbols = 8,
      etr_psc_no_signal = 12,
      etr_psc_pps_mode = 13
};

/* Logical port state returned by stetr */
enum etr_lpsc {
      etr_lpsc_operational_step = 0,
      etr_lpsc_operational_alt = 1,
      etr_lpsc_semi_operational = 2,
      etr_lpsc_protocol_error =  4,
      etr_lpsc_no_symbol_sync = 8,
      etr_lpsc_no_signal = 12,
      etr_lpsc_pps_mode = 13
};

/* ETR status words */
struct etr_esw {
      struct etr_eacr eacr;         /* attachment control register */
      unsigned int y          : 1;  /* stepping mode */
      unsigned int _pad0      : 5;  /* must be 00000 */
      unsigned int p          : 1;  /* stepping port number */
      unsigned int q          : 1;  /* data port number */
      unsigned int psc0 : 4;  /* port 0 state code */
      unsigned int psc1 : 4;  /* port 1 state code */
} __attribute__ ((packed));

/* Second level data register status word */
struct etr_slsw {
      unsigned int vv1  : 1;  /* copy of validity bit data frame 1 */
      unsigned int vv2  : 1;  /* copy of validity bit data frame 2 */
      unsigned int vv3  : 1;  /* copy of validity bit data frame 3 */
      unsigned int vv4  : 1;  /* copy of validity bit data frame 4 */
      unsigned int _pad0      : 19; /* must by all zeroes */
      unsigned int n          : 1;  /* EAF port number */
      unsigned int v1         : 1;  /* validity bit ETR data frame 1 */
      unsigned int v2         : 1;  /* validity bit ETR data frame 2 */
      unsigned int v3         : 1;  /* validity bit ETR data frame 3 */
      unsigned int v4         : 1;  /* validity bit ETR data frame 4 */
      unsigned int _pad1      : 4;  /* must be 0000 */
} __attribute__ ((packed));

/* ETR data frames */
struct etr_edf1 {
      unsigned int u          : 1;  /* untuned bit */
      unsigned int _pad0      : 1;  /* must be 0 */
      unsigned int r          : 1;  /* service request bit */
      unsigned int _pad1      : 4;  /* must be 0000 */
      unsigned int a          : 1;  /* time adjustment bit */
      unsigned int net_id     : 8;  /* ETR network id */
      unsigned int etr_id     : 8;  /* id of ETR which sends data frames */
      unsigned int etr_pn     : 8;  /* port number of ETR output port */
} __attribute__ ((packed));

struct etr_edf2 {
      unsigned int etv  : 32; /* Upper 32 bits of TOD. */
} __attribute__ ((packed));

struct etr_edf3 {
      unsigned int rc         : 8;  /* failure reason code */
      unsigned int _pad0      : 3;  /* must be 000 */
      unsigned int c          : 1;  /* ETR coupled bit */
      unsigned int tc         : 4;  /* ETR type code */
      unsigned int blto : 8;  /* biased local time offset */
                              /* (blto - 128) * 15 = minutes */
      unsigned int buo  : 8;  /* biased utc offset */
                              /* (buo - 128) = leap seconds */
} __attribute__ ((packed));

struct etr_edf4 {
      unsigned int ed         : 8;  /* ETS device dependent data */
      unsigned int _pad0      : 1;  /* must be 0 */
      unsigned int buc  : 5;  /* biased ut1 correction */
                              /* (buc - 16) * 0.1 seconds */
      unsigned int em         : 6;  /* ETS error magnitude */
      unsigned int dc         : 6;  /* ETS drift code */
      unsigned int sc         : 6;  /* ETS steering code */
} __attribute__ ((packed));

/*
 * ETR attachment information block, two formats
 * format 1 has 4 reserved words with a size of 64 bytes
 * format 2 has 16 reserved words with a size of 96 bytes
 */
struct etr_aib {
      struct etr_esw esw;
      struct etr_slsw slsw;
      unsigned long long tsp;
      struct etr_edf1 edf1;
      struct etr_edf2 edf2;
      struct etr_edf3 edf3;
      struct etr_edf4 edf4;
      unsigned int reserved[16];
} __attribute__ ((packed,aligned(8)));

/* ETR interruption parameter */
struct etr_irq_parm {
      unsigned int _pad0      : 8;
      unsigned int pc0  : 1;  /* port 0 state change */
      unsigned int pc1  : 1;  /* port 1 state change */
      unsigned int _pad1      : 3;
      unsigned int eai  : 1;  /* ETR alert indication */
      unsigned int _pad2      : 18;
} __attribute__ ((packed));

/* Query TOD offset result */
struct etr_ptff_qto {
      unsigned long long physical_clock;
      unsigned long long tod_offset;
      unsigned long long logical_tod_offset;
      unsigned long long tod_epoch_difference;
} __attribute__ ((packed));

/* Inline assembly helper functions */
static inline int etr_setr(struct etr_eacr *ctrl)
{
      int rc = -ENOSYS;

      asm volatile(
            "     .insn s,0xb2160000,0(%2)\n"
            "0:   la    %0,0\n"
            "1:\n"
            EX_TABLE(0b,1b)
            : "+d" (rc) : "m" (*ctrl), "a" (ctrl));
      return rc;
}

/* Stores a format 1 aib with 64 bytes */
static inline int etr_stetr(struct etr_aib *aib)
{
      int rc = -ENOSYS;

      asm volatile(
            "     .insn s,0xb2170000,0(%2)\n"
            "0:   la    %0,0\n"
            "1:\n"
            EX_TABLE(0b,1b)
            : "+d" (rc) : "m" (*aib), "a" (aib));
      return rc;
}

/* Stores a format 2 aib with 96 bytes for specified port */
static inline int etr_steai(struct etr_aib *aib, unsigned int func)
{
      register unsigned int reg0 asm("0") = func;
      int rc = -ENOSYS;

      asm volatile(
            "     .insn s,0xb2b30000,0(%2)\n"
            "0:   la    %0,0\n"
            "1:\n"
            EX_TABLE(0b,1b)
            : "+d" (rc) : "m" (*aib), "a" (aib), "d" (reg0));
      return rc;
}

/* Function codes for the steai instruction. */
#define ETR_STEAI_STEPPING_PORT           0x10
#define ETR_STEAI_ALTERNATE_PORT    0x11
#define ETR_STEAI_PORT_0            0x12
#define ETR_STEAI_PORT_1            0x13

static inline int etr_ptff(void *ptff_block, unsigned int func)
{
      register unsigned int reg0 asm("0") = func;
      register unsigned long reg1 asm("1") = (unsigned long) ptff_block;
      int rc = -ENOSYS;

      asm volatile(
            "     .word 0x0104\n"
            "     ipm   %0\n"
            "     srl   %0,28\n"
            : "=d" (rc), "=m" (ptff_block)
            : "d" (reg0), "d" (reg1), "m" (ptff_block) : "cc");
      return rc;
}

/* Function codes for the ptff instruction. */
#define ETR_PTFF_QAF    0x00  /* query available functions */
#define ETR_PTFF_QTO    0x01  /* query tod offset */
#define ETR_PTFF_QSI    0x02  /* query steering information */
#define ETR_PTFF_ATO    0x40  /* adjust tod offset */
#define ETR_PTFF_STO    0x41  /* set tod offset */
#define ETR_PTFF_SFS    0x42  /* set fine steering rate */
#define ETR_PTFF_SGS    0x43  /* set gross steering rate */

/* Functions needed by the machine check handler */
void etr_switch_to_local(void);
void etr_sync_check(void);

/* STP interruption parameter */
struct stp_irq_parm {
      unsigned int _pad0      : 14;
      unsigned int tsc  : 1;  /* Timing status change */
      unsigned int lac  : 1;  /* Link availability change */
      unsigned int tcpc : 1;  /* Time control parameter change */
      unsigned int _pad2      : 15;
} __attribute__ ((packed));

#define STP_OP_SYNC     1
#define STP_OP_CTRL     3

struct stp_sstpi {
      unsigned int rsvd0;
      unsigned int rsvd1 : 8;
      unsigned int stratum : 8;
      unsigned int vbits : 16;
      unsigned int leaps : 16;
      unsigned int tmd : 4;
      unsigned int ctn : 4;
      unsigned int rsvd2 : 3;
      unsigned int c : 1;
      unsigned int tst : 4;
      unsigned int tzo : 16;
      unsigned int dsto : 16;
      unsigned int ctrl : 16;
      unsigned int rsvd3 : 16;
      unsigned int tto;
      unsigned int rsvd4;
      unsigned int ctnid[3];
      unsigned int rsvd5;
      unsigned int todoff[4];
      unsigned int rsvd6[48];
} __attribute__ ((packed));

/* Functions needed by the machine check handler */
void stp_sync_check(void);
void stp_island_check(void);

#endif /* __S390_ETR_H */

Generated by  Doxygen 1.6.0   Back to index