Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1// SPDX-License-Identifier: (GPL-2.0 OR MIT)
2/*
3 * Driver for Microsemi VSC85xx PHYs - timestamping and PHC support
4 *
5 * Authors: Quentin Schulz & Antoine Tenart
6 * License: Dual MIT/GPL
7 * Copyright (c) 2020 Microsemi Corporation
8 */
9
10#include <linux/gpio/consumer.h>
11#include <linux/ip.h>
12#include <linux/net_tstamp.h>
13#include <linux/mii.h>
14#include <linux/phy.h>
15#include <linux/ptp_classify.h>
16#include <linux/ptp_clock_kernel.h>
17#include <linux/udp.h>
18#include <linux/unaligned.h>
19
20#include "../phylib.h"
21#include "mscc.h"
22#include "mscc_ptp.h"
23
24/* Two PHYs share the same 1588 processor and it's to be entirely configured
25 * through the base PHY of this processor.
26 */
27/* phydev->bus->mdio_lock should be locked when using this function */
28static int phy_ts_base_write(struct phy_device *phydev, u32 regnum, u16 val)
29{
30 struct vsc8531_private *priv = phydev->priv;
31
32 WARN_ON_ONCE(!mutex_is_locked(&phydev->mdio.bus->mdio_lock));
33 return __mdiobus_write(phydev->mdio.bus, priv->ts_base_addr, regnum,
34 val);
35}
36
37/* phydev->bus->mdio_lock should be locked when using this function */
38static int phy_ts_base_read(struct phy_device *phydev, u32 regnum)
39{
40 struct vsc8531_private *priv = phydev->priv;
41
42 WARN_ON_ONCE(!mutex_is_locked(&phydev->mdio.bus->mdio_lock));
43 return __mdiobus_read(phydev->mdio.bus, priv->ts_base_addr, regnum);
44}
45
46enum ts_blk_hw {
47 INGRESS_ENGINE_0,
48 EGRESS_ENGINE_0,
49 INGRESS_ENGINE_1,
50 EGRESS_ENGINE_1,
51 INGRESS_ENGINE_2,
52 EGRESS_ENGINE_2,
53 PROCESSOR_0,
54 PROCESSOR_1,
55};
56
57enum ts_blk {
58 INGRESS,
59 EGRESS,
60 PROCESSOR,
61};
62
63static u32 vsc85xx_ts_read_csr(struct phy_device *phydev, enum ts_blk blk,
64 u16 addr)
65{
66 struct vsc8531_private *priv = phydev->priv;
67 bool base_port = phydev->mdio.addr == priv->ts_base_addr;
68 u32 val, cnt = 0;
69 enum ts_blk_hw blk_hw;
70
71 switch (blk) {
72 case INGRESS:
73 blk_hw = base_port ? INGRESS_ENGINE_0 : INGRESS_ENGINE_1;
74 break;
75 case EGRESS:
76 blk_hw = base_port ? EGRESS_ENGINE_0 : EGRESS_ENGINE_1;
77 break;
78 case PROCESSOR:
79 default:
80 blk_hw = base_port ? PROCESSOR_0 : PROCESSOR_1;
81 break;
82 }
83
84 phy_lock_mdio_bus(phydev);
85
86 phy_ts_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_1588);
87
88 phy_ts_base_write(phydev, MSCC_PHY_TS_BIU_ADDR_CNTL, BIU_ADDR_EXE |
89 BIU_ADDR_READ | BIU_BLK_ID(blk_hw) |
90 BIU_CSR_ADDR(addr));
91
92 do {
93 val = phy_ts_base_read(phydev, MSCC_PHY_TS_BIU_ADDR_CNTL);
94 } while (!(val & BIU_ADDR_EXE) && cnt++ < BIU_ADDR_CNT_MAX);
95
96 val = phy_ts_base_read(phydev, MSCC_PHY_TS_CSR_DATA_MSB);
97 val <<= 16;
98 val |= phy_ts_base_read(phydev, MSCC_PHY_TS_CSR_DATA_LSB);
99
100 phy_ts_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_STANDARD);
101
102 phy_unlock_mdio_bus(phydev);
103
104 return val;
105}
106
107static void vsc85xx_ts_write_csr(struct phy_device *phydev, enum ts_blk blk,
108 u16 addr, u32 val)
109{
110 struct vsc8531_private *priv = phydev->priv;
111 bool base_port = phydev->mdio.addr == priv->ts_base_addr;
112 u32 reg, bypass, cnt = 0, lower = val & 0xffff, upper = val >> 16;
113 bool cond = (addr == MSCC_PHY_PTP_LTC_CTRL ||
114 addr == MSCC_PHY_1588_INGR_VSC85XX_INT_MASK ||
115 addr == MSCC_PHY_1588_VSC85XX_INT_MASK ||
116 addr == MSCC_PHY_1588_INGR_VSC85XX_INT_STATUS ||
117 addr == MSCC_PHY_1588_VSC85XX_INT_STATUS) &&
118 blk == PROCESSOR;
119 enum ts_blk_hw blk_hw;
120
121 switch (blk) {
122 case INGRESS:
123 blk_hw = base_port ? INGRESS_ENGINE_0 : INGRESS_ENGINE_1;
124 break;
125 case EGRESS:
126 blk_hw = base_port ? EGRESS_ENGINE_0 : EGRESS_ENGINE_1;
127 break;
128 case PROCESSOR:
129 default:
130 blk_hw = base_port ? PROCESSOR_0 : PROCESSOR_1;
131 break;
132 }
133
134 phy_lock_mdio_bus(phydev);
135
136 bypass = phy_ts_base_read(phydev, MSCC_PHY_BYPASS_CONTROL);
137
138 phy_ts_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_1588);
139
140 if (!cond || upper)
141 phy_ts_base_write(phydev, MSCC_PHY_TS_CSR_DATA_MSB, upper);
142
143 phy_ts_base_write(phydev, MSCC_PHY_TS_CSR_DATA_LSB, lower);
144
145 phy_ts_base_write(phydev, MSCC_PHY_TS_BIU_ADDR_CNTL, BIU_ADDR_EXE |
146 BIU_ADDR_WRITE | BIU_BLK_ID(blk_hw) |
147 BIU_CSR_ADDR(addr));
148
149 do {
150 reg = phy_ts_base_read(phydev, MSCC_PHY_TS_BIU_ADDR_CNTL);
151 } while (!(reg & BIU_ADDR_EXE) && cnt++ < BIU_ADDR_CNT_MAX);
152
153 phy_ts_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_STANDARD);
154
155 if (cond && upper)
156 phy_ts_base_write(phydev, MSCC_PHY_BYPASS_CONTROL, bypass);
157
158 phy_unlock_mdio_bus(phydev);
159}
160
161/* Pick bytes from PTP header */
162#define PTP_HEADER_TRNSP_MSG 26
163#define PTP_HEADER_DOMAIN_NUM 25
164#define PTP_HEADER_BYTE_8_31(x) (31 - (x))
165#define MAC_ADDRESS_BYTE(x) ((x) + (35 - ETH_ALEN + 1))
166
167static int vsc85xx_ts_fsb_init(struct phy_device *phydev)
168{
169 u8 sig_sel[16] = {};
170 signed char i, pos = 0;
171
172 /* Seq ID is 2B long and starts at 30th byte */
173 for (i = 1; i >= 0; i--)
174 sig_sel[pos++] = PTP_HEADER_BYTE_8_31(30 + i);
175
176 /* DomainNum */
177 sig_sel[pos++] = PTP_HEADER_DOMAIN_NUM;
178
179 /* MsgType */
180 sig_sel[pos++] = PTP_HEADER_TRNSP_MSG;
181
182 /* MAC address is 6B long */
183 for (i = ETH_ALEN - 1; i >= 0; i--)
184 sig_sel[pos++] = MAC_ADDRESS_BYTE(i);
185
186 /* Fill the last bytes of the signature to reach a 16B signature */
187 for (; pos < ARRAY_SIZE(sig_sel); pos++)
188 sig_sel[pos] = PTP_HEADER_TRNSP_MSG;
189
190 for (i = 0; i <= 2; i++) {
191 u32 val = 0;
192
193 for (pos = i * 5 + 4; pos >= i * 5; pos--)
194 val = (val << 6) | sig_sel[pos];
195
196 vsc85xx_ts_write_csr(phydev, EGRESS, MSCC_PHY_ANA_FSB_REG(i),
197 val);
198 }
199
200 vsc85xx_ts_write_csr(phydev, EGRESS, MSCC_PHY_ANA_FSB_REG(3),
201 sig_sel[15]);
202
203 return 0;
204}
205
206static const u32 vsc85xx_egr_latency[] = {
207 /* Copper Egress */
208 1272, /* 1000Mbps */
209 12516, /* 100Mbps */
210 125444, /* 10Mbps */
211 /* Fiber Egress */
212 1277, /* 1000Mbps */
213 12537, /* 100Mbps */
214};
215
216static const u32 vsc85xx_egr_latency_macsec[] = {
217 /* Copper Egress ON */
218 3496, /* 1000Mbps */
219 34760, /* 100Mbps */
220 347844, /* 10Mbps */
221 /* Fiber Egress ON */
222 3502, /* 1000Mbps */
223 34780, /* 100Mbps */
224};
225
226static const u32 vsc85xx_ingr_latency[] = {
227 /* Copper Ingress */
228 208, /* 1000Mbps */
229 304, /* 100Mbps */
230 2023, /* 10Mbps */
231 /* Fiber Ingress */
232 98, /* 1000Mbps */
233 197, /* 100Mbps */
234};
235
236static const u32 vsc85xx_ingr_latency_macsec[] = {
237 /* Copper Ingress */
238 2408, /* 1000Mbps */
239 22300, /* 100Mbps */
240 222009, /* 10Mbps */
241 /* Fiber Ingress */
242 2299, /* 1000Mbps */
243 22192, /* 100Mbps */
244};
245
246static void vsc85xx_ts_set_latencies(struct phy_device *phydev)
247{
248 u32 val, ingr_latency, egr_latency;
249 u8 idx;
250
251 /* No need to set latencies of packets if the PHY is not connected */
252 if (!phydev->link)
253 return;
254
255 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_EGR_STALL_LATENCY,
256 STALL_EGR_LATENCY(phydev->speed));
257
258 switch (phydev->speed) {
259 case SPEED_100:
260 idx = 1;
261 break;
262 case SPEED_1000:
263 idx = 0;
264 break;
265 default:
266 idx = 2;
267 break;
268 }
269
270 ingr_latency = IS_ENABLED(CONFIG_MACSEC) ?
271 vsc85xx_ingr_latency_macsec[idx] : vsc85xx_ingr_latency[idx];
272 egr_latency = IS_ENABLED(CONFIG_MACSEC) ?
273 vsc85xx_egr_latency_macsec[idx] : vsc85xx_egr_latency[idx];
274
275 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_INGR_LOCAL_LATENCY,
276 PTP_INGR_LOCAL_LATENCY(ingr_latency));
277
278 val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
279 MSCC_PHY_PTP_INGR_TSP_CTRL);
280 val |= PHY_PTP_INGR_TSP_CTRL_LOAD_DELAYS;
281 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_INGR_TSP_CTRL,
282 val);
283
284 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_EGR_LOCAL_LATENCY,
285 PTP_EGR_LOCAL_LATENCY(egr_latency));
286
287 val = vsc85xx_ts_read_csr(phydev, PROCESSOR, MSCC_PHY_PTP_EGR_TSP_CTRL);
288 val |= PHY_PTP_EGR_TSP_CTRL_LOAD_DELAYS;
289 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_EGR_TSP_CTRL, val);
290}
291
292static int vsc85xx_ts_disable_flows(struct phy_device *phydev, enum ts_blk blk)
293{
294 u8 i;
295
296 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_NXT_PROT_NXT_COMP, 0);
297 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_NXT_PROT_UDP_CHKSUM,
298 IP1_NXT_PROT_UDP_CHKSUM_WIDTH(2));
299 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP2_NXT_PROT_NXT_COMP, 0);
300 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP2_NXT_PROT_UDP_CHKSUM,
301 IP2_NXT_PROT_UDP_CHKSUM_WIDTH(2));
302 vsc85xx_ts_write_csr(phydev, blk, MSCC_PHY_ANA_MPLS_COMP_NXT_COMP, 0);
303 vsc85xx_ts_write_csr(phydev, blk, MSCC_PHY_ANA_ETH1_NTX_PROT, 0);
304 vsc85xx_ts_write_csr(phydev, blk, MSCC_PHY_ANA_ETH2_NTX_PROT, 0);
305
306 for (i = 0; i < COMP_MAX_FLOWS; i++) {
307 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_FLOW_ENA(i),
308 IP1_FLOW_VALID_CH0 | IP1_FLOW_VALID_CH1);
309 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP2_FLOW_ENA(i),
310 IP2_FLOW_VALID_CH0 | IP2_FLOW_VALID_CH1);
311 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_ETH1_FLOW_ENA(i),
312 ETH1_FLOW_VALID_CH0 | ETH1_FLOW_VALID_CH1);
313 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_ETH2_FLOW_ENA(i),
314 ETH2_FLOW_VALID_CH0 | ETH2_FLOW_VALID_CH1);
315 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_MPLS_FLOW_CTRL(i),
316 MPLS_FLOW_VALID_CH0 | MPLS_FLOW_VALID_CH1);
317
318 if (i >= PTP_COMP_MAX_FLOWS)
319 continue;
320
321 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_PTP_FLOW_ENA(i), 0);
322 vsc85xx_ts_write_csr(phydev, blk,
323 MSCC_ANA_PTP_FLOW_DOMAIN_RANGE(i), 0);
324 vsc85xx_ts_write_csr(phydev, blk,
325 MSCC_ANA_PTP_FLOW_MASK_UPPER(i), 0);
326 vsc85xx_ts_write_csr(phydev, blk,
327 MSCC_ANA_PTP_FLOW_MASK_LOWER(i), 0);
328 vsc85xx_ts_write_csr(phydev, blk,
329 MSCC_ANA_PTP_FLOW_MATCH_UPPER(i), 0);
330 vsc85xx_ts_write_csr(phydev, blk,
331 MSCC_ANA_PTP_FLOW_MATCH_LOWER(i), 0);
332 vsc85xx_ts_write_csr(phydev, blk,
333 MSCC_ANA_PTP_FLOW_PTP_ACTION(i), 0);
334 vsc85xx_ts_write_csr(phydev, blk,
335 MSCC_ANA_PTP_FLOW_PTP_ACTION2(i), 0);
336 vsc85xx_ts_write_csr(phydev, blk,
337 MSCC_ANA_PTP_FLOW_PTP_0_FIELD(i), 0);
338 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_OAM_PTP_FLOW_ENA(i),
339 0);
340 }
341
342 return 0;
343}
344
345static int vsc85xx_ts_eth_cmp1_sig(struct phy_device *phydev)
346{
347 u32 val;
348
349 val = vsc85xx_ts_read_csr(phydev, EGRESS, MSCC_PHY_ANA_ETH1_NTX_PROT);
350 val &= ~ANA_ETH1_NTX_PROT_SIG_OFF_MASK;
351 val |= ANA_ETH1_NTX_PROT_SIG_OFF(0);
352 vsc85xx_ts_write_csr(phydev, EGRESS, MSCC_PHY_ANA_ETH1_NTX_PROT, val);
353
354 val = vsc85xx_ts_read_csr(phydev, EGRESS, MSCC_PHY_ANA_FSB_CFG);
355 val &= ~ANA_FSB_ADDR_FROM_BLOCK_SEL_MASK;
356 val |= ANA_FSB_ADDR_FROM_ETH1;
357 vsc85xx_ts_write_csr(phydev, EGRESS, MSCC_PHY_ANA_FSB_CFG, val);
358
359 return 0;
360}
361
362static struct vsc85xx_ptphdr *get_ptp_header_l4(struct sk_buff *skb,
363 struct iphdr *iphdr,
364 struct udphdr *udphdr)
365{
366 if (iphdr->version != 4 || iphdr->protocol != IPPROTO_UDP)
367 return NULL;
368
369 return (struct vsc85xx_ptphdr *)(((unsigned char *)udphdr) + UDP_HLEN);
370}
371
372static struct vsc85xx_ptphdr *get_ptp_header_tx(struct sk_buff *skb)
373{
374 struct ethhdr *ethhdr = eth_hdr(skb);
375 struct udphdr *udphdr;
376 struct iphdr *iphdr;
377
378 if (ethhdr->h_proto == htons(ETH_P_1588))
379 return (struct vsc85xx_ptphdr *)(((unsigned char *)ethhdr) +
380 skb_mac_header_len(skb));
381
382 if (ethhdr->h_proto != htons(ETH_P_IP))
383 return NULL;
384
385 iphdr = ip_hdr(skb);
386 udphdr = udp_hdr(skb);
387
388 return get_ptp_header_l4(skb, iphdr, udphdr);
389}
390
391static struct vsc85xx_ptphdr *get_ptp_header_rx(struct sk_buff *skb,
392 enum hwtstamp_rx_filters rx_filter)
393{
394 struct udphdr *udphdr;
395 struct iphdr *iphdr;
396
397 if (rx_filter == HWTSTAMP_FILTER_PTP_V2_L2_EVENT)
398 return (struct vsc85xx_ptphdr *)skb->data;
399
400 iphdr = (struct iphdr *)skb->data;
401 udphdr = (struct udphdr *)(skb->data + iphdr->ihl * 4);
402
403 return get_ptp_header_l4(skb, iphdr, udphdr);
404}
405
406static int get_sig(struct sk_buff *skb, u8 *sig)
407{
408 struct vsc85xx_ptphdr *ptphdr = get_ptp_header_tx(skb);
409 struct ethhdr *ethhdr = eth_hdr(skb);
410 unsigned int i;
411
412 if (!ptphdr)
413 return -EOPNOTSUPP;
414
415 sig[0] = (__force u16)ptphdr->seq_id >> 8;
416 sig[1] = (__force u16)ptphdr->seq_id & GENMASK(7, 0);
417 sig[2] = ptphdr->domain;
418 sig[3] = ptphdr->tsmt & GENMASK(3, 0);
419
420 memcpy(&sig[4], ethhdr->h_dest, ETH_ALEN);
421
422 /* Fill the last bytes of the signature to reach a 16B signature */
423 for (i = 10; i < 16; i++)
424 sig[i] = ptphdr->tsmt & GENMASK(3, 0);
425
426 return 0;
427}
428
429static void vsc85xx_dequeue_skb(struct vsc85xx_ptp *ptp)
430{
431 struct skb_shared_hwtstamps shhwtstamps;
432 struct vsc85xx_ts_fifo fifo;
433 struct sk_buff *skb;
434 u8 skb_sig[16], *p;
435 int i, len;
436 u32 reg;
437
438 memset(&fifo, 0, sizeof(fifo));
439 p = (u8 *)&fifo;
440
441 reg = vsc85xx_ts_read_csr(ptp->phydev, PROCESSOR,
442 MSCC_PHY_PTP_EGR_TS_FIFO(0));
443 if (reg & PTP_EGR_TS_FIFO_EMPTY)
444 return;
445
446 *p++ = reg & 0xff;
447 *p++ = (reg >> 8) & 0xff;
448
449 /* Read the current FIFO item. Reading FIFO6 pops the next one. */
450 for (i = 1; i < 7; i++) {
451 reg = vsc85xx_ts_read_csr(ptp->phydev, PROCESSOR,
452 MSCC_PHY_PTP_EGR_TS_FIFO(i));
453 *p++ = reg & 0xff;
454 *p++ = (reg >> 8) & 0xff;
455 *p++ = (reg >> 16) & 0xff;
456 *p++ = (reg >> 24) & 0xff;
457 }
458
459 len = skb_queue_len_lockless(&ptp->tx_queue);
460 if (len < 1)
461 return;
462
463 while (len--) {
464 skb = skb_dequeue(&ptp->tx_queue);
465 if (!skb)
466 return;
467
468 /* Can't get the signature of the packet, won't ever
469 * be able to have one so let's dequeue the packet.
470 */
471 if (get_sig(skb, skb_sig) < 0) {
472 kfree_skb(skb);
473 continue;
474 }
475
476 /* Check if we found the signature we were looking for. */
477 if (!memcmp(skb_sig, fifo.sig, sizeof(fifo.sig))) {
478 memset(&shhwtstamps, 0, sizeof(shhwtstamps));
479 shhwtstamps.hwtstamp = ktime_set(fifo.secs, fifo.ns);
480 skb_complete_tx_timestamp(skb, &shhwtstamps);
481
482 return;
483 }
484
485 /* Valid signature but does not match the one of the
486 * packet in the FIFO right now, reschedule it for later
487 * packets.
488 */
489 skb_queue_tail(&ptp->tx_queue, skb);
490 }
491}
492
493static void vsc85xx_get_tx_ts(struct vsc85xx_ptp *ptp)
494{
495 u32 reg;
496
497 do {
498 vsc85xx_dequeue_skb(ptp);
499
500 /* If other timestamps are available in the FIFO, process them. */
501 reg = vsc85xx_ts_read_csr(ptp->phydev, PROCESSOR,
502 MSCC_PHY_PTP_EGR_TS_FIFO_CTRL);
503 } while (PTP_EGR_FIFO_LEVEL_LAST_READ(reg) > 1);
504}
505
506static int vsc85xx_ptp_cmp_init(struct phy_device *phydev, enum ts_blk blk)
507{
508 struct vsc8531_private *vsc8531 = phydev->priv;
509 bool base = phydev->mdio.addr == vsc8531->ts_base_addr;
510 static const u8 msgs[] = {
511 PTP_MSGTYPE_SYNC,
512 PTP_MSGTYPE_DELAY_REQ
513 };
514 u32 val;
515 u8 i;
516
517 for (i = 0; i < ARRAY_SIZE(msgs); i++) {
518 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_PTP_FLOW_ENA(i),
519 base ? PTP_FLOW_VALID_CH0 :
520 PTP_FLOW_VALID_CH1);
521
522 val = vsc85xx_ts_read_csr(phydev, blk,
523 MSCC_ANA_PTP_FLOW_DOMAIN_RANGE(i));
524 val &= ~PTP_FLOW_DOMAIN_RANGE_ENA;
525 vsc85xx_ts_write_csr(phydev, blk,
526 MSCC_ANA_PTP_FLOW_DOMAIN_RANGE(i), val);
527
528 vsc85xx_ts_write_csr(phydev, blk,
529 MSCC_ANA_PTP_FLOW_MATCH_UPPER(i),
530 msgs[i] << 24);
531
532 vsc85xx_ts_write_csr(phydev, blk,
533 MSCC_ANA_PTP_FLOW_MASK_UPPER(i),
534 PTP_FLOW_MSG_TYPE_MASK);
535 }
536
537 return 0;
538}
539
540static int vsc85xx_eth_cmp1_init(struct phy_device *phydev, enum ts_blk blk)
541{
542 struct vsc8531_private *vsc8531 = phydev->priv;
543 bool base = phydev->mdio.addr == vsc8531->ts_base_addr;
544 u32 val;
545
546 vsc85xx_ts_write_csr(phydev, blk, MSCC_PHY_ANA_ETH1_NXT_PROT_TAG, 0);
547 vsc85xx_ts_write_csr(phydev, blk, MSCC_PHY_ANA_ETH1_NTX_PROT_VLAN_TPID,
548 ANA_ETH1_NTX_PROT_VLAN_TPID(ETH_P_8021AD));
549
550 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_ETH1_FLOW_ENA(0),
551 base ? ETH1_FLOW_VALID_CH0 : ETH1_FLOW_VALID_CH1);
552 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_ETH1_FLOW_MATCH_MODE(0),
553 ANA_ETH1_FLOW_MATCH_VLAN_TAG2);
554 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_ETH1_FLOW_ADDR_MATCH1(0), 0);
555 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_ETH1_FLOW_ADDR_MATCH2(0), 0);
556 vsc85xx_ts_write_csr(phydev, blk,
557 MSCC_ANA_ETH1_FLOW_VLAN_RANGE_I_TAG(0), 0);
558 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_ETH1_FLOW_VLAN_TAG1(0), 0);
559 vsc85xx_ts_write_csr(phydev, blk,
560 MSCC_ANA_ETH1_FLOW_VLAN_TAG2_I_TAG(0), 0);
561
562 val = vsc85xx_ts_read_csr(phydev, blk,
563 MSCC_ANA_ETH1_FLOW_MATCH_MODE(0));
564 val &= ~ANA_ETH1_FLOW_MATCH_VLAN_TAG_MASK;
565 val |= ANA_ETH1_FLOW_MATCH_VLAN_VERIFY;
566 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_ETH1_FLOW_MATCH_MODE(0),
567 val);
568
569 return 0;
570}
571
572static int vsc85xx_ip_cmp1_init(struct phy_device *phydev, enum ts_blk blk)
573{
574 struct vsc8531_private *vsc8531 = phydev->priv;
575 bool base = phydev->mdio.addr == vsc8531->ts_base_addr;
576 u32 val;
577
578 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_NXT_PROT_MATCH2_UPPER,
579 PTP_EV_PORT);
580 /* Match on dest port only, ignore src */
581 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_NXT_PROT_MASK2_UPPER,
582 0xffff);
583 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_NXT_PROT_MATCH2_LOWER,
584 0);
585 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_NXT_PROT_MASK2_LOWER, 0);
586
587 val = vsc85xx_ts_read_csr(phydev, blk, MSCC_ANA_IP1_FLOW_ENA(0));
588 val &= ~IP1_FLOW_ENA_CHANNEL_MASK_MASK;
589 val |= base ? IP1_FLOW_VALID_CH0 : IP1_FLOW_VALID_CH1;
590 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_FLOW_ENA(0), val);
591
592 /* Match all IPs */
593 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_FLOW_MATCH_UPPER(0), 0);
594 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_FLOW_MASK_UPPER(0), 0);
595 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_FLOW_MATCH_UPPER_MID(0),
596 0);
597 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_FLOW_MASK_UPPER_MID(0),
598 0);
599 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_FLOW_MATCH_LOWER_MID(0),
600 0);
601 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_FLOW_MASK_LOWER_MID(0),
602 0);
603 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_FLOW_MATCH_LOWER(0), 0);
604 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_FLOW_MASK_LOWER(0), 0);
605
606 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_PTP_IP_CHKSUM_SEL, 0);
607
608 return 0;
609}
610
611static int vsc85xx_adjfine(struct ptp_clock_info *info, long scaled_ppm)
612{
613 struct vsc85xx_ptp *ptp = container_of(info, struct vsc85xx_ptp, caps);
614 struct phy_device *phydev = ptp->phydev;
615 struct vsc8531_private *priv = phydev->priv;
616 u64 adj = 0;
617 u32 val;
618
619 if (abs(scaled_ppm) < 66 || abs(scaled_ppm) > 65536UL * 1000000UL)
620 return 0;
621
622 adj = div64_u64(1000000ULL * 65536ULL, abs(scaled_ppm));
623 if (adj > 1000000000L)
624 adj = 1000000000L;
625
626 val = PTP_AUTO_ADJ_NS_ROLLOVER(adj);
627 val |= scaled_ppm > 0 ? PTP_AUTO_ADJ_ADD_1NS : PTP_AUTO_ADJ_SUB_1NS;
628
629 mutex_lock(&priv->phc_lock);
630
631 /* Update the ppb val in nano seconds to the auto adjust reg. */
632 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_AUTO_ADJ,
633 val);
634
635 /* The auto adjust update val is set to 0 after write operation. */
636 val = vsc85xx_ts_read_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_CTRL);
637 val |= PTP_LTC_CTRL_AUTO_ADJ_UPDATE;
638 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_CTRL, val);
639
640 mutex_unlock(&priv->phc_lock);
641
642 return 0;
643}
644
645static int __vsc85xx_gettime(struct ptp_clock_info *info, struct timespec64 *ts)
646{
647 struct vsc85xx_ptp *ptp = container_of(info, struct vsc85xx_ptp, caps);
648 struct phy_device *phydev = ptp->phydev;
649 struct vsc8531_private *priv = phydev->priv;
650 struct vsc85xx_shared_private *shared;
651 u32 val;
652
653 shared = phy_package_get_priv(phydev);
654
655 val = vsc85xx_ts_read_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_CTRL);
656 val |= PTP_LTC_CTRL_SAVE_ENA;
657 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_CTRL, val);
658
659 /* Local Time Counter (LTC) is put in SAVE* regs on rising edge of
660 * LOAD_SAVE pin.
661 */
662 mutex_lock(&shared->gpio_lock);
663 gpiod_set_value(priv->load_save, 1);
664
665 val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
666 MSCC_PHY_PTP_LTC_SAVED_SEC_MSB);
667
668 ts->tv_sec = ((time64_t)val) << 32;
669
670 val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
671 MSCC_PHY_PTP_LTC_SAVED_SEC_LSB);
672 ts->tv_sec += val;
673
674 ts->tv_nsec = vsc85xx_ts_read_csr(phydev, PROCESSOR,
675 MSCC_PHY_PTP_LTC_SAVED_NS);
676
677 gpiod_set_value(priv->load_save, 0);
678 mutex_unlock(&shared->gpio_lock);
679
680 return 0;
681}
682
683static int vsc85xx_gettime(struct ptp_clock_info *info, struct timespec64 *ts)
684{
685 struct vsc85xx_ptp *ptp = container_of(info, struct vsc85xx_ptp, caps);
686 struct phy_device *phydev = ptp->phydev;
687 struct vsc8531_private *priv = phydev->priv;
688
689 mutex_lock(&priv->phc_lock);
690 __vsc85xx_gettime(info, ts);
691 mutex_unlock(&priv->phc_lock);
692
693 return 0;
694}
695
696static int __vsc85xx_settime(struct ptp_clock_info *info,
697 const struct timespec64 *ts)
698{
699 struct vsc85xx_ptp *ptp = container_of(info, struct vsc85xx_ptp, caps);
700 struct phy_device *phydev = ptp->phydev;
701 struct vsc8531_private *priv = phydev->priv;
702 struct vsc85xx_shared_private *shared;
703 u32 val;
704
705 shared = phy_package_get_priv(phydev);
706
707 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_LOAD_SEC_MSB,
708 PTP_LTC_LOAD_SEC_MSB(ts->tv_sec));
709 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_LOAD_SEC_LSB,
710 PTP_LTC_LOAD_SEC_LSB(ts->tv_sec));
711 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_LOAD_NS,
712 PTP_LTC_LOAD_NS(ts->tv_nsec));
713
714 val = vsc85xx_ts_read_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_CTRL);
715 val |= PTP_LTC_CTRL_LOAD_ENA;
716 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_CTRL, val);
717
718 /* Local Time Counter (LTC) is set from LOAD* regs on rising edge of
719 * LOAD_SAVE pin.
720 */
721 mutex_lock(&shared->gpio_lock);
722 gpiod_set_value(priv->load_save, 1);
723
724 val &= ~PTP_LTC_CTRL_LOAD_ENA;
725 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_CTRL, val);
726
727 gpiod_set_value(priv->load_save, 0);
728 mutex_unlock(&shared->gpio_lock);
729
730 return 0;
731}
732
733static int vsc85xx_settime(struct ptp_clock_info *info,
734 const struct timespec64 *ts)
735{
736 struct vsc85xx_ptp *ptp = container_of(info, struct vsc85xx_ptp, caps);
737 struct phy_device *phydev = ptp->phydev;
738 struct vsc8531_private *priv = phydev->priv;
739
740 mutex_lock(&priv->phc_lock);
741 __vsc85xx_settime(info, ts);
742 mutex_unlock(&priv->phc_lock);
743
744 return 0;
745}
746
747static int vsc85xx_adjtime(struct ptp_clock_info *info, s64 delta)
748{
749 struct vsc85xx_ptp *ptp = container_of(info, struct vsc85xx_ptp, caps);
750 struct phy_device *phydev = ptp->phydev;
751 struct vsc8531_private *priv = phydev->priv;
752 u32 val;
753
754 /* Can't recover that big of an offset. Let's set the time directly. */
755 if (abs(delta) >= NSEC_PER_SEC) {
756 struct timespec64 ts;
757 u64 now;
758
759 mutex_lock(&priv->phc_lock);
760
761 __vsc85xx_gettime(info, &ts);
762 now = ktime_to_ns(timespec64_to_ktime(ts));
763 ts = ns_to_timespec64(now + delta);
764 __vsc85xx_settime(info, &ts);
765
766 mutex_unlock(&priv->phc_lock);
767
768 return 0;
769 }
770
771 mutex_lock(&priv->phc_lock);
772
773 val = PTP_LTC_OFFSET_VAL(abs(delta)) | PTP_LTC_OFFSET_ADJ;
774 if (delta > 0)
775 val |= PTP_LTC_OFFSET_ADD;
776 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_OFFSET, val);
777
778 mutex_unlock(&priv->phc_lock);
779
780 return 0;
781}
782
783static int vsc85xx_eth1_next_comp(struct phy_device *phydev, enum ts_blk blk,
784 u32 next_comp, u32 etype)
785{
786 u32 val;
787
788 val = vsc85xx_ts_read_csr(phydev, blk, MSCC_PHY_ANA_ETH1_NTX_PROT);
789 val &= ~ANA_ETH1_NTX_PROT_COMPARATOR_MASK;
790 val |= next_comp;
791 vsc85xx_ts_write_csr(phydev, blk, MSCC_PHY_ANA_ETH1_NTX_PROT, val);
792
793 val = ANA_ETH1_NXT_PROT_ETYPE_MATCH(etype) |
794 ANA_ETH1_NXT_PROT_ETYPE_MATCH_ENA;
795 vsc85xx_ts_write_csr(phydev, blk,
796 MSCC_PHY_ANA_ETH1_NXT_PROT_ETYPE_MATCH, val);
797
798 return 0;
799}
800
801static int vsc85xx_ip1_next_comp(struct phy_device *phydev, enum ts_blk blk,
802 u32 next_comp, u32 header)
803{
804 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_NXT_PROT_NXT_COMP,
805 ANA_IP1_NXT_PROT_NXT_COMP_BYTES_HDR(header) |
806 next_comp);
807
808 return 0;
809}
810
811static int vsc85xx_ts_ptp_action_flow(struct phy_device *phydev, enum ts_blk blk, u8 flow, enum ptp_cmd cmd)
812{
813 u32 val;
814
815 /* Check non-zero reserved field */
816 val = PTP_FLOW_PTP_0_FIELD_PTP_FRAME | PTP_FLOW_PTP_0_FIELD_RSVRD_CHECK;
817 vsc85xx_ts_write_csr(phydev, blk,
818 MSCC_ANA_PTP_FLOW_PTP_0_FIELD(flow), val);
819
820 val = PTP_FLOW_PTP_ACTION_CORR_OFFSET(8) |
821 PTP_FLOW_PTP_ACTION_TIME_OFFSET(8) |
822 PTP_FLOW_PTP_ACTION_PTP_CMD(cmd == PTP_SAVE_IN_TS_FIFO ?
823 PTP_NOP : cmd);
824 if (cmd == PTP_SAVE_IN_TS_FIFO)
825 val |= PTP_FLOW_PTP_ACTION_SAVE_LOCAL_TIME;
826 else if (cmd == PTP_WRITE_NS)
827 val |= PTP_FLOW_PTP_ACTION_MOD_FRAME_STATUS_UPDATE |
828 PTP_FLOW_PTP_ACTION_MOD_FRAME_STATUS_BYTE_OFFSET(6);
829 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_PTP_FLOW_PTP_ACTION(flow),
830 val);
831
832 if (cmd == PTP_WRITE_1588)
833 /* Rewrite timestamp directly in frame */
834 val = PTP_FLOW_PTP_ACTION2_REWRITE_OFFSET(34) |
835 PTP_FLOW_PTP_ACTION2_REWRITE_BYTES(10);
836 else if (cmd == PTP_SAVE_IN_TS_FIFO)
837 /* no rewrite */
838 val = PTP_FLOW_PTP_ACTION2_REWRITE_OFFSET(0) |
839 PTP_FLOW_PTP_ACTION2_REWRITE_BYTES(0);
840 else
841 /* Write in reserved field */
842 val = PTP_FLOW_PTP_ACTION2_REWRITE_OFFSET(16) |
843 PTP_FLOW_PTP_ACTION2_REWRITE_BYTES(4);
844 vsc85xx_ts_write_csr(phydev, blk,
845 MSCC_ANA_PTP_FLOW_PTP_ACTION2(flow), val);
846
847 return 0;
848}
849
850static int vsc85xx_ptp_conf(struct phy_device *phydev, enum ts_blk blk,
851 bool one_step, bool enable)
852{
853 static const u8 msgs[] = {
854 PTP_MSGTYPE_SYNC,
855 PTP_MSGTYPE_DELAY_REQ
856 };
857 u32 val;
858 u8 i;
859
860 for (i = 0; i < ARRAY_SIZE(msgs); i++) {
861 if (blk == INGRESS)
862 vsc85xx_ts_ptp_action_flow(phydev, blk, msgs[i],
863 PTP_WRITE_NS);
864 else if (msgs[i] == PTP_MSGTYPE_SYNC && one_step)
865 /* no need to know Sync t when sending in one_step */
866 vsc85xx_ts_ptp_action_flow(phydev, blk, msgs[i],
867 PTP_WRITE_1588);
868 else
869 vsc85xx_ts_ptp_action_flow(phydev, blk, msgs[i],
870 PTP_SAVE_IN_TS_FIFO);
871
872 val = vsc85xx_ts_read_csr(phydev, blk,
873 MSCC_ANA_PTP_FLOW_ENA(i));
874 val &= ~PTP_FLOW_ENA;
875 if (enable)
876 val |= PTP_FLOW_ENA;
877 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_PTP_FLOW_ENA(i),
878 val);
879 }
880
881 return 0;
882}
883
884static int vsc85xx_eth1_conf(struct phy_device *phydev, enum ts_blk blk,
885 bool enable)
886{
887 struct vsc8531_private *vsc8531 = phydev->priv;
888 u32 val = ANA_ETH1_FLOW_ADDR_MATCH2_DEST;
889
890 if (vsc8531->ptp->rx_filter == HWTSTAMP_FILTER_PTP_V2_L2_EVENT) {
891 /* PTP over Ethernet multicast address for SYNC and DELAY msg */
892 u8 ptp_multicast[6] = {0x01, 0x1b, 0x19, 0x00, 0x00, 0x00};
893
894 val |= ANA_ETH1_FLOW_ADDR_MATCH2_FULL_ADDR |
895 get_unaligned_be16(&ptp_multicast[4]);
896 vsc85xx_ts_write_csr(phydev, blk,
897 MSCC_ANA_ETH1_FLOW_ADDR_MATCH2(0), val);
898 vsc85xx_ts_write_csr(phydev, blk,
899 MSCC_ANA_ETH1_FLOW_ADDR_MATCH1(0),
900 get_unaligned_be32(ptp_multicast));
901 } else {
902 val |= ANA_ETH1_FLOW_ADDR_MATCH2_ANY_MULTICAST;
903 val |= ANA_ETH1_FLOW_ADDR_MATCH2_ANY_UNICAST;
904 vsc85xx_ts_write_csr(phydev, blk,
905 MSCC_ANA_ETH1_FLOW_ADDR_MATCH2(0), val);
906 vsc85xx_ts_write_csr(phydev, blk,
907 MSCC_ANA_ETH1_FLOW_ADDR_MATCH1(0), 0);
908 }
909
910 val = vsc85xx_ts_read_csr(phydev, blk, MSCC_ANA_ETH1_FLOW_ENA(0));
911 val &= ~ETH1_FLOW_ENA;
912 if (enable)
913 val |= ETH1_FLOW_ENA;
914 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_ETH1_FLOW_ENA(0), val);
915
916 return 0;
917}
918
919static int vsc85xx_ip1_conf(struct phy_device *phydev, enum ts_blk blk,
920 bool enable)
921{
922 u32 val;
923
924 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_NXT_PROT_IP1_MODE,
925 ANA_IP1_NXT_PROT_IPV4 |
926 ANA_IP1_NXT_PROT_FLOW_OFFSET_IPV4);
927
928 /* Matching UDP protocol number */
929 val = ANA_IP1_NXT_PROT_IP_MATCH1_PROT_MASK(0xff) |
930 ANA_IP1_NXT_PROT_IP_MATCH1_PROT_MATCH(IPPROTO_UDP) |
931 ANA_IP1_NXT_PROT_IP_MATCH1_PROT_OFF(9);
932 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_NXT_PROT_IP_MATCH1,
933 val);
934
935 /* End of IP protocol, start of next protocol (UDP) */
936 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_NXT_PROT_OFFSET2,
937 ANA_IP1_NXT_PROT_OFFSET2(20));
938
939 val = vsc85xx_ts_read_csr(phydev, blk,
940 MSCC_ANA_IP1_NXT_PROT_UDP_CHKSUM);
941 val &= ~(IP1_NXT_PROT_UDP_CHKSUM_OFF_MASK |
942 IP1_NXT_PROT_UDP_CHKSUM_WIDTH_MASK);
943 val |= IP1_NXT_PROT_UDP_CHKSUM_WIDTH(2);
944
945 val &= ~(IP1_NXT_PROT_UDP_CHKSUM_UPDATE |
946 IP1_NXT_PROT_UDP_CHKSUM_CLEAR);
947 /* UDP checksum offset in IPv4 packet
948 * according to: https://tools.ietf.org/html/rfc768
949 */
950 val |= IP1_NXT_PROT_UDP_CHKSUM_OFF(26);
951 if (enable)
952 val |= IP1_NXT_PROT_UDP_CHKSUM_CLEAR;
953 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_NXT_PROT_UDP_CHKSUM,
954 val);
955
956 val = vsc85xx_ts_read_csr(phydev, blk, MSCC_ANA_IP1_FLOW_ENA(0));
957 val &= ~(IP1_FLOW_MATCH_ADDR_MASK | IP1_FLOW_ENA);
958 val |= IP1_FLOW_MATCH_DEST_SRC_ADDR;
959 if (enable)
960 val |= IP1_FLOW_ENA;
961 vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_FLOW_ENA(0), val);
962
963 return 0;
964}
965
966static int vsc85xx_ts_engine_init(struct phy_device *phydev, bool one_step)
967{
968 struct vsc8531_private *vsc8531 = phydev->priv;
969 bool ptp_l4, base = phydev->mdio.addr == vsc8531->ts_base_addr;
970 u8 eng_id = base ? 0 : 1;
971 u32 val;
972
973 ptp_l4 = vsc8531->ptp->rx_filter == HWTSTAMP_FILTER_PTP_V2_L4_EVENT;
974
975 val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
976 MSCC_PHY_PTP_ANALYZER_MODE);
977 /* Disable INGRESS and EGRESS so engine eng_id can be reconfigured */
978 val &= ~(PTP_ANALYZER_MODE_EGR_ENA(BIT(eng_id)) |
979 PTP_ANALYZER_MODE_INGR_ENA(BIT(eng_id)));
980 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_ANALYZER_MODE,
981 val);
982
983 if (vsc8531->ptp->rx_filter == HWTSTAMP_FILTER_PTP_V2_L2_EVENT) {
984 vsc85xx_eth1_next_comp(phydev, INGRESS,
985 ANA_ETH1_NTX_PROT_PTP_OAM, ETH_P_1588);
986 vsc85xx_eth1_next_comp(phydev, EGRESS,
987 ANA_ETH1_NTX_PROT_PTP_OAM, ETH_P_1588);
988 } else {
989 vsc85xx_eth1_next_comp(phydev, INGRESS,
990 ANA_ETH1_NTX_PROT_IP_UDP_ACH_1,
991 ETH_P_IP);
992 vsc85xx_eth1_next_comp(phydev, EGRESS,
993 ANA_ETH1_NTX_PROT_IP_UDP_ACH_1,
994 ETH_P_IP);
995 /* Header length of IPv[4/6] + UDP */
996 vsc85xx_ip1_next_comp(phydev, INGRESS,
997 ANA_ETH1_NTX_PROT_PTP_OAM, 28);
998 vsc85xx_ip1_next_comp(phydev, EGRESS,
999 ANA_ETH1_NTX_PROT_PTP_OAM, 28);
1000 }
1001
1002 vsc85xx_eth1_conf(phydev, INGRESS,
1003 vsc8531->ptp->rx_filter != HWTSTAMP_FILTER_NONE);
1004 vsc85xx_ip1_conf(phydev, INGRESS,
1005 ptp_l4 && vsc8531->ptp->rx_filter != HWTSTAMP_FILTER_NONE);
1006 vsc85xx_ptp_conf(phydev, INGRESS, one_step,
1007 vsc8531->ptp->rx_filter != HWTSTAMP_FILTER_NONE);
1008
1009 vsc85xx_eth1_conf(phydev, EGRESS,
1010 vsc8531->ptp->tx_type != HWTSTAMP_TX_OFF);
1011 vsc85xx_ip1_conf(phydev, EGRESS,
1012 ptp_l4 && vsc8531->ptp->tx_type != HWTSTAMP_TX_OFF);
1013 vsc85xx_ptp_conf(phydev, EGRESS, one_step,
1014 vsc8531->ptp->tx_type != HWTSTAMP_TX_OFF);
1015
1016 val &= ~PTP_ANALYZER_MODE_EGR_ENA(BIT(eng_id));
1017 if (vsc8531->ptp->tx_type != HWTSTAMP_TX_OFF)
1018 val |= PTP_ANALYZER_MODE_EGR_ENA(BIT(eng_id));
1019
1020 val &= ~PTP_ANALYZER_MODE_INGR_ENA(BIT(eng_id));
1021 if (vsc8531->ptp->rx_filter != HWTSTAMP_FILTER_NONE)
1022 val |= PTP_ANALYZER_MODE_INGR_ENA(BIT(eng_id));
1023
1024 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_ANALYZER_MODE,
1025 val);
1026
1027 return 0;
1028}
1029
1030void vsc85xx_link_change_notify(struct phy_device *phydev)
1031{
1032 struct vsc8531_private *priv = phydev->priv;
1033
1034 mutex_lock(&priv->ts_lock);
1035 vsc85xx_ts_set_latencies(phydev);
1036 mutex_unlock(&priv->ts_lock);
1037}
1038
1039static void vsc85xx_ts_reset_fifo(struct phy_device *phydev)
1040{
1041 u32 val;
1042
1043 val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1044 MSCC_PHY_PTP_EGR_TS_FIFO_CTRL);
1045 val |= PTP_EGR_TS_FIFO_RESET;
1046 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_EGR_TS_FIFO_CTRL,
1047 val);
1048
1049 val &= ~PTP_EGR_TS_FIFO_RESET;
1050 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_EGR_TS_FIFO_CTRL,
1051 val);
1052}
1053
1054static int vsc85xx_hwtstamp_get(struct mii_timestamper *mii_ts,
1055 struct kernel_hwtstamp_config *cfg)
1056{
1057 struct vsc8531_private *vsc8531 =
1058 container_of(mii_ts, struct vsc8531_private, mii_ts);
1059
1060 cfg->tx_type = vsc8531->ptp->tx_type;
1061 cfg->rx_filter = vsc8531->ptp->rx_filter;
1062
1063 return 0;
1064}
1065
1066static int vsc85xx_hwtstamp_set(struct mii_timestamper *mii_ts,
1067 struct kernel_hwtstamp_config *cfg,
1068 struct netlink_ext_ack *extack)
1069{
1070 struct vsc8531_private *vsc8531 =
1071 container_of(mii_ts, struct vsc8531_private, mii_ts);
1072 struct phy_device *phydev = vsc8531->ptp->phydev;
1073 bool one_step = false;
1074 u32 val;
1075
1076 switch (cfg->tx_type) {
1077 case HWTSTAMP_TX_ONESTEP_SYNC:
1078 one_step = true;
1079 break;
1080 case HWTSTAMP_TX_ON:
1081 break;
1082 case HWTSTAMP_TX_OFF:
1083 skb_queue_purge(&vsc8531->ptp->tx_queue);
1084 break;
1085 default:
1086 return -ERANGE;
1087 }
1088
1089 vsc8531->ptp->tx_type = cfg->tx_type;
1090
1091 switch (cfg->rx_filter) {
1092 case HWTSTAMP_FILTER_NONE:
1093 break;
1094 case HWTSTAMP_FILTER_PTP_V2_L4_EVENT:
1095 /* ETH->IP->UDP->PTP */
1096 break;
1097 case HWTSTAMP_FILTER_PTP_V2_L2_EVENT:
1098 /* ETH->PTP */
1099 break;
1100 default:
1101 return -ERANGE;
1102 }
1103
1104 vsc8531->ptp->rx_filter = cfg->rx_filter;
1105
1106 mutex_lock(&vsc8531->ts_lock);
1107
1108 /* Disable predictor while configuring the 1588 block */
1109 val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1110 MSCC_PHY_PTP_INGR_PREDICTOR);
1111 val &= ~PTP_INGR_PREDICTOR_EN;
1112 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_INGR_PREDICTOR,
1113 val);
1114 val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1115 MSCC_PHY_PTP_EGR_PREDICTOR);
1116 val &= ~PTP_EGR_PREDICTOR_EN;
1117 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_EGR_PREDICTOR,
1118 val);
1119
1120 /* Bypass egress or ingress blocks if timestamping isn't used */
1121 val = vsc85xx_ts_read_csr(phydev, PROCESSOR, MSCC_PHY_PTP_IFACE_CTRL);
1122 val &= ~(PTP_IFACE_CTRL_EGR_BYPASS | PTP_IFACE_CTRL_INGR_BYPASS);
1123 if (vsc8531->ptp->tx_type == HWTSTAMP_TX_OFF)
1124 val |= PTP_IFACE_CTRL_EGR_BYPASS;
1125 if (vsc8531->ptp->rx_filter == HWTSTAMP_FILTER_NONE)
1126 val |= PTP_IFACE_CTRL_INGR_BYPASS;
1127 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_IFACE_CTRL, val);
1128
1129 /* Resetting FIFO so that it's empty after reconfiguration */
1130 vsc85xx_ts_reset_fifo(phydev);
1131
1132 vsc85xx_ts_engine_init(phydev, one_step);
1133
1134 /* Re-enable predictors now */
1135 val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1136 MSCC_PHY_PTP_INGR_PREDICTOR);
1137 val |= PTP_INGR_PREDICTOR_EN;
1138 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_INGR_PREDICTOR,
1139 val);
1140 val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1141 MSCC_PHY_PTP_EGR_PREDICTOR);
1142 val |= PTP_EGR_PREDICTOR_EN;
1143 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_EGR_PREDICTOR,
1144 val);
1145
1146 vsc8531->ptp->configured = 1;
1147 mutex_unlock(&vsc8531->ts_lock);
1148
1149 return 0;
1150}
1151
1152static int vsc85xx_ts_info(struct mii_timestamper *mii_ts,
1153 struct kernel_ethtool_ts_info *info)
1154{
1155 struct vsc8531_private *vsc8531 =
1156 container_of(mii_ts, struct vsc8531_private, mii_ts);
1157
1158 info->phc_index = ptp_clock_index(vsc8531->ptp->ptp_clock);
1159 info->so_timestamping =
1160 SOF_TIMESTAMPING_TX_HARDWARE |
1161 SOF_TIMESTAMPING_RX_HARDWARE |
1162 SOF_TIMESTAMPING_RAW_HARDWARE;
1163 info->tx_types =
1164 (1 << HWTSTAMP_TX_OFF) |
1165 (1 << HWTSTAMP_TX_ON) |
1166 (1 << HWTSTAMP_TX_ONESTEP_SYNC);
1167 info->rx_filters =
1168 (1 << HWTSTAMP_FILTER_NONE) |
1169 (1 << HWTSTAMP_FILTER_PTP_V2_L2_EVENT) |
1170 (1 << HWTSTAMP_FILTER_PTP_V2_L4_EVENT);
1171
1172 return 0;
1173}
1174
1175static void vsc85xx_txtstamp(struct mii_timestamper *mii_ts,
1176 struct sk_buff *skb, int type)
1177{
1178 struct vsc8531_private *vsc8531 =
1179 container_of(mii_ts, struct vsc8531_private, mii_ts);
1180
1181 if (!vsc8531->ptp->configured)
1182 goto out;
1183
1184 if (vsc8531->ptp->tx_type == HWTSTAMP_TX_OFF)
1185 goto out;
1186
1187 if (vsc8531->ptp->tx_type == HWTSTAMP_TX_ONESTEP_SYNC)
1188 if (ptp_msg_is_sync(skb, type))
1189 goto out;
1190
1191 skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
1192
1193 skb_queue_tail(&vsc8531->ptp->tx_queue, skb);
1194 return;
1195
1196out:
1197 kfree_skb(skb);
1198}
1199
1200static bool vsc85xx_rxtstamp(struct mii_timestamper *mii_ts,
1201 struct sk_buff *skb, int type)
1202{
1203 struct vsc8531_private *vsc8531 =
1204 container_of(mii_ts, struct vsc8531_private, mii_ts);
1205 struct vsc85xx_ptphdr *ptphdr;
1206 unsigned long ns;
1207
1208 if (!vsc8531->ptp->configured)
1209 return false;
1210
1211 if (vsc8531->ptp->rx_filter == HWTSTAMP_FILTER_NONE ||
1212 type == PTP_CLASS_NONE)
1213 return false;
1214
1215 ptphdr = get_ptp_header_rx(skb, vsc8531->ptp->rx_filter);
1216 if (!ptphdr)
1217 return false;
1218
1219 ns = ntohl(ptphdr->rsrvd2);
1220
1221 VSC8531_SKB_CB(skb)->ns = ns;
1222 skb_queue_tail(&vsc8531->rx_skbs_list, skb);
1223
1224 ptp_schedule_worker(vsc8531->ptp->ptp_clock, 0);
1225
1226 return true;
1227}
1228
1229static long vsc85xx_do_aux_work(struct ptp_clock_info *info)
1230{
1231 struct vsc85xx_ptp *ptp = container_of(info, struct vsc85xx_ptp, caps);
1232 struct skb_shared_hwtstamps *shhwtstamps = NULL;
1233 struct phy_device *phydev = ptp->phydev;
1234 struct vsc8531_private *priv = phydev->priv;
1235 struct sk_buff_head received;
1236 struct sk_buff *rx_skb;
1237 struct timespec64 ts;
1238 unsigned long flags;
1239
1240 __skb_queue_head_init(&received);
1241 spin_lock_irqsave(&priv->rx_skbs_list.lock, flags);
1242 skb_queue_splice_tail_init(&priv->rx_skbs_list, &received);
1243 spin_unlock_irqrestore(&priv->rx_skbs_list.lock, flags);
1244
1245 vsc85xx_gettime(info, &ts);
1246 while ((rx_skb = __skb_dequeue(&received)) != NULL) {
1247 shhwtstamps = skb_hwtstamps(rx_skb);
1248 memset(shhwtstamps, 0, sizeof(struct skb_shared_hwtstamps));
1249
1250 if (ts.tv_nsec < VSC8531_SKB_CB(rx_skb)->ns)
1251 ts.tv_sec--;
1252
1253 shhwtstamps->hwtstamp = ktime_set(ts.tv_sec,
1254 VSC8531_SKB_CB(rx_skb)->ns);
1255 netif_rx(rx_skb);
1256 }
1257
1258 return -1;
1259}
1260
1261static const struct ptp_clock_info vsc85xx_clk_caps = {
1262 .owner = THIS_MODULE,
1263 .name = "VSC85xx timer",
1264 .max_adj = S32_MAX,
1265 .n_alarm = 0,
1266 .n_pins = 0,
1267 .n_ext_ts = 0,
1268 .n_per_out = 0,
1269 .pps = 0,
1270 .adjtime = &vsc85xx_adjtime,
1271 .adjfine = &vsc85xx_adjfine,
1272 .gettime64 = &vsc85xx_gettime,
1273 .settime64 = &vsc85xx_settime,
1274 .do_aux_work = &vsc85xx_do_aux_work,
1275};
1276
1277static struct vsc8531_private *vsc8584_base_priv(struct phy_device *phydev)
1278{
1279 struct vsc8531_private *vsc8531 = phydev->priv;
1280
1281 if (vsc8531->ts_base_addr != phydev->mdio.addr) {
1282 struct mdio_device *dev;
1283
1284 dev = phydev->mdio.bus->mdio_map[vsc8531->ts_base_addr];
1285 phydev = container_of(dev, struct phy_device, mdio);
1286
1287 return phydev->priv;
1288 }
1289
1290 return vsc8531;
1291}
1292
1293static bool vsc8584_is_1588_input_clk_configured(struct phy_device *phydev)
1294{
1295 struct vsc8531_private *vsc8531 = vsc8584_base_priv(phydev);
1296
1297 return vsc8531->input_clk_init;
1298}
1299
1300static void vsc8584_set_input_clk_configured(struct phy_device *phydev)
1301{
1302 struct vsc8531_private *vsc8531 = vsc8584_base_priv(phydev);
1303
1304 vsc8531->input_clk_init = true;
1305}
1306
1307static int __vsc8584_init_ptp(struct phy_device *phydev)
1308{
1309 static const u32 ltc_seq_e[] = { 0, 400000, 0, 0, 0 };
1310 static const u8 ltc_seq_a[] = { 8, 6, 5, 4, 2 };
1311 u32 val;
1312
1313 if (!vsc8584_is_1588_input_clk_configured(phydev)) {
1314 phy_lock_mdio_bus(phydev);
1315
1316 /* 1588_DIFF_INPUT_CLK configuration: Use an external clock for
1317 * the LTC, as per 3.13.29 in the VSC8584 datasheet.
1318 */
1319 phy_ts_base_write(phydev, MSCC_EXT_PAGE_ACCESS,
1320 MSCC_PHY_PAGE_1588);
1321 phy_ts_base_write(phydev, 29, 0x7ae0);
1322 phy_ts_base_write(phydev, 30, 0xb71c);
1323 phy_ts_base_write(phydev, MSCC_EXT_PAGE_ACCESS,
1324 MSCC_PHY_PAGE_STANDARD);
1325
1326 phy_unlock_mdio_bus(phydev);
1327
1328 vsc8584_set_input_clk_configured(phydev);
1329 }
1330
1331 /* Disable predictor before configuring the 1588 block */
1332 val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1333 MSCC_PHY_PTP_INGR_PREDICTOR);
1334 val &= ~PTP_INGR_PREDICTOR_EN;
1335 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_INGR_PREDICTOR,
1336 val);
1337 val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1338 MSCC_PHY_PTP_EGR_PREDICTOR);
1339 val &= ~PTP_EGR_PREDICTOR_EN;
1340 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_EGR_PREDICTOR,
1341 val);
1342
1343 /* By default, the internal clock of fixed rate 250MHz is used */
1344 val = vsc85xx_ts_read_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_CTRL);
1345 val &= ~PTP_LTC_CTRL_CLK_SEL_MASK;
1346 val |= PTP_LTC_CTRL_CLK_SEL_INTERNAL_250;
1347 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_CTRL, val);
1348
1349 val = vsc85xx_ts_read_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_SEQUENCE);
1350 val &= ~PTP_LTC_SEQUENCE_A_MASK;
1351 val |= PTP_LTC_SEQUENCE_A(ltc_seq_a[PHC_CLK_250MHZ]);
1352 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_SEQUENCE, val);
1353
1354 val = vsc85xx_ts_read_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_SEQ);
1355 val &= ~(PTP_LTC_SEQ_ERR_MASK | PTP_LTC_SEQ_ADD_SUB);
1356 if (ltc_seq_e[PHC_CLK_250MHZ])
1357 val |= PTP_LTC_SEQ_ADD_SUB;
1358 val |= PTP_LTC_SEQ_ERR(ltc_seq_e[PHC_CLK_250MHZ]);
1359 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_SEQ, val);
1360
1361 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_1PPS_WIDTH_ADJ,
1362 PPS_WIDTH_ADJ);
1363
1364 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_INGR_DELAY_FIFO,
1365 IS_ENABLED(CONFIG_MACSEC) ?
1366 PTP_INGR_DELAY_FIFO_DEPTH_MACSEC :
1367 PTP_INGR_DELAY_FIFO_DEPTH_DEFAULT);
1368
1369 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_EGR_DELAY_FIFO,
1370 IS_ENABLED(CONFIG_MACSEC) ?
1371 PTP_EGR_DELAY_FIFO_DEPTH_MACSEC :
1372 PTP_EGR_DELAY_FIFO_DEPTH_DEFAULT);
1373
1374 /* Enable n-phase sampler for Viper Rev-B */
1375 val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1376 MSCC_PHY_PTP_ACCUR_CFG_STATUS);
1377 val &= ~(PTP_ACCUR_PPS_OUT_BYPASS | PTP_ACCUR_PPS_IN_BYPASS |
1378 PTP_ACCUR_EGR_SOF_BYPASS | PTP_ACCUR_INGR_SOF_BYPASS |
1379 PTP_ACCUR_LOAD_SAVE_BYPASS);
1380 val |= PTP_ACCUR_PPS_OUT_CALIB_ERR | PTP_ACCUR_PPS_OUT_CALIB_DONE |
1381 PTP_ACCUR_PPS_IN_CALIB_ERR | PTP_ACCUR_PPS_IN_CALIB_DONE |
1382 PTP_ACCUR_EGR_SOF_CALIB_ERR | PTP_ACCUR_EGR_SOF_CALIB_DONE |
1383 PTP_ACCUR_INGR_SOF_CALIB_ERR | PTP_ACCUR_INGR_SOF_CALIB_DONE |
1384 PTP_ACCUR_LOAD_SAVE_CALIB_ERR | PTP_ACCUR_LOAD_SAVE_CALIB_DONE;
1385 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_ACCUR_CFG_STATUS,
1386 val);
1387
1388 val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1389 MSCC_PHY_PTP_ACCUR_CFG_STATUS);
1390 val |= PTP_ACCUR_CALIB_TRIGG;
1391 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_ACCUR_CFG_STATUS,
1392 val);
1393
1394 val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1395 MSCC_PHY_PTP_ACCUR_CFG_STATUS);
1396 val &= ~PTP_ACCUR_CALIB_TRIGG;
1397 val |= PTP_ACCUR_PPS_OUT_CALIB_ERR | PTP_ACCUR_PPS_OUT_CALIB_DONE |
1398 PTP_ACCUR_PPS_IN_CALIB_ERR | PTP_ACCUR_PPS_IN_CALIB_DONE |
1399 PTP_ACCUR_EGR_SOF_CALIB_ERR | PTP_ACCUR_EGR_SOF_CALIB_DONE |
1400 PTP_ACCUR_INGR_SOF_CALIB_ERR | PTP_ACCUR_INGR_SOF_CALIB_DONE |
1401 PTP_ACCUR_LOAD_SAVE_CALIB_ERR | PTP_ACCUR_LOAD_SAVE_CALIB_DONE;
1402 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_ACCUR_CFG_STATUS,
1403 val);
1404
1405 val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1406 MSCC_PHY_PTP_ACCUR_CFG_STATUS);
1407 val |= PTP_ACCUR_CALIB_TRIGG;
1408 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_ACCUR_CFG_STATUS,
1409 val);
1410
1411 val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1412 MSCC_PHY_PTP_ACCUR_CFG_STATUS);
1413 val &= ~PTP_ACCUR_CALIB_TRIGG;
1414 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_ACCUR_CFG_STATUS,
1415 val);
1416
1417 /* Do not access FIFO via SI */
1418 val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1419 MSCC_PHY_PTP_TSTAMP_FIFO_SI);
1420 val &= ~PTP_TSTAMP_FIFO_SI_EN;
1421 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_TSTAMP_FIFO_SI,
1422 val);
1423
1424 val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1425 MSCC_PHY_PTP_INGR_REWRITER_CTRL);
1426 val &= ~PTP_INGR_REWRITER_REDUCE_PREAMBLE;
1427 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_INGR_REWRITER_CTRL,
1428 val);
1429 val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1430 MSCC_PHY_PTP_EGR_REWRITER_CTRL);
1431 val &= ~PTP_EGR_REWRITER_REDUCE_PREAMBLE;
1432 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_EGR_REWRITER_CTRL,
1433 val);
1434
1435 /* Put the flag that indicates the frame has been modified to bit 7 */
1436 val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1437 MSCC_PHY_PTP_INGR_REWRITER_CTRL);
1438 val |= PTP_INGR_REWRITER_FLAG_BIT_OFF(7) | PTP_INGR_REWRITER_FLAG_VAL;
1439 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_INGR_REWRITER_CTRL,
1440 val);
1441 val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1442 MSCC_PHY_PTP_EGR_REWRITER_CTRL);
1443 val |= PTP_EGR_REWRITER_FLAG_BIT_OFF(7);
1444 val &= ~PTP_EGR_REWRITER_FLAG_VAL;
1445 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_EGR_REWRITER_CTRL,
1446 val);
1447
1448 /* 30bit mode for RX timestamp, only the nanoseconds are kept in
1449 * reserved field.
1450 */
1451 val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1452 MSCC_PHY_PTP_INGR_TSP_CTRL);
1453 val |= PHY_PTP_INGR_TSP_CTRL_FRACT_NS;
1454 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_INGR_TSP_CTRL,
1455 val);
1456
1457 val = vsc85xx_ts_read_csr(phydev, PROCESSOR, MSCC_PHY_PTP_EGR_TSP_CTRL);
1458 val |= PHY_PTP_EGR_TSP_CTRL_FRACT_NS;
1459 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_EGR_TSP_CTRL, val);
1460
1461 val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1462 MSCC_PHY_PTP_SERIAL_TOD_IFACE);
1463 val |= PTP_SERIAL_TOD_IFACE_LS_AUTO_CLR;
1464 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_SERIAL_TOD_IFACE,
1465 val);
1466
1467 vsc85xx_ts_fsb_init(phydev);
1468
1469 /* Set the Egress timestamp FIFO configuration and status register */
1470 val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1471 MSCC_PHY_PTP_EGR_TS_FIFO_CTRL);
1472 val &= ~(PTP_EGR_TS_FIFO_SIG_BYTES_MASK | PTP_EGR_TS_FIFO_THRESH_MASK);
1473 /* 16 bytes for the signature, 10 for the timestamp in the TS FIFO */
1474 val |= PTP_EGR_TS_FIFO_SIG_BYTES(16) | PTP_EGR_TS_FIFO_THRESH(7);
1475 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_EGR_TS_FIFO_CTRL,
1476 val);
1477
1478 vsc85xx_ts_reset_fifo(phydev);
1479
1480 val = PTP_IFACE_CTRL_CLK_ENA;
1481 if (!IS_ENABLED(CONFIG_MACSEC))
1482 val |= PTP_IFACE_CTRL_GMII_PROT;
1483 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_IFACE_CTRL, val);
1484
1485 vsc85xx_ts_set_latencies(phydev);
1486
1487 val = vsc85xx_ts_read_csr(phydev, PROCESSOR, MSCC_PHY_PTP_VERSION_CODE);
1488
1489 val = vsc85xx_ts_read_csr(phydev, PROCESSOR, MSCC_PHY_PTP_IFACE_CTRL);
1490 val |= PTP_IFACE_CTRL_EGR_BYPASS;
1491 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_IFACE_CTRL, val);
1492
1493 vsc85xx_ts_disable_flows(phydev, EGRESS);
1494 vsc85xx_ts_disable_flows(phydev, INGRESS);
1495
1496 val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1497 MSCC_PHY_PTP_ANALYZER_MODE);
1498 /* Disable INGRESS and EGRESS so engine eng_id can be reconfigured */
1499 val &= ~(PTP_ANALYZER_MODE_EGR_ENA_MASK |
1500 PTP_ANALYZER_MODE_INGR_ENA_MASK |
1501 PTP_ANA_INGR_ENCAP_FLOW_MODE_MASK |
1502 PTP_ANA_EGR_ENCAP_FLOW_MODE_MASK);
1503 /* Strict matching in flow (packets should match flows from the same
1504 * index in all enabled comparators (except PTP)).
1505 */
1506 val |= PTP_ANA_SPLIT_ENCAP_FLOW | PTP_ANA_INGR_ENCAP_FLOW_MODE(0x7) |
1507 PTP_ANA_EGR_ENCAP_FLOW_MODE(0x7);
1508 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_ANALYZER_MODE,
1509 val);
1510
1511 /* Initialized for ingress and egress flows:
1512 * - The Ethernet comparator.
1513 * - The IP comparator.
1514 * - The PTP comparator.
1515 */
1516 vsc85xx_eth_cmp1_init(phydev, INGRESS);
1517 vsc85xx_ip_cmp1_init(phydev, INGRESS);
1518 vsc85xx_ptp_cmp_init(phydev, INGRESS);
1519 vsc85xx_eth_cmp1_init(phydev, EGRESS);
1520 vsc85xx_ip_cmp1_init(phydev, EGRESS);
1521 vsc85xx_ptp_cmp_init(phydev, EGRESS);
1522
1523 vsc85xx_ts_eth_cmp1_sig(phydev);
1524
1525 return 0;
1526}
1527
1528void vsc8584_config_ts_intr(struct phy_device *phydev)
1529{
1530 struct vsc8531_private *priv = phydev->priv;
1531
1532 mutex_lock(&priv->ts_lock);
1533 vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_1588_VSC85XX_INT_MASK,
1534 VSC85XX_1588_INT_MASK_MASK);
1535 mutex_unlock(&priv->ts_lock);
1536}
1537
1538int vsc8584_ptp_init(struct phy_device *phydev)
1539{
1540 switch (phydev->phy_id & phydev->drv->phy_id_mask) {
1541 case PHY_ID_VSC8572:
1542 case PHY_ID_VSC8574:
1543 case PHY_ID_VSC8575:
1544 case PHY_ID_VSC8582:
1545 case PHY_ID_VSC8584:
1546 return __vsc8584_init_ptp(phydev);
1547 }
1548
1549 return 0;
1550}
1551
1552void vsc8584_ptp_deinit(struct phy_device *phydev)
1553{
1554 struct vsc8531_private *vsc8531 = phydev->priv;
1555
1556 if (vsc8531->ptp->ptp_clock) {
1557 ptp_clock_unregister(vsc8531->ptp->ptp_clock);
1558 skb_queue_purge(&vsc8531->rx_skbs_list);
1559 skb_queue_purge(&vsc8531->ptp->tx_queue);
1560 }
1561}
1562
1563irqreturn_t vsc8584_handle_ts_interrupt(struct phy_device *phydev)
1564{
1565 struct vsc8531_private *priv = phydev->priv;
1566 int rc;
1567
1568 mutex_lock(&priv->ts_lock);
1569 rc = vsc85xx_ts_read_csr(phydev, PROCESSOR,
1570 MSCC_PHY_1588_VSC85XX_INT_STATUS);
1571 /* Ack the PTP interrupt */
1572 vsc85xx_ts_write_csr(phydev, PROCESSOR,
1573 MSCC_PHY_1588_VSC85XX_INT_STATUS, rc);
1574
1575 if (!(rc & VSC85XX_1588_INT_MASK_MASK)) {
1576 mutex_unlock(&priv->ts_lock);
1577 return IRQ_NONE;
1578 }
1579
1580 if (rc & VSC85XX_1588_INT_FIFO_ADD) {
1581 vsc85xx_get_tx_ts(priv->ptp);
1582 } else if (rc & VSC85XX_1588_INT_FIFO_OVERFLOW) {
1583 skb_queue_purge(&priv->ptp->tx_queue);
1584 vsc85xx_ts_reset_fifo(phydev);
1585 }
1586
1587 mutex_unlock(&priv->ts_lock);
1588 return IRQ_HANDLED;
1589}
1590
1591int vsc8584_ptp_probe(struct phy_device *phydev)
1592{
1593 struct vsc8531_private *vsc8531 = phydev->priv;
1594
1595 vsc8531->ptp = devm_kzalloc(&phydev->mdio.dev, sizeof(*vsc8531->ptp),
1596 GFP_KERNEL);
1597 if (!vsc8531->ptp)
1598 return -ENOMEM;
1599
1600 mutex_init(&vsc8531->phc_lock);
1601 mutex_init(&vsc8531->ts_lock);
1602 skb_queue_head_init(&vsc8531->rx_skbs_list);
1603 skb_queue_head_init(&vsc8531->ptp->tx_queue);
1604
1605 /* Retrieve the shared load/save GPIO. Request it as non exclusive as
1606 * the same GPIO can be requested by all the PHYs of the same package.
1607 * This GPIO must be used with the gpio_lock taken (the lock is shared
1608 * between all PHYs).
1609 */
1610 vsc8531->load_save = devm_gpiod_get_optional(&phydev->mdio.dev, "load-save",
1611 GPIOD_FLAGS_BIT_NONEXCLUSIVE |
1612 GPIOD_OUT_LOW);
1613 if (IS_ERR(vsc8531->load_save)) {
1614 phydev_err(phydev, "Can't get load-save GPIO (%ld)\n",
1615 PTR_ERR(vsc8531->load_save));
1616 return PTR_ERR(vsc8531->load_save);
1617 }
1618
1619 /* Timestamp selected by default to keep legacy API */
1620 phydev->default_timestamp = true;
1621
1622 vsc8531->ptp->phydev = phydev;
1623
1624 vsc8531->mii_ts.rxtstamp = vsc85xx_rxtstamp;
1625 vsc8531->mii_ts.txtstamp = vsc85xx_txtstamp;
1626 vsc8531->mii_ts.hwtstamp_set = vsc85xx_hwtstamp_set;
1627 vsc8531->mii_ts.hwtstamp_get = vsc85xx_hwtstamp_get;
1628 vsc8531->mii_ts.ts_info = vsc85xx_ts_info;
1629 phydev->mii_ts = &vsc8531->mii_ts;
1630
1631 memcpy(&vsc8531->ptp->caps, &vsc85xx_clk_caps, sizeof(vsc85xx_clk_caps));
1632 vsc8531->ptp->ptp_clock = ptp_clock_register(&vsc8531->ptp->caps,
1633 &phydev->mdio.dev);
1634 return PTR_ERR_OR_ZERO(vsc8531->ptp->ptp_clock);
1635}
1636
1637int vsc8584_ptp_probe_once(struct phy_device *phydev)
1638{
1639 struct vsc85xx_shared_private *shared = phy_package_get_priv(phydev);
1640
1641 /* Initialize shared GPIO lock */
1642 mutex_init(&shared->gpio_lock);
1643
1644 return 0;
1645}