File Index
Files and directories
Sign in
FILE

idpf_ptp.h

File preview with syntax highlighting.

linux-6.19.14/drivers/net/ethernet/intel/idpf/idpf_ptp.h C
  1/* SPDX-License-Identifier: GPL-2.0-only */
  2/* Copyright (C) 2024 Intel Corporation */
  3
  4#ifndef _IDPF_PTP_H
  5#define _IDPF_PTP_H
  6
  7#include <linux/ptp_clock_kernel.h>
  8
  9/**
 10 * struct idpf_ptp_cmd - PTP command masks
 11 * @exec_cmd_mask: mask to trigger command execution
 12 * @shtime_enable_mask: mask to enable shadow time
 13 */
 14struct idpf_ptp_cmd {
 15	u32 exec_cmd_mask;
 16	u32 shtime_enable_mask;
 17};
 18
 19/* struct idpf_ptp_dev_clk_regs - PTP device registers
 20 * @dev_clk_ns_l: low part of the device clock register
 21 * @dev_clk_ns_h: high part of the device clock register
 22 * @phy_clk_ns_l: low part of the PHY clock register
 23 * @phy_clk_ns_h: high part of the PHY clock register
 24 * @sys_time_ns_l: low part of the system time register
 25 * @sys_time_ns_h: high part of the system time register
 26 * @incval_l: low part of the increment value register
 27 * @incval_h: high part of the increment value register
 28 * @shadj_l: low part of the shadow adjust register
 29 * @shadj_h: high part of the shadow adjust register
 30 * @phy_incval_l: low part of the PHY increment value register
 31 * @phy_incval_h: high part of the PHY increment value register
 32 * @phy_shadj_l: low part of the PHY shadow adjust register
 33 * @phy_shadj_h: high part of the PHY shadow adjust register
 34 * @cmd: PTP command register
 35 * @phy_cmd: PHY command register
 36 * @cmd_sync: PTP command synchronization register
 37 */
 38struct idpf_ptp_dev_clk_regs {
 39	/* Main clock */
 40	void __iomem *dev_clk_ns_l;
 41	void __iomem *dev_clk_ns_h;
 42
 43	/* PHY timer */
 44	void __iomem *phy_clk_ns_l;
 45	void __iomem *phy_clk_ns_h;
 46
 47	/* System time */
 48	void __iomem *sys_time_ns_l;
 49	void __iomem *sys_time_ns_h;
 50
 51	/* Main timer adjustments */
 52	void __iomem *incval_l;
 53	void __iomem *incval_h;
 54	void __iomem *shadj_l;
 55	void __iomem *shadj_h;
 56
 57	/* PHY timer adjustments */
 58	void __iomem *phy_incval_l;
 59	void __iomem *phy_incval_h;
 60	void __iomem *phy_shadj_l;
 61	void __iomem *phy_shadj_h;
 62
 63	/* Command */
 64	void __iomem *cmd;
 65	void __iomem *phy_cmd;
 66	void __iomem *cmd_sync;
 67};
 68
 69/**
 70 * enum idpf_ptp_access - the type of access to PTP operations
 71 * @IDPF_PTP_NONE: no access
 72 * @IDPF_PTP_DIRECT: direct access through BAR registers
 73 * @IDPF_PTP_MAILBOX: access through mailbox messages
 74 */
 75enum idpf_ptp_access {
 76	IDPF_PTP_NONE = 0,
 77	IDPF_PTP_DIRECT,
 78	IDPF_PTP_MAILBOX,
 79};
 80
 81/**
 82 * struct idpf_ptp_secondary_mbx - PTP secondary mailbox
 83 * @peer_mbx_q_id: PTP mailbox queue ID
 84 * @peer_id: Peer ID for PTP Device Control daemon
 85 * @valid: indicates whether secondary mailblox is supported by the Control
 86 *	   Plane
 87 */
 88struct idpf_ptp_secondary_mbx {
 89	u16 peer_mbx_q_id;
 90	u16 peer_id;
 91	bool valid:1;
 92};
 93
 94/**
 95 * enum idpf_ptp_tx_tstamp_state - Tx timestamp states
 96 * @IDPF_PTP_FREE: Tx timestamp index free to use
 97 * @IDPF_PTP_REQUEST: Tx timestamp index set to the Tx descriptor
 98 * @IDPF_PTP_READ_VALUE: Tx timestamp value ready to be read
 99 */
100enum idpf_ptp_tx_tstamp_state {
101	IDPF_PTP_FREE,
102	IDPF_PTP_REQUEST,
103	IDPF_PTP_READ_VALUE,
104};
105
106/**
107 * struct idpf_ptp_tx_tstamp_status - Parameters to track Tx timestamp
108 * @skb: the pointer to the SKB that received the completion tag
109 * @state: the state of the Tx timestamp
110 */
111struct idpf_ptp_tx_tstamp_status {
112	struct sk_buff *skb;
113	enum idpf_ptp_tx_tstamp_state state;
114};
115
116/**
117 * struct idpf_ptp_tx_tstamp - Parameters for Tx timestamping
118 * @list_member: the list member structure
119 * @tx_latch_reg_offset_l: Tx tstamp latch low register offset
120 * @tx_latch_reg_offset_h: Tx tstamp latch high register offset
121 * @skb: the pointer to the SKB for this timestamp request
122 * @tstamp: the Tx tstamp value
123 * @idx: the index of the Tx tstamp
124 */
125struct idpf_ptp_tx_tstamp {
126	struct list_head list_member;
127	u32 tx_latch_reg_offset_l;
128	u32 tx_latch_reg_offset_h;
129	struct sk_buff *skb;
130	u64 tstamp;
131	u32 idx;
132};
133
134/**
135 * struct idpf_ptp_vport_tx_tstamp_caps - Tx timestamp capabilities
136 * @vport_id: the vport id
137 * @num_entries: the number of negotiated Tx timestamp entries
138 * @tstamp_ns_lo_bit: first bit for nanosecond part of the timestamp
139 * @latches_lock: the lock to the lists of free/used timestamp indexes
140 * @status_lock: the lock to the status tracker
141 * @access: indicates an access to Tx timestamp
142 * @latches_free: the list of the free Tx timestamps latches
143 * @latches_in_use: the list of the used Tx timestamps latches
144 * @tx_tstamp_status: Tx tstamp status tracker
145 */
146struct idpf_ptp_vport_tx_tstamp_caps {
147	u32 vport_id;
148	u16 num_entries;
149	u16 tstamp_ns_lo_bit;
150	spinlock_t latches_lock;
151	spinlock_t status_lock;
152	bool access:1;
153	struct list_head latches_free;
154	struct list_head latches_in_use;
155	struct idpf_ptp_tx_tstamp_status tx_tstamp_status[];
156};
157
158/**
159 * struct idpf_ptp - PTP parameters
160 * @info: structure defining PTP hardware capabilities
161 * @clock: pointer to registered PTP clock device
162 * @adapter: back pointer to the adapter
163 * @base_incval: base increment value of the PTP clock
164 * @max_adj: maximum adjustment of the PTP clock
165 * @cmd: HW specific command masks
166 * @cached_phc_time: a cached copy of the PHC time for timestamp extension
167 * @cached_phc_jiffies: jiffies when cached_phc_time was last updated
168 * @dev_clk_regs: the set of registers to access the device clock
169 * @caps: PTP capabilities negotiated with the Control Plane
170 * @get_dev_clk_time_access: access type for getting the device clock time
171 * @get_cross_tstamp_access: access type for the cross timestamping
172 * @set_dev_clk_time_access: access type for setting the device clock time
173 * @adj_dev_clk_time_access: access type for the adjusting the device clock
174 * @tx_tstamp_access: access type for the Tx timestamp value read
175 * @rsv: reserved bits
176 * @secondary_mbx: parameters for using dedicated PTP mailbox
177 * @read_dev_clk_lock: spinlock protecting access to the device clock read
178 *		       operation executed by the HW latch
179 */
180struct idpf_ptp {
181	struct ptp_clock_info info;
182	struct ptp_clock *clock;
183	struct idpf_adapter *adapter;
184	u64 base_incval;
185	u64 max_adj;
186	struct idpf_ptp_cmd cmd;
187	u64 cached_phc_time;
188	unsigned long cached_phc_jiffies;
189	struct idpf_ptp_dev_clk_regs dev_clk_regs;
190	u32 caps;
191	enum idpf_ptp_access get_dev_clk_time_access:2;
192	enum idpf_ptp_access get_cross_tstamp_access:2;
193	enum idpf_ptp_access set_dev_clk_time_access:2;
194	enum idpf_ptp_access adj_dev_clk_time_access:2;
195	enum idpf_ptp_access tx_tstamp_access:2;
196	u8 rsv;
197	struct idpf_ptp_secondary_mbx secondary_mbx;
198	spinlock_t read_dev_clk_lock;
199};
200
201/**
202 * idpf_ptp_info_to_adapter - get driver adapter struct from ptp_clock_info
203 * @info: pointer to ptp_clock_info struct
204 *
205 * Return: pointer to the corresponding adapter struct
206 */
207static inline struct idpf_adapter *
208idpf_ptp_info_to_adapter(const struct ptp_clock_info *info)
209{
210	const struct idpf_ptp *ptp = container_of_const(info, struct idpf_ptp,
211							info);
212	return ptp->adapter;
213}
214
215/**
216 * struct idpf_ptp_dev_timers - System time and device time values
217 * @sys_time_ns: system time value expressed in nanoseconds
218 * @dev_clk_time_ns: device clock time value expressed in nanoseconds
219 */
220struct idpf_ptp_dev_timers {
221	u64 sys_time_ns;
222	u64 dev_clk_time_ns;
223};
224
225/**
226 * idpf_ptp_is_vport_tx_tstamp_ena - Verify the Tx timestamping enablement for
227 *				     a given vport.
228 * @vport: Virtual port structure
229 *
230 * Tx timestamp capabilities are negotiated with the Control Plane only if the
231 * device clock value can be read, Tx timestamp access type is different than
232 * NONE, and the PTP clock for the adapter is created. When all those conditions
233 * are satisfied, Tx timestamp feature is enabled and tx_tstamp_caps is
234 * allocated and fulfilled.
235 *
236 * Return: true if the Tx timestamping is enabled, false otherwise.
237 */
238static inline bool idpf_ptp_is_vport_tx_tstamp_ena(struct idpf_vport *vport)
239{
240	if (!vport->tx_tstamp_caps)
241		return false;
242	else
243		return true;
244}
245
246/**
247 * idpf_ptp_is_vport_rx_tstamp_ena - Verify the Rx timestamping enablement for
248 *				     a given vport.
249 * @vport: Virtual port structure
250 *
251 * Rx timestamp feature is enabled if the PTP clock for the adapter is created
252 * and it is possible to read the value of the device clock. The second
253 * assumption comes from the need to extend the Rx timestamp value to 64 bit
254 * based on the current device clock time.
255 *
256 * Return: true if the Rx timestamping is enabled, false otherwise.
257 */
258static inline bool idpf_ptp_is_vport_rx_tstamp_ena(struct idpf_vport *vport)
259{
260	if (!vport->adapter->ptp ||
261	    vport->adapter->ptp->get_dev_clk_time_access == IDPF_PTP_NONE)
262		return false;
263	else
264		return true;
265}
266
267#if IS_ENABLED(CONFIG_PTP_1588_CLOCK)
268int idpf_ptp_init(struct idpf_adapter *adapter);
269void idpf_ptp_release(struct idpf_adapter *adapter);
270int idpf_ptp_get_caps(struct idpf_adapter *adapter);
271void idpf_ptp_get_features_access(const struct idpf_adapter *adapter);
272bool idpf_ptp_get_txq_tstamp_capability(struct idpf_tx_queue *txq);
273int idpf_ptp_get_dev_clk_time(struct idpf_adapter *adapter,
274			      struct idpf_ptp_dev_timers *dev_clk_time);
275int idpf_ptp_get_cross_time(struct idpf_adapter *adapter,
276			    struct idpf_ptp_dev_timers *cross_time);
277int idpf_ptp_set_dev_clk_time(struct idpf_adapter *adapter, u64 time);
278int idpf_ptp_adj_dev_clk_fine(struct idpf_adapter *adapter, u64 incval);
279int idpf_ptp_adj_dev_clk_time(struct idpf_adapter *adapter, s64 delta);
280int idpf_ptp_get_vport_tstamps_caps(struct idpf_vport *vport);
281int idpf_ptp_get_tx_tstamp(struct idpf_vport *vport);
282int idpf_ptp_set_timestamp_mode(struct idpf_vport *vport,
283				struct kernel_hwtstamp_config *config);
284u64 idpf_ptp_extend_ts(struct idpf_vport *vport, u64 in_tstamp);
285u64 idpf_ptp_tstamp_extend_32b_to_64b(u64 cached_phc_time, u32 in_timestamp);
286int idpf_ptp_request_ts(struct idpf_tx_queue *tx_q, struct sk_buff *skb,
287			u32 *idx);
288void idpf_tstamp_task(struct work_struct *work);
289#else /* CONFIG_PTP_1588_CLOCK */
290static inline int idpf_ptp_init(struct idpf_adapter *adapter)
291{
292	return 0;
293}
294
295static inline void idpf_ptp_release(struct idpf_adapter *adapter) { }
296
297static inline int idpf_ptp_get_caps(struct idpf_adapter *adapter)
298{
299	return -EOPNOTSUPP;
300}
301
302static inline void
303idpf_ptp_get_features_access(const struct idpf_adapter *adapter) { }
304
305static inline bool
306idpf_ptp_get_txq_tstamp_capability(struct idpf_tx_queue *txq)
307{
308	return false;
309}
310
311static inline int
312idpf_ptp_get_dev_clk_time(struct idpf_adapter *adapter,
313			  struct idpf_ptp_dev_timers *dev_clk_time)
314{
315	return -EOPNOTSUPP;
316}
317
318static inline int
319idpf_ptp_get_cross_time(struct idpf_adapter *adapter,
320			struct idpf_ptp_dev_timers *cross_time)
321{
322	return -EOPNOTSUPP;
323}
324
325static inline int idpf_ptp_set_dev_clk_time(struct idpf_adapter *adapter,
326					    u64 time)
327{
328	return -EOPNOTSUPP;
329}
330
331static inline int idpf_ptp_adj_dev_clk_fine(struct idpf_adapter *adapter,
332					    u64 incval)
333{
334	return -EOPNOTSUPP;
335}
336
337static inline int idpf_ptp_adj_dev_clk_time(struct idpf_adapter *adapter,
338					    s64 delta)
339{
340	return -EOPNOTSUPP;
341}
342
343static inline int idpf_ptp_get_vport_tstamps_caps(struct idpf_vport *vport)
344{
345	return -EOPNOTSUPP;
346}
347
348static inline int idpf_ptp_get_tx_tstamp(struct idpf_vport *vport)
349{
350	return -EOPNOTSUPP;
351}
352
353static inline int
354idpf_ptp_set_timestamp_mode(struct idpf_vport *vport,
355			    struct kernel_hwtstamp_config *config)
356{
357	return -EOPNOTSUPP;
358}
359
360static inline u64 idpf_ptp_extend_ts(struct idpf_vport *vport, u32 in_tstamp)
361{
362	return 0;
363}
364
365static inline u64 idpf_ptp_tstamp_extend_32b_to_64b(u64 cached_phc_time,
366						    u32 in_timestamp)
367{
368	return 0;
369}
370
371static inline int idpf_ptp_request_ts(struct idpf_tx_queue *tx_q,
372				      struct sk_buff *skb, u32 *idx)
373{
374	return -EOPNOTSUPP;
375}
376
377static inline void idpf_tstamp_task(struct work_struct *work) { }
378#endif /* CONFIG_PTP_1588_CLOCK */
379#endif /* _IDPF_PTP_H */
~/ Read-only file preview.