RISC-V: Remove CLINT related code from timer and arch
Right now the RISC-V timer driver is convoluted to support: 1. Linux RISC-V S-mode (with MMU) where it will use TIME CSR for clocksource and SBI timer calls for clockevent device. 2. Linux RISC-V M-mode (without MMU) where it will use CLINT MMIO counter register for clocksource and CLINT MMIO compare register for clockevent device. We now have a separate CLINT timer driver which also provide CLINT based IPI operations so let's remove CLINT MMIO related code from arch/riscv directory and RISC-V timer driver. Signed-off-by: Anup Patel <anup.patel@wdc.com> Tested-by: Emil Renner Berhing <kernel@esmil.dk> Acked-by: Daniel Lezcano <daniel.lezcano@linaro.org> Reviewed-by: Atish Patra <atish.patra@wdc.com> Reviewed-by: Palmer Dabbelt <palmerdabbelt@google.com> Signed-off-by: Palmer Dabbelt <palmerdabbelt@google.com>
This commit is contained in:
parent
2ac6795fcc
commit
2bc3fc877a
@ -81,7 +81,7 @@ config RISCV
|
|||||||
select PCI_DOMAINS_GENERIC if PCI
|
select PCI_DOMAINS_GENERIC if PCI
|
||||||
select PCI_MSI if PCI
|
select PCI_MSI if PCI
|
||||||
select RISCV_INTC
|
select RISCV_INTC
|
||||||
select RISCV_TIMER
|
select RISCV_TIMER if RISCV_SBI
|
||||||
select SPARSEMEM_STATIC if 32BIT
|
select SPARSEMEM_STATIC if 32BIT
|
||||||
select SPARSE_IRQ
|
select SPARSE_IRQ
|
||||||
select SYSCTL_EXCEPTION_TRACE
|
select SYSCTL_EXCEPTION_TRACE
|
||||||
|
@ -12,6 +12,7 @@ config SOC_SIFIVE
|
|||||||
|
|
||||||
config SOC_VIRT
|
config SOC_VIRT
|
||||||
bool "QEMU Virt Machine"
|
bool "QEMU Virt Machine"
|
||||||
|
select CLINT_TIMER if RISCV_M_MODE
|
||||||
select POWER_RESET
|
select POWER_RESET
|
||||||
select POWER_RESET_SYSCON
|
select POWER_RESET_SYSCON
|
||||||
select POWER_RESET_SYSCON_POWEROFF
|
select POWER_RESET_SYSCON_POWEROFF
|
||||||
@ -24,6 +25,7 @@ config SOC_VIRT
|
|||||||
config SOC_KENDRYTE
|
config SOC_KENDRYTE
|
||||||
bool "Kendryte K210 SoC"
|
bool "Kendryte K210 SoC"
|
||||||
depends on !MMU
|
depends on !MMU
|
||||||
|
select CLINT_TIMER if RISCV_M_MODE
|
||||||
select SERIAL_SIFIVE if TTY
|
select SERIAL_SIFIVE if TTY
|
||||||
select SERIAL_SIFIVE_CONSOLE if TTY
|
select SERIAL_SIFIVE_CONSOLE if TTY
|
||||||
select SIFIVE_PLIC
|
select SIFIVE_PLIC
|
||||||
|
@ -26,6 +26,7 @@ CONFIG_EXPERT=y
|
|||||||
CONFIG_SLOB=y
|
CONFIG_SLOB=y
|
||||||
# CONFIG_SLAB_MERGE_DEFAULT is not set
|
# CONFIG_SLAB_MERGE_DEFAULT is not set
|
||||||
# CONFIG_MMU is not set
|
# CONFIG_MMU is not set
|
||||||
|
CONFIG_SOC_VIRT=y
|
||||||
CONFIG_MAXPHYSMEM_2GB=y
|
CONFIG_MAXPHYSMEM_2GB=y
|
||||||
CONFIG_SMP=y
|
CONFIG_SMP=y
|
||||||
CONFIG_CMDLINE="root=/dev/vda rw earlycon=uart8250,mmio,0x10000000,115200n8 console=ttyS0"
|
CONFIG_CMDLINE="root=/dev/vda rw earlycon=uart8250,mmio,0x10000000,115200n8 console=ttyS0"
|
||||||
@ -49,7 +50,6 @@ CONFIG_VIRTIO_BLK=y
|
|||||||
# CONFIG_SERIO is not set
|
# CONFIG_SERIO is not set
|
||||||
# CONFIG_LEGACY_PTYS is not set
|
# CONFIG_LEGACY_PTYS is not set
|
||||||
# CONFIG_LDISC_AUTOLOAD is not set
|
# CONFIG_LDISC_AUTOLOAD is not set
|
||||||
# CONFIG_DEVMEM is not set
|
|
||||||
CONFIG_SERIAL_8250=y
|
CONFIG_SERIAL_8250=y
|
||||||
# CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set
|
# CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set
|
||||||
CONFIG_SERIAL_8250_CONSOLE=y
|
CONFIG_SERIAL_8250_CONSOLE=y
|
||||||
@ -57,16 +57,13 @@ CONFIG_SERIAL_8250_NR_UARTS=1
|
|||||||
CONFIG_SERIAL_8250_RUNTIME_UARTS=1
|
CONFIG_SERIAL_8250_RUNTIME_UARTS=1
|
||||||
CONFIG_SERIAL_OF_PLATFORM=y
|
CONFIG_SERIAL_OF_PLATFORM=y
|
||||||
# CONFIG_HW_RANDOM is not set
|
# CONFIG_HW_RANDOM is not set
|
||||||
|
# CONFIG_DEVMEM is not set
|
||||||
# CONFIG_HWMON is not set
|
# CONFIG_HWMON is not set
|
||||||
# CONFIG_LCD_CLASS_DEVICE is not set
|
|
||||||
# CONFIG_BACKLIGHT_CLASS_DEVICE is not set
|
|
||||||
# CONFIG_VGA_CONSOLE is not set
|
# CONFIG_VGA_CONSOLE is not set
|
||||||
# CONFIG_HID is not set
|
# CONFIG_HID is not set
|
||||||
# CONFIG_USB_SUPPORT is not set
|
# CONFIG_USB_SUPPORT is not set
|
||||||
CONFIG_VIRTIO_MMIO=y
|
CONFIG_VIRTIO_MMIO=y
|
||||||
CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES=y
|
CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES=y
|
||||||
CONFIG_SIFIVE_PLIC=y
|
|
||||||
# CONFIG_VALIDATE_FS_PARSER is not set
|
|
||||||
CONFIG_EXT2_FS=y
|
CONFIG_EXT2_FS=y
|
||||||
# CONFIG_DNOTIFY is not set
|
# CONFIG_DNOTIFY is not set
|
||||||
# CONFIG_INOTIFY_USER is not set
|
# CONFIG_INOTIFY_USER is not set
|
||||||
|
@ -1,14 +0,0 @@
|
|||||||
/* SPDX-License-Identifier: GPL-2.0 */
|
|
||||||
#ifndef _ASM_RISCV_CLINT_H
|
|
||||||
#define _ASM_RISCV_CLINT_H 1
|
|
||||||
|
|
||||||
#include <linux/io.h>
|
|
||||||
#include <linux/smp.h>
|
|
||||||
|
|
||||||
#ifdef CONFIG_RISCV_M_MODE
|
|
||||||
void clint_init_boot_cpu(void);
|
|
||||||
#else /* CONFIG_RISCV_M_MODE */
|
|
||||||
#define clint_init_boot_cpu() do { } while (0)
|
|
||||||
#endif /* CONFIG_RISCV_M_MODE */
|
|
||||||
|
|
||||||
#endif /* _ASM_RISCV_CLINT_H */
|
|
@ -7,41 +7,27 @@
|
|||||||
#define _ASM_RISCV_TIMEX_H
|
#define _ASM_RISCV_TIMEX_H
|
||||||
|
|
||||||
#include <asm/csr.h>
|
#include <asm/csr.h>
|
||||||
#include <asm/mmio.h>
|
|
||||||
|
|
||||||
typedef unsigned long cycles_t;
|
typedef unsigned long cycles_t;
|
||||||
|
|
||||||
extern u64 __iomem *riscv_time_val;
|
|
||||||
extern u64 __iomem *riscv_time_cmp;
|
|
||||||
|
|
||||||
#ifdef CONFIG_64BIT
|
|
||||||
#define mmio_get_cycles() readq_relaxed(riscv_time_val)
|
|
||||||
#else
|
|
||||||
#define mmio_get_cycles() readl_relaxed(riscv_time_val)
|
|
||||||
#define mmio_get_cycles_hi() readl_relaxed(((u32 *)riscv_time_val) + 1)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static inline cycles_t get_cycles(void)
|
static inline cycles_t get_cycles(void)
|
||||||
{
|
{
|
||||||
if (IS_ENABLED(CONFIG_RISCV_SBI))
|
|
||||||
return csr_read(CSR_TIME);
|
return csr_read(CSR_TIME);
|
||||||
return mmio_get_cycles();
|
|
||||||
}
|
}
|
||||||
#define get_cycles get_cycles
|
#define get_cycles get_cycles
|
||||||
|
|
||||||
|
static inline u32 get_cycles_hi(void)
|
||||||
|
{
|
||||||
|
return csr_read(CSR_TIMEH);
|
||||||
|
}
|
||||||
|
#define get_cycles_hi get_cycles_hi
|
||||||
|
|
||||||
#ifdef CONFIG_64BIT
|
#ifdef CONFIG_64BIT
|
||||||
static inline u64 get_cycles64(void)
|
static inline u64 get_cycles64(void)
|
||||||
{
|
{
|
||||||
return get_cycles();
|
return get_cycles();
|
||||||
}
|
}
|
||||||
#else /* CONFIG_64BIT */
|
#else /* CONFIG_64BIT */
|
||||||
static inline u32 get_cycles_hi(void)
|
|
||||||
{
|
|
||||||
if (IS_ENABLED(CONFIG_RISCV_SBI))
|
|
||||||
return csr_read(CSR_TIMEH);
|
|
||||||
return mmio_get_cycles_hi();
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline u64 get_cycles64(void)
|
static inline u64 get_cycles64(void)
|
||||||
{
|
{
|
||||||
u32 hi, lo;
|
u32 hi, lo;
|
||||||
|
@ -31,7 +31,7 @@ obj-y += cacheinfo.o
|
|||||||
obj-y += patch.o
|
obj-y += patch.o
|
||||||
obj-$(CONFIG_MMU) += vdso.o vdso/
|
obj-$(CONFIG_MMU) += vdso.o vdso/
|
||||||
|
|
||||||
obj-$(CONFIG_RISCV_M_MODE) += clint.o traps_misaligned.o
|
obj-$(CONFIG_RISCV_M_MODE) += traps_misaligned.o
|
||||||
obj-$(CONFIG_FPU) += fpu.o
|
obj-$(CONFIG_FPU) += fpu.o
|
||||||
obj-$(CONFIG_SMP) += smpboot.o
|
obj-$(CONFIG_SMP) += smpboot.o
|
||||||
obj-$(CONFIG_SMP) += smp.o
|
obj-$(CONFIG_SMP) += smp.o
|
||||||
|
@ -1,63 +0,0 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2019 Christoph Hellwig.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/io.h>
|
|
||||||
#include <linux/of_address.h>
|
|
||||||
#include <linux/smp.h>
|
|
||||||
#include <linux/types.h>
|
|
||||||
#include <asm/clint.h>
|
|
||||||
#include <asm/csr.h>
|
|
||||||
#include <asm/timex.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;
|
|
||||||
|
|
||||||
static void clint_send_ipi(const struct cpumask *target)
|
|
||||||
{
|
|
||||||
unsigned int cpu;
|
|
||||||
|
|
||||||
for_each_cpu(cpu, target)
|
|
||||||
writel(1, clint_ipi_base + cpuid_to_hartid_map(cpu));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void clint_clear_ipi(void)
|
|
||||||
{
|
|
||||||
writel(0, clint_ipi_base + cpuid_to_hartid_map(smp_processor_id()));
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct riscv_ipi_ops clint_ipi_ops = {
|
|
||||||
.ipi_inject = clint_send_ipi,
|
|
||||||
.ipi_clear = clint_clear_ipi,
|
|
||||||
};
|
|
||||||
|
|
||||||
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();
|
|
||||||
riscv_set_ipi_ops(&clint_ipi_ops);
|
|
||||||
}
|
|
@ -18,7 +18,6 @@
|
|||||||
#include <linux/swiotlb.h>
|
#include <linux/swiotlb.h>
|
||||||
#include <linux/smp.h>
|
#include <linux/smp.h>
|
||||||
|
|
||||||
#include <asm/clint.h>
|
|
||||||
#include <asm/cpu_ops.h>
|
#include <asm/cpu_ops.h>
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
#include <asm/sections.h>
|
#include <asm/sections.h>
|
||||||
@ -79,7 +78,6 @@ void __init setup_arch(char **cmdline_p)
|
|||||||
#else
|
#else
|
||||||
unflatten_device_tree();
|
unflatten_device_tree();
|
||||||
#endif
|
#endif
|
||||||
clint_init_boot_cpu();
|
|
||||||
|
|
||||||
#ifdef CONFIG_SWIOTLB
|
#ifdef CONFIG_SWIOTLB
|
||||||
swiotlb_init(1);
|
swiotlb_init(1);
|
||||||
|
@ -18,7 +18,6 @@
|
|||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/irq_work.h>
|
#include <linux/irq_work.h>
|
||||||
|
|
||||||
#include <asm/clint.h>
|
|
||||||
#include <asm/sbi.h>
|
#include <asm/sbi.h>
|
||||||
#include <asm/tlbflush.h>
|
#include <asm/tlbflush.h>
|
||||||
#include <asm/cacheflush.h>
|
#include <asm/cacheflush.h>
|
||||||
|
@ -24,7 +24,6 @@
|
|||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
#include <linux/sched/task_stack.h>
|
#include <linux/sched/task_stack.h>
|
||||||
#include <linux/sched/mm.h>
|
#include <linux/sched/mm.h>
|
||||||
#include <asm/clint.h>
|
|
||||||
#include <asm/cpu_ops.h>
|
#include <asm/cpu_ops.h>
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
#include <asm/mmu_context.h>
|
#include <asm/mmu_context.h>
|
||||||
|
@ -653,9 +653,8 @@ config ATCPIT100_TIMER
|
|||||||
This option enables support for the Andestech ATCPIT100 timers.
|
This option enables support for the Andestech ATCPIT100 timers.
|
||||||
|
|
||||||
config RISCV_TIMER
|
config RISCV_TIMER
|
||||||
bool "Timer for the RISC-V platform"
|
bool "Timer for the RISC-V platform" if COMPILE_TEST
|
||||||
depends on GENERIC_SCHED_CLOCK && RISCV
|
depends on GENERIC_SCHED_CLOCK && RISCV
|
||||||
default y
|
|
||||||
select TIMER_PROBE
|
select TIMER_PROBE
|
||||||
select TIMER_OF
|
select TIMER_OF
|
||||||
help
|
help
|
||||||
|
@ -19,26 +19,13 @@
|
|||||||
#include <linux/of_irq.h>
|
#include <linux/of_irq.h>
|
||||||
#include <asm/smp.h>
|
#include <asm/smp.h>
|
||||||
#include <asm/sbi.h>
|
#include <asm/sbi.h>
|
||||||
|
#include <asm/timex.h>
|
||||||
u64 __iomem *riscv_time_cmp;
|
|
||||||
u64 __iomem *riscv_time_val;
|
|
||||||
|
|
||||||
static inline void mmio_set_timer(u64 val)
|
|
||||||
{
|
|
||||||
void __iomem *r;
|
|
||||||
|
|
||||||
r = riscv_time_cmp + cpuid_to_hartid_map(smp_processor_id());
|
|
||||||
writeq_relaxed(val, r);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int riscv_clock_next_event(unsigned long delta,
|
static int riscv_clock_next_event(unsigned long delta,
|
||||||
struct clock_event_device *ce)
|
struct clock_event_device *ce)
|
||||||
{
|
{
|
||||||
csr_set(CSR_IE, IE_TIE);
|
csr_set(CSR_IE, IE_TIE);
|
||||||
if (IS_ENABLED(CONFIG_RISCV_SBI))
|
|
||||||
sbi_set_timer(get_cycles64() + delta);
|
sbi_set_timer(get_cycles64() + delta);
|
||||||
else
|
|
||||||
mmio_set_timer(get_cycles64() + delta);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user