aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/clocksource/riscv_timer.c
diff options
context:
space:
mode:
authorAtish Patra <atish.patra@wdc.com>2018-10-02 15:15:05 -0400
committerPalmer Dabbelt <palmer@sifive.com>2018-10-22 20:03:37 -0400
commitf99fb607fb2bc0d4ce6b9adb764c65e37f40a92b (patch)
tree082100e81815f6c2fa5d152821d24351aa16a871 /drivers/clocksource/riscv_timer.c
parent6825c7a80f1863b975a00042abe140ea24813af2 (diff)
RISC-V: Use Linux logical CPU number instead of hartid
Setup the cpu_logical_map during boot. Moreover, every SBI call and PLIC context are based on the physical hartid. Use the logical CPU to hartid mapping to pass correct hartid to respective functions. Signed-off-by: Atish Patra <atish.patra@wdc.com> Reviewed-by: Anup Patel <anup@brainfault.org> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Palmer Dabbelt <palmer@sifive.com>
Diffstat (limited to 'drivers/clocksource/riscv_timer.c')
-rw-r--r--drivers/clocksource/riscv_timer.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/drivers/clocksource/riscv_timer.c b/drivers/clocksource/riscv_timer.c
index ad7453fc3129..084e97dc10ed 100644
--- a/drivers/clocksource/riscv_timer.c
+++ b/drivers/clocksource/riscv_timer.c
@@ -8,6 +8,7 @@
8#include <linux/cpu.h> 8#include <linux/cpu.h>
9#include <linux/delay.h> 9#include <linux/delay.h>
10#include <linux/irq.h> 10#include <linux/irq.h>
11#include <asm/smp.h>
11#include <asm/sbi.h> 12#include <asm/sbi.h>
12 13
13/* 14/*
@@ -84,13 +85,16 @@ void riscv_timer_interrupt(void)
84 85
85static int __init riscv_timer_init_dt(struct device_node *n) 86static int __init riscv_timer_init_dt(struct device_node *n)
86{ 87{
87 int cpu_id = riscv_of_processor_hartid(n), error; 88 int cpuid, hartid, error;
88 struct clocksource *cs; 89 struct clocksource *cs;
89 90
90 if (cpu_id != smp_processor_id()) 91 hartid = riscv_of_processor_hartid(n);
92 cpuid = riscv_hartid_to_cpuid(hartid);
93
94 if (cpuid != smp_processor_id())
91 return 0; 95 return 0;
92 96
93 cs = per_cpu_ptr(&riscv_clocksource, cpu_id); 97 cs = per_cpu_ptr(&riscv_clocksource, cpuid);
94 clocksource_register_hz(cs, riscv_timebase); 98 clocksource_register_hz(cs, riscv_timebase);
95 99
96 error = cpuhp_setup_state(CPUHP_AP_RISCV_TIMER_STARTING, 100 error = cpuhp_setup_state(CPUHP_AP_RISCV_TIMER_STARTING,
@@ -98,7 +102,7 @@ static int __init riscv_timer_init_dt(struct device_node *n)
98 riscv_timer_starting_cpu, riscv_timer_dying_cpu); 102 riscv_timer_starting_cpu, riscv_timer_dying_cpu);
99 if (error) 103 if (error)
100 pr_err("RISCV timer register failed [%d] for cpu = [%d]\n", 104 pr_err("RISCV timer register failed [%d] for cpu = [%d]\n",
101 error, cpu_id); 105 error, cpuid);
102 return error; 106 return error;
103} 107}
104 108