u-boot/drivers/cache/cache-sifive-pl2.c
Zong Li 64e8482f1c cache: add sifive private L2 cache driver
This driver is currently responsible for enabling the clock gating
feature of SiFive pre core's private L2 cache.

Signed-off-by: Zong Li <zong.li@sifive.com>
Reviewed-by: Leo Yu-Chi Liang <ycliang@andestech.com>
2023-12-27 17:28:57 +08:00

44 lines
983 B
C

// SPDX-License-Identifier: GPL-2.0
/*
* Copyright (C) 2023 SiFive
*/
#include <cache.h>
#include <dm.h>
#include <malloc.h>
#include <asm/io.h>
#include <dm/device.h>
#include <dm/device-internal.h>
#define SIFIVE_PL2CHICKENBIT_OFFSET 0x1000
#define SIFIVE_PL2CHICKENBIT_REGIONCLOCKDISABLE_MASK BIT(3)
static int sifive_pl2_probe(struct udevice *dev)
{
fdt_addr_t base;
u32 val;
base = dev_read_addr(dev);
if (base == FDT_ADDR_T_NONE)
return -EINVAL;
/* Enable regionClockDisable bit */
val = readl((void __iomem *)(base + SIFIVE_PL2CHICKENBIT_OFFSET));
writel(val & ~SIFIVE_PL2CHICKENBIT_REGIONCLOCKDISABLE_MASK,
(void __iomem *)(base + SIFIVE_PL2CHICKENBIT_OFFSET));
return 0;
}
static const struct udevice_id sifive_pl2_ids[] = {
{ .compatible = "sifive,pl2cache0" },
{ .compatible = "sifive,pl2cache1" },
{}
};
U_BOOT_DRIVER(sifive_pl2) = {
.name = "sifive_pl2",
.id = UCLASS_CACHE,
.of_match = sifive_pl2_ids,
.probe = sifive_pl2_probe,
};