[PATCH v3 02/12] lib: utils: Add FDT cache library
Anup Patel
anup at brainfault.org
Mon Aug 4 01:36:22 PDT 2025
On Tue, Jul 8, 2025 at 1:19 PM Nick Hu <nick.hu at sifive.com> wrote:
>
> Add the FDT cache library so we can build up the cache topology via the
> 'next-level-cache' DT property.
>
> Co-developed-by: Vincent Chen <vincent.chen at sifive.com>
> Signed-off-by: Vincent Chen <vincent.chen at sifive.com>
> Co-developed-by: Andy Chiu <andy.chiu at sifive.com>
> Signed-off-by: Andy Chiu <andy.chiu at sifive.com>
> Signed-off-by: Nick Hu <nick.hu at sifive.com>
> Reviewed-by: Samuel Holland <samuel.holland at sifive.com>
LGTM.
Reviewed-by: Anup Patel <anup at brainfault.org>
Regards,
Anup
> ---
> include/sbi_utils/cache/fdt_cache.h | 34 +++++++++
> lib/utils/cache/Kconfig | 6 ++
> lib/utils/cache/fdt_cache.c | 87 ++++++++++++++++++++++++
> lib/utils/cache/fdt_cache_drivers.carray | 3 +
> lib/utils/cache/objects.mk | 3 +
> platform/generic/configs/defconfig | 1 +
> 6 files changed, 134 insertions(+)
> create mode 100644 include/sbi_utils/cache/fdt_cache.h
> create mode 100644 lib/utils/cache/fdt_cache.c
> create mode 100644 lib/utils/cache/fdt_cache_drivers.carray
>
> diff --git a/include/sbi_utils/cache/fdt_cache.h b/include/sbi_utils/cache/fdt_cache.h
> new file mode 100644
> index 00000000..b377d6f5
> --- /dev/null
> +++ b/include/sbi_utils/cache/fdt_cache.h
> @@ -0,0 +1,34 @@
> +/*
> + * SPDX-License-Identifier: BSD-2-Clause
> + *
> + * Copyright (c) 2025 SiFive Inc.
> + */
> +
> +#ifndef __FDT_CACHE_H__
> +#define __FDT_CACHE_H__
> +
> +#include <sbi_utils/cache/cache.h>
> +
> +/**
> + * Register a cache device using information from the DT
> + *
> + * @param fdt devicetree blob
> + * @param noff offset of a node in the devicetree blob
> + * @param dev cache device to register for this devicetree node
> + *
> + * @return 0 on success, or a negative error code on failure
> + */
> +int fdt_cache_add(const void *fdt, int noff, struct cache_device *dev);
> +
> +/**
> + * Get the cache device referencd by the "next-level-cache" property of a DT node
> + *
> + * @param fdt devicetree blob
> + * @param noff offset of a node in the devicetree blob
> + * @param out_dev location to return the cache device
> + *
> + * @return 0 on success, or a negative error code on failure
> + */
> +int fdt_next_cache_get(const void *fdt, int noff, struct cache_device **out_dev);
> +
> +#endif
> diff --git a/lib/utils/cache/Kconfig b/lib/utils/cache/Kconfig
> index 24aa41bc..10602176 100644
> --- a/lib/utils/cache/Kconfig
> +++ b/lib/utils/cache/Kconfig
> @@ -2,6 +2,12 @@
>
> menu "Cache Support"
>
> +config FDT_CACHE
> + bool "FDT based cache drivers"
> + depends on FDT
> + select CACHE
> + default n
> +
> config CACHE
> bool "Cache support"
> default n
> diff --git a/lib/utils/cache/fdt_cache.c b/lib/utils/cache/fdt_cache.c
> new file mode 100644
> index 00000000..e1c6f67c
> --- /dev/null
> +++ b/lib/utils/cache/fdt_cache.c
> @@ -0,0 +1,87 @@
> +/*
> + * SPDX-License-Identifier: BSD-2-Clause
> + *
> + * Copyright (c) 2025 SiFive Inc.
> + */
> +
> +#include <libfdt.h>
> +#include <sbi/sbi_console.h>
> +#include <sbi/sbi_error.h>
> +#include <sbi/sbi_heap.h>
> +#include <sbi_utils/cache/fdt_cache.h>
> +#include <sbi_utils/fdt/fdt_driver.h>
> +
> +/* List of FDT cache drivers generated at compile time */
> +extern const struct fdt_driver *const fdt_cache_drivers[];
> +
> +int fdt_cache_add(const void *fdt, int noff, struct cache_device *dev)
> +{
> + int rc;
> +
> + dev->id = noff;
> + sbi_strncpy(dev->name, fdt_get_name(fdt, noff, NULL), sizeof(dev->name) - 1);
> + sbi_dprintf("%s: %s\n", __func__, dev->name);
> +
> + rc = fdt_next_cache_get(fdt, noff, &dev->next);
> + if (rc)
> + return rc;
> +
> + return cache_add(dev);
> +}
> +
> +static int fdt_cache_add_generic(const void *fdt, int noff)
> +{
> + struct cache_device *dev;
> + int rc;
> +
> + dev = sbi_zalloc(sizeof(*dev));
> + if (!dev)
> + return SBI_ENOMEM;
> +
> + rc = fdt_cache_add(fdt, noff, dev);
> + if (rc) {
> + sbi_free(dev);
> + return rc;
> + }
> +
> + return 0;
> +}
> +
> +static int fdt_cache_find(const void *fdt, int noff, struct cache_device **out_dev)
> +{
> + struct cache_device *dev = cache_find(noff);
> + int rc;
> +
> + if (!dev) {
> + rc = fdt_driver_init_by_offset(fdt, noff, fdt_cache_drivers);
> + if (rc == SBI_ENODEV)
> + rc = fdt_cache_add_generic(fdt, noff);
> + if (rc)
> + return rc;
> +
> + dev = cache_find(noff);
> + if (!dev)
> + return SBI_EFAIL;
> + }
> +
> + if (out_dev)
> + *out_dev = dev;
> +
> + return SBI_OK;
> +}
> +
> +int fdt_next_cache_get(const void *fdt, int noff, struct cache_device **out_dev)
> +{
> + const fdt32_t *val;
> + int len;
> +
> + val = fdt_getprop(fdt, noff, "next-level-cache", &len);
> + if (!val || len < sizeof(*val))
> + return SBI_OK;
> +
> + noff = fdt_node_offset_by_phandle(fdt, fdt32_to_cpu(val[0]));
> + if (noff < 0)
> + return noff;
> +
> + return fdt_cache_find(fdt, noff, out_dev);
> +}
> diff --git a/lib/utils/cache/fdt_cache_drivers.carray b/lib/utils/cache/fdt_cache_drivers.carray
> new file mode 100644
> index 00000000..c1b1791c
> --- /dev/null
> +++ b/lib/utils/cache/fdt_cache_drivers.carray
> @@ -0,0 +1,3 @@
> +HEADER: sbi_utils/cache/fdt_cache.h
> +TYPE: const struct fdt_driver
> +NAME: fdt_cache_drivers
> diff --git a/lib/utils/cache/objects.mk b/lib/utils/cache/objects.mk
> index 21d30ce8..2fcf9666 100644
> --- a/lib/utils/cache/objects.mk
> +++ b/lib/utils/cache/objects.mk
> @@ -4,4 +4,7 @@
> # Copyright (c) 2025 SiFive
> #
>
> +libsbiutils-objs-$(CONFIG_FDT_CACHE) += cache/fdt_cache.o
> +libsbiutils-objs-$(CONFIG_FDT_CACHE) += cache/fdt_cache_drivers.carray.o
> +
> libsbiutils-objs-$(CONFIG_CACHE) += cache/cache.o
> diff --git a/platform/generic/configs/defconfig b/platform/generic/configs/defconfig
> index c7a6531e..b5a7993d 100644
> --- a/platform/generic/configs/defconfig
> +++ b/platform/generic/configs/defconfig
> @@ -7,6 +7,7 @@ CONFIG_PLATFORM_SOPHGO_SG2042=y
> CONFIG_PLATFORM_STARFIVE_JH7110=y
> CONFIG_PLATFORM_THEAD=y
> CONFIG_PLATFORM_MIPS_P8700=y
> +CONFIG_FDT_CACHE=y
> CONFIG_FDT_CPPC=y
> CONFIG_FDT_CPPC_RPMI=y
> CONFIG_FDT_GPIO=y
> --
> 2.17.1
>
More information about the opensbi
mailing list