| // SPDX-License-Identifier: GPL-2.0 |
| /* |
| * Copyright (c) 2019 Christoph Hellwig. |
| */ |
| |
| #include <linux/io.h> |
| #include <linux/of_address.h> |
| #include <linux/types.h> |
| #include <asm/clint.h> |
| #include <asm/csr.h> |
| #include <asm/timex.h> |
| #include <asm/smp.h> |
| |
| /* |
| * This is the layout used by the SiFive clint, which is also shared by the qemu |
| * virt platform, and the Kendryte KD210 at least. |
| */ |
| #define CLINT_IPI_OFF 0 |
| #define CLINT_TIME_CMP_OFF 0x4000 |
| #define CLINT_TIME_VAL_OFF 0xbff8 |
| |
| u32 __iomem *clint_ipi_base; |
| |
| void clint_init_boot_cpu(void) |
| { |
| struct device_node *np; |
| void __iomem *base; |
| |
| np = of_find_compatible_node(NULL, NULL, "riscv,clint0"); |
| if (!np) { |
| panic("clint not found"); |
| return; |
| } |
| |
| base = of_iomap(np, 0); |
| if (!base) |
| panic("could not map CLINT"); |
| |
| clint_ipi_base = base + CLINT_IPI_OFF; |
| riscv_time_cmp = base + CLINT_TIME_CMP_OFF; |
| riscv_time_val = base + CLINT_TIME_VAL_OFF; |
| |
| clint_clear_ipi(boot_cpu_hartid); |
| } |