RISC-V: time.c: Add ACPI support for time_init()
authorSunil V L <sunilvl@ventanamicro.com>
Mon, 15 May 2023 05:49:26 +0000 (11:19 +0530)
committerPalmer Dabbelt <palmer@rivosinc.com>
Thu, 1 Jun 2023 15:45:13 +0000 (08:45 -0700)
On ACPI based platforms, timer related information is
available in RHCT. Add ACPI based probe support to the
timer initialization.

Signed-off-by: Sunil V L <sunilvl@ventanamicro.com>
Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Conor Dooley <conor.dooley@microchip.com>
Link: https://lore.kernel.org/r/20230515054928.2079268-20-sunilvl@ventanamicro.com
Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
arch/riscv/kernel/time.c

index babaf3b..23641e8 100644 (file)
@@ -4,6 +4,7 @@
  * Copyright (C) 2017 SiFive
  */
 
+#include <linux/acpi.h>
 #include <linux/of_clk.h>
 #include <linux/clockchips.h>
 #include <linux/clocksource.h>
@@ -18,17 +19,29 @@ EXPORT_SYMBOL_GPL(riscv_timebase);
 void __init time_init(void)
 {
        struct device_node *cpu;
+       struct acpi_table_rhct *rhct;
+       acpi_status status;
        u32 prop;
 
-       cpu = of_find_node_by_path("/cpus");
-       if (!cpu || of_property_read_u32(cpu, "timebase-frequency", &prop))
-               panic(KERN_WARNING "RISC-V system with no 'timebase-frequency' in DTS\n");
-       of_node_put(cpu);
-       riscv_timebase = prop;
+       if (acpi_disabled) {
+               cpu = of_find_node_by_path("/cpus");
+               if (!cpu || of_property_read_u32(cpu, "timebase-frequency", &prop))
+                       panic("RISC-V system with no 'timebase-frequency' in DTS\n");
+
+               of_node_put(cpu);
+               riscv_timebase = prop;
+               of_clk_init(NULL);
+       } else {
+               status = acpi_get_table(ACPI_SIG_RHCT, 0, (struct acpi_table_header **)&rhct);
+               if (ACPI_FAILURE(status))
+                       panic("RISC-V ACPI system with no RHCT table\n");
+
+               riscv_timebase = rhct->time_base_freq;
+               acpi_put_table((struct acpi_table_header *)rhct);
+       }
 
        lpj_fine = riscv_timebase / HZ;
 
-       of_clk_init(NULL);
        timer_probe();
 
        tick_setup_hrtimer_broadcast();