macb_ptp.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * 1588 PTP support for Cadence GEM device.
  4. *
  5. * Copyright (C) 2017 Cadence Design Systems - https://www.cadence.com
  6. *
  7. * Authors: Rafal Ozieblo <[email protected]>
  8. * Bartosz Folta <[email protected]>
  9. */
  10. #include <linux/kernel.h>
  11. #include <linux/types.h>
  12. #include <linux/clk.h>
  13. #include <linux/device.h>
  14. #include <linux/etherdevice.h>
  15. #include <linux/platform_device.h>
  16. #include <linux/time64.h>
  17. #include <linux/ptp_classify.h>
  18. #include <linux/if_ether.h>
  19. #include <linux/if_vlan.h>
  20. #include <linux/net_tstamp.h>
  21. #include <linux/circ_buf.h>
  22. #include <linux/spinlock.h>
  23. #include "macb.h"
  24. #define GEM_PTP_TIMER_NAME "gem-ptp-timer"
  25. static struct macb_dma_desc_ptp *macb_ptp_desc(struct macb *bp,
  26. struct macb_dma_desc *desc)
  27. {
  28. if (bp->hw_dma_cap == HW_DMA_CAP_PTP)
  29. return (struct macb_dma_desc_ptp *)
  30. ((u8 *)desc + sizeof(struct macb_dma_desc));
  31. if (bp->hw_dma_cap == HW_DMA_CAP_64B_PTP)
  32. return (struct macb_dma_desc_ptp *)
  33. ((u8 *)desc + sizeof(struct macb_dma_desc)
  34. + sizeof(struct macb_dma_desc_64));
  35. return NULL;
  36. }
  37. static int gem_tsu_get_time(struct ptp_clock_info *ptp, struct timespec64 *ts,
  38. struct ptp_system_timestamp *sts)
  39. {
  40. struct macb *bp = container_of(ptp, struct macb, ptp_clock_info);
  41. unsigned long flags;
  42. long first, second;
  43. u32 secl, sech;
  44. spin_lock_irqsave(&bp->tsu_clk_lock, flags);
  45. ptp_read_system_prets(sts);
  46. first = gem_readl(bp, TN);
  47. ptp_read_system_postts(sts);
  48. secl = gem_readl(bp, TSL);
  49. sech = gem_readl(bp, TSH);
  50. second = gem_readl(bp, TN);
  51. /* test for nsec rollover */
  52. if (first > second) {
  53. /* if so, use later read & re-read seconds
  54. * (assume all done within 1s)
  55. */
  56. ptp_read_system_prets(sts);
  57. ts->tv_nsec = gem_readl(bp, TN);
  58. ptp_read_system_postts(sts);
  59. secl = gem_readl(bp, TSL);
  60. sech = gem_readl(bp, TSH);
  61. } else {
  62. ts->tv_nsec = first;
  63. }
  64. spin_unlock_irqrestore(&bp->tsu_clk_lock, flags);
  65. ts->tv_sec = (((u64)sech << GEM_TSL_SIZE) | secl)
  66. & TSU_SEC_MAX_VAL;
  67. return 0;
  68. }
  69. static int gem_tsu_set_time(struct ptp_clock_info *ptp,
  70. const struct timespec64 *ts)
  71. {
  72. struct macb *bp = container_of(ptp, struct macb, ptp_clock_info);
  73. unsigned long flags;
  74. u32 ns, sech, secl;
  75. secl = (u32)ts->tv_sec;
  76. sech = (ts->tv_sec >> GEM_TSL_SIZE) & ((1 << GEM_TSH_SIZE) - 1);
  77. ns = ts->tv_nsec;
  78. spin_lock_irqsave(&bp->tsu_clk_lock, flags);
  79. /* TSH doesn't latch the time and no atomicity! */
  80. gem_writel(bp, TN, 0); /* clear to avoid overflow */
  81. gem_writel(bp, TSH, sech);
  82. /* write lower bits 2nd, for synchronized secs update */
  83. gem_writel(bp, TSL, secl);
  84. gem_writel(bp, TN, ns);
  85. spin_unlock_irqrestore(&bp->tsu_clk_lock, flags);
  86. return 0;
  87. }
  88. static int gem_tsu_incr_set(struct macb *bp, struct tsu_incr *incr_spec)
  89. {
  90. unsigned long flags;
  91. /* tsu_timer_incr register must be written after
  92. * the tsu_timer_incr_sub_ns register and the write operation
  93. * will cause the value written to the tsu_timer_incr_sub_ns register
  94. * to take effect.
  95. */
  96. spin_lock_irqsave(&bp->tsu_clk_lock, flags);
  97. /* RegBit[15:0] = Subns[23:8]; RegBit[31:24] = Subns[7:0] */
  98. gem_writel(bp, TISUBN, GEM_BF(SUBNSINCRL, incr_spec->sub_ns) |
  99. GEM_BF(SUBNSINCRH, (incr_spec->sub_ns >>
  100. GEM_SUBNSINCRL_SIZE)));
  101. gem_writel(bp, TI, GEM_BF(NSINCR, incr_spec->ns));
  102. spin_unlock_irqrestore(&bp->tsu_clk_lock, flags);
  103. return 0;
  104. }
  105. static int gem_ptp_adjfine(struct ptp_clock_info *ptp, long scaled_ppm)
  106. {
  107. struct macb *bp = container_of(ptp, struct macb, ptp_clock_info);
  108. struct tsu_incr incr_spec;
  109. bool neg_adj = false;
  110. u32 word;
  111. u64 adj;
  112. if (scaled_ppm < 0) {
  113. neg_adj = true;
  114. scaled_ppm = -scaled_ppm;
  115. }
  116. /* Adjustment is relative to base frequency */
  117. incr_spec.sub_ns = bp->tsu_incr.sub_ns;
  118. incr_spec.ns = bp->tsu_incr.ns;
  119. /* scaling: unused(8bit) | ns(8bit) | fractions(16bit) */
  120. word = ((u64)incr_spec.ns << GEM_SUBNSINCR_SIZE) + incr_spec.sub_ns;
  121. adj = (u64)scaled_ppm * word;
  122. /* Divide with rounding, equivalent to floating dividing:
  123. * (temp / USEC_PER_SEC) + 0.5
  124. */
  125. adj += (USEC_PER_SEC >> 1);
  126. adj >>= PPM_FRACTION; /* remove fractions */
  127. adj = div_u64(adj, USEC_PER_SEC);
  128. adj = neg_adj ? (word - adj) : (word + adj);
  129. incr_spec.ns = (adj >> GEM_SUBNSINCR_SIZE)
  130. & ((1 << GEM_NSINCR_SIZE) - 1);
  131. incr_spec.sub_ns = adj & ((1 << GEM_SUBNSINCR_SIZE) - 1);
  132. gem_tsu_incr_set(bp, &incr_spec);
  133. return 0;
  134. }
  135. static int gem_ptp_adjtime(struct ptp_clock_info *ptp, s64 delta)
  136. {
  137. struct macb *bp = container_of(ptp, struct macb, ptp_clock_info);
  138. struct timespec64 now, then = ns_to_timespec64(delta);
  139. u32 adj, sign = 0;
  140. if (delta < 0) {
  141. sign = 1;
  142. delta = -delta;
  143. }
  144. if (delta > TSU_NSEC_MAX_VAL) {
  145. gem_tsu_get_time(&bp->ptp_clock_info, &now, NULL);
  146. now = timespec64_add(now, then);
  147. gem_tsu_set_time(&bp->ptp_clock_info,
  148. (const struct timespec64 *)&now);
  149. } else {
  150. adj = (sign << GEM_ADDSUB_OFFSET) | delta;
  151. gem_writel(bp, TA, adj);
  152. }
  153. return 0;
  154. }
  155. static int gem_ptp_enable(struct ptp_clock_info *ptp,
  156. struct ptp_clock_request *rq, int on)
  157. {
  158. return -EOPNOTSUPP;
  159. }
  160. static const struct ptp_clock_info gem_ptp_caps_template = {
  161. .owner = THIS_MODULE,
  162. .name = GEM_PTP_TIMER_NAME,
  163. .max_adj = 0,
  164. .n_alarm = 0,
  165. .n_ext_ts = 0,
  166. .n_per_out = 0,
  167. .n_pins = 0,
  168. .pps = 1,
  169. .adjfine = gem_ptp_adjfine,
  170. .adjtime = gem_ptp_adjtime,
  171. .gettimex64 = gem_tsu_get_time,
  172. .settime64 = gem_tsu_set_time,
  173. .enable = gem_ptp_enable,
  174. };
  175. static void gem_ptp_init_timer(struct macb *bp)
  176. {
  177. u32 rem = 0;
  178. u64 adj;
  179. bp->tsu_incr.ns = div_u64_rem(NSEC_PER_SEC, bp->tsu_rate, &rem);
  180. if (rem) {
  181. adj = rem;
  182. adj <<= GEM_SUBNSINCR_SIZE;
  183. bp->tsu_incr.sub_ns = div_u64(adj, bp->tsu_rate);
  184. } else {
  185. bp->tsu_incr.sub_ns = 0;
  186. }
  187. }
  188. static void gem_ptp_init_tsu(struct macb *bp)
  189. {
  190. struct timespec64 ts;
  191. /* 1. get current system time */
  192. ts = ns_to_timespec64(ktime_to_ns(ktime_get_real()));
  193. /* 2. set ptp timer */
  194. gem_tsu_set_time(&bp->ptp_clock_info, &ts);
  195. /* 3. set PTP timer increment value to BASE_INCREMENT */
  196. gem_tsu_incr_set(bp, &bp->tsu_incr);
  197. gem_writel(bp, TA, 0);
  198. }
  199. static void gem_ptp_clear_timer(struct macb *bp)
  200. {
  201. bp->tsu_incr.sub_ns = 0;
  202. bp->tsu_incr.ns = 0;
  203. gem_writel(bp, TISUBN, GEM_BF(SUBNSINCR, 0));
  204. gem_writel(bp, TI, GEM_BF(NSINCR, 0));
  205. gem_writel(bp, TA, 0);
  206. }
  207. static int gem_hw_timestamp(struct macb *bp, u32 dma_desc_ts_1,
  208. u32 dma_desc_ts_2, struct timespec64 *ts)
  209. {
  210. struct timespec64 tsu;
  211. ts->tv_sec = (GEM_BFEXT(DMA_SECH, dma_desc_ts_2) << GEM_DMA_SECL_SIZE) |
  212. GEM_BFEXT(DMA_SECL, dma_desc_ts_1);
  213. ts->tv_nsec = GEM_BFEXT(DMA_NSEC, dma_desc_ts_1);
  214. /* TSU overlapping workaround
  215. * The timestamp only contains lower few bits of seconds,
  216. * so add value from 1588 timer
  217. */
  218. gem_tsu_get_time(&bp->ptp_clock_info, &tsu, NULL);
  219. /* If the top bit is set in the timestamp,
  220. * but not in 1588 timer, it has rolled over,
  221. * so subtract max size
  222. */
  223. if ((ts->tv_sec & (GEM_DMA_SEC_TOP >> 1)) &&
  224. !(tsu.tv_sec & (GEM_DMA_SEC_TOP >> 1)))
  225. ts->tv_sec -= GEM_DMA_SEC_TOP;
  226. ts->tv_sec += ((~GEM_DMA_SEC_MASK) & tsu.tv_sec);
  227. return 0;
  228. }
  229. void gem_ptp_rxstamp(struct macb *bp, struct sk_buff *skb,
  230. struct macb_dma_desc *desc)
  231. {
  232. struct skb_shared_hwtstamps *shhwtstamps = skb_hwtstamps(skb);
  233. struct macb_dma_desc_ptp *desc_ptp;
  234. struct timespec64 ts;
  235. if (GEM_BFEXT(DMA_RXVALID, desc->addr)) {
  236. desc_ptp = macb_ptp_desc(bp, desc);
  237. /* Unlikely but check */
  238. if (!desc_ptp) {
  239. dev_warn_ratelimited(&bp->pdev->dev,
  240. "Timestamp not supported in BD\n");
  241. return;
  242. }
  243. gem_hw_timestamp(bp, desc_ptp->ts_1, desc_ptp->ts_2, &ts);
  244. memset(shhwtstamps, 0, sizeof(struct skb_shared_hwtstamps));
  245. shhwtstamps->hwtstamp = ktime_set(ts.tv_sec, ts.tv_nsec);
  246. }
  247. }
  248. static void gem_tstamp_tx(struct macb *bp, struct sk_buff *skb,
  249. struct macb_dma_desc_ptp *desc_ptp)
  250. {
  251. struct skb_shared_hwtstamps shhwtstamps;
  252. struct timespec64 ts;
  253. gem_hw_timestamp(bp, desc_ptp->ts_1, desc_ptp->ts_2, &ts);
  254. memset(&shhwtstamps, 0, sizeof(shhwtstamps));
  255. shhwtstamps.hwtstamp = ktime_set(ts.tv_sec, ts.tv_nsec);
  256. skb_tstamp_tx(skb, &shhwtstamps);
  257. }
  258. int gem_ptp_txstamp(struct macb_queue *queue, struct sk_buff *skb,
  259. struct macb_dma_desc *desc)
  260. {
  261. unsigned long tail = READ_ONCE(queue->tx_ts_tail);
  262. unsigned long head = queue->tx_ts_head;
  263. struct macb_dma_desc_ptp *desc_ptp;
  264. struct gem_tx_ts *tx_timestamp;
  265. if (!GEM_BFEXT(DMA_TXVALID, desc->ctrl))
  266. return -EINVAL;
  267. if (CIRC_SPACE(head, tail, PTP_TS_BUFFER_SIZE) == 0)
  268. return -ENOMEM;
  269. desc_ptp = macb_ptp_desc(queue->bp, desc);
  270. /* Unlikely but check */
  271. if (!desc_ptp)
  272. return -EINVAL;
  273. skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
  274. tx_timestamp = &queue->tx_timestamps[head];
  275. tx_timestamp->skb = skb;
  276. /* ensure ts_1/ts_2 is loaded after ctrl (TX_USED check) */
  277. dma_rmb();
  278. tx_timestamp->desc_ptp.ts_1 = desc_ptp->ts_1;
  279. tx_timestamp->desc_ptp.ts_2 = desc_ptp->ts_2;
  280. /* move head */
  281. smp_store_release(&queue->tx_ts_head,
  282. (head + 1) & (PTP_TS_BUFFER_SIZE - 1));
  283. schedule_work(&queue->tx_ts_task);
  284. return 0;
  285. }
  286. static void gem_tx_timestamp_flush(struct work_struct *work)
  287. {
  288. struct macb_queue *queue =
  289. container_of(work, struct macb_queue, tx_ts_task);
  290. unsigned long head, tail;
  291. struct gem_tx_ts *tx_ts;
  292. /* take current head */
  293. head = smp_load_acquire(&queue->tx_ts_head);
  294. tail = queue->tx_ts_tail;
  295. while (CIRC_CNT(head, tail, PTP_TS_BUFFER_SIZE)) {
  296. tx_ts = &queue->tx_timestamps[tail];
  297. gem_tstamp_tx(queue->bp, tx_ts->skb, &tx_ts->desc_ptp);
  298. /* cleanup */
  299. dev_kfree_skb_any(tx_ts->skb);
  300. /* remove old tail */
  301. smp_store_release(&queue->tx_ts_tail,
  302. (tail + 1) & (PTP_TS_BUFFER_SIZE - 1));
  303. tail = queue->tx_ts_tail;
  304. }
  305. }
  306. void gem_ptp_init(struct net_device *dev)
  307. {
  308. struct macb *bp = netdev_priv(dev);
  309. struct macb_queue *queue;
  310. unsigned int q;
  311. bp->ptp_clock_info = gem_ptp_caps_template;
  312. /* nominal frequency and maximum adjustment in ppb */
  313. bp->tsu_rate = bp->ptp_info->get_tsu_rate(bp);
  314. bp->ptp_clock_info.max_adj = bp->ptp_info->get_ptp_max_adj();
  315. gem_ptp_init_timer(bp);
  316. bp->ptp_clock = ptp_clock_register(&bp->ptp_clock_info, &dev->dev);
  317. if (IS_ERR(bp->ptp_clock)) {
  318. pr_err("ptp clock register failed: %ld\n",
  319. PTR_ERR(bp->ptp_clock));
  320. bp->ptp_clock = NULL;
  321. return;
  322. } else if (bp->ptp_clock == NULL) {
  323. pr_err("ptp clock register failed\n");
  324. return;
  325. }
  326. spin_lock_init(&bp->tsu_clk_lock);
  327. for (q = 0, queue = bp->queues; q < bp->num_queues; ++q, ++queue) {
  328. queue->tx_ts_head = 0;
  329. queue->tx_ts_tail = 0;
  330. INIT_WORK(&queue->tx_ts_task, gem_tx_timestamp_flush);
  331. }
  332. gem_ptp_init_tsu(bp);
  333. dev_info(&bp->pdev->dev, "%s ptp clock registered.\n",
  334. GEM_PTP_TIMER_NAME);
  335. }
  336. void gem_ptp_remove(struct net_device *ndev)
  337. {
  338. struct macb *bp = netdev_priv(ndev);
  339. if (bp->ptp_clock)
  340. ptp_clock_unregister(bp->ptp_clock);
  341. gem_ptp_clear_timer(bp);
  342. dev_info(&bp->pdev->dev, "%s ptp clock unregistered.\n",
  343. GEM_PTP_TIMER_NAME);
  344. }
  345. static int gem_ptp_set_ts_mode(struct macb *bp,
  346. enum macb_bd_control tx_bd_control,
  347. enum macb_bd_control rx_bd_control)
  348. {
  349. gem_writel(bp, TXBDCTRL, GEM_BF(TXTSMODE, tx_bd_control));
  350. gem_writel(bp, RXBDCTRL, GEM_BF(RXTSMODE, rx_bd_control));
  351. return 0;
  352. }
  353. int gem_get_hwtst(struct net_device *dev, struct ifreq *rq)
  354. {
  355. struct hwtstamp_config *tstamp_config;
  356. struct macb *bp = netdev_priv(dev);
  357. tstamp_config = &bp->tstamp_config;
  358. if ((bp->hw_dma_cap & HW_DMA_CAP_PTP) == 0)
  359. return -EOPNOTSUPP;
  360. if (copy_to_user(rq->ifr_data, tstamp_config, sizeof(*tstamp_config)))
  361. return -EFAULT;
  362. else
  363. return 0;
  364. }
  365. static void gem_ptp_set_one_step_sync(struct macb *bp, u8 enable)
  366. {
  367. u32 reg_val;
  368. reg_val = macb_readl(bp, NCR);
  369. if (enable)
  370. macb_writel(bp, NCR, reg_val | MACB_BIT(OSSMODE));
  371. else
  372. macb_writel(bp, NCR, reg_val & ~MACB_BIT(OSSMODE));
  373. }
  374. int gem_set_hwtst(struct net_device *dev, struct ifreq *ifr, int cmd)
  375. {
  376. enum macb_bd_control tx_bd_control = TSTAMP_DISABLED;
  377. enum macb_bd_control rx_bd_control = TSTAMP_DISABLED;
  378. struct hwtstamp_config *tstamp_config;
  379. struct macb *bp = netdev_priv(dev);
  380. u32 regval;
  381. tstamp_config = &bp->tstamp_config;
  382. if ((bp->hw_dma_cap & HW_DMA_CAP_PTP) == 0)
  383. return -EOPNOTSUPP;
  384. if (copy_from_user(tstamp_config, ifr->ifr_data,
  385. sizeof(*tstamp_config)))
  386. return -EFAULT;
  387. switch (tstamp_config->tx_type) {
  388. case HWTSTAMP_TX_OFF:
  389. break;
  390. case HWTSTAMP_TX_ONESTEP_SYNC:
  391. gem_ptp_set_one_step_sync(bp, 1);
  392. tx_bd_control = TSTAMP_ALL_FRAMES;
  393. break;
  394. case HWTSTAMP_TX_ON:
  395. gem_ptp_set_one_step_sync(bp, 0);
  396. tx_bd_control = TSTAMP_ALL_FRAMES;
  397. break;
  398. default:
  399. return -ERANGE;
  400. }
  401. switch (tstamp_config->rx_filter) {
  402. case HWTSTAMP_FILTER_NONE:
  403. break;
  404. case HWTSTAMP_FILTER_PTP_V1_L4_SYNC:
  405. break;
  406. case HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ:
  407. break;
  408. case HWTSTAMP_FILTER_PTP_V2_EVENT:
  409. case HWTSTAMP_FILTER_PTP_V2_L2_EVENT:
  410. case HWTSTAMP_FILTER_PTP_V2_L4_EVENT:
  411. case HWTSTAMP_FILTER_PTP_V2_SYNC:
  412. case HWTSTAMP_FILTER_PTP_V2_L2_SYNC:
  413. case HWTSTAMP_FILTER_PTP_V2_L4_SYNC:
  414. case HWTSTAMP_FILTER_PTP_V2_DELAY_REQ:
  415. case HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ:
  416. case HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ:
  417. rx_bd_control = TSTAMP_ALL_PTP_FRAMES;
  418. tstamp_config->rx_filter = HWTSTAMP_FILTER_PTP_V2_EVENT;
  419. regval = macb_readl(bp, NCR);
  420. macb_writel(bp, NCR, (regval | MACB_BIT(SRTSM)));
  421. break;
  422. case HWTSTAMP_FILTER_PTP_V1_L4_EVENT:
  423. case HWTSTAMP_FILTER_ALL:
  424. rx_bd_control = TSTAMP_ALL_FRAMES;
  425. tstamp_config->rx_filter = HWTSTAMP_FILTER_ALL;
  426. break;
  427. default:
  428. tstamp_config->rx_filter = HWTSTAMP_FILTER_NONE;
  429. return -ERANGE;
  430. }
  431. if (gem_ptp_set_ts_mode(bp, tx_bd_control, rx_bd_control) != 0)
  432. return -ERANGE;
  433. if (copy_to_user(ifr->ifr_data, tstamp_config, sizeof(*tstamp_config)))
  434. return -EFAULT;
  435. else
  436. return 0;
  437. }