10bf5eb78SHuazhong Tan /* SPDX-License-Identifier: GPL-2.0+ */
20bf5eb78SHuazhong Tan // Copyright (c) 2021 Hisilicon Limited.
30bf5eb78SHuazhong Tan
40bf5eb78SHuazhong Tan #ifndef __HCLGE_PTP_H
50bf5eb78SHuazhong Tan #define __HCLGE_PTP_H
60bf5eb78SHuazhong Tan
70bf5eb78SHuazhong Tan #include <linux/ptp_clock_kernel.h>
80bf5eb78SHuazhong Tan #include <linux/net_tstamp.h>
90bf5eb78SHuazhong Tan #include <linux/types.h>
100bf5eb78SHuazhong Tan
11*184da9dcSJie Wang struct hclge_dev;
12*184da9dcSJie Wang struct ifreq;
13*184da9dcSJie Wang
140bf5eb78SHuazhong Tan #define HCLGE_PTP_REG_OFFSET 0x29000
150bf5eb78SHuazhong Tan
160bf5eb78SHuazhong Tan #define HCLGE_PTP_TX_TS_SEQID_REG 0x0
170bf5eb78SHuazhong Tan #define HCLGE_PTP_TX_TS_NSEC_REG 0x4
180bf5eb78SHuazhong Tan #define HCLGE_PTP_TX_TS_NSEC_MASK GENMASK(29, 0)
190bf5eb78SHuazhong Tan #define HCLGE_PTP_TX_TS_SEC_L_REG 0x8
200bf5eb78SHuazhong Tan #define HCLGE_PTP_TX_TS_SEC_H_REG 0xC
210bf5eb78SHuazhong Tan #define HCLGE_PTP_TX_TS_SEC_H_MASK GENMASK(15, 0)
220bf5eb78SHuazhong Tan #define HCLGE_PTP_TX_TS_CNT_REG 0x30
230bf5eb78SHuazhong Tan
240bf5eb78SHuazhong Tan #define HCLGE_PTP_TIME_SEC_H_REG 0x50
250bf5eb78SHuazhong Tan #define HCLGE_PTP_TIME_SEC_H_MASK GENMASK(15, 0)
260bf5eb78SHuazhong Tan #define HCLGE_PTP_TIME_SEC_L_REG 0x54
270bf5eb78SHuazhong Tan #define HCLGE_PTP_TIME_NSEC_REG 0x58
280bf5eb78SHuazhong Tan #define HCLGE_PTP_TIME_NSEC_MASK GENMASK(29, 0)
290bf5eb78SHuazhong Tan #define HCLGE_PTP_TIME_NSEC_NEG BIT(31)
300bf5eb78SHuazhong Tan #define HCLGE_PTP_TIME_SYNC_REG 0x5C
310bf5eb78SHuazhong Tan #define HCLGE_PTP_TIME_SYNC_EN BIT(0)
320bf5eb78SHuazhong Tan #define HCLGE_PTP_TIME_ADJ_REG 0x60
330bf5eb78SHuazhong Tan #define HCLGE_PTP_TIME_ADJ_EN BIT(0)
340bf5eb78SHuazhong Tan #define HCLGE_PTP_CYCLE_QUO_REG 0x64
358373cd38SYufeng Mo #define HCLGE_PTP_CYCLE_QUO_MASK GENMASK(7, 0)
360bf5eb78SHuazhong Tan #define HCLGE_PTP_CYCLE_DEN_REG 0x68
370bf5eb78SHuazhong Tan #define HCLGE_PTP_CYCLE_NUM_REG 0x6C
380bf5eb78SHuazhong Tan #define HCLGE_PTP_CYCLE_CFG_REG 0x70
390bf5eb78SHuazhong Tan #define HCLGE_PTP_CYCLE_ADJ_EN BIT(0)
400bf5eb78SHuazhong Tan #define HCLGE_PTP_CUR_TIME_SEC_H_REG 0x74
410bf5eb78SHuazhong Tan #define HCLGE_PTP_CUR_TIME_SEC_L_REG 0x78
420bf5eb78SHuazhong Tan #define HCLGE_PTP_CUR_TIME_NSEC_REG 0x7C
430bf5eb78SHuazhong Tan
440bf5eb78SHuazhong Tan #define HCLGE_PTP_CYCLE_ADJ_MAX 500000000
450bf5eb78SHuazhong Tan #define HCLGE_PTP_SEC_H_OFFSET 32u
460bf5eb78SHuazhong Tan #define HCLGE_PTP_SEC_L_MASK GENMASK(31, 0)
470bf5eb78SHuazhong Tan
48956c3ae4SDan Carpenter #define HCLGE_PTP_FLAG_EN 0
49956c3ae4SDan Carpenter #define HCLGE_PTP_FLAG_TX_EN 1
50956c3ae4SDan Carpenter #define HCLGE_PTP_FLAG_RX_EN 2
510bf5eb78SHuazhong Tan
528373cd38SYufeng Mo struct hclge_ptp_cycle {
538373cd38SYufeng Mo u32 quo;
548373cd38SYufeng Mo u32 numer;
558373cd38SYufeng Mo u32 den;
568373cd38SYufeng Mo };
578373cd38SYufeng Mo
580bf5eb78SHuazhong Tan struct hclge_ptp {
590bf5eb78SHuazhong Tan struct hclge_dev *hdev;
600bf5eb78SHuazhong Tan struct ptp_clock *clock;
610bf5eb78SHuazhong Tan struct sk_buff *tx_skb;
620bf5eb78SHuazhong Tan unsigned long flags;
630bf5eb78SHuazhong Tan void __iomem *io_base;
640bf5eb78SHuazhong Tan struct ptp_clock_info info;
650bf5eb78SHuazhong Tan struct hwtstamp_config ts_cfg;
660bf5eb78SHuazhong Tan spinlock_t lock; /* protects ptp registers */
670bf5eb78SHuazhong Tan u32 ptp_cfg;
680bf5eb78SHuazhong Tan u32 last_tx_seqid;
698373cd38SYufeng Mo struct hclge_ptp_cycle cycle;
700bf5eb78SHuazhong Tan unsigned long tx_start;
710bf5eb78SHuazhong Tan unsigned long tx_cnt;
720bf5eb78SHuazhong Tan unsigned long tx_skipped;
730bf5eb78SHuazhong Tan unsigned long tx_cleaned;
740bf5eb78SHuazhong Tan unsigned long last_rx;
750bf5eb78SHuazhong Tan unsigned long rx_cnt;
760bf5eb78SHuazhong Tan unsigned long tx_timeout;
770bf5eb78SHuazhong Tan };
780bf5eb78SHuazhong Tan
790bf5eb78SHuazhong Tan struct hclge_ptp_int_cmd {
800bf5eb78SHuazhong Tan #define HCLGE_PTP_INT_EN_B BIT(0)
810bf5eb78SHuazhong Tan
820bf5eb78SHuazhong Tan u8 int_en;
830bf5eb78SHuazhong Tan u8 rsvd[23];
840bf5eb78SHuazhong Tan };
850bf5eb78SHuazhong Tan
860bf5eb78SHuazhong Tan enum hclge_ptp_udp_type {
870bf5eb78SHuazhong Tan HCLGE_PTP_UDP_NOT_TYPE,
880bf5eb78SHuazhong Tan HCLGE_PTP_UDP_P13F_TYPE,
890bf5eb78SHuazhong Tan HCLGE_PTP_UDP_P140_TYPE,
900bf5eb78SHuazhong Tan HCLGE_PTP_UDP_FULL_TYPE,
910bf5eb78SHuazhong Tan };
920bf5eb78SHuazhong Tan
930bf5eb78SHuazhong Tan enum hclge_ptp_msg_type {
940bf5eb78SHuazhong Tan HCLGE_PTP_MSG_TYPE_V2_L2,
950bf5eb78SHuazhong Tan HCLGE_PTP_MSG_TYPE_V2,
960bf5eb78SHuazhong Tan HCLGE_PTP_MSG_TYPE_V2_EVENT,
970bf5eb78SHuazhong Tan };
980bf5eb78SHuazhong Tan
990bf5eb78SHuazhong Tan enum hclge_ptp_msg0_type {
1000bf5eb78SHuazhong Tan HCLGE_PTP_MSG0_V2_DELAY_REQ = 1,
1010bf5eb78SHuazhong Tan HCLGE_PTP_MSG0_V2_PDELAY_REQ,
1020bf5eb78SHuazhong Tan HCLGE_PTP_MSG0_V2_DELAY_RESP,
1030bf5eb78SHuazhong Tan HCLGE_PTP_MSG0_V2_EVENT = 0xF,
1040bf5eb78SHuazhong Tan };
1050bf5eb78SHuazhong Tan
1060bf5eb78SHuazhong Tan #define HCLGE_PTP_MSG1_V2_DEFAULT 1
1070bf5eb78SHuazhong Tan
1080bf5eb78SHuazhong Tan struct hclge_ptp_cfg_cmd {
1090bf5eb78SHuazhong Tan #define HCLGE_PTP_EN_B BIT(0)
1100bf5eb78SHuazhong Tan #define HCLGE_PTP_TX_EN_B BIT(1)
1110bf5eb78SHuazhong Tan #define HCLGE_PTP_RX_EN_B BIT(2)
1120bf5eb78SHuazhong Tan #define HCLGE_PTP_UDP_EN_SHIFT 3
1130bf5eb78SHuazhong Tan #define HCLGE_PTP_UDP_EN_MASK GENMASK(4, 3)
1140bf5eb78SHuazhong Tan #define HCLGE_PTP_MSG_TYPE_SHIFT 8
1150bf5eb78SHuazhong Tan #define HCLGE_PTP_MSG_TYPE_MASK GENMASK(9, 8)
1160bf5eb78SHuazhong Tan #define HCLGE_PTP_MSG1_SHIFT 16
1170bf5eb78SHuazhong Tan #define HCLGE_PTP_MSG1_MASK GENMASK(19, 16)
1180bf5eb78SHuazhong Tan #define HCLGE_PTP_MSG0_SHIFT 24
1190bf5eb78SHuazhong Tan #define HCLGE_PTP_MSG0_MASK GENMASK(27, 24)
1200bf5eb78SHuazhong Tan
1210bf5eb78SHuazhong Tan __le32 cfg;
1220bf5eb78SHuazhong Tan u8 rsvd[20];
1230bf5eb78SHuazhong Tan };
1240bf5eb78SHuazhong Tan
hclge_ptp_get_hdev(struct ptp_clock_info * info)1250bf5eb78SHuazhong Tan static inline struct hclge_dev *hclge_ptp_get_hdev(struct ptp_clock_info *info)
1260bf5eb78SHuazhong Tan {
1270bf5eb78SHuazhong Tan struct hclge_ptp *ptp = container_of(info, struct hclge_ptp, info);
1280bf5eb78SHuazhong Tan
1290bf5eb78SHuazhong Tan return ptp->hdev;
1300bf5eb78SHuazhong Tan }
1310bf5eb78SHuazhong Tan
1320bf5eb78SHuazhong Tan bool hclge_ptp_set_tx_info(struct hnae3_handle *handle, struct sk_buff *skb);
13352d89333SHao Chen void hclge_ptp_clean_tx_hwts(struct hclge_dev *hdev);
1340bf5eb78SHuazhong Tan void hclge_ptp_get_rx_hwts(struct hnae3_handle *handle, struct sk_buff *skb,
1350bf5eb78SHuazhong Tan u32 nsec, u32 sec);
1360bf5eb78SHuazhong Tan int hclge_ptp_get_cfg(struct hclge_dev *hdev, struct ifreq *ifr);
1370bf5eb78SHuazhong Tan int hclge_ptp_set_cfg(struct hclge_dev *hdev, struct ifreq *ifr);
1380bf5eb78SHuazhong Tan int hclge_ptp_init(struct hclge_dev *hdev);
1390bf5eb78SHuazhong Tan void hclge_ptp_uninit(struct hclge_dev *hdev);
1400bf5eb78SHuazhong Tan int hclge_ptp_get_ts_info(struct hnae3_handle *handle,
1410bf5eb78SHuazhong Tan struct ethtool_ts_info *info);
1420bf5eb78SHuazhong Tan int hclge_ptp_cfg_qry(struct hclge_dev *hdev, u32 *cfg);
1430bf5eb78SHuazhong Tan #endif
144