xref: /openbmc/linux/drivers/net/dsa/sja1105/sja1105_tas.h (revision 834f8933d5ddd732274cb6050252bd1c7cc7349d)
1b790b554SNishad Kamdar /* SPDX-License-Identifier: GPL-2.0 */
2b790b554SNishad Kamdar /* Copyright (c) 2019, Vladimir Oltean <olteanv@gmail.com>
3317ab5b8SVladimir Oltean  */
4317ab5b8SVladimir Oltean #ifndef _SJA1105_TAS_H
5317ab5b8SVladimir Oltean #define _SJA1105_TAS_H
6317ab5b8SVladimir Oltean 
7317ab5b8SVladimir Oltean #include <net/pkt_sched.h>
8317ab5b8SVladimir Oltean 
9*834f8933SVladimir Oltean #define SJA1105_TAS_MAX_DELTA		BIT(18)
10*834f8933SVladimir Oltean 
11*834f8933SVladimir Oltean struct sja1105_private;
12*834f8933SVladimir Oltean 
13317ab5b8SVladimir Oltean #if IS_ENABLED(CONFIG_NET_DSA_SJA1105_TAS)
14317ab5b8SVladimir Oltean 
1586db36a3SVladimir Oltean enum sja1105_tas_state {
1686db36a3SVladimir Oltean 	SJA1105_TAS_STATE_DISABLED,
1786db36a3SVladimir Oltean 	SJA1105_TAS_STATE_ENABLED_NOT_RUNNING,
1886db36a3SVladimir Oltean 	SJA1105_TAS_STATE_RUNNING,
1986db36a3SVladimir Oltean };
2086db36a3SVladimir Oltean 
2186db36a3SVladimir Oltean enum sja1105_ptp_op {
2286db36a3SVladimir Oltean 	SJA1105_PTP_NONE,
2386db36a3SVladimir Oltean 	SJA1105_PTP_CLOCKSTEP,
2486db36a3SVladimir Oltean 	SJA1105_PTP_ADJUSTFREQ,
2586db36a3SVladimir Oltean };
2686db36a3SVladimir Oltean 
27*834f8933SVladimir Oltean struct sja1105_gate_entry {
28*834f8933SVladimir Oltean 	struct list_head list;
29*834f8933SVladimir Oltean 	struct sja1105_rule *rule;
30*834f8933SVladimir Oltean 	s64 interval;
31*834f8933SVladimir Oltean 	u8 gate_state;
32*834f8933SVladimir Oltean };
33*834f8933SVladimir Oltean 
34*834f8933SVladimir Oltean struct sja1105_gating_config {
35*834f8933SVladimir Oltean 	u64 cycle_time;
36*834f8933SVladimir Oltean 	s64 base_time;
37*834f8933SVladimir Oltean 	int num_entries;
38*834f8933SVladimir Oltean 	struct list_head entries;
39*834f8933SVladimir Oltean };
40*834f8933SVladimir Oltean 
41317ab5b8SVladimir Oltean struct sja1105_tas_data {
42317ab5b8SVladimir Oltean 	struct tc_taprio_qopt_offload *offload[SJA1105_NUM_PORTS];
43*834f8933SVladimir Oltean 	struct sja1105_gating_config gating_cfg;
4486db36a3SVladimir Oltean 	enum sja1105_tas_state state;
4586db36a3SVladimir Oltean 	enum sja1105_ptp_op last_op;
4686db36a3SVladimir Oltean 	struct work_struct tas_work;
4786db36a3SVladimir Oltean 	s64 earliest_base_time;
4886db36a3SVladimir Oltean 	s64 oper_base_time;
4986db36a3SVladimir Oltean 	u64 max_cycle_time;
5086db36a3SVladimir Oltean 	bool enabled;
51317ab5b8SVladimir Oltean };
52317ab5b8SVladimir Oltean 
53317ab5b8SVladimir Oltean int sja1105_setup_tc_taprio(struct dsa_switch *ds, int port,
54317ab5b8SVladimir Oltean 			    struct tc_taprio_qopt_offload *admin);
55317ab5b8SVladimir Oltean 
56317ab5b8SVladimir Oltean void sja1105_tas_setup(struct dsa_switch *ds);
57317ab5b8SVladimir Oltean 
58317ab5b8SVladimir Oltean void sja1105_tas_teardown(struct dsa_switch *ds);
59317ab5b8SVladimir Oltean 
6086db36a3SVladimir Oltean void sja1105_tas_clockstep(struct dsa_switch *ds);
6186db36a3SVladimir Oltean 
6286db36a3SVladimir Oltean void sja1105_tas_adjfreq(struct dsa_switch *ds);
6386db36a3SVladimir Oltean 
64*834f8933SVladimir Oltean bool sja1105_gating_check_conflicts(struct sja1105_private *priv, int port,
65*834f8933SVladimir Oltean 				    struct netlink_ext_ack *extack);
66*834f8933SVladimir Oltean 
67*834f8933SVladimir Oltean int sja1105_init_scheduling(struct sja1105_private *priv);
68*834f8933SVladimir Oltean 
69317ab5b8SVladimir Oltean #else
70317ab5b8SVladimir Oltean 
71317ab5b8SVladimir Oltean /* C doesn't allow empty structures, bah! */
72317ab5b8SVladimir Oltean struct sja1105_tas_data {
73317ab5b8SVladimir Oltean 	u8 dummy;
74317ab5b8SVladimir Oltean };
75317ab5b8SVladimir Oltean 
76317ab5b8SVladimir Oltean static inline int sja1105_setup_tc_taprio(struct dsa_switch *ds, int port,
77317ab5b8SVladimir Oltean 					  struct tc_taprio_qopt_offload *admin)
78317ab5b8SVladimir Oltean {
79317ab5b8SVladimir Oltean 	return -EOPNOTSUPP;
80317ab5b8SVladimir Oltean }
81317ab5b8SVladimir Oltean 
82317ab5b8SVladimir Oltean static inline void sja1105_tas_setup(struct dsa_switch *ds) { }
83317ab5b8SVladimir Oltean 
84317ab5b8SVladimir Oltean static inline void sja1105_tas_teardown(struct dsa_switch *ds) { }
85317ab5b8SVladimir Oltean 
8686db36a3SVladimir Oltean static inline void sja1105_tas_clockstep(struct dsa_switch *ds) { }
8786db36a3SVladimir Oltean 
8886db36a3SVladimir Oltean static inline void sja1105_tas_adjfreq(struct dsa_switch *ds) { }
8986db36a3SVladimir Oltean 
90*834f8933SVladimir Oltean static inline bool
91*834f8933SVladimir Oltean sja1105_gating_check_conflicts(struct dsa_switch *ds, int port,
92*834f8933SVladimir Oltean 			       struct netlink_ext_ack *extack)
93*834f8933SVladimir Oltean {
94*834f8933SVladimir Oltean 	return true;
95*834f8933SVladimir Oltean }
96*834f8933SVladimir Oltean 
97*834f8933SVladimir Oltean static inline int sja1105_init_scheduling(struct sja1105_private *priv)
98*834f8933SVladimir Oltean {
99*834f8933SVladimir Oltean 	return 0;
100*834f8933SVladimir Oltean }
101*834f8933SVladimir Oltean 
102317ab5b8SVladimir Oltean #endif /* IS_ENABLED(CONFIG_NET_DSA_SJA1105_TAS) */
103317ab5b8SVladimir Oltean 
104317ab5b8SVladimir Oltean #endif /* _SJA1105_TAS_H */
105