From: Anup Patel Date: Thu, 20 May 2021 09:13:06 +0000 (+0530) Subject: lib: utils/ipi: Add FDT based ACLINT MSWI IPI driver X-Git-Tag: v1.3~509 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=56fc5f7618b70a83425a764cafd67ffcf3605b5d;p=platform%2Fkernel%2Fopensbi-spacemit.git lib: utils/ipi: Add FDT based ACLINT MSWI IPI driver We add a new FDT based ACLINT MSWI IPI driver which works for both CLINT device and standalone ACLINT MSWI device. Signed-off-by: Anup Patel Reviewed-by: Bin Meng Reviewed-by: Xiang W --- diff --git a/lib/utils/ipi/fdt_ipi.c b/lib/utils/ipi/fdt_ipi.c index 3932f50..ed56e49 100644 --- a/lib/utils/ipi/fdt_ipi.c +++ b/lib/utils/ipi/fdt_ipi.c @@ -12,10 +12,10 @@ #include #include -extern struct fdt_ipi fdt_ipi_clint; +extern struct fdt_ipi fdt_ipi_mswi; static struct fdt_ipi *ipi_drivers[] = { - &fdt_ipi_clint + &fdt_ipi_mswi }; static struct fdt_ipi dummy = { diff --git a/lib/utils/ipi/fdt_ipi_clint.c b/lib/utils/ipi/fdt_ipi_clint.c deleted file mode 100644 index ce0ca8e..0000000 --- a/lib/utils/ipi/fdt_ipi_clint.c +++ /dev/null @@ -1,51 +0,0 @@ -/* - * SPDX-License-Identifier: BSD-2-Clause - * - * Copyright (c) 2020 Western Digital Corporation or its affiliates. - * - * Authors: - * Anup Patel - */ - -#include -#include -#include -#include - -#define CLINT_IPI_MAX_NR 16 - -static unsigned long clint_ipi_count = 0; -static struct clint_data clint_ipi[CLINT_IPI_MAX_NR]; - -static int ipi_clint_cold_init(void *fdt, int nodeoff, - const struct fdt_match *match) -{ - int rc; - unsigned long cisize; - struct clint_data *ci; - - if (CLINT_IPI_MAX_NR <= clint_ipi_count) - return SBI_ENOSPC; - ci = &clint_ipi[clint_ipi_count++]; - - rc = fdt_parse_aclint_node(fdt, nodeoff, false, &ci->addr, &cisize, - &ci->first_hartid, &ci->hart_count); - if (rc) - return rc; - ci->has_64bit_mmio = false; - - return clint_cold_ipi_init(ci); -} - -static const struct fdt_match ipi_clint_match[] = { - { .compatible = "riscv,clint0" }, - { .compatible = "sifive,clint0" }, - { }, -}; - -struct fdt_ipi fdt_ipi_clint = { - .match_table = ipi_clint_match, - .cold_init = ipi_clint_cold_init, - .warm_init = clint_warm_ipi_init, - .exit = NULL, -}; diff --git a/lib/utils/ipi/fdt_ipi_mswi.c b/lib/utils/ipi/fdt_ipi_mswi.c new file mode 100644 index 0000000..f119f9c --- /dev/null +++ b/lib/utils/ipi/fdt_ipi_mswi.c @@ -0,0 +1,67 @@ +/* + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2021 Western Digital Corporation or its affiliates. + * + * Authors: + * Anup Patel + */ + +#include +#include +#include +#include + +#define MSWI_MAX_NR 16 + +static unsigned long mswi_count = 0; +static struct aclint_mswi_data mswi[MSWI_MAX_NR]; + +static int ipi_mswi_cold_init(void *fdt, int nodeoff, + const struct fdt_match *match) +{ + int rc; + unsigned long offset; + struct aclint_mswi_data *ms; + + if (MSWI_MAX_NR <= mswi_count) + return SBI_ENOSPC; + ms = &mswi[mswi_count]; + + rc = fdt_parse_aclint_node(fdt, nodeoff, false, &ms->addr, &ms->size, + &ms->first_hartid, &ms->hart_count); + if (rc) + return rc; + + if (match->data) { + /* Adjust MSWI address and size for CLINT device */ + offset = *((unsigned long *)match->data); + ms->addr += offset; + if ((ms->size - offset) < ACLINT_MSWI_SIZE) + return SBI_EINVAL; + ms->size = ACLINT_MSWI_SIZE; + } + + rc = aclint_mswi_cold_init(ms); + if (rc) + return rc; + + mswi_count++; + return 0; +} + +static unsigned long clint_offset = CLINT_MSWI_OFFSET; + +static const struct fdt_match ipi_mswi_match[] = { + { .compatible = "riscv,clint0", .data = &clint_offset }, + { .compatible = "sifive,clint0", .data = &clint_offset }, + { .compatible = "riscv,aclint-mswi" }, + { }, +}; + +struct fdt_ipi fdt_ipi_mswi = { + .match_table = ipi_mswi_match, + .cold_init = ipi_mswi_cold_init, + .warm_init = aclint_mswi_warm_init, + .exit = NULL, +}; diff --git a/lib/utils/ipi/objects.mk b/lib/utils/ipi/objects.mk index 7e37816..129eea8 100644 --- a/lib/utils/ipi/objects.mk +++ b/lib/utils/ipi/objects.mk @@ -9,4 +9,4 @@ libsbiutils-objs-y += ipi/aclint_mswi.o libsbiutils-objs-y += ipi/fdt_ipi.o -libsbiutils-objs-y += ipi/fdt_ipi_clint.o +libsbiutils-objs-y += ipi/fdt_ipi_mswi.o