1ae5c42f0SMichael Chan /* Broadcom NetXtreme-C/E network driver. 2ae5c42f0SMichael Chan * 3ae5c42f0SMichael Chan * Copyright (c) 2021 Broadcom Inc. 4ae5c42f0SMichael Chan * 5ae5c42f0SMichael Chan * This program is free software; you can redistribute it and/or modify 6ae5c42f0SMichael Chan * it under the terms of the GNU General Public License as published by 7ae5c42f0SMichael Chan * the Free Software Foundation. 8ae5c42f0SMichael Chan */ 9ae5c42f0SMichael Chan 10ae5c42f0SMichael Chan #ifndef BNXT_PTP_H 11ae5c42f0SMichael Chan #define BNXT_PTP_H 12ae5c42f0SMichael Chan 13118612d5SMichael Chan #define BNXT_PTP_GRC_WIN 5 14118612d5SMichael Chan #define BNXT_PTP_GRC_WIN_BASE 0x5000 15118612d5SMichael Chan 16118612d5SMichael Chan #define BNXT_MAX_PHC_DRIFT 31000000 17118612d5SMichael Chan #define BNXT_LO_TIMER_MASK 0x0000ffffffffUL 18118612d5SMichael Chan #define BNXT_HI_TIMER_MASK 0xffff00000000UL 19118612d5SMichael Chan 20118612d5SMichael Chan #define BNXT_PTP_QTS_TIMEOUT 1000 21118612d5SMichael Chan #define BNXT_PTP_QTS_TX_ENABLES (PORT_TS_QUERY_REQ_ENABLES_PTP_SEQ_ID | \ 22118612d5SMichael Chan PORT_TS_QUERY_REQ_ENABLES_TS_REQ_TIMEOUT) 23118612d5SMichael Chan 24ae5c42f0SMichael Chan struct bnxt_ptp_cfg { 25ae5c42f0SMichael Chan struct ptp_clock_info ptp_info; 26ae5c42f0SMichael Chan struct ptp_clock *ptp_clock; 27ae5c42f0SMichael Chan struct cyclecounter cc; 28ae5c42f0SMichael Chan struct timecounter tc; 29ae5c42f0SMichael Chan /* serialize timecounter access */ 30ae5c42f0SMichael Chan spinlock_t ptp_lock; 31ae5c42f0SMichael Chan struct sk_buff *tx_skb; 32ae5c42f0SMichael Chan u64 current_time; 33ae5c42f0SMichael Chan u64 old_time; 34ae5c42f0SMichael Chan unsigned long next_period; 35*89bc7f45SMichael Chan unsigned long next_overflow_check; 36*89bc7f45SMichael Chan /* 48-bit PHC overflows in 78 hours. Check overflow every 19 hours. */ 37*89bc7f45SMichael Chan #define BNXT_PHC_OVERFLOW_PERIOD (19 * 3600 * HZ) 38*89bc7f45SMichael Chan 39ae5c42f0SMichael Chan u16 tx_seqid; 40ae5c42f0SMichael Chan struct bnxt *bp; 41ae5c42f0SMichael Chan atomic_t tx_avail; 42ae5c42f0SMichael Chan #define BNXT_MAX_TX_TS 1 43ae5c42f0SMichael Chan u16 rxctl; 44ae5c42f0SMichael Chan #define BNXT_PTP_MSG_SYNC (1 << 0) 45ae5c42f0SMichael Chan #define BNXT_PTP_MSG_DELAY_REQ (1 << 1) 46ae5c42f0SMichael Chan #define BNXT_PTP_MSG_PDELAY_REQ (1 << 2) 47ae5c42f0SMichael Chan #define BNXT_PTP_MSG_PDELAY_RESP (1 << 3) 48ae5c42f0SMichael Chan #define BNXT_PTP_MSG_FOLLOW_UP (1 << 8) 49ae5c42f0SMichael Chan #define BNXT_PTP_MSG_DELAY_RESP (1 << 9) 50ae5c42f0SMichael Chan #define BNXT_PTP_MSG_PDELAY_RESP_FOLLOW_UP (1 << 10) 51ae5c42f0SMichael Chan #define BNXT_PTP_MSG_ANNOUNCE (1 << 11) 52ae5c42f0SMichael Chan #define BNXT_PTP_MSG_SIGNALING (1 << 12) 53ae5c42f0SMichael Chan #define BNXT_PTP_MSG_MANAGEMENT (1 << 13) 54ae5c42f0SMichael Chan #define BNXT_PTP_MSG_EVENTS (BNXT_PTP_MSG_SYNC | \ 55ae5c42f0SMichael Chan BNXT_PTP_MSG_DELAY_REQ | \ 56ae5c42f0SMichael Chan BNXT_PTP_MSG_PDELAY_REQ | \ 57ae5c42f0SMichael Chan BNXT_PTP_MSG_PDELAY_RESP) 58ae5c42f0SMichael Chan u8 tx_tstamp_en:1; 59ae5c42f0SMichael Chan int rx_filter; 60ae5c42f0SMichael Chan 61ae5c42f0SMichael Chan u32 refclk_regs[2]; 62ae5c42f0SMichael Chan u32 refclk_mapped_regs[2]; 63ae5c42f0SMichael Chan }; 64118612d5SMichael Chan 657f5515d1SPavan Chebbi #if BITS_PER_LONG == 32 667f5515d1SPavan Chebbi #define BNXT_READ_TIME64(ptp, dst, src) \ 677f5515d1SPavan Chebbi do { \ 687f5515d1SPavan Chebbi spin_lock_bh(&(ptp)->ptp_lock); \ 697f5515d1SPavan Chebbi (dst) = (src); \ 707f5515d1SPavan Chebbi spin_unlock_bh(&(ptp)->ptp_lock); \ 717f5515d1SPavan Chebbi } while (0) 727f5515d1SPavan Chebbi #else 737f5515d1SPavan Chebbi #define BNXT_READ_TIME64(ptp, dst, src) \ 747f5515d1SPavan Chebbi ((dst) = READ_ONCE(src)) 757f5515d1SPavan Chebbi #endif 767f5515d1SPavan Chebbi 7783bb623cSPavan Chebbi int bnxt_ptp_parse(struct sk_buff *skb, u16 *seq_id); 78118612d5SMichael Chan int bnxt_hwtstamp_set(struct net_device *dev, struct ifreq *ifr); 79118612d5SMichael Chan int bnxt_hwtstamp_get(struct net_device *dev, struct ifreq *ifr); 8083bb623cSPavan Chebbi int bnxt_get_tx_ts_p5(struct bnxt *bp, struct sk_buff *skb); 817f5515d1SPavan Chebbi int bnxt_get_rx_ts_p5(struct bnxt *bp, u64 *ts, u32 pkt_ts); 82118612d5SMichael Chan int bnxt_ptp_init(struct bnxt *bp); 83118612d5SMichael Chan void bnxt_ptp_clear(struct bnxt *bp); 84ae5c42f0SMichael Chan #endif 85