[PATCH 5/6] lib: utils/timer: Add FDT based ACLINT MTIMER driver
Xiang W
wxjstz at 126.com
Mon Jun 14 07:58:02 PDT 2021
在 2021-06-12星期六的 21:33 +0530,Anup Patel写道:
> We add a new FDT based ACLINT MTIMER driver which works for
> both CLINT device and standalone ACLINT MTIMER device.
>
> Signed-off-by: Anup Patel <anup.patel at wdc.com>
look good to me
Reviewed-by: Xiang W <wxjstz at 126.com>
> ---
> lib/utils/timer/fdt_timer.c | 4 +-
> lib/utils/timer/fdt_timer_clint.c | 57 -----------------------
> lib/utils/timer/fdt_timer_mtimer.c | 74
> ++++++++++++++++++++++++++++++
> lib/utils/timer/objects.mk | 2 +-
> 4 files changed, 77 insertions(+), 60 deletions(-)
> delete mode 100644 lib/utils/timer/fdt_timer_clint.c
> create mode 100644 lib/utils/timer/fdt_timer_mtimer.c
>
> diff --git a/lib/utils/timer/fdt_timer.c
> b/lib/utils/timer/fdt_timer.c
> index 1fad42c..148c05e 100644
> --- a/lib/utils/timer/fdt_timer.c
> +++ b/lib/utils/timer/fdt_timer.c
> @@ -12,10 +12,10 @@
> #include <sbi_utils/fdt/fdt_helper.h>
> #include <sbi_utils/timer/fdt_timer.h>
>
> -extern struct fdt_timer fdt_timer_clint;
> +extern struct fdt_timer fdt_timer_mtimer;
>
> static struct fdt_timer *timer_drivers[] = {
> - &fdt_timer_clint
> + &fdt_timer_mtimer
> };
>
> static struct fdt_timer dummy = {
> diff --git a/lib/utils/timer/fdt_timer_clint.c
> b/lib/utils/timer/fdt_timer_clint.c
> deleted file mode 100644
> index 9c84c3b..0000000
> --- a/lib/utils/timer/fdt_timer_clint.c
> +++ /dev/null
> @@ -1,57 +0,0 @@
> -/*
> - * SPDX-License-Identifier: BSD-2-Clause
> - *
> - * Copyright (c) 2020 Western Digital Corporation or its affiliates.
> - *
> - * Authors:
> - * Anup Patel <anup.patel at wdc.com>
> - */
> -
> -#include <libfdt.h>
> -#include <sbi/sbi_error.h>
> -#include <sbi_utils/fdt/fdt_helper.h>
> -#include <sbi_utils/timer/fdt_timer.h>
> -#include <sbi_utils/sys/clint.h>
> -
> -#define CLINT_TIMER_MAX_NR 16
> -
> -static unsigned long clint_timer_count = 0;
> -static struct clint_data clint_timer[CLINT_TIMER_MAX_NR];
> -
> -static int timer_clint_cold_init(void *fdt, int nodeoff,
> - const struct fdt_match *match)
> -{
> - int rc;
> - unsigned long ctsize;
> - struct clint_data *ct, *ctmaster = NULL;
> -
> - if (CLINT_TIMER_MAX_NR <= clint_timer_count)
> - return SBI_ENOSPC;
> - ct = &clint_timer[clint_timer_count++];
> - if (1 < clint_timer_count)
> - ctmaster = &clint_timer[0];
> -
> - rc = fdt_parse_aclint_node(fdt, nodeoff, TRUE, &ct->addr,
> &ctsize,
> - &ct->first_hartid, &ct-
> >hart_count);
> - if (rc)
> - return rc;
> -
> - ct->has_64bit_mmio = true;
> - if (fdt_getprop(fdt, nodeoff, "clint,has-no-64bit-mmio",
> &rc))
> - ct->has_64bit_mmio = FALSE;
> -
> - return clint_cold_timer_init(ct, ctmaster);
> -}
> -
> -static const struct fdt_match timer_clint_match[] = {
> - { .compatible = "riscv,clint0" },
> - { .compatible = "sifive,clint0" },
> - { },
> -};
> -
> -struct fdt_timer fdt_timer_clint = {
> - .match_table = timer_clint_match,
> - .cold_init = timer_clint_cold_init,
> - .warm_init = clint_warm_timer_init,
> - .exit = NULL,
> -};
> diff --git a/lib/utils/timer/fdt_timer_mtimer.c
> b/lib/utils/timer/fdt_timer_mtimer.c
> new file mode 100644
> index 0000000..6d9f789
> --- /dev/null
> +++ b/lib/utils/timer/fdt_timer_mtimer.c
> @@ -0,0 +1,74 @@
> +/*
> + * SPDX-License-Identifier: BSD-2-Clause
> + *
> + * Copyright (c) 2020 Western Digital Corporation or its affiliates.
> + *
> + * Authors:
> + * Anup Patel <anup.patel at wdc.com>
> + */
> +
> +#include <libfdt.h>
> +#include <sbi/sbi_error.h>
> +#include <sbi_utils/fdt/fdt_helper.h>
> +#include <sbi_utils/timer/fdt_timer.h>
> +#include <sbi_utils/timer/aclint_mtimer.h>
> +
> +#define MTIMER_MAX_NR 16
> +
> +static unsigned long mtimer_count = 0;
> +static struct aclint_mtimer_data mtimer[MTIMER_MAX_NR];
> +
> +static int timer_mtimer_cold_init(void *fdt, int nodeoff,
> + const struct fdt_match *match)
> +{
> + int rc;
> + unsigned long offset;
> + struct aclint_mtimer_data *mt, *mtmaster = NULL;
> +
> + if (MTIMER_MAX_NR <= mtimer_count)
> + return SBI_ENOSPC;
> + mt = &mtimer[mtimer_count];
> + if (0 < mtimer_count)
> + mtmaster = &mtimer[0];
> +
> + rc = fdt_parse_aclint_node(fdt, nodeoff, TRUE, &mt->addr,
> &mt->size,
> + &mt->first_hartid, &mt-
> >hart_count);
> + if (rc)
> + return rc;
> + mt->has_64bit_mmio = true;
> +
> + if (match->data) {
> + /* Adjust MTIMER address and size for CLINT device */
> + offset = *((unsigned long *)match->data);
> + mt->addr += offset;
> + if ((mt->size - offset) < ACLINT_MTIMER_SIZE)
> + return SBI_EINVAL;
> + mt->size -= offset;
> + /* Parse additional CLINT properties */
> + if (fdt_getprop(fdt, nodeoff, "clint,has-no-64bit-
> mmio", &rc))
> + mt->has_64bit_mmio = false;
> + }
> +
> + rc = aclint_mtimer_cold_init(mt, mtmaster);
> + if (rc)
> + return rc;
> +
> + mtimer_count++;
> + return 0;
> +}
> +
> +static unsigned long clint_offset = CLINT_MTIMER_OFFSET;
> +
> +static const struct fdt_match timer_mtimer_match[] = {
> + { .compatible = "riscv,clint0", .data = &clint_offset },
> + { .compatible = "sifive,clint0", .data = &clint_offset },
> + { .compatible = "riscv,aclint-mtimer" },
> + { },
> +};
> +
> +struct fdt_timer fdt_timer_mtimer = {
> + .match_table = timer_mtimer_match,
> + .cold_init = timer_mtimer_cold_init,
> + .warm_init = aclint_mtimer_warm_init,
> + .exit = NULL,
> +};
> diff --git a/lib/utils/timer/objects.mk b/lib/utils/timer/objects.mk
> index f8e3931..228ccb1 100644
> --- a/lib/utils/timer/objects.mk
> +++ b/lib/utils/timer/objects.mk
> @@ -8,5 +8,5 @@
> #
>
> libsbiutils-objs-y += timer/fdt_timer.o
> -libsbiutils-objs-y += timer/fdt_timer_clint.o
> +libsbiutils-objs-y += timer/fdt_timer_mtimer.o
> libsbiutils-objs-y += timer/aclint_mtimer.o
> --
> 2.25.1
>
>
More information about the opensbi
mailing list