1. 21 8月, 2020 1 次提交
  2. 23 7月, 2020 2 次提交
  3. 18 6月, 2020 1 次提交
  4. 23 5月, 2020 2 次提交
  5. 27 4月, 2020 2 次提交
  6. 27 2月, 2020 1 次提交
  7. 17 1月, 2020 3 次提交
  8. 04 11月, 2019 1 次提交
  9. 27 8月, 2019 1 次提交
  10. 09 8月, 2019 1 次提交
    • P
      clocksource: Add a new timer-ingenic driver · 34e93683
      Paul Cercueil 提交于
      This driver handles the TCU (Timer Counter Unit) present on the Ingenic
      JZ47xx SoCs, and provides the kernel with a system timer, a clocksource
      and a sched_clock.
      Signed-off-by: NPaul Cercueil <paul@crapouillou.net>
      Tested-by: NMathieu Malaterre <malat@debian.org>
      Tested-by: NArtur Rojek <contact@artur-rojek.eu>
      Reviewed-by: NThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: NPaul Burton <paul.burton@mips.com>
      Cc: Ralf Baechle <ralf@linux-mips.org>
      Cc: James Hogan <jhogan@kernel.org>
      Cc: Jonathan Corbet <corbet@lwn.net>
      Cc: Lee Jones <lee.jones@linaro.org>
      Cc: Arnd Bergmann <arnd@arndb.de>
      Cc: Daniel Lezcano <daniel.lezcano@linaro.org>
      Cc: Michael Turquette <mturquette@baylibre.com>
      Cc: Stephen Boyd <sboyd@kernel.org>
      Cc: Jason Cooper <jason@lakedaemon.net>
      Cc: Marc Zyngier <marc.zyngier@arm.com>
      Cc: Rob Herring <robh+dt@kernel.org>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: devicetree@vger.kernel.org
      Cc: linux-kernel@vger.kernel.org
      Cc: linux-doc@vger.kernel.org
      Cc: linux-mips@vger.kernel.org
      Cc: linux-clk@vger.kernel.org
      Cc: od@zcrc.me
      34e93683
  11. 26 6月, 2019 3 次提交
  12. 21 5月, 2019 1 次提交
  13. 03 5月, 2019 3 次提交
  14. 23 4月, 2019 1 次提交
  15. 12 4月, 2019 1 次提交
  16. 01 3月, 2019 1 次提交
  17. 23 2月, 2019 2 次提交
    • J
      clocksource/drivers/tegra: Add Tegra210 timer support · b4822dc7
      Joseph Lo 提交于
      Add support for the Tegra210 timer that runs at oscillator clock
      (TMR10-TMR13). We need these timers to work as clock event device and to
      replace the ARMv8 architected timer due to it can't survive across the
      power cycle of the CPU core or CPUPORESET signal. So it can't be a wake-up
      source when CPU suspends in power down state.
      
      Also convert the original driver to use timer-of API.
      
      Cc: Daniel Lezcano <daniel.lezcano@linaro.org>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: linux-kernel@vger.kernel.org
      Signed-off-by: NJoseph Lo <josephl@nvidia.com>
      Acked-by: NThierry Reding <treding@nvidia.com>
      Acked-by: NJon Hunter <jonathanh@nvidia.com>
      Acked-by: NDaniel Lezcano <daniel.lezcano@linaro.org>
      Signed-off-by: NDaniel Lezcano <daniel.lezcano@linaro.org>
      b4822dc7
    • S
      clocksource/drivers/arch_timer: Workaround for Allwinner A64 timer instability · c950ca8c
      Samuel Holland 提交于
      The Allwinner A64 SoC is known[1] to have an unstable architectural
      timer, which manifests itself most obviously in the time jumping forward
      a multiple of 95 years[2][3]. This coincides with 2^56 cycles at a
      timer frequency of 24 MHz, implying that the time went slightly backward
      (and this was interpreted by the kernel as it jumping forward and
      wrapping around past the epoch).
      
      Investigation revealed instability in the low bits of CNTVCT at the
      point a high bit rolls over. This leads to power-of-two cycle forward
      and backward jumps. (Testing shows that forward jumps are about twice as
      likely as backward jumps.) Since the counter value returns to normal
      after an indeterminate read, each "jump" really consists of both a
      forward and backward jump from the software perspective.
      
      Unless the kernel is trapping CNTVCT reads, a userspace program is able
      to read the register in a loop faster than it changes. A test program
      running on all 4 CPU cores that reported jumps larger than 100 ms was
      run for 13.6 hours and reported the following:
      
       Count | Event
      -------+---------------------------
        9940 | jumped backward      699ms
         268 | jumped backward     1398ms
           1 | jumped backward     2097ms
       16020 | jumped forward       175ms
        6443 | jumped forward       699ms
        2976 | jumped forward      1398ms
           9 | jumped forward    356516ms
           9 | jumped forward    357215ms
           4 | jumped forward    714430ms
           1 | jumped forward   3578440ms
      
      This works out to a jump larger than 100 ms about every 5.5 seconds on
      each CPU core.
      
      The largest jump (almost an hour!) was the following sequence of reads:
          0x0000007fffffffff → 0x00000093feffffff → 0x0000008000000000
      
      Note that the middle bits don't necessarily all read as all zeroes or
      all ones during the anomalous behavior; however the low 10 bits checked
      by the function in this patch have never been observed with any other
      value.
      
      Also note that smaller jumps are much more common, with backward jumps
      of 2048 (2^11) cycles observed over 400 times per second on each core.
      (Of course, this is partially explained by lower bits rolling over more
      frequently.) Any one of these could have caused the 95 year time skip.
      
      Similar anomalies were observed while reading CNTPCT (after patching the
      kernel to allow reads from userspace). However, the CNTPCT jumps are
      much less frequent, and only small jumps were observed. The same program
      as before (except now reading CNTPCT) observed after 72 hours:
      
       Count | Event
      -------+---------------------------
          17 | jumped backward      699ms
          52 | jumped forward       175ms
        2831 | jumped forward       699ms
           5 | jumped forward      1398ms
      
      Further investigation showed that the instability in CNTPCT/CNTVCT also
      affected the respective timer's TVAL register. The following values were
      observed immediately after writing CNVT_TVAL to 0x10000000:
      
       CNTVCT             | CNTV_TVAL  | CNTV_CVAL          | CNTV_TVAL Error
      --------------------+------------+--------------------+-----------------
       0x000000d4a2d8bfff | 0x10003fff | 0x000000d4b2d8bfff | +0x00004000
       0x000000d4a2d94000 | 0x0fffffff | 0x000000d4b2d97fff | -0x00004000
       0x000000d4a2d97fff | 0x10003fff | 0x000000d4b2d97fff | +0x00004000
       0x000000d4a2d9c000 | 0x0fffffff | 0x000000d4b2d9ffff | -0x00004000
      
      The pattern of errors in CNTV_TVAL seemed to depend on exactly which
      value was written to it. For example, after writing 0x10101010:
      
       CNTVCT             | CNTV_TVAL  | CNTV_CVAL          | CNTV_TVAL Error
      --------------------+------------+--------------------+-----------------
       0x000001ac3effffff | 0x1110100f | 0x000001ac4f10100f | +0x1000000
       0x000001ac40000000 | 0x1010100f | 0x000001ac5110100f | -0x1000000
       0x000001ac58ffffff | 0x1110100f | 0x000001ac6910100f | +0x1000000
       0x000001ac66000000 | 0x1010100f | 0x000001ac7710100f | -0x1000000
       0x000001ac6affffff | 0x1110100f | 0x000001ac7b10100f | +0x1000000
       0x000001ac6e000000 | 0x1010100f | 0x000001ac7f10100f | -0x1000000
      
      I was also twice able to reproduce the issue covered by Allwinner's
      workaround[4], that writing to TVAL sometimes fails, and both CVAL and
      TVAL are left with entirely bogus values. One was the following values:
      
       CNTVCT             | CNTV_TVAL  | CNTV_CVAL
      --------------------+------------+--------------------------------------
       0x000000d4a2d6014c | 0x8fbd5721 | 0x000000d132935fff (615s in the past)
      Reviewed-by: NMarc Zyngier <marc.zyngier@arm.com>
      
      ========================================================================
      
      Because the CPU can read the CNTPCT/CNTVCT registers faster than they
      change, performing two reads of the register and comparing the high bits
      (like other workarounds) is not a workable solution. And because the
      timer can jump both forward and backward, no pair of reads can
      distinguish a good value from a bad one. The only way to guarantee a
      good value from consecutive reads would be to read _three_ times, and
      take the middle value only if the three values are 1) each unique and
      2) increasing. This takes at minimum 3 counter cycles (125 ns), or more
      if an anomaly is detected.
      
      However, since there is a distinct pattern to the bad values, we can
      optimize the common case (1022/1024 of the time) to a single read by
      simply ignoring values that match the error pattern. This still takes no
      more than 3 cycles in the worst case, and requires much less code. As an
      additional safety check, we still limit the loop iteration to the number
      of max-frequency (1.2 GHz) CPU cycles in three 24 MHz counter periods.
      
      For the TVAL registers, the simple solution is to not use them. Instead,
      read or write the CVAL and calculate the TVAL value in software.
      
      Although the manufacturer is aware of at least part of the erratum[4],
      there is no official name for it. For now, use the kernel-internal name
      "UNKNOWN1".
      
      [1]: https://github.com/armbian/build/commit/a08cd6fe7ae9
      [2]: https://forum.armbian.com/topic/3458-a64-datetime-clock-issue/
      [3]: https://irclog.whitequark.org/linux-sunxi/2018-01-26
      [4]: https://github.com/Allwinner-Homlet/H6-BSP4.9-linux/blob/master/drivers/clocksource/arm_arch_timer.c#L272Acked-by: NMaxime Ripard <maxime.ripard@bootlin.com>
      Tested-by: NAndre Przywara <andre.przywara@arm.com>
      Signed-off-by: NSamuel Holland <samuel@sholland.org>
      Cc: stable@vger.kernel.org
      Signed-off-by: NDaniel Lezcano <daniel.lezcano@linaro.org>
      c950ca8c
  18. 19 12月, 2018 5 次提交
    • M
      clocksource/drivers/rda: Add clock driver for RDA8810PL SoC · 7f83a132
      Manivannan Sadhasivam 提交于
      Add clock driver for RDA Micro RDA8810PL SoC supporting OSTIMER
      and HWTIMER.
      
      RDA8810PL has two independent timers: OSTIMER (56 bit) and HWTIMER
      (64 bit). Each timer provides optional interrupt support. In this
      driver, OSTIMER is used for clockevents and HWTIMER is used for
      clocksource.
      Signed-off-by: NAndreas Färber <afaerber@suse.de>
      Signed-off-by: NManivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
      Signed-off-by: NDaniel Lezcano <daniel.lezcano@linaro.org>
      7f83a132
    • A
      clocksource/drivers/riscv_timer: Provide the sched_clock · 92e0d143
      Anup Patel 提交于
      Currently, we don't have a sched_clock registered for RISC-V systems.
      This means Linux time keeping will use jiffies (running at HZ) as the
      default sched_clock.
      
      To avoid this, we explicity provide sched_clock using RISC-V rdtime
      instruction (similar to riscv_timer clocksource).
      Signed-off-by: NAnup Patel <anup@brainfault.org>
      Reviewed-by: NPalmer Dabbelt <palmer@sifive.com>
      Signed-off-by: NDaniel Lezcano <daniel.lezcano@linaro.org>
      92e0d143
    • A
      clocksource/drivers/arc_timer: Utilize generic sched_clock · bf287607
      Alexey Brodkin 提交于
      It turned out we used to use default implementation of sched_clock()
      from kernel/sched/clock.c which was as precise as 1/HZ, i.e.
      by default we had 10 msec granularity of time measurement.
      
      Now given ARC built-in timers are clocked with the same frequency as
      CPU cores we may get much higher precision of time tracking.
      
      Thus we switch to generic sched_clock which really reads ARC hardware
      counters.
      
      This is especially helpful for measuring short events.
      That's what we used to have:
      ------------------------------>8------------------------
      $ perf stat /bin/sh -c /root/lmbench-master/bin/arc/hello > /dev/null
      
       Performance counter stats for '/bin/sh -c /root/lmbench-master/bin/arc/hello':
      
               10.000000      task-clock (msec)         #    2.832 CPUs utilized
                       1      context-switches          #    0.100 K/sec
                       1      cpu-migrations            #    0.100 K/sec
                      63      page-faults               #    0.006 M/sec
                 3049480      cycles                    #    0.305 GHz
                 1091259      instructions              #    0.36  insn per cycle
                  256828      branches                  #   25.683 M/sec
                   27026      branch-misses             #   10.52% of all branches
      
             0.003530687 seconds time elapsed
      
             0.000000000 seconds user
             0.010000000 seconds sys
      ------------------------------>8------------------------
      
      And now we'll see:
      ------------------------------>8------------------------
      $ perf stat /bin/sh -c /root/lmbench-master/bin/arc/hello > /dev/null
      
       Performance counter stats for '/bin/sh -c /root/lmbench-master/bin/arc/hello':
      
                3.004322      task-clock (msec)         #    0.865 CPUs utilized
                       1      context-switches          #    0.333 K/sec
                       1      cpu-migrations            #    0.333 K/sec
                      63      page-faults               #    0.021 M/sec
                 2986734      cycles                    #    0.994 GHz
                 1087466      instructions              #    0.36  insn per cycle
                  255209      branches                  #   84.947 M/sec
                   26002      branch-misses             #   10.19% of all branches
      
             0.003474829 seconds time elapsed
      
             0.003519000 seconds user
             0.000000000 seconds sys
      ------------------------------>8------------------------
      
      Note how much more meaningful is the second output - time spent for
      execution pretty much matches number of cycles spent (we're runnign
      @ 1GHz here).
      Signed-off-by: NAlexey Brodkin <abrodkin@synopsys.com>
      Cc: Daniel Lezcano <daniel.lezcano@linaro.org>
      Cc: Vineet Gupta <vgupta@synopsys.com>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: stable@vger.kernel.org
      Acked-by: NVineet Gupta <vgupta@synopsys.com>
      Signed-off-by: NDaniel Lezcano <daniel.lezcano@linaro.org>
      bf287607
    • A
      clocksource/drivers/imx-gpt: Add support for ARM64 · df181e38
      Anson Huang 提交于
      This patch allows building and compile-testing the i.MX GPT driver
      also for ARM64. The delay_timer is only supported on ARMv7.
      Signed-off-by: NAnson Huang <Anson.Huang@nxp.com>
      Signed-off-by: NDaniel Lezcano <daniel.lezcano@linaro.org>
      df181e38
    • L
      clocksource/drivers/ux500: Drop Ux500 custom SCHED_CLOCK · 85b6fcad
      Linus Walleij 提交于
      The two drivers used for Ux500 sched_clock use two Kconfig
      symbols to select which of the two gets used as sched_clock.
      
      This isn't right: the workaround is trying to make sure that
      the NONSTOP timer is used for sched_clock in order to keep
      that clock ticking consistently over a suspend/resume
      cycle. (Otherwise sched_clock simply stops during suspend
      and continues after resume).
      
      This will notably affect any timetstamped debug prints,
      so that they show the absolute number of seconds since the
      system was booted and does not loose wall-clock time during
      suspend and resume as if time stood still.
      
      The real way to fix this problem is to make sched_clock
      take advantage of any NONSTOP clock source on the system
      and adjust accordingly, not to try to work around this by
      using a different sched_clock depending on what system
      we are compiling for. This can solve the problem for
      everyone instead of providing a local solution.
      
      Cc: Baolin Wang <baolin.wang@linaro.org>
      Signed-off-by: NLinus Walleij <linus.walleij@linaro.org>
      Signed-off-by: NDaniel Lezcano <daniel.lezcano@linaro.org>
      85b6fcad
  19. 03 11月, 2018 2 次提交
  20. 13 8月, 2018 1 次提交
  21. 19 5月, 2018 1 次提交
  22. 31 3月, 2018 1 次提交
  23. 09 3月, 2018 1 次提交
  24. 23 2月, 2018 2 次提交