[PATCH] bsp/imx: Fix system counter init for imx6
Christian MAUDERER
christian.mauderer at embedded-brains.de
Mon Jan 18 09:05:36 UTC 2021
Hello,
I want to backport that patch to RTEMS 5 too because this problem
occurred multiple times on the mailing list. If that is OK I'll create a
separate ticket for RTEMS 5 that describes that problem. For RTEMS 6 it
should finally be the last step to closing the "add i.MX6UL" ticket.
Best regards
Christian
Am 18.01.21 um 10:02 schrieb Christian Mauderer:
> For i.MX7 U-Boot initializes the system counter. On i.MX6 Barebox is
> often used which doesn't initialize the counter. With this patch, we try
> to auto-detect whether the counter is initialized or not and do the
> initialization ourself if necessary.
>
> Closes #3869
> ---
> bsps/arm/imx/start/bspstart.c | 61 ++++++++++++++++++++++++++++++++++-
> 1 file changed, 60 insertions(+), 1 deletion(-)
>
> diff --git a/bsps/arm/imx/start/bspstart.c b/bsps/arm/imx/start/bspstart.c
> index 9f610d1ff5..238bc2bd28 100644
> --- a/bsps/arm/imx/start/bspstart.c
> +++ b/bsps/arm/imx/start/bspstart.c
> @@ -19,6 +19,7 @@
> #include <bsp/irq-generic.h>
> #include <bsp/linker-symbols.h>
> #include <dev/clock/arm-generic-timer.h>
> +#include <libcpu/arm-cp15.h>
>
> #include <libfdt.h>
>
> @@ -59,6 +60,60 @@ uint32_t bsp_fdt_map_intr(const uint32_t *intr, size_t icells)
> return intr[1] + MAGIC_IRQ_OFFSET;
> }
>
> +static bool imx_is_imx6(const void *fdt)
> +{
> + /*
> + * At the moment: Check for some compatible strings that should be there
> + * somewhere in every fdt.
> + *
> + * FIXME: It would be nice if some CPU-ID could be used instead. But I didn't
> + * find one.
> + */
> + int node;
> +
> + node = fdt_node_offset_by_compatible(fdt, -1, "fsl,imx6ul");
> + if (node >= 0) {
> + return true;
> + }
> +
> + node = fdt_node_offset_by_compatible(fdt, -1, "fsl,imx6ull");
> + if (node >= 0) {
> + return true;
> + }
> +
> + return false;
> +}
> +
> +#define SYSCNT_CNTCR (0x0)
> +#define SYSCNT_CNTCR_ENABLE (1 << 0)
> +#define SYSCNT_CNTCR_HDBG (1 << 1)
> +#define SYSCNT_CNTCR_FCREQ(n) (1 << (8 + (n)))
> +#define SYSCNT_CNTFID(n) (0x20 + 4 * (n))
> +
> +static uint32_t imx_syscnt_enable_and_return_frequency(const void *fdt)
> +{
> + uint32_t freq;
> + volatile void *syscnt_base;
> +
> + /* That's not in the usual FDTs. Sorry for falling back to a magic value. */
> + if (imx_is_imx6(fdt)) {
> + syscnt_base = (void *)0x021dc000;
> + } else {
> + syscnt_base = (void *)0x306c0000;
> + }
> +
> + freq = *(uint32_t *)(syscnt_base + SYSCNT_CNTFID(0));
> +
> + arm_cp15_set_counter_frequency(freq);
> +
> + *(uint32_t *)(syscnt_base + SYSCNT_CNTCR) =
> + SYSCNT_CNTCR_ENABLE |
> + SYSCNT_CNTCR_HDBG |
> + SYSCNT_CNTCR_FCREQ(0);
> +
> + return freq;
> +}
> +
> void arm_generic_timer_get_config(
> uint32_t *frequency,
> uint32_t *irq
> @@ -76,7 +131,11 @@ void arm_generic_timer_get_config(
> if (val != NULL && len >= 4) {
> *frequency = fdt32_to_cpu(val[0]);
> } else {
> - bsp_fatal(IMX_FATAL_GENERIC_TIMER_FREQUENCY);
> + /*
> + * Normally clock-frequency would be provided by the boot loader. If it
> + * didn't add one, we have to initialize the system counter ourself.
> + */
> + *frequency = imx_syscnt_enable_and_return_frequency(fdt);
> }
>
> /* FIXME: Figure out how Linux gets a proper IRQ number */
>
--
--------------------------------------------
embedded brains GmbH
Herr Christian MAUDERER
Dornierstr. 4
82178 Puchheim
Germany
email: christian.mauderer at embedded-brains.de
phone: +49-89-18 94 741 - 18
fax: +49-89-18 94 741 - 08
Registergericht: Amtsgericht München
Registernummer: HRB 157899
Vertretungsberechtigte Geschäftsführer: Peter Rasmussen, Thomas Dörfler
Unsere Datenschutzerklärung finden Sie hier:
https://embedded-brains.de/datenschutzerklaerung/
More information about the devel
mailing list