ravb_ptp.c 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /* PTP 1588 clock using the Renesas Ethernet AVB
  3. *
  4. * Copyright (C) 2013-2015 Renesas Electronics Corporation
  5. * Copyright (C) 2015 Renesas Solutions Corp.
  6. * Copyright (C) 2015-2016 Cogent Embedded, Inc. <source@cogentembedded.com>
  7. */
  8. #include "ravb.h"
  9. static int ravb_ptp_tcr_request(struct ravb_private *priv, u32 request)
  10. {
  11. struct net_device *ndev = priv->ndev;
  12. int error;
  13. error = ravb_wait(ndev, GCCR, GCCR_TCR, GCCR_TCR_NOREQ);
  14. if (error)
  15. return error;
  16. ravb_modify(ndev, GCCR, request, request);
  17. return ravb_wait(ndev, GCCR, GCCR_TCR, GCCR_TCR_NOREQ);
  18. }
  19. /* Caller must hold the lock */
  20. static int ravb_ptp_time_read(struct ravb_private *priv, struct timespec64 *ts)
  21. {
  22. struct net_device *ndev = priv->ndev;
  23. int error;
  24. error = ravb_ptp_tcr_request(priv, GCCR_TCR_CAPTURE);
  25. if (error)
  26. return error;
  27. ts->tv_nsec = ravb_read(ndev, GCT0);
  28. ts->tv_sec = ravb_read(ndev, GCT1) |
  29. ((s64)ravb_read(ndev, GCT2) << 32);
  30. return 0;
  31. }
  32. /* Caller must hold the lock */
  33. static int ravb_ptp_time_write(struct ravb_private *priv,
  34. const struct timespec64 *ts)
  35. {
  36. struct net_device *ndev = priv->ndev;
  37. int error;
  38. u32 gccr;
  39. error = ravb_ptp_tcr_request(priv, GCCR_TCR_RESET);
  40. if (error)
  41. return error;
  42. gccr = ravb_read(ndev, GCCR);
  43. if (gccr & GCCR_LTO)
  44. return -EBUSY;
  45. ravb_write(ndev, ts->tv_nsec, GTO0);
  46. ravb_write(ndev, ts->tv_sec, GTO1);
  47. ravb_write(ndev, (ts->tv_sec >> 32) & 0xffff, GTO2);
  48. ravb_write(ndev, gccr | GCCR_LTO, GCCR);
  49. return 0;
  50. }
  51. /* Caller must hold the lock */
  52. static int ravb_ptp_update_compare(struct ravb_private *priv, u32 ns)
  53. {
  54. struct net_device *ndev = priv->ndev;
  55. /* When the comparison value (GPTC.PTCV) is in range of
  56. * [x-1 to x+1] (x is the configured increment value in
  57. * GTI.TIV), it may happen that a comparison match is
  58. * not detected when the timer wraps around.
  59. */
  60. u32 gti_ns_plus_1 = (priv->ptp.current_addend >> 20) + 1;
  61. u32 gccr;
  62. if (ns < gti_ns_plus_1)
  63. ns = gti_ns_plus_1;
  64. else if (ns > 0 - gti_ns_plus_1)
  65. ns = 0 - gti_ns_plus_1;
  66. gccr = ravb_read(ndev, GCCR);
  67. if (gccr & GCCR_LPTC)
  68. return -EBUSY;
  69. ravb_write(ndev, ns, GPTC);
  70. ravb_write(ndev, gccr | GCCR_LPTC, GCCR);
  71. return 0;
  72. }
  73. /* PTP clock operations */
  74. static int ravb_ptp_adjfine(struct ptp_clock_info *ptp, long scaled_ppm)
  75. {
  76. struct ravb_private *priv = container_of(ptp, struct ravb_private,
  77. ptp.info);
  78. struct net_device *ndev = priv->ndev;
  79. unsigned long flags;
  80. u32 addend;
  81. u32 gccr;
  82. addend = (u32)adjust_by_scaled_ppm(priv->ptp.default_addend,
  83. scaled_ppm);
  84. spin_lock_irqsave(&priv->lock, flags);
  85. priv->ptp.current_addend = addend;
  86. gccr = ravb_read(ndev, GCCR);
  87. if (gccr & GCCR_LTI) {
  88. spin_unlock_irqrestore(&priv->lock, flags);
  89. return -EBUSY;
  90. }
  91. ravb_write(ndev, addend & GTI_TIV, GTI);
  92. ravb_write(ndev, gccr | GCCR_LTI, GCCR);
  93. spin_unlock_irqrestore(&priv->lock, flags);
  94. return 0;
  95. }
  96. static int ravb_ptp_adjtime(struct ptp_clock_info *ptp, s64 delta)
  97. {
  98. struct ravb_private *priv = container_of(ptp, struct ravb_private,
  99. ptp.info);
  100. struct timespec64 ts;
  101. unsigned long flags;
  102. int error;
  103. spin_lock_irqsave(&priv->lock, flags);
  104. error = ravb_ptp_time_read(priv, &ts);
  105. if (!error) {
  106. u64 now = ktime_to_ns(timespec64_to_ktime(ts));
  107. ts = ns_to_timespec64(now + delta);
  108. error = ravb_ptp_time_write(priv, &ts);
  109. }
  110. spin_unlock_irqrestore(&priv->lock, flags);
  111. return error;
  112. }
  113. static int ravb_ptp_gettime64(struct ptp_clock_info *ptp, struct timespec64 *ts)
  114. {
  115. struct ravb_private *priv = container_of(ptp, struct ravb_private,
  116. ptp.info);
  117. unsigned long flags;
  118. int error;
  119. spin_lock_irqsave(&priv->lock, flags);
  120. error = ravb_ptp_time_read(priv, ts);
  121. spin_unlock_irqrestore(&priv->lock, flags);
  122. return error;
  123. }
  124. static int ravb_ptp_settime64(struct ptp_clock_info *ptp,
  125. const struct timespec64 *ts)
  126. {
  127. struct ravb_private *priv = container_of(ptp, struct ravb_private,
  128. ptp.info);
  129. unsigned long flags;
  130. int error;
  131. spin_lock_irqsave(&priv->lock, flags);
  132. error = ravb_ptp_time_write(priv, ts);
  133. spin_unlock_irqrestore(&priv->lock, flags);
  134. return error;
  135. }
  136. static int ravb_ptp_extts(struct ptp_clock_info *ptp,
  137. struct ptp_extts_request *req, int on)
  138. {
  139. struct ravb_private *priv = container_of(ptp, struct ravb_private,
  140. ptp.info);
  141. const struct ravb_hw_info *info = priv->info;
  142. struct net_device *ndev = priv->ndev;
  143. unsigned long flags;
  144. if (req->index)
  145. return -EINVAL;
  146. if (priv->ptp.extts[req->index] == on)
  147. return 0;
  148. priv->ptp.extts[req->index] = on;
  149. spin_lock_irqsave(&priv->lock, flags);
  150. if (!info->irq_en_dis)
  151. ravb_modify(ndev, GIC, GIC_PTCE, on ? GIC_PTCE : 0);
  152. else if (on)
  153. ravb_write(ndev, GIE_PTCS, GIE);
  154. else
  155. ravb_write(ndev, GID_PTCD, GID);
  156. spin_unlock_irqrestore(&priv->lock, flags);
  157. return 0;
  158. }
  159. static int ravb_ptp_perout(struct ptp_clock_info *ptp,
  160. struct ptp_perout_request *req, int on)
  161. {
  162. struct ravb_private *priv = container_of(ptp, struct ravb_private,
  163. ptp.info);
  164. const struct ravb_hw_info *info = priv->info;
  165. struct net_device *ndev = priv->ndev;
  166. struct ravb_ptp_perout *perout;
  167. unsigned long flags;
  168. int error = 0;
  169. if (req->index)
  170. return -EINVAL;
  171. if (on) {
  172. u64 start_ns;
  173. u64 period_ns;
  174. start_ns = req->start.sec * NSEC_PER_SEC + req->start.nsec;
  175. period_ns = req->period.sec * NSEC_PER_SEC + req->period.nsec;
  176. if (start_ns > U32_MAX) {
  177. netdev_warn(ndev,
  178. "ptp: start value (nsec) is over limit. Maximum size of start is only 32 bits\n");
  179. return -ERANGE;
  180. }
  181. if (period_ns > U32_MAX) {
  182. netdev_warn(ndev,
  183. "ptp: period value (nsec) is over limit. Maximum size of period is only 32 bits\n");
  184. return -ERANGE;
  185. }
  186. spin_lock_irqsave(&priv->lock, flags);
  187. perout = &priv->ptp.perout[req->index];
  188. perout->target = (u32)start_ns;
  189. perout->period = (u32)period_ns;
  190. error = ravb_ptp_update_compare(priv, (u32)start_ns);
  191. if (!error) {
  192. /* Unmask interrupt */
  193. if (!info->irq_en_dis)
  194. ravb_modify(ndev, GIC, GIC_PTME, GIC_PTME);
  195. else
  196. ravb_write(ndev, GIE_PTMS0, GIE);
  197. }
  198. } else {
  199. spin_lock_irqsave(&priv->lock, flags);
  200. perout = &priv->ptp.perout[req->index];
  201. perout->period = 0;
  202. /* Mask interrupt */
  203. if (!info->irq_en_dis)
  204. ravb_modify(ndev, GIC, GIC_PTME, 0);
  205. else
  206. ravb_write(ndev, GID_PTMD0, GID);
  207. }
  208. spin_unlock_irqrestore(&priv->lock, flags);
  209. return error;
  210. }
  211. static int ravb_ptp_enable(struct ptp_clock_info *ptp,
  212. struct ptp_clock_request *req, int on)
  213. {
  214. switch (req->type) {
  215. case PTP_CLK_REQ_EXTTS:
  216. return ravb_ptp_extts(ptp, &req->extts, on);
  217. case PTP_CLK_REQ_PEROUT:
  218. return ravb_ptp_perout(ptp, &req->perout, on);
  219. default:
  220. return -EOPNOTSUPP;
  221. }
  222. }
  223. static const struct ptp_clock_info ravb_ptp_info = {
  224. .owner = THIS_MODULE,
  225. .name = "ravb clock",
  226. .max_adj = 50000000,
  227. .n_ext_ts = N_EXT_TS,
  228. .n_per_out = N_PER_OUT,
  229. .supported_extts_flags = PTP_RISING_EDGE | PTP_FALLING_EDGE,
  230. .adjfine = ravb_ptp_adjfine,
  231. .adjtime = ravb_ptp_adjtime,
  232. .gettime64 = ravb_ptp_gettime64,
  233. .settime64 = ravb_ptp_settime64,
  234. .enable = ravb_ptp_enable,
  235. };
  236. /* Caller must hold the lock */
  237. void ravb_ptp_interrupt(struct net_device *ndev)
  238. {
  239. struct ravb_private *priv = netdev_priv(ndev);
  240. u32 gis = ravb_read(ndev, GIS);
  241. gis &= ravb_read(ndev, GIC);
  242. if (gis & GIS_PTCF) {
  243. struct ptp_clock_event event;
  244. event.type = PTP_CLOCK_EXTTS;
  245. event.index = 0;
  246. event.timestamp = ravb_read(ndev, GCPT);
  247. ptp_clock_event(priv->ptp.clock, &event);
  248. }
  249. if (gis & GIS_PTMF) {
  250. struct ravb_ptp_perout *perout = priv->ptp.perout;
  251. if (perout->period) {
  252. perout->target += perout->period;
  253. ravb_ptp_update_compare(priv, perout->target);
  254. }
  255. }
  256. ravb_write(ndev, ~(gis | GIS_RESERVED), GIS);
  257. }
  258. void ravb_ptp_init(struct net_device *ndev, struct platform_device *pdev)
  259. {
  260. struct ravb_private *priv = netdev_priv(ndev);
  261. unsigned long flags;
  262. priv->ptp.info = ravb_ptp_info;
  263. priv->ptp.default_addend = ravb_read(ndev, GTI);
  264. priv->ptp.current_addend = priv->ptp.default_addend;
  265. spin_lock_irqsave(&priv->lock, flags);
  266. ravb_wait(ndev, GCCR, GCCR_TCR, GCCR_TCR_NOREQ);
  267. ravb_modify(ndev, GCCR, GCCR_TCSS, GCCR_TCSS_ADJGPTP);
  268. spin_unlock_irqrestore(&priv->lock, flags);
  269. priv->ptp.clock = ptp_clock_register(&priv->ptp.info, &pdev->dev);
  270. }
  271. void ravb_ptp_stop(struct net_device *ndev)
  272. {
  273. struct ravb_private *priv = netdev_priv(ndev);
  274. ravb_write(ndev, 0, GIC);
  275. ravb_write(ndev, 0, GIS);
  276. ptp_clock_unregister(priv->ptp.clock);
  277. }