forked from mirrors/linux
		
	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
					
				
					 12 changed files with 16 additions and 126 deletions
				
			
		|  | @ -81,7 +81,7 @@ config RISCV | |||
| 	select PCI_DOMAINS_GENERIC if PCI | ||||
| 	select PCI_MSI if PCI | ||||
| 	select RISCV_INTC | ||||
| 	select RISCV_TIMER | ||||
| 	select RISCV_TIMER if RISCV_SBI | ||||
| 	select SPARSEMEM_STATIC if 32BIT | ||||
| 	select SPARSE_IRQ | ||||
| 	select SYSCTL_EXCEPTION_TRACE | ||||
|  |  | |||
|  | @ -12,6 +12,7 @@ config SOC_SIFIVE | |||
| 
 | ||||
| config SOC_VIRT | ||||
| 	bool "QEMU Virt Machine" | ||||
| 	select CLINT_TIMER if RISCV_M_MODE | ||||
| 	select POWER_RESET | ||||
| 	select POWER_RESET_SYSCON | ||||
| 	select POWER_RESET_SYSCON_POWEROFF | ||||
|  | @ -24,6 +25,7 @@ config SOC_VIRT | |||
| config SOC_KENDRYTE | ||||
| 	bool "Kendryte K210 SoC" | ||||
| 	depends on !MMU | ||||
| 	select CLINT_TIMER if RISCV_M_MODE | ||||
| 	select SERIAL_SIFIVE if TTY | ||||
| 	select SERIAL_SIFIVE_CONSOLE if TTY | ||||
| 	select SIFIVE_PLIC | ||||
|  |  | |||
|  | @ -26,6 +26,7 @@ CONFIG_EXPERT=y | |||
| CONFIG_SLOB=y | ||||
| # CONFIG_SLAB_MERGE_DEFAULT is not set | ||||
| # CONFIG_MMU is not set | ||||
| CONFIG_SOC_VIRT=y | ||||
| CONFIG_MAXPHYSMEM_2GB=y | ||||
| CONFIG_SMP=y | ||||
| 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_LEGACY_PTYS is not set | ||||
| # CONFIG_LDISC_AUTOLOAD is not set | ||||
| # CONFIG_DEVMEM is not set | ||||
| CONFIG_SERIAL_8250=y | ||||
| # CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set | ||||
| CONFIG_SERIAL_8250_CONSOLE=y | ||||
|  | @ -57,16 +57,13 @@ CONFIG_SERIAL_8250_NR_UARTS=1 | |||
| CONFIG_SERIAL_8250_RUNTIME_UARTS=1 | ||||
| CONFIG_SERIAL_OF_PLATFORM=y | ||||
| # CONFIG_HW_RANDOM is not set | ||||
| # CONFIG_DEVMEM 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_HID is not set | ||||
| # CONFIG_USB_SUPPORT is not set | ||||
| CONFIG_VIRTIO_MMIO=y | ||||
| CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES=y | ||||
| CONFIG_SIFIVE_PLIC=y | ||||
| # CONFIG_VALIDATE_FS_PARSER is not set | ||||
| CONFIG_EXT2_FS=y | ||||
| # CONFIG_DNOTIFY 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 | ||||
| 
 | ||||
| #include <asm/csr.h> | ||||
| #include <asm/mmio.h> | ||||
| 
 | ||||
| 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) | ||||
| { | ||||
| 	if (IS_ENABLED(CONFIG_RISCV_SBI)) | ||||
| 		return csr_read(CSR_TIME); | ||||
| 	return mmio_get_cycles(); | ||||
| 	return csr_read(CSR_TIME); | ||||
| } | ||||
| #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 | ||||
| static inline u64 get_cycles64(void) | ||||
| { | ||||
| 	return get_cycles(); | ||||
| } | ||||
| #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) | ||||
| { | ||||
| 	u32 hi, lo; | ||||
|  |  | |||
|  | @ -31,7 +31,7 @@ obj-y	+= cacheinfo.o | |||
| obj-y	+= patch.o | ||||
| 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_SMP)		+= smpboot.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/smp.h> | ||||
| 
 | ||||
| #include <asm/clint.h> | ||||
| #include <asm/cpu_ops.h> | ||||
| #include <asm/setup.h> | ||||
| #include <asm/sections.h> | ||||
|  | @ -79,7 +78,6 @@ void __init setup_arch(char **cmdline_p) | |||
| #else | ||||
| 	unflatten_device_tree(); | ||||
| #endif | ||||
| 	clint_init_boot_cpu(); | ||||
| 
 | ||||
| #ifdef CONFIG_SWIOTLB | ||||
| 	swiotlb_init(1); | ||||
|  |  | |||
|  | @ -18,7 +18,6 @@ | |||
| #include <linux/delay.h> | ||||
| #include <linux/irq_work.h> | ||||
| 
 | ||||
| #include <asm/clint.h> | ||||
| #include <asm/sbi.h> | ||||
| #include <asm/tlbflush.h> | ||||
| #include <asm/cacheflush.h> | ||||
|  |  | |||
|  | @ -24,7 +24,6 @@ | |||
| #include <linux/of.h> | ||||
| #include <linux/sched/task_stack.h> | ||||
| #include <linux/sched/mm.h> | ||||
| #include <asm/clint.h> | ||||
| #include <asm/cpu_ops.h> | ||||
| #include <asm/irq.h> | ||||
| #include <asm/mmu_context.h> | ||||
|  |  | |||
|  | @ -653,9 +653,8 @@ config ATCPIT100_TIMER | |||
| 	  This option enables support for the Andestech ATCPIT100 timers. | ||||
| 
 | ||||
| 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 | ||||
| 	default y | ||||
| 	select TIMER_PROBE | ||||
| 	select TIMER_OF | ||||
| 	help | ||||
|  |  | |||
|  | @ -19,26 +19,13 @@ | |||
| #include <linux/of_irq.h> | ||||
| #include <asm/smp.h> | ||||
| #include <asm/sbi.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); | ||||
| } | ||||
| #include <asm/timex.h> | ||||
| 
 | ||||
| static int riscv_clock_next_event(unsigned long delta, | ||||
| 		struct clock_event_device *ce) | ||||
| { | ||||
| 	csr_set(CSR_IE, IE_TIE); | ||||
| 	if (IS_ENABLED(CONFIG_RISCV_SBI)) | ||||
| 		sbi_set_timer(get_cycles64() + delta); | ||||
| 	else | ||||
| 		mmio_set_timer(get_cycles64() + delta); | ||||
| 	sbi_set_timer(get_cycles64() + delta); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Anup Patel
						Anup Patel