60f0cb6c9b90a56564b4ae85e40402f0ca4674ce
[librecmc/librecmc.git] / target / linux / sunxi / patches-4.14 / 031-arm64-Implement-arch_counter_get_cntpct-to-read-the-.patch
1 From f2e600c149fda3453344f89c7e9353fe278ebd32 Mon Sep 17 00:00:00 2001
2 From: Christoffer Dall <christoffer.dall@linaro.org>
3 Date: Wed, 18 Oct 2017 13:06:25 +0200
4 Subject: [PATCH] arm64: Implement arch_counter_get_cntpct to read the physical
5  counter
6
7 As we are about to use the physical counter on arm64 systems that have
8 KVM support, implement arch_counter_get_cntpct() and the associated
9 errata workaround functionality for stable timer reads.
10
11 Cc: Will Deacon <will.deacon@arm.com>
12 Cc: Mark Rutland <mark.rutland@arm.com>
13 Acked-by: Catalin Marinas <catalin.marinas@arm.com>
14 Acked-by: Marc Zyngier <marc.zyngier@arm.com>
15 Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org>
16 ---
17  arch/arm64/include/asm/arch_timer.h  |  8 +++-----
18  drivers/clocksource/arm_arch_timer.c | 23 +++++++++++++++++++++++
19  2 files changed, 26 insertions(+), 5 deletions(-)
20
21 --- a/arch/arm64/include/asm/arch_timer.h
22 +++ b/arch/arm64/include/asm/arch_timer.h
23 @@ -52,6 +52,7 @@ struct arch_timer_erratum_workaround {
24         const char *desc;
25         u32 (*read_cntp_tval_el0)(void);
26         u32 (*read_cntv_tval_el0)(void);
27 +       u64 (*read_cntpct_el0)(void);
28         u64 (*read_cntvct_el0)(void);
29         int (*set_next_event_phys)(unsigned long, struct clock_event_device *);
30         int (*set_next_event_virt)(unsigned long, struct clock_event_device *);
31 @@ -148,11 +149,8 @@ static inline void arch_timer_set_cntkct
32  
33  static inline u64 arch_counter_get_cntpct(void)
34  {
35 -       /*
36 -        * AArch64 kernel and user space mandate the use of CNTVCT.
37 -        */
38 -       BUG();
39 -       return 0;
40 +       isb();
41 +       return arch_timer_reg_read_stable(cntpct_el0);
42  }
43  
44  static inline u64 arch_counter_get_cntvct(void)
45 --- a/drivers/clocksource/arm_arch_timer.c
46 +++ b/drivers/clocksource/arm_arch_timer.c
47 @@ -217,6 +217,11 @@ static u32 notrace fsl_a008585_read_cntv
48         return __fsl_a008585_read_reg(cntv_tval_el0);
49  }
50  
51 +static u64 notrace fsl_a008585_read_cntpct_el0(void)
52 +{
53 +       return __fsl_a008585_read_reg(cntpct_el0);
54 +}
55 +
56  static u64 notrace fsl_a008585_read_cntvct_el0(void)
57  {
58         return __fsl_a008585_read_reg(cntvct_el0);
59 @@ -258,6 +263,11 @@ static u32 notrace hisi_161010101_read_c
60         return __hisi_161010101_read_reg(cntv_tval_el0);
61  }
62  
63 +static u64 notrace hisi_161010101_read_cntpct_el0(void)
64 +{
65 +       return __hisi_161010101_read_reg(cntpct_el0);
66 +}
67 +
68  static u64 notrace hisi_161010101_read_cntvct_el0(void)
69  {
70         return __hisi_161010101_read_reg(cntvct_el0);
71 @@ -288,6 +298,15 @@ static struct ate_acpi_oem_info hisi_161
72  #endif
73  
74  #ifdef CONFIG_ARM64_ERRATUM_858921
75 +static u64 notrace arm64_858921_read_cntpct_el0(void)
76 +{
77 +       u64 old, new;
78 +
79 +       old = read_sysreg(cntpct_el0);
80 +       new = read_sysreg(cntpct_el0);
81 +       return (((old ^ new) >> 32) & 1) ? old : new;
82 +}
83 +
84  static u64 notrace arm64_858921_read_cntvct_el0(void)
85  {
86         u64 old, new;
87 @@ -346,6 +365,7 @@ static const struct arch_timer_erratum_w
88                 .desc = "Freescale erratum a005858",
89                 .read_cntp_tval_el0 = fsl_a008585_read_cntp_tval_el0,
90                 .read_cntv_tval_el0 = fsl_a008585_read_cntv_tval_el0,
91 +               .read_cntpct_el0 = fsl_a008585_read_cntpct_el0,
92                 .read_cntvct_el0 = fsl_a008585_read_cntvct_el0,
93                 .set_next_event_phys = erratum_set_next_event_tval_phys,
94                 .set_next_event_virt = erratum_set_next_event_tval_virt,
95 @@ -358,6 +378,7 @@ static const struct arch_timer_erratum_w
96                 .desc = "HiSilicon erratum 161010101",
97                 .read_cntp_tval_el0 = hisi_161010101_read_cntp_tval_el0,
98                 .read_cntv_tval_el0 = hisi_161010101_read_cntv_tval_el0,
99 +               .read_cntpct_el0 = hisi_161010101_read_cntpct_el0,
100                 .read_cntvct_el0 = hisi_161010101_read_cntvct_el0,
101                 .set_next_event_phys = erratum_set_next_event_tval_phys,
102                 .set_next_event_virt = erratum_set_next_event_tval_virt,
103 @@ -368,6 +389,7 @@ static const struct arch_timer_erratum_w
104                 .desc = "HiSilicon erratum 161010101",
105                 .read_cntp_tval_el0 = hisi_161010101_read_cntp_tval_el0,
106                 .read_cntv_tval_el0 = hisi_161010101_read_cntv_tval_el0,
107 +               .read_cntpct_el0 = hisi_161010101_read_cntpct_el0,
108                 .read_cntvct_el0 = hisi_161010101_read_cntvct_el0,
109                 .set_next_event_phys = erratum_set_next_event_tval_phys,
110                 .set_next_event_virt = erratum_set_next_event_tval_virt,
111 @@ -378,6 +400,7 @@ static const struct arch_timer_erratum_w
112                 .match_type = ate_match_local_cap_id,
113                 .id = (void *)ARM64_WORKAROUND_858921,
114                 .desc = "ARM erratum 858921",
115 +               .read_cntpct_el0 = arm64_858921_read_cntpct_el0,
116                 .read_cntvct_el0 = arm64_858921_read_cntvct_el0,
117         },
118  #endif