On 11/07/2017 03:39, Palmer Dabbelt wrote: > The RISC-V ISA defines a per-hart real-time clock and timer, which is > present on all systems. The clock is accessed via the 'rdtime' > pseudo-instruction (which reads a CSR), and the timer is set via an SBI > call. > > This driver attempts to split out the RISC-V ISA specific mechanisms of > accessing the hardware from the clocksource driver by taking a pair of > function pointers to issue the actual RISC-V specific instructions. > > Signed-off-by: Palmer Dabbelt <pal...@dabbelt.com> > ---
[ ... ] > +#ifndef _LINUX_TIMER_RISCV_H > +#define _LINUX_TIMER_RISCV_H > + > +/* > + * All RISC-V systems have a timer attached to every hart. These timers can > be > + * read by the 'rdcycle' pseudo instruction, and can use the SBI to setup > + * events. In order to abstract the architecture-specific timer reading and > + * setting functions away from the clock event insertion code, we provide > + * function pointers to the clockevent subsystem that perform two basic > operations: > + * rdtime() reads the timer on the current CPU, and next_event(delta) sets > the > + * next timer event to 'delta' cycles in the future. As the timers are > + * inherently a per-cpu resource, these callbacks perform operations on the > + * current hart. There is guaranteed to be exactly one timer per hart on all > + * RISC-V systems. > + */ Hi Palmer, The driver code must be self contained (eg. setup and irq handling). There are examples in the drivers/clocksource to stick on, for example the jcore-pit.c or the mips-gic-timer.c drivers. I don't see the point to setup callbacks at init time. Thanks. -- Daniel > +void timer_riscv_init(int cpu_id, > + unsigned long riscv_timebase, > + unsigned long long (*rdtime)(struct clocksource *), > + int (*next_event)(unsigned long, struct > clock_event_device *)); > + > +/* > + * Looks up the clocksource or clock_even_device that cooresponds the given > + * hart. > + */ > +struct clocksource *timer_riscv_source(int cpuid); > +struct clock_event_device *timer_riscv_device(int cpu_id); > + > +#endif > -- <http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook | <http://twitter.com/#!/linaroorg> Twitter | <http://www.linaro.org/linaro-blog/> Blog