rockchip_canfd-timestamp.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. // SPDX-License-Identifier: GPL-2.0
  2. //
  3. // Copyright (c) 2023, 2024 Pengutronix,
  4. // Marc Kleine-Budde <kernel@pengutronix.de>
  5. //
  6. #include <linux/clocksource.h>
  7. #include "rockchip_canfd.h"
  8. static u64 rkcanfd_timestamp_read(const struct cyclecounter *cc)
  9. {
  10. const struct rkcanfd_priv *priv = container_of(cc, struct rkcanfd_priv, cc);
  11. return rkcanfd_get_timestamp(priv);
  12. }
  13. void rkcanfd_skb_set_timestamp(const struct rkcanfd_priv *priv,
  14. struct sk_buff *skb, const u32 timestamp)
  15. {
  16. struct skb_shared_hwtstamps *hwtstamps = skb_hwtstamps(skb);
  17. u64 ns;
  18. ns = timecounter_cyc2time(&priv->tc, timestamp);
  19. hwtstamps->hwtstamp = ns_to_ktime(ns);
  20. }
  21. static void rkcanfd_timestamp_work(struct work_struct *work)
  22. {
  23. const struct delayed_work *delayed_work = to_delayed_work(work);
  24. struct rkcanfd_priv *priv;
  25. priv = container_of(delayed_work, struct rkcanfd_priv, timestamp);
  26. timecounter_read(&priv->tc);
  27. schedule_delayed_work(&priv->timestamp, priv->work_delay_jiffies);
  28. }
  29. void rkcanfd_timestamp_init(struct rkcanfd_priv *priv)
  30. {
  31. const struct can_bittiming *dbt = &priv->can.data_bittiming;
  32. const struct can_bittiming *bt = &priv->can.bittiming;
  33. struct cyclecounter *cc = &priv->cc;
  34. u32 bitrate, div, reg, rate;
  35. u64 work_delay_ns;
  36. u64 max_cycles;
  37. /* At the standard clock rate of 300Mhz on the rk3658, the 32
  38. * bit timer overflows every 14s. This means that we have to
  39. * poll it quite often to avoid missing a wrap around.
  40. *
  41. * Divide it down to a reasonable rate, at least twice the bit
  42. * rate.
  43. */
  44. bitrate = max(bt->bitrate, dbt->bitrate);
  45. div = min(DIV_ROUND_UP(priv->can.clock.freq, bitrate * 2),
  46. FIELD_MAX(RKCANFD_REG_TIMESTAMP_CTRL_TIME_BASE_COUNTER_PRESCALE) + 1);
  47. reg = FIELD_PREP(RKCANFD_REG_TIMESTAMP_CTRL_TIME_BASE_COUNTER_PRESCALE,
  48. div - 1) |
  49. RKCANFD_REG_TIMESTAMP_CTRL_TIME_BASE_COUNTER_ENABLE;
  50. rkcanfd_write(priv, RKCANFD_REG_TIMESTAMP_CTRL, reg);
  51. cc->read = rkcanfd_timestamp_read;
  52. cc->mask = CYCLECOUNTER_MASK(32);
  53. rate = priv->can.clock.freq / div;
  54. clocks_calc_mult_shift(&cc->mult, &cc->shift, rate, NSEC_PER_SEC,
  55. RKCANFD_TIMESTAMP_WORK_MAX_DELAY_SEC);
  56. max_cycles = div_u64(ULLONG_MAX, cc->mult);
  57. max_cycles = min(max_cycles, cc->mask);
  58. work_delay_ns = clocksource_cyc2ns(max_cycles, cc->mult, cc->shift);
  59. priv->work_delay_jiffies = div_u64(work_delay_ns, 3u * NSEC_PER_SEC / HZ);
  60. INIT_DELAYED_WORK(&priv->timestamp, rkcanfd_timestamp_work);
  61. netdev_dbg(priv->ndev, "clock=%lu.%02luMHz bitrate=%lu.%02luMBit/s div=%u rate=%lu.%02luMHz mult=%u shift=%u delay=%lus\n",
  62. priv->can.clock.freq / MEGA,
  63. priv->can.clock.freq % MEGA / KILO / 10,
  64. bitrate / MEGA,
  65. bitrate % MEGA / KILO / 100,
  66. div,
  67. rate / MEGA,
  68. rate % MEGA / KILO / 10,
  69. cc->mult, cc->shift,
  70. priv->work_delay_jiffies / HZ);
  71. }
  72. void rkcanfd_timestamp_start(struct rkcanfd_priv *priv)
  73. {
  74. timecounter_init(&priv->tc, &priv->cc, ktime_get_real_ns());
  75. schedule_delayed_work(&priv->timestamp, priv->work_delay_jiffies);
  76. }
  77. void rkcanfd_timestamp_stop(struct rkcanfd_priv *priv)
  78. {
  79. cancel_delayed_work(&priv->timestamp);
  80. }
  81. void rkcanfd_timestamp_stop_sync(struct rkcanfd_priv *priv)
  82. {
  83. cancel_delayed_work_sync(&priv->timestamp);
  84. }