12874c5fdSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
2c6fe0ad2SBrandon Streiff /*
3c6fe0ad2SBrandon Streiff  * Marvell 88E6xxx Switch hardware timestamping support
4c6fe0ad2SBrandon Streiff  *
5c6fe0ad2SBrandon Streiff  * Copyright (c) 2008 Marvell Semiconductor
6c6fe0ad2SBrandon Streiff  *
7c6fe0ad2SBrandon Streiff  * Copyright (c) 2017 National Instruments
8c6fe0ad2SBrandon Streiff  *      Erik Hons <erik.hons@ni.com>
9c6fe0ad2SBrandon Streiff  *      Brandon Streiff <brandon.streiff@ni.com>
10c6fe0ad2SBrandon Streiff  *      Dane Wagner <dane.wagner@ni.com>
11c6fe0ad2SBrandon Streiff  */
12c6fe0ad2SBrandon Streiff 
13c6fe0ad2SBrandon Streiff #ifndef _MV88E6XXX_HWTSTAMP_H
14c6fe0ad2SBrandon Streiff #define _MV88E6XXX_HWTSTAMP_H
15c6fe0ad2SBrandon Streiff 
16c6fe0ad2SBrandon Streiff #include "chip.h"
17c6fe0ad2SBrandon Streiff 
18e2294a8bSAndrew Lunn /* Global 6352 PTP registers */
19c6fe0ad2SBrandon Streiff /* Offset 0x00: PTP EtherType */
20c6fe0ad2SBrandon Streiff #define MV88E6XXX_PTP_ETHERTYPE	0x00
21c6fe0ad2SBrandon Streiff 
22c6fe0ad2SBrandon Streiff /* Offset 0x01: Message Type Timestamp Enables */
23c6fe0ad2SBrandon Streiff #define MV88E6XXX_PTP_MSGTYPE			0x01
24c6fe0ad2SBrandon Streiff #define MV88E6XXX_PTP_MSGTYPE_SYNC		0x0001
25c6fe0ad2SBrandon Streiff #define MV88E6XXX_PTP_MSGTYPE_DELAY_REQ		0x0002
26c6fe0ad2SBrandon Streiff #define MV88E6XXX_PTP_MSGTYPE_PDLAY_REQ		0x0004
27c6fe0ad2SBrandon Streiff #define MV88E6XXX_PTP_MSGTYPE_PDLAY_RES		0x0008
28c6fe0ad2SBrandon Streiff #define MV88E6XXX_PTP_MSGTYPE_ALL_EVENT		0x000f
29c6fe0ad2SBrandon Streiff 
30c6fe0ad2SBrandon Streiff /* Offset 0x02: Timestamp Arrival Capture Pointers */
31c6fe0ad2SBrandon Streiff #define MV88E6XXX_PTP_TS_ARRIVAL_PTR	0x02
32c6fe0ad2SBrandon Streiff 
33e2294a8bSAndrew Lunn /* Offset 0x05: PTP Global Configuration */
34e2294a8bSAndrew Lunn #define MV88E6165_PTP_CFG			0x05
35e2294a8bSAndrew Lunn #define MV88E6165_PTP_CFG_TSPEC_MASK		0xf000
36e2294a8bSAndrew Lunn #define MV88E6165_PTP_CFG_DISABLE_TS_OVERWRITE	BIT(1)
37e2294a8bSAndrew Lunn #define MV88E6165_PTP_CFG_DISABLE_PTP		BIT(0)
38e2294a8bSAndrew Lunn 
39a2e47134SBrandon Streiff /* Offset 0x07: PTP Global Configuration */
40a2e47134SBrandon Streiff #define MV88E6341_PTP_CFG			0x07
41a2e47134SBrandon Streiff #define MV88E6341_PTP_CFG_UPDATE		0x8000
42a2e47134SBrandon Streiff #define MV88E6341_PTP_CFG_IDX_MASK		0x7f00
43a2e47134SBrandon Streiff #define MV88E6341_PTP_CFG_DATA_MASK		0x00ff
44a2e47134SBrandon Streiff #define MV88E6341_PTP_CFG_MODE_IDX		0x0
45a2e47134SBrandon Streiff #define MV88E6341_PTP_CFG_MODE_TS_AT_PHY	0x00
46a2e47134SBrandon Streiff #define MV88E6341_PTP_CFG_MODE_TS_AT_MAC	0x80
47a2e47134SBrandon Streiff 
48c6fe0ad2SBrandon Streiff /* Offset 0x08: PTP Interrupt Status */
49c6fe0ad2SBrandon Streiff #define MV88E6XXX_PTP_IRQ_STATUS	0x08
50c6fe0ad2SBrandon Streiff 
51e2294a8bSAndrew Lunn /* Per-Port 6352 PTP Registers */
52c6fe0ad2SBrandon Streiff /* Offset 0x00: PTP Configuration 0 */
53c6fe0ad2SBrandon Streiff #define MV88E6XXX_PORT_PTP_CFG0				0x00
54c6fe0ad2SBrandon Streiff #define MV88E6XXX_PORT_PTP_CFG0_TSPEC_SHIFT		12
55c6fe0ad2SBrandon Streiff #define MV88E6XXX_PORT_PTP_CFG0_TSPEC_MASK		0xf000
56c6fe0ad2SBrandon Streiff #define MV88E6XXX_PORT_PTP_CFG0_TSPEC_1588		0x0000
57c6fe0ad2SBrandon Streiff #define MV88E6XXX_PORT_PTP_CFG0_TSPEC_8021AS		0x1000
58c6fe0ad2SBrandon Streiff #define MV88E6XXX_PORT_PTP_CFG0_DISABLE_TSPEC_MATCH	0x0800
59c6fe0ad2SBrandon Streiff #define MV88E6XXX_PORT_PTP_CFG0_DISABLE_OVERWRITE	0x0002
60c6fe0ad2SBrandon Streiff #define MV88E6XXX_PORT_PTP_CFG0_DISABLE_PTP		0x0001
61c6fe0ad2SBrandon Streiff 
62c6fe0ad2SBrandon Streiff /* Offset 0x01: PTP Configuration 1 */
63c6fe0ad2SBrandon Streiff #define MV88E6XXX_PORT_PTP_CFG1	0x01
64c6fe0ad2SBrandon Streiff 
65c6fe0ad2SBrandon Streiff /* Offset 0x02: PTP Configuration 2 */
66c6fe0ad2SBrandon Streiff #define MV88E6XXX_PORT_PTP_CFG2				0x02
67c6fe0ad2SBrandon Streiff #define MV88E6XXX_PORT_PTP_CFG2_EMBED_ARRIVAL		0x1000
68c6fe0ad2SBrandon Streiff #define MV88E6XXX_PORT_PTP_CFG2_DEP_IRQ_EN		0x0002
69c6fe0ad2SBrandon Streiff #define MV88E6XXX_PORT_PTP_CFG2_ARR_IRQ_EN		0x0001
70c6fe0ad2SBrandon Streiff 
71c6fe0ad2SBrandon Streiff /* Offset 0x03: PTP LED Configuration */
72c6fe0ad2SBrandon Streiff #define MV88E6XXX_PORT_PTP_LED_CFG	0x03
73c6fe0ad2SBrandon Streiff 
74c6fe0ad2SBrandon Streiff /* Offset 0x08: PTP Arrival 0 Status */
75c6fe0ad2SBrandon Streiff #define MV88E6XXX_PORT_PTP_ARR0_STS	0x08
76c6fe0ad2SBrandon Streiff 
77c6fe0ad2SBrandon Streiff /* Offset 0x09/0x0A: PTP Arrival 0 Time */
78c6fe0ad2SBrandon Streiff #define MV88E6XXX_PORT_PTP_ARR0_TIME_LO	0x09
79c6fe0ad2SBrandon Streiff #define MV88E6XXX_PORT_PTP_ARR0_TIME_HI	0x0a
80c6fe0ad2SBrandon Streiff 
81c6fe0ad2SBrandon Streiff /* Offset 0x0B: PTP Arrival 0 Sequence ID */
82c6fe0ad2SBrandon Streiff #define MV88E6XXX_PORT_PTP_ARR0_SEQID	0x0b
83c6fe0ad2SBrandon Streiff 
84c6fe0ad2SBrandon Streiff /* Offset 0x0C: PTP Arrival 1 Status */
85c6fe0ad2SBrandon Streiff #define MV88E6XXX_PORT_PTP_ARR1_STS	0x0c
86c6fe0ad2SBrandon Streiff 
87c6fe0ad2SBrandon Streiff /* Offset 0x0D/0x0E: PTP Arrival 1 Time */
88c6fe0ad2SBrandon Streiff #define MV88E6XXX_PORT_PTP_ARR1_TIME_LO	0x0d
89c6fe0ad2SBrandon Streiff #define MV88E6XXX_PORT_PTP_ARR1_TIME_HI	0x0e
90c6fe0ad2SBrandon Streiff 
91c6fe0ad2SBrandon Streiff /* Offset 0x0F: PTP Arrival 1 Sequence ID */
92c6fe0ad2SBrandon Streiff #define MV88E6XXX_PORT_PTP_ARR1_SEQID	0x0f
93c6fe0ad2SBrandon Streiff 
94c6fe0ad2SBrandon Streiff /* Offset 0x10: PTP Departure Status */
95c6fe0ad2SBrandon Streiff #define MV88E6XXX_PORT_PTP_DEP_STS	0x10
96c6fe0ad2SBrandon Streiff 
97c6fe0ad2SBrandon Streiff /* Offset 0x11/0x12: PTP Deperture Time */
98c6fe0ad2SBrandon Streiff #define MV88E6XXX_PORT_PTP_DEP_TIME_LO	0x11
99c6fe0ad2SBrandon Streiff #define MV88E6XXX_PORT_PTP_DEP_TIME_HI	0x12
100c6fe0ad2SBrandon Streiff 
101c6fe0ad2SBrandon Streiff /* Offset 0x13: PTP Departure Sequence ID */
102c6fe0ad2SBrandon Streiff #define MV88E6XXX_PORT_PTP_DEP_SEQID	0x13
103c6fe0ad2SBrandon Streiff 
104c6fe0ad2SBrandon Streiff /* Status fields for arrival and depature timestamp status registers */
105c6fe0ad2SBrandon Streiff #define MV88E6XXX_PTP_TS_STATUS_MASK		0x0006
106c6fe0ad2SBrandon Streiff #define MV88E6XXX_PTP_TS_STATUS_NORMAL		0x0000
107c6fe0ad2SBrandon Streiff #define MV88E6XXX_PTP_TS_STATUS_OVERWITTEN	0x0002
108c6fe0ad2SBrandon Streiff #define MV88E6XXX_PTP_TS_STATUS_DISCARDED	0x0004
109c6fe0ad2SBrandon Streiff #define MV88E6XXX_PTP_TS_VALID			0x0001
110c6fe0ad2SBrandon Streiff 
111c6fe0ad2SBrandon Streiff #ifdef CONFIG_NET_DSA_MV88E6XXX_PTP
112c6fe0ad2SBrandon Streiff 
113c6fe0ad2SBrandon Streiff int mv88e6xxx_port_hwtstamp_set(struct dsa_switch *ds, int port,
114c6fe0ad2SBrandon Streiff 				struct ifreq *ifr);
115c6fe0ad2SBrandon Streiff int mv88e6xxx_port_hwtstamp_get(struct dsa_switch *ds, int port,
116c6fe0ad2SBrandon Streiff 				struct ifreq *ifr);
117c6fe0ad2SBrandon Streiff 
118c6fe0ad2SBrandon Streiff bool mv88e6xxx_port_rxtstamp(struct dsa_switch *ds, int port,
119c6fe0ad2SBrandon Streiff 			     struct sk_buff *clone, unsigned int type);
120*5c5416f5SYangbo Lu void mv88e6xxx_port_txtstamp(struct dsa_switch *ds, int port,
121*5c5416f5SYangbo Lu 			     struct sk_buff *skb);
122c6fe0ad2SBrandon Streiff 
123c6fe0ad2SBrandon Streiff int mv88e6xxx_get_ts_info(struct dsa_switch *ds, int port,
124c6fe0ad2SBrandon Streiff 			  struct ethtool_ts_info *info);
125c6fe0ad2SBrandon Streiff 
126c6fe0ad2SBrandon Streiff int mv88e6xxx_hwtstamp_setup(struct mv88e6xxx_chip *chip);
127c6fe0ad2SBrandon Streiff void mv88e6xxx_hwtstamp_free(struct mv88e6xxx_chip *chip);
128ffc705deSAndrew Lunn int mv88e6352_hwtstamp_port_enable(struct mv88e6xxx_chip *chip, int port);
129ffc705deSAndrew Lunn int mv88e6352_hwtstamp_port_disable(struct mv88e6xxx_chip *chip, int port);
130e2294a8bSAndrew Lunn int mv88e6165_global_enable(struct mv88e6xxx_chip *chip);
131e2294a8bSAndrew Lunn int mv88e6165_global_disable(struct mv88e6xxx_chip *chip);
132c6fe0ad2SBrandon Streiff 
133c6fe0ad2SBrandon Streiff #else /* !CONFIG_NET_DSA_MV88E6XXX_PTP */
134c6fe0ad2SBrandon Streiff 
mv88e6xxx_port_hwtstamp_set(struct dsa_switch * ds,int port,struct ifreq * ifr)135c6fe0ad2SBrandon Streiff static inline int mv88e6xxx_port_hwtstamp_set(struct dsa_switch *ds,
136c6fe0ad2SBrandon Streiff 					      int port, struct ifreq *ifr)
137c6fe0ad2SBrandon Streiff {
138c6fe0ad2SBrandon Streiff 	return -EOPNOTSUPP;
139c6fe0ad2SBrandon Streiff }
140c6fe0ad2SBrandon Streiff 
mv88e6xxx_port_hwtstamp_get(struct dsa_switch * ds,int port,struct ifreq * ifr)141c6fe0ad2SBrandon Streiff static inline int mv88e6xxx_port_hwtstamp_get(struct dsa_switch *ds,
142c6fe0ad2SBrandon Streiff 					      int port, struct ifreq *ifr)
143c6fe0ad2SBrandon Streiff {
144c6fe0ad2SBrandon Streiff 	return -EOPNOTSUPP;
145c6fe0ad2SBrandon Streiff }
146c6fe0ad2SBrandon Streiff 
mv88e6xxx_port_rxtstamp(struct dsa_switch * ds,int port,struct sk_buff * clone,unsigned int type)147c6fe0ad2SBrandon Streiff static inline bool mv88e6xxx_port_rxtstamp(struct dsa_switch *ds, int port,
148c6fe0ad2SBrandon Streiff 					   struct sk_buff *clone,
149c6fe0ad2SBrandon Streiff 					   unsigned int type)
150c6fe0ad2SBrandon Streiff {
151c6fe0ad2SBrandon Streiff 	return false;
152c6fe0ad2SBrandon Streiff }
153c6fe0ad2SBrandon Streiff 
mv88e6xxx_port_txtstamp(struct dsa_switch * ds,int port,struct sk_buff * skb)154*5c5416f5SYangbo Lu static inline void mv88e6xxx_port_txtstamp(struct dsa_switch *ds, int port,
155*5c5416f5SYangbo Lu 					   struct sk_buff *skb)
156c6fe0ad2SBrandon Streiff {
157c6fe0ad2SBrandon Streiff }
158c6fe0ad2SBrandon Streiff 
mv88e6xxx_get_ts_info(struct dsa_switch * ds,int port,struct ethtool_ts_info * info)159c6fe0ad2SBrandon Streiff static inline int mv88e6xxx_get_ts_info(struct dsa_switch *ds, int port,
160c6fe0ad2SBrandon Streiff 					struct ethtool_ts_info *info)
161c6fe0ad2SBrandon Streiff {
162c6fe0ad2SBrandon Streiff 	return -EOPNOTSUPP;
163c6fe0ad2SBrandon Streiff }
164c6fe0ad2SBrandon Streiff 
mv88e6xxx_hwtstamp_setup(struct mv88e6xxx_chip * chip)165c6fe0ad2SBrandon Streiff static inline int mv88e6xxx_hwtstamp_setup(struct mv88e6xxx_chip *chip)
166c6fe0ad2SBrandon Streiff {
167c6fe0ad2SBrandon Streiff 	return 0;
168c6fe0ad2SBrandon Streiff }
169c6fe0ad2SBrandon Streiff 
mv88e6xxx_hwtstamp_free(struct mv88e6xxx_chip * chip)170c6fe0ad2SBrandon Streiff static inline void mv88e6xxx_hwtstamp_free(struct mv88e6xxx_chip *chip)
171c6fe0ad2SBrandon Streiff {
172c6fe0ad2SBrandon Streiff }
173c6fe0ad2SBrandon Streiff 
174c6fe0ad2SBrandon Streiff #endif /* CONFIG_NET_DSA_MV88E6XXX_PTP */
175c6fe0ad2SBrandon Streiff 
176c6fe0ad2SBrandon Streiff #endif /* _MV88E6XXX_HWTSTAMP_H */
177