Linux-libre 4.19.123-gnu
[librecmc/linux-libre.git] / drivers / clocksource / arc_timer.c
1 /*
2  * Copyright (C) 2016-17 Synopsys, Inc. (www.synopsys.com)
3  * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation.
8  */
9
10 /* ARC700 has two 32bit independent prog Timers: TIMER0 and TIMER1, Each can be
11  * programmed to go from @count to @limit and optionally interrupt.
12  * We've designated TIMER0 for clockevents and TIMER1 for clocksource
13  *
14  * ARCv2 based HS38 cores have RTC (in-core) and GFRC (inside ARConnect/MCIP)
15  * which are suitable for UP and SMP based clocksources respectively
16  */
17
18 #include <linux/interrupt.h>
19 #include <linux/clk.h>
20 #include <linux/clk-provider.h>
21 #include <linux/clocksource.h>
22 #include <linux/clockchips.h>
23 #include <linux/cpu.h>
24 #include <linux/of.h>
25 #include <linux/of_irq.h>
26 #include <linux/sched_clock.h>
27
28 #include <soc/arc/timers.h>
29 #include <soc/arc/mcip.h>
30
31
32 static unsigned long arc_timer_freq;
33
34 static int noinline arc_get_timer_clk(struct device_node *node)
35 {
36         struct clk *clk;
37         int ret;
38
39         clk = of_clk_get(node, 0);
40         if (IS_ERR(clk)) {
41                 pr_err("timer missing clk\n");
42                 return PTR_ERR(clk);
43         }
44
45         ret = clk_prepare_enable(clk);
46         if (ret) {
47                 pr_err("Couldn't enable parent clk\n");
48                 return ret;
49         }
50
51         arc_timer_freq = clk_get_rate(clk);
52
53         return 0;
54 }
55
56 /********** Clock Source Device *********/
57
58 #ifdef CONFIG_ARC_TIMERS_64BIT
59
60 static u64 arc_read_gfrc(struct clocksource *cs)
61 {
62         unsigned long flags;
63         u32 l, h;
64
65         /*
66          * From a programming model pov, there seems to be just one instance of
67          * MCIP_CMD/MCIP_READBACK however micro-architecturally there's
68          * an instance PER ARC CORE (not per cluster), and there are dedicated
69          * hardware decode logic (per core) inside ARConnect to handle
70          * simultaneous read/write accesses from cores via those two registers.
71          * So several concurrent commands to ARConnect are OK if they are
72          * trying to access two different sub-components (like GFRC,
73          * inter-core interrupt, etc...). HW also supports simultaneously
74          * accessing GFRC by multiple cores.
75          * That's why it is safe to disable hard interrupts on the local CPU
76          * before access to GFRC instead of taking global MCIP spinlock
77          * defined in arch/arc/kernel/mcip.c
78          */
79         local_irq_save(flags);
80
81         __mcip_cmd(CMD_GFRC_READ_LO, 0);
82         l = read_aux_reg(ARC_REG_MCIP_READBACK);
83
84         __mcip_cmd(CMD_GFRC_READ_HI, 0);
85         h = read_aux_reg(ARC_REG_MCIP_READBACK);
86
87         local_irq_restore(flags);
88
89         return (((u64)h) << 32) | l;
90 }
91
92 static notrace u64 arc_gfrc_clock_read(void)
93 {
94         return arc_read_gfrc(NULL);
95 }
96
97 static struct clocksource arc_counter_gfrc = {
98         .name   = "ARConnect GFRC",
99         .rating = 400,
100         .read   = arc_read_gfrc,
101         .mask   = CLOCKSOURCE_MASK(64),
102         .flags  = CLOCK_SOURCE_IS_CONTINUOUS,
103 };
104
105 static int __init arc_cs_setup_gfrc(struct device_node *node)
106 {
107         struct mcip_bcr mp;
108         int ret;
109
110         READ_BCR(ARC_REG_MCIP_BCR, mp);
111         if (!mp.gfrc) {
112                 pr_warn("Global-64-bit-Ctr clocksource not detected\n");
113                 return -ENXIO;
114         }
115
116         ret = arc_get_timer_clk(node);
117         if (ret)
118                 return ret;
119
120         sched_clock_register(arc_gfrc_clock_read, 64, arc_timer_freq);
121
122         return clocksource_register_hz(&arc_counter_gfrc, arc_timer_freq);
123 }
124 TIMER_OF_DECLARE(arc_gfrc, "snps,archs-timer-gfrc", arc_cs_setup_gfrc);
125
126 #define AUX_RTC_CTRL    0x103
127 #define AUX_RTC_LOW     0x104
128 #define AUX_RTC_HIGH    0x105
129
130 static u64 arc_read_rtc(struct clocksource *cs)
131 {
132         unsigned long status;
133         u32 l, h;
134
135         /*
136          * hardware has an internal state machine which tracks readout of
137          * low/high and updates the CTRL.status if
138          *  - interrupt/exception taken between the two reads
139          *  - high increments after low has been read
140          */
141         do {
142                 l = read_aux_reg(AUX_RTC_LOW);
143                 h = read_aux_reg(AUX_RTC_HIGH);
144                 status = read_aux_reg(AUX_RTC_CTRL);
145         } while (!(status & _BITUL(31)));
146
147         return (((u64)h) << 32) | l;
148 }
149
150 static notrace u64 arc_rtc_clock_read(void)
151 {
152         return arc_read_rtc(NULL);
153 }
154
155 static struct clocksource arc_counter_rtc = {
156         .name   = "ARCv2 RTC",
157         .rating = 350,
158         .read   = arc_read_rtc,
159         .mask   = CLOCKSOURCE_MASK(64),
160         .flags  = CLOCK_SOURCE_IS_CONTINUOUS,
161 };
162
163 static int __init arc_cs_setup_rtc(struct device_node *node)
164 {
165         struct bcr_timer timer;
166         int ret;
167
168         READ_BCR(ARC_REG_TIMERS_BCR, timer);
169         if (!timer.rtc) {
170                 pr_warn("Local-64-bit-Ctr clocksource not detected\n");
171                 return -ENXIO;
172         }
173
174         /* Local to CPU hence not usable in SMP */
175         if (IS_ENABLED(CONFIG_SMP)) {
176                 pr_warn("Local-64-bit-Ctr not usable in SMP\n");
177                 return -EINVAL;
178         }
179
180         ret = arc_get_timer_clk(node);
181         if (ret)
182                 return ret;
183
184         write_aux_reg(AUX_RTC_CTRL, 1);
185
186         sched_clock_register(arc_rtc_clock_read, 64, arc_timer_freq);
187
188         return clocksource_register_hz(&arc_counter_rtc, arc_timer_freq);
189 }
190 TIMER_OF_DECLARE(arc_rtc, "snps,archs-timer-rtc", arc_cs_setup_rtc);
191
192 #endif
193
194 /*
195  * 32bit TIMER1 to keep counting monotonically and wraparound
196  */
197
198 static u64 arc_read_timer1(struct clocksource *cs)
199 {
200         return (u64) read_aux_reg(ARC_REG_TIMER1_CNT);
201 }
202
203 static notrace u64 arc_timer1_clock_read(void)
204 {
205         return arc_read_timer1(NULL);
206 }
207
208 static struct clocksource arc_counter_timer1 = {
209         .name   = "ARC Timer1",
210         .rating = 300,
211         .read   = arc_read_timer1,
212         .mask   = CLOCKSOURCE_MASK(32),
213         .flags  = CLOCK_SOURCE_IS_CONTINUOUS,
214 };
215
216 static int __init arc_cs_setup_timer1(struct device_node *node)
217 {
218         int ret;
219
220         /* Local to CPU hence not usable in SMP */
221         if (IS_ENABLED(CONFIG_SMP))
222                 return -EINVAL;
223
224         ret = arc_get_timer_clk(node);
225         if (ret)
226                 return ret;
227
228         write_aux_reg(ARC_REG_TIMER1_LIMIT, ARC_TIMERN_MAX);
229         write_aux_reg(ARC_REG_TIMER1_CNT, 0);
230         write_aux_reg(ARC_REG_TIMER1_CTRL, TIMER_CTRL_NH);
231
232         sched_clock_register(arc_timer1_clock_read, 32, arc_timer_freq);
233
234         return clocksource_register_hz(&arc_counter_timer1, arc_timer_freq);
235 }
236
237 /********** Clock Event Device *********/
238
239 static int arc_timer_irq;
240
241 /*
242  * Arm the timer to interrupt after @cycles
243  * The distinction for oneshot/periodic is done in arc_event_timer_ack() below
244  */
245 static void arc_timer_event_setup(unsigned int cycles)
246 {
247         write_aux_reg(ARC_REG_TIMER0_LIMIT, cycles);
248         write_aux_reg(ARC_REG_TIMER0_CNT, 0);   /* start from 0 */
249
250         write_aux_reg(ARC_REG_TIMER0_CTRL, TIMER_CTRL_IE | TIMER_CTRL_NH);
251 }
252
253
254 static int arc_clkevent_set_next_event(unsigned long delta,
255                                        struct clock_event_device *dev)
256 {
257         arc_timer_event_setup(delta);
258         return 0;
259 }
260
261 static int arc_clkevent_set_periodic(struct clock_event_device *dev)
262 {
263         /*
264          * At X Hz, 1 sec = 1000ms -> X cycles;
265          *                    10ms -> X / 100 cycles
266          */
267         arc_timer_event_setup(arc_timer_freq / HZ);
268         return 0;
269 }
270
271 static DEFINE_PER_CPU(struct clock_event_device, arc_clockevent_device) = {
272         .name                   = "ARC Timer0",
273         .features               = CLOCK_EVT_FEAT_ONESHOT |
274                                   CLOCK_EVT_FEAT_PERIODIC,
275         .rating                 = 300,
276         .set_next_event         = arc_clkevent_set_next_event,
277         .set_state_periodic     = arc_clkevent_set_periodic,
278 };
279
280 static irqreturn_t timer_irq_handler(int irq, void *dev_id)
281 {
282         /*
283          * Note that generic IRQ core could have passed @evt for @dev_id if
284          * irq_set_chip_and_handler() asked for handle_percpu_devid_irq()
285          */
286         struct clock_event_device *evt = this_cpu_ptr(&arc_clockevent_device);
287         int irq_reenable = clockevent_state_periodic(evt);
288
289         /*
290          * 1. ACK the interrupt
291          *    - For ARC700, any write to CTRL reg ACKs it, so just rewrite
292          *      Count when [N]ot [H]alted bit.
293          *    - For HS3x, it is a bit subtle. On taken count-down interrupt,
294          *      IP bit [3] is set, which needs to be cleared for ACK'ing.
295          *      The write below can only update the other two bits, hence
296          *      explicitly clears IP bit
297          * 2. Re-arm interrupt if periodic by writing to IE bit [0]
298          */
299         write_aux_reg(ARC_REG_TIMER0_CTRL, irq_reenable | TIMER_CTRL_NH);
300
301         evt->event_handler(evt);
302
303         return IRQ_HANDLED;
304 }
305
306
307 static int arc_timer_starting_cpu(unsigned int cpu)
308 {
309         struct clock_event_device *evt = this_cpu_ptr(&arc_clockevent_device);
310
311         evt->cpumask = cpumask_of(smp_processor_id());
312
313         clockevents_config_and_register(evt, arc_timer_freq, 0, ARC_TIMERN_MAX);
314         enable_percpu_irq(arc_timer_irq, 0);
315         return 0;
316 }
317
318 static int arc_timer_dying_cpu(unsigned int cpu)
319 {
320         disable_percpu_irq(arc_timer_irq);
321         return 0;
322 }
323
324 /*
325  * clockevent setup for boot CPU
326  */
327 static int __init arc_clockevent_setup(struct device_node *node)
328 {
329         struct clock_event_device *evt = this_cpu_ptr(&arc_clockevent_device);
330         int ret;
331
332         arc_timer_irq = irq_of_parse_and_map(node, 0);
333         if (arc_timer_irq <= 0) {
334                 pr_err("clockevent: missing irq\n");
335                 return -EINVAL;
336         }
337
338         ret = arc_get_timer_clk(node);
339         if (ret) {
340                 pr_err("clockevent: missing clk\n");
341                 return ret;
342         }
343
344         /* Needs apriori irq_set_percpu_devid() done in intc map function */
345         ret = request_percpu_irq(arc_timer_irq, timer_irq_handler,
346                                  "Timer0 (per-cpu-tick)", evt);
347         if (ret) {
348                 pr_err("clockevent: unable to request irq\n");
349                 return ret;
350         }
351
352         ret = cpuhp_setup_state(CPUHP_AP_ARC_TIMER_STARTING,
353                                 "clockevents/arc/timer:starting",
354                                 arc_timer_starting_cpu,
355                                 arc_timer_dying_cpu);
356         if (ret) {
357                 pr_err("Failed to setup hotplug state\n");
358                 return ret;
359         }
360         return 0;
361 }
362
363 static int __init arc_of_timer_init(struct device_node *np)
364 {
365         static int init_count = 0;
366         int ret;
367
368         if (!init_count) {
369                 init_count = 1;
370                 ret = arc_clockevent_setup(np);
371         } else {
372                 ret = arc_cs_setup_timer1(np);
373         }
374
375         return ret;
376 }
377 TIMER_OF_DECLARE(arc_clkevt, "snps,arc-timer", arc_of_timer_init);