Hi Drew,
On 7/2/20 10:12 AM, Andrew Jones wrote:
> The timer can be useful for other tests besides the timer test.
> Extract the DT parsing of the irqs out of the timer test into
> setup and provide them along with some defines in a new timer.h
> file.
>
> Signed-off-by: Andrew Jones <[email protected]>
Reviewed-by: Eric Auger <[email protected]>
Thanks
Eric
> ---
> arm/timer.c | 26 ++++----------------------
> lib/arm/asm/timer.h | 31 +++++++++++++++++++++++++++++++
> lib/arm/setup.c | 42 ++++++++++++++++++++++++++++++++++++++++++
> lib/arm64/asm/timer.h | 1 +
> 4 files changed, 78 insertions(+), 22 deletions(-)
> create mode 100644 lib/arm/asm/timer.h
> create mode 100644 lib/arm64/asm/timer.h
>
> diff --git a/arm/timer.c b/arm/timer.c
> index 44621b4f2967..09e3f8f6bd7d 100644
> --- a/arm/timer.c
> +++ b/arm/timer.c
> @@ -8,15 +8,12 @@
> #include <libcflat.h>
> #include <devicetree.h>
> #include <errata.h>
> +#include <asm/timer.h>
> #include <asm/delay.h>
> #include <asm/processor.h>
> #include <asm/gic.h>
> #include <asm/io.h>
>
> -#define ARCH_TIMER_CTL_ENABLE (1 << 0)
> -#define ARCH_TIMER_CTL_IMASK (1 << 1)
> -#define ARCH_TIMER_CTL_ISTATUS (1 << 2)
> -
> static void *gic_isenabler;
> static void *gic_icenabler;
>
> @@ -108,7 +105,6 @@ static void write_ptimer_ctl(u64 val)
>
> struct timer_info {
> u32 irq;
> - u32 irq_flags;
> volatile bool irq_received;
> u64 (*read_counter)(void);
> u64 (*read_cval)(void);
> @@ -304,23 +300,9 @@ static void test_ptimer(void)
>
> static void test_init(void)
> {
> - const struct fdt_property *prop;
> - const void *fdt = dt_fdt();
> - int node, len;
> - u32 *data;
> -
> - node = fdt_node_offset_by_compatible(fdt, -1, "arm,armv8-timer");
> - assert(node >= 0);
> - prop = fdt_get_property(fdt, node, "interrupts", &len);
> - assert(prop && len == (4 * 3 * sizeof(u32)));
> -
> - data = (u32 *)prop->data;
> - assert(fdt32_to_cpu(data[3]) == 1);
> - ptimer_info.irq = fdt32_to_cpu(data[4]);
> - ptimer_info.irq_flags = fdt32_to_cpu(data[5]);
> - assert(fdt32_to_cpu(data[6]) == 1);
> - vtimer_info.irq = fdt32_to_cpu(data[7]);
> - vtimer_info.irq_flags = fdt32_to_cpu(data[8]);
> + assert(TIMER_PTIMER_IRQ != -1 && TIMER_VTIMER_IRQ != -1);
> + ptimer_info.irq = TIMER_PTIMER_IRQ;
> + vtimer_info.irq = TIMER_VTIMER_IRQ;
>
> install_exception_handler(EL1H_SYNC, ESR_EL1_EC_UNKNOWN,
> ptimer_unsupported_handler);
> ptimer_info.read_ctl();
> diff --git a/lib/arm/asm/timer.h b/lib/arm/asm/timer.h
> new file mode 100644
> index 000000000000..f75cc67f3ac4
> --- /dev/null
> +++ b/lib/arm/asm/timer.h
> @@ -0,0 +1,31 @@
> +/*
> + * Copyright (C) 2020, Red Hat Inc, Andrew Jones <[email protected]>
> + *
> + * This work is licensed under the terms of the GNU LGPL, version 2.
> + */
> +#ifndef _ASMARM_TIMER_H_
> +#define _ASMARM_TIMER_H_
> +
> +#define ARCH_TIMER_CTL_ENABLE (1 << 0)
> +#define ARCH_TIMER_CTL_IMASK (1 << 1)
> +#define ARCH_TIMER_CTL_ISTATUS (1 << 2)
> +
> +#ifndef __ASSEMBLY__
> +
> +struct timer_state {
> + struct {
> + u32 irq;
> + u32 irq_flags;
> + } ptimer;
> + struct {
> + u32 irq;
> + u32 irq_flags;
> + } vtimer;
> +};
> +extern struct timer_state __timer_state;
> +
> +#define TIMER_PTIMER_IRQ (__timer_state.ptimer.irq)
> +#define TIMER_VTIMER_IRQ (__timer_state.vtimer.irq)
> +
> +#endif /* !__ASSEMBLY__ */
> +#endif /* _ASMARM_TIMER_H_ */
> diff --git a/lib/arm/setup.c b/lib/arm/setup.c
> index 418b4e58a5f8..78562e47c01c 100644
> --- a/lib/arm/setup.c
> +++ b/lib/arm/setup.c
> @@ -22,6 +22,7 @@
> #include <asm/page.h>
> #include <asm/processor.h>
> #include <asm/smp.h>
> +#include <asm/timer.h>
>
> #include "io.h"
>
> @@ -29,6 +30,8 @@
>
> extern unsigned long stacktop;
>
> +struct timer_state __timer_state;
> +
> char *initrd;
> u32 initrd_size;
>
> @@ -156,6 +159,43 @@ static void mem_init(phys_addr_t freemem_start)
> page_alloc_ops_enable();
> }
>
> +static void timer_save_state(void)
> +{
> + const struct fdt_property *prop;
> + const void *fdt = dt_fdt();
> + int node, len;
> + u32 *data;
> +
> + node = fdt_node_offset_by_compatible(fdt, -1, "arm,armv8-timer");
> + assert(node >= 0 || node == -FDT_ERR_NOTFOUND);
> +
> + if (node == -FDT_ERR_NOTFOUND) {
> + __timer_state.ptimer.irq = -1;
> + __timer_state.vtimer.irq = -1;
> + return;
> + }
> +
> + /*
> + * From Linux devicetree timer binding documentation
> + *
> + * interrupts <type irq flags>:
> + * secure timer irq
> + * non-secure timer irq (ptimer)
> + * virtual timer irq (vtimer)
> + * hypervisor timer irq
> + */
> + prop = fdt_get_property(fdt, node, "interrupts", &len);
> + assert(prop && len == (4 * 3 * sizeof(u32)));
> +
> + data = (u32 *)prop->data;
> + assert(fdt32_to_cpu(data[3]) == 1 /* PPI */);
> + __timer_state.ptimer.irq = fdt32_to_cpu(data[4]);
> + __timer_state.ptimer.irq_flags = fdt32_to_cpu(data[5]);
> + assert(fdt32_to_cpu(data[6]) == 1 /* PPI */);
> + __timer_state.vtimer.irq = fdt32_to_cpu(data[7]);
> + __timer_state.vtimer.irq_flags = fdt32_to_cpu(data[8]);
> +}
> +
> void setup(const void *fdt)
> {
> void *freemem = &stacktop;
> @@ -211,6 +251,8 @@ void setup(const void *fdt)
> io_init();
>
> /* finish setup */
> + timer_save_state();
> +
> ret = dt_get_bootargs(&bootargs);
> assert(ret == 0 || ret == -FDT_ERR_NOTFOUND);
> setup_args_progname(bootargs);
> diff --git a/lib/arm64/asm/timer.h b/lib/arm64/asm/timer.h
> new file mode 100644
> index 000000000000..c0f5f88287de
> --- /dev/null
> +++ b/lib/arm64/asm/timer.h
> @@ -0,0 +1 @@
> +#include "../../arm/asm/timer.h"
>
_______________________________________________
kvmarm mailing list
[email protected]
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm