]> Git Repo - J-u-boot.git/blob - arch/riscv/cpu/cpu.c
riscv: Introduce CONFIG_XIP to support booting from flash
[J-u-boot.git] / arch / riscv / cpu / cpu.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (C) 2018, Bin Meng <[email protected]>
4  */
5
6 #include <common.h>
7 #include <cpu.h>
8 #include <dm.h>
9 #include <log.h>
10 #include <asm/csr.h>
11 #include <asm/encoding.h>
12 #include <dm/uclass-internal.h>
13
14 /*
15  * The variables here must be stored in the data section since they are used
16  * before the bss section is available.
17  */
18 phys_addr_t prior_stage_fdt_address __attribute__((section(".data")));
19 #ifndef CONFIG_XIP
20 u32 hart_lottery __attribute__((section(".data"))) = 0;
21
22 /*
23  * The main hart running U-Boot has acquired available_harts_lock until it has
24  * finished initialization of global data.
25  */
26 u32 available_harts_lock = 1;
27 #endif
28
29 static inline bool supports_extension(char ext)
30 {
31 #ifdef CONFIG_CPU
32         struct udevice *dev;
33         char desc[32];
34
35         uclass_find_first_device(UCLASS_CPU, &dev);
36         if (!dev) {
37                 debug("unable to find the RISC-V cpu device\n");
38                 return false;
39         }
40         if (!cpu_get_desc(dev, desc, sizeof(desc))) {
41                 /* skip the first 4 characters (rv32|rv64) */
42                 if (strchr(desc + 4, ext))
43                         return true;
44         }
45
46         return false;
47 #else  /* !CONFIG_CPU */
48 #ifdef CONFIG_RISCV_MMODE
49         return csr_read(misa) & (1 << (ext - 'a'));
50 #else  /* !CONFIG_RISCV_MMODE */
51 #warning "There is no way to determine the available extensions in S-mode."
52 #warning "Please convert your board to use the RISC-V CPU driver."
53         return false;
54 #endif /* CONFIG_RISCV_MMODE */
55 #endif /* CONFIG_CPU */
56 }
57
58 static int riscv_cpu_probe(void)
59 {
60 #ifdef CONFIG_CPU
61         int ret;
62
63         /* probe cpus so that RISC-V timer can be bound */
64         ret = cpu_probe_all();
65         if (ret)
66                 return log_msg_ret("RISC-V cpus probe failed\n", ret);
67 #endif
68
69         return 0;
70 }
71
72 int arch_cpu_init_dm(void)
73 {
74         int ret;
75
76         ret = riscv_cpu_probe();
77         if (ret)
78                 return ret;
79
80         /* Enable FPU */
81         if (supports_extension('d') || supports_extension('f')) {
82                 csr_set(MODE_PREFIX(status), MSTATUS_FS);
83                 csr_write(fcsr, 0);
84         }
85
86         if (CONFIG_IS_ENABLED(RISCV_MMODE)) {
87                 /*
88                  * Enable perf counters for cycle, time,
89                  * and instret counters only
90                  */
91                 csr_write(mcounteren, GENMASK(2, 0));
92
93                 /* Disable paging */
94                 if (supports_extension('s'))
95                         csr_write(satp, 0);
96         }
97
98         return 0;
99 }
100
101 int arch_early_init_r(void)
102 {
103         return riscv_cpu_probe();
104 }
This page took 0.031999 seconds and 4 git commands to generate.