| /* | |
| * 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 */ |