summaryrefslogtreecommitdiff
path: root/components/drivers
diff options
context:
space:
mode:
authorGUI <[email protected]>2026-10-17 09:44:26 +0800
committerGitHub <[email protected]>2026-10-17 09:44:26 +0800
commit8d8dc96b67eee53af2841a8819364d52fbec39cb (patch)
treeeb2ac2f0984261f526c5d9c14462db47eceeb193 /components/drivers
parentc1d931bcc78915f24c3526a07bdecc64d5110d51 (diff)
[ARCH/RISC-V] Next RISC-V (#10320)
* [libcpu][risc-v] Refactor the RISC-V architecture port Introduce an opt-in unified RISC-V common layer for RV32 and RV64 while keeping existing BSPs on the legacy implementation during migration. - use ARCH_RISCV and ARCH_CPU_64BIT for architecture and XLEN selection - unify context, trap, MMU, cache, timer, SBI, SMP and ISA handling - add PLIC, CLIC, ACLINT, APLIC and IMSIC support - map physical hart IDs to contiguous logical CPU IDs - add T-Head vendor overrides while preserving legacy ports - migrate qemu-virt64-riscv with RV32 and RV64 support - update clock_time, MM, LWP, OFW, PCI and Rust integration Existing BSPs continue using legacy_common or common64 unless they select RT_USING_RISCV_NEW_COMMON. Signed-off-by: GuEe-GUI <[email protected]> * [libcpu][risc-v] skip disabled CPU nodes in early FDT walk Rbb666 noted that rt_hw_fdt_install_early() walked every /cpus child without checking status, so disabled cores still joined hart registration and MMU capability probing. Skip nodes that are not okay/ok via rt_fdt_device_is_available() before reading reg or mmu-type. Signed-off-by: seteiro <[email protected]> * [libcpu][risc-v] Fix per-CPU page table mapping - reuse existing non-leaf page table entries when mapping per-CPU areas - reject leaf entry conflicts instead of overwriting mappings Signed-off-by: GuEe-GUI <[email protected]> --------- Signed-off-by: GuEe-GUI <[email protected]> Signed-off-by: seteiro <[email protected]> Co-authored-by: seteiro <[email protected]>
Diffstat (limited to 'components/drivers')
-rw-r--r--components/drivers/block/blk.c5
-rw-r--r--components/drivers/clock_time/SConscript7
-rw-r--r--components/drivers/clock_time/arch/risc-v/cputimer.c (renamed from components/drivers/clock_time/arch/risc-v/virt64/cputimer.c)20
-rw-r--r--components/drivers/core/mnt.c4
-rw-r--r--components/drivers/core/platform_ofw.c26
-rw-r--r--components/drivers/dma/dma_pool.c4
-rw-r--r--components/drivers/mfd/mfd-syscon.c2
-rw-r--r--components/drivers/ofw/fdt.c15
-rwxr-xr-xcomponents/drivers/ofw/io.c30
-rw-r--r--components/drivers/ofw/ofw.c10
-rwxr-xr-xcomponents/drivers/ofw/ofw_internal.h3
-rw-r--r--components/drivers/pci/ofw.c3
-rw-r--r--components/drivers/pci/pci.c12
-rwxr-xr-xcomponents/drivers/pic/Kconfig18
14 files changed, 101 insertions, 58 deletions
diff --git a/components/drivers/block/blk.c b/components/drivers/block/blk.c
index 5f0d6b1f82..a0c18acca9 100644
--- a/components/drivers/block/blk.c
+++ b/components/drivers/block/blk.c
@@ -492,11 +492,12 @@ static const char *blk_get_mounted_path(struct rt_device *device)
const char *convert_size(struct rt_device_blk_geometry *geome,
rt_size_t sector_count, rt_size_t *out_cap, rt_size_t *out_minor)
{
- rt_size_t cap, minor = 0;
+ rt_uint64_t cap;
+ rt_size_t minor = 0;
int size_index = 0;
const char *size_name[] = { "B", "K", "M", "G", "T", "P", "E" };
- cap = geome->bytes_per_sector * sector_count;
+ cap = (rt_uint64_t)geome->bytes_per_sector * sector_count;
for (size_index = 0; size_index < RT_ARRAY_SIZE(size_name) - 1; ++size_index)
{
diff --git a/components/drivers/clock_time/SConscript b/components/drivers/clock_time/SConscript
index 111449276a..386ce7135d 100644
--- a/components/drivers/clock_time/SConscript
+++ b/components/drivers/clock_time/SConscript
@@ -25,7 +25,12 @@ if os.path.isdir(arch_dir):
arch_list = os.listdir(arch_dir)
if rtconfig.ARCH in arch_list:
cpu_dir = os.path.join(arch_dir, rtconfig.ARCH, rtconfig.CPU)
- if os.path.exists(cpu_dir):
+ if rtconfig.ARCH == 'risc-v':
+ if GetDepend('RT_USING_RISCV_NEW_COMMON'):
+ src += Glob("arch/risc-v/*.c")
+ elif os.path.exists(cpu_dir):
+ src += Glob("arch/%s/%s/*.c" % (rtconfig.ARCH, rtconfig.CPU))
+ elif os.path.exists(cpu_dir):
src += Glob("arch/%s/%s/*.c" % (rtconfig.ARCH, rtconfig.CPU))
else:
src += Glob("arch/%s/*.c" % rtconfig.ARCH)
diff --git a/components/drivers/clock_time/arch/risc-v/virt64/cputimer.c b/components/drivers/clock_time/arch/risc-v/cputimer.c
index 7921716b7f..8941830f77 100644
--- a/components/drivers/clock_time/arch/risc-v/virt64/cputimer.c
+++ b/components/drivers/clock_time/arch/risc-v/cputimer.c
@@ -1,40 +1,40 @@
/*
- * Copyright (c) 2006-2023, RT-Thread Development Team
+ * Copyright (c) 2006-2025, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2023-07-10 xqyjlj The first version.
+ * 2025-04-20 GuEe-GUI Port to common RISC-V timer.
*/
#include <drivers/clock_time.h>
+#include <riscv_timer.h>
-static volatile unsigned long _init_cnt = 0;
+static volatile rt_uint64_t _init_cnt = 0;
static rt_bool_t _riscv_clock_registered = RT_FALSE;
static struct rt_clock_time_device _riscv_clock_dev;
-extern rt_uint64_t rt_hw_get_clock_timer_freq(void);
-
static rt_uint64_t _riscv_clock_get_freq(struct rt_clock_time_device *dev)
{
RT_UNUSED(dev);
- return rt_hw_get_clock_timer_freq();
+
+ return riscv_timer_get_frequency();
}
static rt_uint64_t _riscv_clock_get_counter(struct rt_clock_time_device *dev)
{
- unsigned long time_elapsed;
-
RT_UNUSED(dev);
- __asm__ __volatile__("rdtime %0" : "=r"(time_elapsed));
- return (rt_uint64_t)(time_elapsed - _init_cnt);
+
+ return riscv_timer_rdtime() - _init_cnt;
}
static rt_err_t _riscv_clock_set_timeout(struct rt_clock_time_device *dev, rt_uint64_t delta)
{
RT_UNUSED(dev);
RT_UNUSED(delta);
+
return -RT_ENOSYS;
}
@@ -47,7 +47,7 @@ static const struct rt_clock_time_ops _riscv_clock_ops =
void rt_clock_time_source_init(void)
{
- __asm__ __volatile__("rdtime %0" : "=r"(_init_cnt));
+ _init_cnt = riscv_timer_rdtime();
if (!_riscv_clock_registered)
{
diff --git a/components/drivers/core/mnt.c b/components/drivers/core/mnt.c
index 02a68d46dd..d5c6cc5a4d 100644
--- a/components/drivers/core/mnt.c
+++ b/components/drivers/core/mnt.c
@@ -20,8 +20,10 @@
#ifdef RT_USING_FINSH
#include <msh.h>
#endif
+#ifdef ARCH_MM_MMU
#include <ioremap.h>
#include <mm_memblock.h>
+#endif
#ifdef RT_USING_OFW
#define bootargs_select rt_ofw_bootargs_select
@@ -38,6 +40,7 @@ static int rootfs_mnt_init(void)
const char *fstype = bootargs_select("rootfstype=", 0);
const char *rw = bootargs_select("rw", 0);
+#ifdef ARCH_MM_MMU
if (!dev || !fstype)
{
const char *name = "initrd";
@@ -64,6 +67,7 @@ static int rootfs_mnt_init(void)
}
}
}
+#endif /* ARCH_MM_MMU */
if (fstype != cromfs_type && dev)
{
diff --git a/components/drivers/core/platform_ofw.c b/components/drivers/core/platform_ofw.c
index 4bc2deed5d..7bcfd4ea6c 100644
--- a/components/drivers/core/platform_ofw.c
+++ b/components/drivers/core/platform_ofw.c
@@ -20,6 +20,7 @@
#include <drivers/platform.h>
#include <drivers/core/bus.h>
#include <drivers/core/dm.h>
+#include <drivers/misc.h>
#include "../ofw/ofw_internal.h"
@@ -42,6 +43,20 @@ static const struct rt_ofw_node_id platform_ofw_ids[] =
{ /* sentinel */ }
};
+static void ofw_address_to_string(char *buffer, rt_size_t size, rt_uint64_t address)
+{
+ rt_uint32_t address_hi = rt_upper_32_bits(address);
+
+ if (address_hi)
+ {
+ rt_snprintf(buffer, size, "%x%08x", address_hi, rt_lower_32_bits(address));
+ }
+ else
+ {
+ rt_snprintf(buffer, size, "%x", rt_lower_32_bits(address));
+ }
+}
+
static void ofw_device_rename(struct rt_device *dev)
{
rt_uint32_t mask;
@@ -60,18 +75,21 @@ static void ofw_device_rename(struct rt_device *dev)
{
if (!rt_ofw_get_address(np, 0, &addr, RT_NULL))
{
+ char addr_str[sizeof(addr) * 2 + 1];
const char *node_name = rt_fdt_node_name(np->full_name);
rt_size_t tag_len = strchrnul(node_name, '@') - node_name;
+ ofw_address_to_string(addr_str, sizeof(addr_str), addr);
+
if (!rt_ofw_prop_read_u32(np, "mask", &mask))
{
- rt_dm_dev_set_name(dev, dev_name ? "%lx.%x.%.*s:%s" : "%lx.%x.%.*s",
- addr, __rt_ffs(mask) - 1, tag_len, node_name, dev_name);
+ rt_dm_dev_set_name(dev, dev_name ? "%s.%x.%.*s:%s" : "%s.%x.%.*s",
+ addr_str, __rt_ffs(mask) - 1, tag_len, node_name, dev_name);
}
else
{
- rt_dm_dev_set_name(dev, dev_name ? "%lx.%.*s:%s" : "%lx.%.*s",
- addr, tag_len, node_name, dev_name);
+ rt_dm_dev_set_name(dev, dev_name ? "%s.%.*s:%s" : "%s.%.*s",
+ addr_str, tag_len, node_name, dev_name);
}
return;
diff --git a/components/drivers/dma/dma_pool.c b/components/drivers/dma/dma_pool.c
index 75e28cced6..4b3e2055e2 100644
--- a/components/drivers/dma/dma_pool.c
+++ b/components/drivers/dma/dma_pool.c
@@ -1007,6 +1007,7 @@ rt_err_t rt_dma_sync_in_data(struct rt_device *dev, void *out_data, rt_size_t si
*/
static rt_err_t dma_pool_map_linear(struct rt_dma_pool *pool)
{
+#ifdef ARCH_MM_MMU
rt_region_t *region = &pool->region;
rt_size_t start = RT_ALIGN_DOWN(region->start, ARCH_PAGE_SIZE);
rt_size_t end = RT_ALIGN(region->end, ARCH_PAGE_SIZE);
@@ -1032,6 +1033,9 @@ static rt_err_t dma_pool_map_linear(struct rt_dma_pool *pool)
(unsigned long)start, (unsigned long)end);
return -RT_ERROR;
}
+#else
+ RT_UNUSED(pool);
+#endif /* ARCH_MM_MMU */
return RT_EOK;
}
diff --git a/components/drivers/mfd/mfd-syscon.c b/components/drivers/mfd/mfd-syscon.c
index d470e370ee..c99748f66e 100644
--- a/components/drivers/mfd/mfd-syscon.c
+++ b/components/drivers/mfd/mfd-syscon.c
@@ -182,7 +182,7 @@ static rt_err_t syscon_probe(struct rt_platform_device *pdev)
}
syscon->iomem_size = (rt_size_t)iomem_range[1];
- syscon->iomem_base = rt_ioremap((void *)iomem_range[0], syscon->iomem_size);
+ syscon->iomem_base = rt_ioremap((void *)(rt_ubase_t)iomem_range[0], syscon->iomem_size);
if (!syscon->iomem_base)
{
diff --git a/components/drivers/ofw/fdt.c b/components/drivers/ofw/fdt.c
index 23709be301..91679417f8 100644
--- a/components/drivers/ofw/fdt.c
+++ b/components/drivers/ofw/fdt.c
@@ -14,6 +14,7 @@
#include <drivers/ofw_fdt.h>
#include <drivers/ofw_raw.h>
#include <drivers/core/dm.h>
+#include <drivers/misc.h>
#ifdef RT_USING_MEMBLOCK
#include <mm_memblock.h>
@@ -39,12 +40,6 @@ static rt_phandle _phandle_max;
static rt_size_t _root_size_cells;
static rt_size_t _root_addr_cells;
-#ifdef ARCH_CPU_64BIT
-#define MIN_BIT 16
-#else
-#define MIN_BIT 8
-#endif
-
const char *rt_fdt_node_name(const char *full_name)
{
const char *node_name = strrchr(full_name, '/');
@@ -367,11 +362,15 @@ static rt_err_t fdt_scan_memory(void)
if (!err)
{
- LOG_I("Memory node(%d) ranges: 0x%.*lx - 0x%.*lx%s", no, MIN_BIT, base, MIN_BIT, base + size, "");
+ LOG_I("Memory node(%d) ranges: 0x%08x%08x - 0x%08x%08x", no,
+ rt_upper_32_bits(base), rt_lower_32_bits(base),
+ rt_upper_32_bits(base + size), rt_lower_32_bits(base + size));
}
else
{
- LOG_W("Memory node(%d) ranges: 0x%.*lx - 0x%.*lx%s", no, MIN_BIT, base, MIN_BIT, base + size, " unable to record");
+ LOG_W("Memory node(%d) ranges: 0x%08x%08x - 0x%08x%08x unable to record", no,
+ rt_upper_32_bits(base), rt_lower_32_bits(base),
+ rt_upper_32_bits(base + size), rt_lower_32_bits(base + size));
}
}
}
diff --git a/components/drivers/ofw/io.c b/components/drivers/ofw/io.c
index ac8695aff1..a6bb5bbec7 100755
--- a/components/drivers/ofw/io.c
+++ b/components/drivers/ofw/io.c
@@ -526,22 +526,22 @@ rt_uint64_t rt_ofw_reverse_address(struct rt_ofw_node *np, const char *range_typ
return address;
}
-#ifdef ARCH_CPU_64BIT
-#define ofw_address_cpu_cast(np, address) (void *)(address)
+static void *ofw_address_to_pointer(struct rt_ofw_node *np, rt_uint64_t address)
+{
+#ifndef ARCH_CPU_64BIT
+ if (rt_upper_32_bits(address))
+ {
+ LOG_W("%s found 64-bit address = %x%08x",
+ rt_ofw_node_full_name(np),
+ rt_upper_32_bits(address), rt_lower_32_bits(address));
+ }
#else
-#define ofw_address_cpu_cast(np, address) \
- ({ \
- if (((address) >> 32)) \
- { \
- LOG_W("%s find 64 bits address = %x%x", \
- rt_ofw_node_full_name(np), \
- ofw_static_cast(rt_ubase_t, (address) >> 32), \
- ofw_static_cast(rt_ubase_t, (address))); \
- } \
- (void *)ofw_static_cast(rt_ubase_t, (address)); \
- })
+ RT_UNUSED(np);
#endif
+ return (void *)(rt_ubase_t)address;
+}
+
void *rt_ofw_iomap(struct rt_ofw_node *np, int index)
{
void *iomem = RT_NULL;
@@ -552,7 +552,7 @@ void *rt_ofw_iomap(struct rt_ofw_node *np, int index)
if (!ofw_get_address(np, index, &regs[0], &regs[1]))
{
- iomem = rt_ioremap(ofw_address_cpu_cast(np, regs[0]), (size_t)regs[1]);
+ iomem = rt_ioremap(ofw_address_to_pointer(np, regs[0]), (size_t)regs[1]);
}
}
@@ -569,7 +569,7 @@ void *rt_ofw_iomap_by_name(struct rt_ofw_node *np, const char *name)
if (!ofw_get_address_by_name(np, name, &regs[0], &regs[1]))
{
- iomem = rt_ioremap(ofw_address_cpu_cast(np, regs[0]), (size_t)regs[1]);
+ iomem = rt_ioremap(ofw_address_to_pointer(np, regs[0]), (size_t)regs[1]);
}
}
diff --git a/components/drivers/ofw/ofw.c b/components/drivers/ofw/ofw.c
index 4e18de790e..762553f31d 100644
--- a/components/drivers/ofw/ofw.c
+++ b/components/drivers/ofw/ofw.c
@@ -13,6 +13,7 @@
#include <drivers/platform.h>
#include <drivers/core/bus.h>
#include <drivers/serial_dm.h>
+#include <drivers/misc.h>
#define DBG_TAG "rtdm.ofw"
#define DBG_LVL DBG_INFO
@@ -678,9 +679,12 @@ void rt_ofw_node_dump_dts(struct rt_ofw_node *np, rt_bool_t sibling_too)
for (int i = header->rsvmap_nr - 1; i >= 0; --i)
{
- rt_kprintf("/memreserve/\t%p %p;\n",
- ofw_static_cast(rt_size_t, fdt64_to_cpu(rsvmap->address)),
- ofw_static_cast(rt_size_t, fdt64_to_cpu(rsvmap->size)));
+ rt_uint64_t address = fdt64_to_cpu(rsvmap->address);
+ rt_uint64_t size = fdt64_to_cpu(rsvmap->size);
+
+ rt_kprintf("/memreserve/\t0x%08x%08x 0x%08x%08x;\n",
+ rt_upper_32_bits(address), rt_lower_32_bits(address),
+ rt_upper_32_bits(size), rt_lower_32_bits(size));
++rsvmap;
}
diff --git a/components/drivers/ofw/ofw_internal.h b/components/drivers/ofw/ofw_internal.h
index 7778dbc4c5..50240a3eb7 100755
--- a/components/drivers/ofw/ofw_internal.h
+++ b/components/drivers/ofw/ofw_internal.h
@@ -66,9 +66,6 @@ extern struct rt_ofw_node *ofw_node_reserved_memory;
extern struct rt_fdt_earlycon fdt_earlycon;
-#define ofw_static_cast(to_type, value) \
- (to_type)(((value) >> ((sizeof(value) - sizeof(to_type)) * 8)))
-
rt_err_t ofw_alias_scan(void);
int ofw_alias_node_id(struct rt_ofw_node *np);
rt_err_t ofw_phandle_hash_reset(rt_phandle min, rt_phandle max);
diff --git a/components/drivers/pci/ofw.c b/components/drivers/pci/ofw.c
index 7d0a476d8b..b6c1e6bacb 100644
--- a/components/drivers/pci/ofw.c
+++ b/components/drivers/pci/ofw.c
@@ -248,7 +248,8 @@ rt_err_t rt_pci_ofw_parse_ranges(struct rt_ofw_node *dev_np,
struct rt_pci_host_bridge *host_bridge)
{
rt_err_t err;
- int phy_addr_cells = -1, phy_size_cells = -1, cpu_addr_cells;
+ rt_int32_t phy_addr_cells = -1, phy_size_cells = -1;
+ int cpu_addr_cells;
if (!dev_np || !host_bridge)
{
diff --git a/components/drivers/pci/pci.c b/components/drivers/pci/pci.c
index e2fa293956..17545ef34f 100644
--- a/components/drivers/pci/pci.c
+++ b/components/drivers/pci/pci.c
@@ -534,12 +534,18 @@ rt_err_t rt_pci_region_setup(struct rt_pci_host_bridge *host_bridge)
* according to PCI 2.1 and moreover. Use a reasonable starting value of
* 0x1000 instead if the bus start address is below 0x1000.
*/
- region->bus_start = rt_max_t(rt_size_t, 0x1000, region->phy_addr);
+ region->bus_start = rt_max_t(rt_uint64_t, 0x1000, region->phy_addr);
LOG_I("Bus %s region(%d):",
region->flags == PCI_BUS_REGION_F_MEM ? "Memory" : (region->flags == PCI_BUS_REGION_F_PREFETCH ? "Prefetchable Mem" : (region->flags == PCI_BUS_REGION_F_IO ? "I/O" : "Unknown")), i);
- LOG_I(" cpu: [%p, %p]", region->cpu_addr, (region->cpu_addr + region->size - 1));
- LOG_I(" physical: [%p, %p]", region->phy_addr, (region->phy_addr + region->size - 1));
+ LOG_I(" cpu: [0x%08x%08x, 0x%08x%08x]",
+ rt_upper_32_bits(region->cpu_addr), rt_lower_32_bits(region->cpu_addr),
+ rt_upper_32_bits(region->cpu_addr + region->size - 1),
+ rt_lower_32_bits(region->cpu_addr + region->size - 1));
+ LOG_I(" physical: [0x%08x%08x, 0x%08x%08x]",
+ rt_upper_32_bits(region->phy_addr), rt_lower_32_bits(region->phy_addr),
+ rt_upper_32_bits(region->phy_addr + region->size - 1),
+ rt_lower_32_bits(region->phy_addr + region->size - 1));
}
return err;
diff --git a/components/drivers/pic/Kconfig b/components/drivers/pic/Kconfig
index 4ea164b50d..e5b81643da 100755
--- a/components/drivers/pic/Kconfig
+++ b/components/drivers/pic/Kconfig
@@ -18,21 +18,23 @@ config MAX_HANDLERS
range 1 4294967294
default 256
-config RT_PIC_ARM_GIC
- bool "ARM GICv2/v1"
+config RT_PIC_ARM_NVIC
+ bool "ARM Cortex-M NVIC"
depends on RT_USING_PIC
+ depends on ARCH_ARM_CORTEX_M
select RT_USING_OFW
default n
-config RT_PIC_ARM_NVIC
- bool "ARM Cortex-M NVIC"
+config RT_PIC_ARM_GIC
+ bool "ARM GICv2/v1"
depends on RT_USING_PIC
- depends on ARCH_ARM_CORTEX_M
select RT_USING_OFW
default n
config RT_PIC_ARM_GIC_V2M
- bool "ARM GIC V2M" if RT_PIC_ARM_GIC && RT_PCI_MSI
+ bool "ARM GIC V2M"
+ depends on RT_USING_PIC
+ depends on RT_PCI_MSI
depends on RT_USING_OFW
default n
@@ -43,7 +45,9 @@ config RT_PIC_ARM_GIC_V3
default n
config RT_PIC_ARM_GIC_V3_ITS
- bool "ARM GICv3 ITS (Interrupt Translation Service)" if RT_PIC_ARM_GIC_V3 && RT_PCI_MSI
+ bool "ARM GICv3 ITS (Interrupt Translation Service)"
+ depends on RT_PIC_ARM_GIC_V3
+ depends on RT_PCI_MSI
depends on RT_USING_OFW
select RT_USING_ADT_REF
default n