]> Git Repo - J-u-boot.git/blobdiff - arch/riscv/cpu/cpu.c
Merge tag 'v2023.10-rc4' into next
[J-u-boot.git] / arch / riscv / cpu / cpu.c
index d34c8efce0938b759a90b350dd2ad7e7c056ad7b..d64aa330f206531f57ce527b76f325752cbb3241 100644 (file)
@@ -33,7 +33,9 @@ u32 available_harts_lock = 1;
 
 static inline bool supports_extension(char ext)
 {
-#ifdef CONFIG_CPU
+#if CONFIG_IS_ENABLED(RISCV_MMODE)
+       return csr_read(CSR_MISA) & (1 << (ext - 'a'));
+#elif CONFIG_CPU
        struct udevice *dev;
        char desc[32];
        int i;
@@ -58,17 +60,13 @@ static inline bool supports_extension(char ext)
 
        return false;
 #else  /* !CONFIG_CPU */
-#if CONFIG_IS_ENABLED(RISCV_MMODE)
-       return csr_read(CSR_MISA) & (1 << (ext - 'a'));
-#else  /* !CONFIG_IS_ENABLED(RISCV_MMODE) */
 #warning "There is no way to determine the available extensions in S-mode."
 #warning "Please convert your board to use the RISC-V CPU driver."
        return false;
-#endif /* CONFIG_IS_ENABLED(RISCV_MMODE) */
 #endif /* CONFIG_CPU */
 }
 
-static int riscv_cpu_probe(void)
+static int riscv_cpu_probe(void *ctx, struct event *event)
 {
 #ifdef CONFIG_CPU
        int ret;
@@ -81,6 +79,7 @@ static int riscv_cpu_probe(void)
 
        return 0;
 }
+EVENT_SPY(EVT_DM_POST_INIT_R, riscv_cpu_probe);
 
 /*
  * This is called on secondary harts just after the IPI is init'd. Currently
@@ -93,11 +92,11 @@ static void dummy_pending_ipi_clear(ulong hart, ulong arg0, ulong arg1)
 }
 #endif
 
-int riscv_cpu_setup(void *ctx, struct event *event)
+int riscv_cpu_setup(void)
 {
        int ret;
 
-       ret = riscv_cpu_probe();
+       ret = riscv_cpu_probe(ctx, event);
        if (ret)
                return ret;
 
@@ -112,12 +111,14 @@ int riscv_cpu_setup(void *ctx, struct event *event)
                 * Enable perf counters for cycle, time,
                 * and instret counters only
                 */
+               if (supports_extension('u')) {
 #ifdef CONFIG_RISCV_PRIV_1_9
-               csr_write(CSR_MSCOUNTEREN, GENMASK(2, 0));
-               csr_write(CSR_MUCOUNTEREN, GENMASK(2, 0));
+                       csr_write(CSR_MSCOUNTEREN, GENMASK(2, 0));
+                       csr_write(CSR_MUCOUNTEREN, GENMASK(2, 0));
 #else
-               csr_write(CSR_MCOUNTEREN, GENMASK(2, 0));
+                       csr_write(CSR_MCOUNTEREN, GENMASK(2, 0));
 #endif
+               }
 
                /* Disable paging */
                if (supports_extension('s'))
@@ -145,16 +146,10 @@ int riscv_cpu_setup(void *ctx, struct event *event)
 
        return 0;
 }
-EVENT_SPY(EVT_DM_POST_INIT, riscv_cpu_setup);
+EVENT_SPY_SIMPLE(EVT_DM_POST_INIT_F, riscv_cpu_setup);
 
 int arch_early_init_r(void)
 {
-       int ret;
-
-       ret = riscv_cpu_probe();
-       if (ret)
-               return ret;
-
        if (IS_ENABLED(CONFIG_SYSRESET_SBI))
                device_bind_driver(gd->dm_root, "sbi-sysreset",
                                   "sbi-sysreset", NULL);
This page took 0.027511 seconds and 4 git commands to generate.