cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

lan966x_ptp.c (22925B)


      1// SPDX-License-Identifier: GPL-2.0+
      2
      3#include <linux/ptp_classify.h>
      4
      5#include "lan966x_main.h"
      6
      7#define LAN966X_MAX_PTP_ID	512
      8
      9/* Represents 1ppm adjustment in 2^59 format with 6.037735849ns as reference
     10 * The value is calculated as following: (1/1000000)/((2^-59)/6.037735849)
     11 */
     12#define LAN966X_1PPM_FORMAT		3480517749723LL
     13
     14/* Represents 1ppb adjustment in 2^29 format with 6.037735849ns as reference
     15 * The value is calculated as following: (1/1000000000)/((2^59)/6.037735849)
     16 */
     17#define LAN966X_1PPB_FORMAT		3480517749LL
     18
     19#define TOD_ACC_PIN		0x7
     20
     21enum {
     22	PTP_PIN_ACTION_IDLE = 0,
     23	PTP_PIN_ACTION_LOAD,
     24	PTP_PIN_ACTION_SAVE,
     25	PTP_PIN_ACTION_CLOCK,
     26	PTP_PIN_ACTION_DELTA,
     27	PTP_PIN_ACTION_TOD
     28};
     29
     30static u64 lan966x_ptp_get_nominal_value(void)
     31{
     32	/* This is the default value that for each system clock, the time of day
     33	 * is increased. It has the format 5.59 nanosecond.
     34	 */
     35	return 0x304d4873ecade305;
     36}
     37
     38int lan966x_ptp_hwtstamp_set(struct lan966x_port *port, struct ifreq *ifr)
     39{
     40	struct lan966x *lan966x = port->lan966x;
     41	struct hwtstamp_config cfg;
     42	struct lan966x_phc *phc;
     43
     44	/* For now don't allow to run ptp on ports that are part of a bridge,
     45	 * because in case of transparent clock the HW will still forward the
     46	 * frames, so there would be duplicate frames
     47	 */
     48	if (lan966x->bridge_mask & BIT(port->chip_port))
     49		return -EINVAL;
     50
     51	if (copy_from_user(&cfg, ifr->ifr_data, sizeof(cfg)))
     52		return -EFAULT;
     53
     54	switch (cfg.tx_type) {
     55	case HWTSTAMP_TX_ON:
     56		port->ptp_cmd = IFH_REW_OP_TWO_STEP_PTP;
     57		break;
     58	case HWTSTAMP_TX_ONESTEP_SYNC:
     59		port->ptp_cmd = IFH_REW_OP_ONE_STEP_PTP;
     60		break;
     61	case HWTSTAMP_TX_OFF:
     62		port->ptp_cmd = IFH_REW_OP_NOOP;
     63		break;
     64	default:
     65		return -ERANGE;
     66	}
     67
     68	switch (cfg.rx_filter) {
     69	case HWTSTAMP_FILTER_NONE:
     70		break;
     71	case HWTSTAMP_FILTER_ALL:
     72	case HWTSTAMP_FILTER_PTP_V1_L4_EVENT:
     73	case HWTSTAMP_FILTER_PTP_V1_L4_SYNC:
     74	case HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ:
     75	case HWTSTAMP_FILTER_PTP_V2_L4_EVENT:
     76	case HWTSTAMP_FILTER_PTP_V2_L4_SYNC:
     77	case HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ:
     78	case HWTSTAMP_FILTER_PTP_V2_L2_EVENT:
     79	case HWTSTAMP_FILTER_PTP_V2_L2_SYNC:
     80	case HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ:
     81	case HWTSTAMP_FILTER_PTP_V2_EVENT:
     82	case HWTSTAMP_FILTER_PTP_V2_SYNC:
     83	case HWTSTAMP_FILTER_PTP_V2_DELAY_REQ:
     84	case HWTSTAMP_FILTER_NTP_ALL:
     85		cfg.rx_filter = HWTSTAMP_FILTER_ALL;
     86		break;
     87	default:
     88		return -ERANGE;
     89	}
     90
     91	/* Commit back the result & save it */
     92	mutex_lock(&lan966x->ptp_lock);
     93	phc = &lan966x->phc[LAN966X_PHC_PORT];
     94	memcpy(&phc->hwtstamp_config, &cfg, sizeof(cfg));
     95	mutex_unlock(&lan966x->ptp_lock);
     96
     97	return copy_to_user(ifr->ifr_data, &cfg, sizeof(cfg)) ? -EFAULT : 0;
     98}
     99
    100int lan966x_ptp_hwtstamp_get(struct lan966x_port *port, struct ifreq *ifr)
    101{
    102	struct lan966x *lan966x = port->lan966x;
    103	struct lan966x_phc *phc;
    104
    105	phc = &lan966x->phc[LAN966X_PHC_PORT];
    106	return copy_to_user(ifr->ifr_data, &phc->hwtstamp_config,
    107			    sizeof(phc->hwtstamp_config)) ? -EFAULT : 0;
    108}
    109
    110static int lan966x_ptp_classify(struct lan966x_port *port, struct sk_buff *skb)
    111{
    112	struct ptp_header *header;
    113	u8 msgtype;
    114	int type;
    115
    116	if (port->ptp_cmd == IFH_REW_OP_NOOP)
    117		return IFH_REW_OP_NOOP;
    118
    119	type = ptp_classify_raw(skb);
    120	if (type == PTP_CLASS_NONE)
    121		return IFH_REW_OP_NOOP;
    122
    123	header = ptp_parse_header(skb, type);
    124	if (!header)
    125		return IFH_REW_OP_NOOP;
    126
    127	if (port->ptp_cmd == IFH_REW_OP_TWO_STEP_PTP)
    128		return IFH_REW_OP_TWO_STEP_PTP;
    129
    130	/* If it is sync and run 1 step then set the correct operation,
    131	 * otherwise run as 2 step
    132	 */
    133	msgtype = ptp_get_msgtype(header, type);
    134	if ((msgtype & 0xf) == 0)
    135		return IFH_REW_OP_ONE_STEP_PTP;
    136
    137	return IFH_REW_OP_TWO_STEP_PTP;
    138}
    139
    140static void lan966x_ptp_txtstamp_old_release(struct lan966x_port *port)
    141{
    142	struct sk_buff *skb, *skb_tmp;
    143	unsigned long flags;
    144
    145	spin_lock_irqsave(&port->tx_skbs.lock, flags);
    146	skb_queue_walk_safe(&port->tx_skbs, skb, skb_tmp) {
    147		if time_after(LAN966X_SKB_CB(skb)->jiffies + LAN966X_PTP_TIMEOUT,
    148			      jiffies)
    149			break;
    150
    151		__skb_unlink(skb, &port->tx_skbs);
    152		dev_kfree_skb_any(skb);
    153	}
    154	spin_unlock_irqrestore(&port->tx_skbs.lock, flags);
    155}
    156
    157int lan966x_ptp_txtstamp_request(struct lan966x_port *port,
    158				 struct sk_buff *skb)
    159{
    160	struct lan966x *lan966x = port->lan966x;
    161	unsigned long flags;
    162	u8 rew_op;
    163
    164	rew_op = lan966x_ptp_classify(port, skb);
    165	LAN966X_SKB_CB(skb)->rew_op = rew_op;
    166
    167	if (rew_op != IFH_REW_OP_TWO_STEP_PTP)
    168		return 0;
    169
    170	lan966x_ptp_txtstamp_old_release(port);
    171
    172	spin_lock_irqsave(&lan966x->ptp_ts_id_lock, flags);
    173	if (lan966x->ptp_skbs == LAN966X_MAX_PTP_ID) {
    174		spin_unlock_irqrestore(&lan966x->ptp_ts_id_lock, flags);
    175		return -EBUSY;
    176	}
    177
    178	skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
    179
    180	skb_queue_tail(&port->tx_skbs, skb);
    181	LAN966X_SKB_CB(skb)->ts_id = port->ts_id;
    182	LAN966X_SKB_CB(skb)->jiffies = jiffies;
    183
    184	lan966x->ptp_skbs++;
    185	port->ts_id++;
    186	if (port->ts_id == LAN966X_MAX_PTP_ID)
    187		port->ts_id = 0;
    188
    189	spin_unlock_irqrestore(&lan966x->ptp_ts_id_lock, flags);
    190
    191	return 0;
    192}
    193
    194void lan966x_ptp_txtstamp_release(struct lan966x_port *port,
    195				  struct sk_buff *skb)
    196{
    197	struct lan966x *lan966x = port->lan966x;
    198	unsigned long flags;
    199
    200	spin_lock_irqsave(&lan966x->ptp_ts_id_lock, flags);
    201	port->ts_id--;
    202	lan966x->ptp_skbs--;
    203	skb_unlink(skb, &port->tx_skbs);
    204	spin_unlock_irqrestore(&lan966x->ptp_ts_id_lock, flags);
    205}
    206
    207static void lan966x_get_hwtimestamp(struct lan966x *lan966x,
    208				    struct timespec64 *ts,
    209				    u32 nsec)
    210{
    211	/* Read current PTP time to get seconds */
    212	unsigned long flags;
    213	u32 curr_nsec;
    214
    215	spin_lock_irqsave(&lan966x->ptp_clock_lock, flags);
    216
    217	lan_rmw(PTP_PIN_CFG_PIN_ACTION_SET(PTP_PIN_ACTION_SAVE) |
    218		PTP_PIN_CFG_PIN_DOM_SET(LAN966X_PHC_PORT) |
    219		PTP_PIN_CFG_PIN_SYNC_SET(0),
    220		PTP_PIN_CFG_PIN_ACTION |
    221		PTP_PIN_CFG_PIN_DOM |
    222		PTP_PIN_CFG_PIN_SYNC,
    223		lan966x, PTP_PIN_CFG(TOD_ACC_PIN));
    224
    225	ts->tv_sec = lan_rd(lan966x, PTP_TOD_SEC_LSB(TOD_ACC_PIN));
    226	curr_nsec = lan_rd(lan966x, PTP_TOD_NSEC(TOD_ACC_PIN));
    227
    228	ts->tv_nsec = nsec;
    229
    230	/* Sec has incremented since the ts was registered */
    231	if (curr_nsec < nsec)
    232		ts->tv_sec--;
    233
    234	spin_unlock_irqrestore(&lan966x->ptp_clock_lock, flags);
    235}
    236
    237irqreturn_t lan966x_ptp_irq_handler(int irq, void *args)
    238{
    239	int budget = LAN966X_MAX_PTP_ID;
    240	struct lan966x *lan966x = args;
    241
    242	while (budget--) {
    243		struct sk_buff *skb, *skb_tmp, *skb_match = NULL;
    244		struct skb_shared_hwtstamps shhwtstamps;
    245		struct lan966x_port *port;
    246		struct timespec64 ts;
    247		unsigned long flags;
    248		u32 val, id, txport;
    249		u32 delay;
    250
    251		val = lan_rd(lan966x, PTP_TWOSTEP_CTRL);
    252
    253		/* Check if a timestamp can be retrieved */
    254		if (!(val & PTP_TWOSTEP_CTRL_VLD))
    255			break;
    256
    257		WARN_ON(val & PTP_TWOSTEP_CTRL_OVFL);
    258
    259		if (!(val & PTP_TWOSTEP_CTRL_STAMP_TX))
    260			continue;
    261
    262		/* Retrieve the ts Tx port */
    263		txport = PTP_TWOSTEP_CTRL_STAMP_PORT_GET(val);
    264
    265		/* Retrieve its associated skb */
    266		port = lan966x->ports[txport];
    267
    268		/* Retrieve the delay */
    269		delay = lan_rd(lan966x, PTP_TWOSTEP_STAMP);
    270		delay = PTP_TWOSTEP_STAMP_STAMP_NSEC_GET(delay);
    271
    272		/* Get next timestamp from fifo, which needs to be the
    273		 * rx timestamp which represents the id of the frame
    274		 */
    275		lan_rmw(PTP_TWOSTEP_CTRL_NXT_SET(1),
    276			PTP_TWOSTEP_CTRL_NXT,
    277			lan966x, PTP_TWOSTEP_CTRL);
    278
    279		val = lan_rd(lan966x, PTP_TWOSTEP_CTRL);
    280
    281		/* Check if a timestamp can be retried */
    282		if (!(val & PTP_TWOSTEP_CTRL_VLD))
    283			break;
    284
    285		/* Read RX timestamping to get the ID */
    286		id = lan_rd(lan966x, PTP_TWOSTEP_STAMP);
    287
    288		spin_lock_irqsave(&port->tx_skbs.lock, flags);
    289		skb_queue_walk_safe(&port->tx_skbs, skb, skb_tmp) {
    290			if (LAN966X_SKB_CB(skb)->ts_id != id)
    291				continue;
    292
    293			__skb_unlink(skb, &port->tx_skbs);
    294			skb_match = skb;
    295			break;
    296		}
    297		spin_unlock_irqrestore(&port->tx_skbs.lock, flags);
    298
    299		/* Next ts */
    300		lan_rmw(PTP_TWOSTEP_CTRL_NXT_SET(1),
    301			PTP_TWOSTEP_CTRL_NXT,
    302			lan966x, PTP_TWOSTEP_CTRL);
    303
    304		if (WARN_ON(!skb_match))
    305			continue;
    306
    307		spin_lock(&lan966x->ptp_ts_id_lock);
    308		lan966x->ptp_skbs--;
    309		spin_unlock(&lan966x->ptp_ts_id_lock);
    310
    311		/* Get the h/w timestamp */
    312		lan966x_get_hwtimestamp(lan966x, &ts, delay);
    313
    314		/* Set the timestamp into the skb */
    315		shhwtstamps.hwtstamp = ktime_set(ts.tv_sec, ts.tv_nsec);
    316		skb_tstamp_tx(skb_match, &shhwtstamps);
    317
    318		dev_kfree_skb_any(skb_match);
    319	}
    320
    321	return IRQ_HANDLED;
    322}
    323
    324irqreturn_t lan966x_ptp_ext_irq_handler(int irq, void *args)
    325{
    326	struct lan966x *lan966x = args;
    327	struct lan966x_phc *phc;
    328	unsigned long flags;
    329	u64 time = 0;
    330	time64_t s;
    331	int pin, i;
    332	s64 ns;
    333
    334	if (!(lan_rd(lan966x, PTP_PIN_INTR)))
    335		return IRQ_NONE;
    336
    337	/* Go through all domains and see which pin generated the interrupt */
    338	for (i = 0; i < LAN966X_PHC_COUNT; ++i) {
    339		struct ptp_clock_event ptp_event = {0};
    340
    341		phc = &lan966x->phc[i];
    342		pin = ptp_find_pin_unlocked(phc->clock, PTP_PF_EXTTS, 0);
    343		if (pin == -1)
    344			continue;
    345
    346		if (!(lan_rd(lan966x, PTP_PIN_INTR) & BIT(pin)))
    347			continue;
    348
    349		spin_lock_irqsave(&lan966x->ptp_clock_lock, flags);
    350
    351		/* Enable to get the new interrupt.
    352		 * By writing 1 it clears the bit
    353		 */
    354		lan_wr(BIT(pin), lan966x, PTP_PIN_INTR);
    355
    356		/* Get current time */
    357		s = lan_rd(lan966x, PTP_TOD_SEC_MSB(pin));
    358		s <<= 32;
    359		s |= lan_rd(lan966x, PTP_TOD_SEC_LSB(pin));
    360		ns = lan_rd(lan966x, PTP_TOD_NSEC(pin));
    361		ns &= PTP_TOD_NSEC_TOD_NSEC;
    362
    363		spin_unlock_irqrestore(&lan966x->ptp_clock_lock, flags);
    364
    365		if ((ns & 0xFFFFFFF0) == 0x3FFFFFF0) {
    366			s--;
    367			ns &= 0xf;
    368			ns += 999999984;
    369		}
    370		time = ktime_set(s, ns);
    371
    372		ptp_event.index = pin;
    373		ptp_event.timestamp = time;
    374		ptp_event.type = PTP_CLOCK_EXTTS;
    375		ptp_clock_event(phc->clock, &ptp_event);
    376	}
    377
    378	return IRQ_HANDLED;
    379}
    380
    381static int lan966x_ptp_adjfine(struct ptp_clock_info *ptp, long scaled_ppm)
    382{
    383	struct lan966x_phc *phc = container_of(ptp, struct lan966x_phc, info);
    384	struct lan966x *lan966x = phc->lan966x;
    385	unsigned long flags;
    386	bool neg_adj = 0;
    387	u64 tod_inc;
    388	u64 ref;
    389
    390	if (!scaled_ppm)
    391		return 0;
    392
    393	if (scaled_ppm < 0) {
    394		neg_adj = 1;
    395		scaled_ppm = -scaled_ppm;
    396	}
    397
    398	tod_inc = lan966x_ptp_get_nominal_value();
    399
    400	/* The multiplication is split in 2 separate additions because of
    401	 * overflow issues. If scaled_ppm with 16bit fractional part was bigger
    402	 * than 20ppm then we got overflow.
    403	 */
    404	ref = LAN966X_1PPM_FORMAT * (scaled_ppm >> 16);
    405	ref += (LAN966X_1PPM_FORMAT * (0xffff & scaled_ppm)) >> 16;
    406	tod_inc = neg_adj ? tod_inc - ref : tod_inc + ref;
    407
    408	spin_lock_irqsave(&lan966x->ptp_clock_lock, flags);
    409
    410	lan_rmw(PTP_DOM_CFG_CLKCFG_DIS_SET(1 << BIT(phc->index)),
    411		PTP_DOM_CFG_CLKCFG_DIS,
    412		lan966x, PTP_DOM_CFG);
    413
    414	lan_wr((u32)tod_inc & 0xFFFFFFFF, lan966x,
    415	       PTP_CLK_PER_CFG(phc->index, 0));
    416	lan_wr((u32)(tod_inc >> 32), lan966x,
    417	       PTP_CLK_PER_CFG(phc->index, 1));
    418
    419	lan_rmw(PTP_DOM_CFG_CLKCFG_DIS_SET(0),
    420		PTP_DOM_CFG_CLKCFG_DIS,
    421		lan966x, PTP_DOM_CFG);
    422
    423	spin_unlock_irqrestore(&lan966x->ptp_clock_lock, flags);
    424
    425	return 0;
    426}
    427
    428static int lan966x_ptp_settime64(struct ptp_clock_info *ptp,
    429				 const struct timespec64 *ts)
    430{
    431	struct lan966x_phc *phc = container_of(ptp, struct lan966x_phc, info);
    432	struct lan966x *lan966x = phc->lan966x;
    433	unsigned long flags;
    434
    435	spin_lock_irqsave(&lan966x->ptp_clock_lock, flags);
    436
    437	/* Must be in IDLE mode before the time can be loaded */
    438	lan_rmw(PTP_PIN_CFG_PIN_ACTION_SET(PTP_PIN_ACTION_IDLE) |
    439		PTP_PIN_CFG_PIN_DOM_SET(phc->index) |
    440		PTP_PIN_CFG_PIN_SYNC_SET(0),
    441		PTP_PIN_CFG_PIN_ACTION |
    442		PTP_PIN_CFG_PIN_DOM |
    443		PTP_PIN_CFG_PIN_SYNC,
    444		lan966x, PTP_PIN_CFG(TOD_ACC_PIN));
    445
    446	/* Set new value */
    447	lan_wr(PTP_TOD_SEC_MSB_TOD_SEC_MSB_SET(upper_32_bits(ts->tv_sec)),
    448	       lan966x, PTP_TOD_SEC_MSB(TOD_ACC_PIN));
    449	lan_wr(lower_32_bits(ts->tv_sec),
    450	       lan966x, PTP_TOD_SEC_LSB(TOD_ACC_PIN));
    451	lan_wr(ts->tv_nsec, lan966x, PTP_TOD_NSEC(TOD_ACC_PIN));
    452
    453	/* Apply new values */
    454	lan_rmw(PTP_PIN_CFG_PIN_ACTION_SET(PTP_PIN_ACTION_LOAD) |
    455		PTP_PIN_CFG_PIN_DOM_SET(phc->index) |
    456		PTP_PIN_CFG_PIN_SYNC_SET(0),
    457		PTP_PIN_CFG_PIN_ACTION |
    458		PTP_PIN_CFG_PIN_DOM |
    459		PTP_PIN_CFG_PIN_SYNC,
    460		lan966x, PTP_PIN_CFG(TOD_ACC_PIN));
    461
    462	spin_unlock_irqrestore(&lan966x->ptp_clock_lock, flags);
    463
    464	return 0;
    465}
    466
    467static int lan966x_ptp_gettime64(struct ptp_clock_info *ptp,
    468				 struct timespec64 *ts)
    469{
    470	struct lan966x_phc *phc = container_of(ptp, struct lan966x_phc, info);
    471	struct lan966x *lan966x = phc->lan966x;
    472	unsigned long flags;
    473	time64_t s;
    474	s64 ns;
    475
    476	spin_lock_irqsave(&lan966x->ptp_clock_lock, flags);
    477
    478	lan_rmw(PTP_PIN_CFG_PIN_ACTION_SET(PTP_PIN_ACTION_SAVE) |
    479		PTP_PIN_CFG_PIN_DOM_SET(phc->index) |
    480		PTP_PIN_CFG_PIN_SYNC_SET(0),
    481		PTP_PIN_CFG_PIN_ACTION |
    482		PTP_PIN_CFG_PIN_DOM |
    483		PTP_PIN_CFG_PIN_SYNC,
    484		lan966x, PTP_PIN_CFG(TOD_ACC_PIN));
    485
    486	s = lan_rd(lan966x, PTP_TOD_SEC_MSB(TOD_ACC_PIN));
    487	s <<= 32;
    488	s |= lan_rd(lan966x, PTP_TOD_SEC_LSB(TOD_ACC_PIN));
    489	ns = lan_rd(lan966x, PTP_TOD_NSEC(TOD_ACC_PIN));
    490	ns &= PTP_TOD_NSEC_TOD_NSEC;
    491
    492	spin_unlock_irqrestore(&lan966x->ptp_clock_lock, flags);
    493
    494	/* Deal with negative values */
    495	if ((ns & 0xFFFFFFF0) == 0x3FFFFFF0) {
    496		s--;
    497		ns &= 0xf;
    498		ns += 999999984;
    499	}
    500
    501	set_normalized_timespec64(ts, s, ns);
    502	return 0;
    503}
    504
    505static int lan966x_ptp_adjtime(struct ptp_clock_info *ptp, s64 delta)
    506{
    507	struct lan966x_phc *phc = container_of(ptp, struct lan966x_phc, info);
    508	struct lan966x *lan966x = phc->lan966x;
    509
    510	if (delta > -(NSEC_PER_SEC / 2) && delta < (NSEC_PER_SEC / 2)) {
    511		unsigned long flags;
    512
    513		spin_lock_irqsave(&lan966x->ptp_clock_lock, flags);
    514
    515		/* Must be in IDLE mode before the time can be loaded */
    516		lan_rmw(PTP_PIN_CFG_PIN_ACTION_SET(PTP_PIN_ACTION_IDLE) |
    517			PTP_PIN_CFG_PIN_DOM_SET(phc->index) |
    518			PTP_PIN_CFG_PIN_SYNC_SET(0),
    519			PTP_PIN_CFG_PIN_ACTION |
    520			PTP_PIN_CFG_PIN_DOM |
    521			PTP_PIN_CFG_PIN_SYNC,
    522			lan966x, PTP_PIN_CFG(TOD_ACC_PIN));
    523
    524		lan_wr(PTP_TOD_NSEC_TOD_NSEC_SET(delta),
    525		       lan966x, PTP_TOD_NSEC(TOD_ACC_PIN));
    526
    527		/* Adjust time with the value of PTP_TOD_NSEC */
    528		lan_rmw(PTP_PIN_CFG_PIN_ACTION_SET(PTP_PIN_ACTION_DELTA) |
    529			PTP_PIN_CFG_PIN_DOM_SET(phc->index) |
    530			PTP_PIN_CFG_PIN_SYNC_SET(0),
    531			PTP_PIN_CFG_PIN_ACTION |
    532			PTP_PIN_CFG_PIN_DOM |
    533			PTP_PIN_CFG_PIN_SYNC,
    534			lan966x, PTP_PIN_CFG(TOD_ACC_PIN));
    535
    536		spin_unlock_irqrestore(&lan966x->ptp_clock_lock, flags);
    537	} else {
    538		/* Fall back using lan966x_ptp_settime64 which is not exact */
    539		struct timespec64 ts;
    540		u64 now;
    541
    542		lan966x_ptp_gettime64(ptp, &ts);
    543
    544		now = ktime_to_ns(timespec64_to_ktime(ts));
    545		ts = ns_to_timespec64(now + delta);
    546
    547		lan966x_ptp_settime64(ptp, &ts);
    548	}
    549
    550	return 0;
    551}
    552
    553static int lan966x_ptp_verify(struct ptp_clock_info *ptp, unsigned int pin,
    554			      enum ptp_pin_function func, unsigned int chan)
    555{
    556	struct lan966x_phc *phc = container_of(ptp, struct lan966x_phc, info);
    557	struct lan966x *lan966x = phc->lan966x;
    558	struct ptp_clock_info *info;
    559	int i;
    560
    561	/* Currently support only 1 channel */
    562	if (chan != 0)
    563		return -1;
    564
    565	switch (func) {
    566	case PTP_PF_NONE:
    567	case PTP_PF_PEROUT:
    568	case PTP_PF_EXTTS:
    569		break;
    570	default:
    571		return -1;
    572	}
    573
    574	/* The PTP pins are shared by all the PHC. So it is required to see if
    575	 * the pin is connected to another PHC. The pin is connected to another
    576	 * PHC if that pin already has a function on that PHC.
    577	 */
    578	for (i = 0; i < LAN966X_PHC_COUNT; ++i) {
    579		info = &lan966x->phc[i].info;
    580
    581		/* Ignore the check with ourself */
    582		if (ptp == info)
    583			continue;
    584
    585		if (info->pin_config[pin].func == PTP_PF_PEROUT ||
    586		    info->pin_config[pin].func == PTP_PF_EXTTS)
    587			return -1;
    588	}
    589
    590	return 0;
    591}
    592
    593static int lan966x_ptp_perout(struct ptp_clock_info *ptp,
    594			      struct ptp_clock_request *rq, int on)
    595{
    596	struct lan966x_phc *phc = container_of(ptp, struct lan966x_phc, info);
    597	struct lan966x *lan966x = phc->lan966x;
    598	struct timespec64 ts_phase, ts_period;
    599	unsigned long flags;
    600	s64 wf_high, wf_low;
    601	bool pps = false;
    602	int pin;
    603
    604	if (rq->perout.flags & ~(PTP_PEROUT_DUTY_CYCLE |
    605				 PTP_PEROUT_PHASE))
    606		return -EOPNOTSUPP;
    607
    608	pin = ptp_find_pin(phc->clock, PTP_PF_PEROUT, rq->perout.index);
    609	if (pin == -1 || pin >= LAN966X_PHC_PINS_NUM)
    610		return -EINVAL;
    611
    612	if (!on) {
    613		spin_lock_irqsave(&lan966x->ptp_clock_lock, flags);
    614		lan_rmw(PTP_PIN_CFG_PIN_ACTION_SET(PTP_PIN_ACTION_IDLE) |
    615			PTP_PIN_CFG_PIN_DOM_SET(phc->index) |
    616			PTP_PIN_CFG_PIN_SYNC_SET(0),
    617			PTP_PIN_CFG_PIN_ACTION |
    618			PTP_PIN_CFG_PIN_DOM |
    619			PTP_PIN_CFG_PIN_SYNC,
    620			lan966x, PTP_PIN_CFG(pin));
    621		spin_unlock_irqrestore(&lan966x->ptp_clock_lock, flags);
    622		return 0;
    623	}
    624
    625	if (rq->perout.period.sec == 1 &&
    626	    rq->perout.period.nsec == 0)
    627		pps = true;
    628
    629	if (rq->perout.flags & PTP_PEROUT_PHASE) {
    630		ts_phase.tv_sec = rq->perout.phase.sec;
    631		ts_phase.tv_nsec = rq->perout.phase.nsec;
    632	} else {
    633		ts_phase.tv_sec = rq->perout.start.sec;
    634		ts_phase.tv_nsec = rq->perout.start.nsec;
    635	}
    636
    637	if (ts_phase.tv_sec || (ts_phase.tv_nsec && !pps)) {
    638		dev_warn(lan966x->dev,
    639			 "Absolute time not supported!\n");
    640		return -EINVAL;
    641	}
    642
    643	if (rq->perout.flags & PTP_PEROUT_DUTY_CYCLE) {
    644		struct timespec64 ts_on;
    645
    646		ts_on.tv_sec = rq->perout.on.sec;
    647		ts_on.tv_nsec = rq->perout.on.nsec;
    648
    649		wf_high = timespec64_to_ns(&ts_on);
    650	} else {
    651		wf_high = 5000;
    652	}
    653
    654	if (pps) {
    655		spin_lock_irqsave(&lan966x->ptp_clock_lock, flags);
    656		lan_wr(PTP_WF_LOW_PERIOD_PIN_WFL(ts_phase.tv_nsec),
    657		       lan966x, PTP_WF_LOW_PERIOD(pin));
    658		lan_wr(PTP_WF_HIGH_PERIOD_PIN_WFH(wf_high),
    659		       lan966x, PTP_WF_HIGH_PERIOD(pin));
    660		lan_rmw(PTP_PIN_CFG_PIN_ACTION_SET(PTP_PIN_ACTION_CLOCK) |
    661			PTP_PIN_CFG_PIN_DOM_SET(phc->index) |
    662			PTP_PIN_CFG_PIN_SYNC_SET(3),
    663			PTP_PIN_CFG_PIN_ACTION |
    664			PTP_PIN_CFG_PIN_DOM |
    665			PTP_PIN_CFG_PIN_SYNC,
    666			lan966x, PTP_PIN_CFG(pin));
    667		spin_unlock_irqrestore(&lan966x->ptp_clock_lock, flags);
    668		return 0;
    669	}
    670
    671	ts_period.tv_sec = rq->perout.period.sec;
    672	ts_period.tv_nsec = rq->perout.period.nsec;
    673
    674	wf_low = timespec64_to_ns(&ts_period);
    675	wf_low -= wf_high;
    676
    677	spin_lock_irqsave(&lan966x->ptp_clock_lock, flags);
    678	lan_wr(PTP_WF_LOW_PERIOD_PIN_WFL(wf_low),
    679	       lan966x, PTP_WF_LOW_PERIOD(pin));
    680	lan_wr(PTP_WF_HIGH_PERIOD_PIN_WFH(wf_high),
    681	       lan966x, PTP_WF_HIGH_PERIOD(pin));
    682	lan_rmw(PTP_PIN_CFG_PIN_ACTION_SET(PTP_PIN_ACTION_CLOCK) |
    683		PTP_PIN_CFG_PIN_DOM_SET(phc->index) |
    684		PTP_PIN_CFG_PIN_SYNC_SET(0),
    685		PTP_PIN_CFG_PIN_ACTION |
    686		PTP_PIN_CFG_PIN_DOM |
    687		PTP_PIN_CFG_PIN_SYNC,
    688		lan966x, PTP_PIN_CFG(pin));
    689	spin_unlock_irqrestore(&lan966x->ptp_clock_lock, flags);
    690
    691	return 0;
    692}
    693
    694static int lan966x_ptp_extts(struct ptp_clock_info *ptp,
    695			     struct ptp_clock_request *rq, int on)
    696{
    697	struct lan966x_phc *phc = container_of(ptp, struct lan966x_phc, info);
    698	struct lan966x *lan966x = phc->lan966x;
    699	unsigned long flags;
    700	int pin;
    701	u32 val;
    702
    703	if (lan966x->ptp_ext_irq <= 0)
    704		return -EOPNOTSUPP;
    705
    706	/* Reject requests with unsupported flags */
    707	if (rq->extts.flags & ~(PTP_ENABLE_FEATURE |
    708				PTP_RISING_EDGE |
    709				PTP_STRICT_FLAGS))
    710		return -EOPNOTSUPP;
    711
    712	pin = ptp_find_pin(phc->clock, PTP_PF_EXTTS, rq->extts.index);
    713	if (pin == -1 || pin >= LAN966X_PHC_PINS_NUM)
    714		return -EINVAL;
    715
    716	spin_lock_irqsave(&lan966x->ptp_clock_lock, flags);
    717	lan_rmw(PTP_PIN_CFG_PIN_ACTION_SET(PTP_PIN_ACTION_SAVE) |
    718		PTP_PIN_CFG_PIN_SYNC_SET(on ? 3 : 0) |
    719		PTP_PIN_CFG_PIN_DOM_SET(phc->index) |
    720		PTP_PIN_CFG_PIN_SELECT_SET(pin),
    721		PTP_PIN_CFG_PIN_ACTION |
    722		PTP_PIN_CFG_PIN_SYNC |
    723		PTP_PIN_CFG_PIN_DOM |
    724		PTP_PIN_CFG_PIN_SELECT,
    725		lan966x, PTP_PIN_CFG(pin));
    726
    727	val = lan_rd(lan966x, PTP_PIN_INTR_ENA);
    728	if (on)
    729		val |= BIT(pin);
    730	else
    731		val &= ~BIT(pin);
    732	lan_wr(val, lan966x, PTP_PIN_INTR_ENA);
    733
    734	spin_unlock_irqrestore(&lan966x->ptp_clock_lock, flags);
    735
    736	return 0;
    737}
    738
    739static int lan966x_ptp_enable(struct ptp_clock_info *ptp,
    740			      struct ptp_clock_request *rq, int on)
    741{
    742	switch (rq->type) {
    743	case PTP_CLK_REQ_PEROUT:
    744		return lan966x_ptp_perout(ptp, rq, on);
    745	case PTP_CLK_REQ_EXTTS:
    746		return lan966x_ptp_extts(ptp, rq, on);
    747	default:
    748		return -EOPNOTSUPP;
    749	}
    750
    751	return 0;
    752}
    753
    754static struct ptp_clock_info lan966x_ptp_clock_info = {
    755	.owner		= THIS_MODULE,
    756	.name		= "lan966x ptp",
    757	.max_adj	= 200000,
    758	.gettime64	= lan966x_ptp_gettime64,
    759	.settime64	= lan966x_ptp_settime64,
    760	.adjtime	= lan966x_ptp_adjtime,
    761	.adjfine	= lan966x_ptp_adjfine,
    762	.verify		= lan966x_ptp_verify,
    763	.enable		= lan966x_ptp_enable,
    764	.n_per_out	= LAN966X_PHC_PINS_NUM,
    765	.n_ext_ts	= LAN966X_PHC_PINS_NUM,
    766	.n_pins		= LAN966X_PHC_PINS_NUM,
    767};
    768
    769static int lan966x_ptp_phc_init(struct lan966x *lan966x,
    770				int index,
    771				struct ptp_clock_info *clock_info)
    772{
    773	struct lan966x_phc *phc = &lan966x->phc[index];
    774	struct ptp_pin_desc *p;
    775	int i;
    776
    777	for (i = 0; i < LAN966X_PHC_PINS_NUM; i++) {
    778		p = &phc->pins[i];
    779
    780		snprintf(p->name, sizeof(p->name), "pin%d", i);
    781		p->index = i;
    782		p->func = PTP_PF_NONE;
    783	}
    784
    785	phc->info = *clock_info;
    786	phc->info.pin_config = &phc->pins[0];
    787	phc->clock = ptp_clock_register(&phc->info, lan966x->dev);
    788	if (IS_ERR(phc->clock))
    789		return PTR_ERR(phc->clock);
    790
    791	phc->index = index;
    792	phc->lan966x = lan966x;
    793
    794	/* PTP Rx stamping is always enabled.  */
    795	phc->hwtstamp_config.rx_filter = HWTSTAMP_FILTER_PTP_V2_EVENT;
    796
    797	return 0;
    798}
    799
    800int lan966x_ptp_init(struct lan966x *lan966x)
    801{
    802	u64 tod_adj = lan966x_ptp_get_nominal_value();
    803	struct lan966x_port *port;
    804	int err, i;
    805
    806	if (!lan966x->ptp)
    807		return 0;
    808
    809	for (i = 0; i < LAN966X_PHC_COUNT; ++i) {
    810		err = lan966x_ptp_phc_init(lan966x, i, &lan966x_ptp_clock_info);
    811		if (err)
    812			return err;
    813	}
    814
    815	spin_lock_init(&lan966x->ptp_clock_lock);
    816	spin_lock_init(&lan966x->ptp_ts_id_lock);
    817	mutex_init(&lan966x->ptp_lock);
    818
    819	/* Disable master counters */
    820	lan_wr(PTP_DOM_CFG_ENA_SET(0), lan966x, PTP_DOM_CFG);
    821
    822	/* Configure the nominal TOD increment per clock cycle */
    823	lan_rmw(PTP_DOM_CFG_CLKCFG_DIS_SET(0x7),
    824		PTP_DOM_CFG_CLKCFG_DIS,
    825		lan966x, PTP_DOM_CFG);
    826
    827	for (i = 0; i < LAN966X_PHC_COUNT; ++i) {
    828		lan_wr((u32)tod_adj & 0xFFFFFFFF, lan966x,
    829		       PTP_CLK_PER_CFG(i, 0));
    830		lan_wr((u32)(tod_adj >> 32), lan966x,
    831		       PTP_CLK_PER_CFG(i, 1));
    832	}
    833
    834	lan_rmw(PTP_DOM_CFG_CLKCFG_DIS_SET(0),
    835		PTP_DOM_CFG_CLKCFG_DIS,
    836		lan966x, PTP_DOM_CFG);
    837
    838	/* Enable master counters */
    839	lan_wr(PTP_DOM_CFG_ENA_SET(0x7), lan966x, PTP_DOM_CFG);
    840
    841	for (i = 0; i < lan966x->num_phys_ports; i++) {
    842		port = lan966x->ports[i];
    843		if (!port)
    844			continue;
    845
    846		skb_queue_head_init(&port->tx_skbs);
    847	}
    848
    849	return 0;
    850}
    851
    852void lan966x_ptp_deinit(struct lan966x *lan966x)
    853{
    854	struct lan966x_port *port;
    855	int i;
    856
    857	for (i = 0; i < lan966x->num_phys_ports; i++) {
    858		port = lan966x->ports[i];
    859		if (!port)
    860			continue;
    861
    862		skb_queue_purge(&port->tx_skbs);
    863	}
    864
    865	for (i = 0; i < LAN966X_PHC_COUNT; ++i)
    866		ptp_clock_unregister(lan966x->phc[i].clock);
    867}
    868
    869void lan966x_ptp_rxtstamp(struct lan966x *lan966x, struct sk_buff *skb,
    870			  u64 timestamp)
    871{
    872	struct skb_shared_hwtstamps *shhwtstamps;
    873	struct lan966x_phc *phc;
    874	struct timespec64 ts;
    875	u64 full_ts_in_ns;
    876
    877	if (!lan966x->ptp)
    878		return;
    879
    880	phc = &lan966x->phc[LAN966X_PHC_PORT];
    881	lan966x_ptp_gettime64(&phc->info, &ts);
    882
    883	/* Drop the sub-ns precision */
    884	timestamp = timestamp >> 2;
    885	if (ts.tv_nsec < timestamp)
    886		ts.tv_sec--;
    887	ts.tv_nsec = timestamp;
    888	full_ts_in_ns = ktime_set(ts.tv_sec, ts.tv_nsec);
    889
    890	shhwtstamps = skb_hwtstamps(skb);
    891	shhwtstamps->hwtstamp = full_ts_in_ns;
    892}