[PATCH v6 0/7] Initial ESWIN/EIC7700 and Hifive P550 support
Anup Patel
anup at brainfault.org
Sun Dec 21 07:38:54 PST 2025
On Thu, Dec 18, 2025 at 4:14 PM Bo Gan <ganboing at gmail.com> wrote:
>
> EIC7700 is the SoC used in HiFive P550 and Milk-V Megrez. This SoC is
> currently one of the only off-the-shelf board/chips that support H
> extension, although it's v0.6.1. It also supports pre-ratified N-trace.
> Add support for it so people can benefit from latest OpenSBI features.
>
> The device-tree of HiFive P550 has been upstreamed to Linux:
> https://lore.kernel.org/all/20250825132427.1618089-1-pinkesh.vaghela@einfochips.com/
> However U-boot is not, and there are bugs in vendor U-boot device-tree,
> and also inconsistencies between the two. Thus, this patch is coded with
> the upstreamed device-tree as the reference, but tested with the patched
> vendor U-boot device tree as `FW_FDT_PATH`. The patched vendor U-boot is
> hosted here: https://github.com/ganboing/u-boot-eic7x/tree/eic7x-dt-fix
> Refer to the last PATCH for the instructions on building the firmware
> blob and launch it through UART boot.
>
> The major complication of this chip is that it requires certain memory
> regions to be blocked with PMP entries to prevent speculative execution
> or HW prefetcher from touching the data-cacheable regions within to
> avoid bus errors. Due to the fact that this SoC handles cache incoherent
> DMA by mapping memory twice, one as cached, and the other as uncached,
> we also need an extra PMP to protect the OpenSBI in the uncached portion
> in address space. The PMP handling is tricky, so I documented it very
> extensively for people to reason about it. I managed to get it done with
> only NAPOT PMP entries and still got 1 free PMP for root harts for die 0
> (No free PMP for die 1 root harts). This even permits a udomain/tdomain
> like partitioning, so we can even try out TEEs. Sample boot log:
>
> OpenSBI v1.7-95-g68b64d77
> Build time: 2025-12-17 05:08:58 -0800
> Build compiler: gcc version 13.2.0 (gc891d8dc23e-dirty)
> ____ _____ ____ _____
> / __ \ / ____| _ \_ _|
> | | | |_ __ ___ _ __ | (___ | |_) || |
> | | | | '_ \ / _ \ '_ \ \___ \| _ < | |
> | |__| | |_) | __/ | | |____) | |_) || |_
> \____/| .__/ \___|_| |_|_____/|____/_____|
> | |
> |_|
>
> Platform Name : SiFive HiFive Premier P550
> Platform Features : medeleg
> Platform HART Count : 4
> Platform HART Protection : eic7700_pmp
> Platform IPI Device : aclint-mswi
> Platform Timer Device : aclint-mtimer @ 1000000Hz
> Platform Console Device : uart8250
> Platform HSM Device : ---
> Platform PMU Device : ---
> Platform Reboot Device : hfp_reset
> Platform Shutdown Device : hfp_reset
> Platform Suspend Device : ---
> Platform CPPC Device : ---
> Firmware Base : 0x80000000
> Firmware Size : 357 KB
> Firmware RW Offset : 0x40000
> Firmware RW Size : 101 KB
> Firmware Heap Offset : 0x4d000
> Firmware Heap Size : 49 KB (total), 0 KB (reserved), 13 KB (used), 35 KB (free)
> Firmware Scratch Size : 4096 B (total), 424 B (used), 3672 B (free)
> Runtime SBI Version : 3.0
> Standard SBI Extensions : time,rfnc,ipi,base,hsm,srst,pmu,dbcn,fwft,legacy,dbtr,sse
> Experimental SBI Extensions : none
>
> Domain0 Name : root
> Domain0 Boot HART : 3
> Domain0 HARTs : 0*,1*,2*,3*
> Domain0 Region00 : 0x0000000080000000-0x000000008007ffff M: (F,R,W,X) S/U: ()
> Domain0 Region01 : 0x000000c000000000-0x000000c00007ffff M: (I,F,R,W,X) S/U: ()
> Domain0 Region02 : 0x0000000002000000-0x000000000200ffff M: (I,R,W) S/U: ()
> Domain0 Region03 : 0x0000000000000000-0x000000007fffffff M: (I,R,W) S/U: (R,W)
> Domain0 Region04 : 0x0000000000000000-0x0000000fffffffff M: (R,W) S/U: (R,W,X)
> Domain0 Region05 : 0x0000000000000000-0x0000007fffffffff M: (I) S/U: ()
> Domain0 Region06 : 0x0000000000000000-0xffffffffffffffff M: () S/U: (R,W,X)
> Domain0 Next Address : 0x0000000080200000
> Domain0 Next Arg1 : 0x00000000f8000000
> Domain0 Next Mode : S-mode
> Domain0 SysReset : yes
> Domain0 SysSuspend : yes
>
> Boot HART ID : 3
> Boot HART Domain : root
> Boot HART Priv Version : v1.11
> Boot HART Base ISA : rv64imafdchx
> Boot HART ISA Extensions : sscofpmf,zihpm,sdtrig
> Boot HART PMP Count : 8
> Boot HART PMP Granularity : 12 bits
> Boot HART PMP Address Bits : 39
> Boot HART MHPM Info : 4 (0x00000078)
> Boot HART Debug Triggers : 4 triggers
> Boot HART MIDELEG : 0x0000000000002666
> Boot HART MEDELEG : 0x0000000000f0b509
>
> Signed-off-by: Bo Gan <ganboing at gmail.com>
> ---
> Changes in v6:
> - Fix CPU_DIE_MASK macro
> - Make eic770x build on rv64 only to fix rv32 build error.
> - I'm still waiting for ESWIN's reply on the reset memory corruption
> issue, but I stress tested the P550 board warm reset overnight,
> and can confirm the extra sbi_printf indeed mitigated the problem.
>
> Changes in v5:
> - Add Hifive P550 shutdown/reboot support.
> - Add a sbi_printf() just before SoC reset to workaround flaky
> memory corruption issue after reset. This issue has been reported
> to ESWIN, and it's been reproduced with their vendor OpenSBI code.
> ESWIN's actively investigating it.
>
> Changes in v4:
> - Adapt to the hart protection abstraction.
> Also make use of sbi_hart_pmp_fence for correctness.
> - Specify MMIO flag for the uncached mapping of OpenSBI.
> It'll avoid adding an extraneous reserved memory region in FDT for S mode.
>
> Changes in v3:
> - Figure out the cause behind bus error, and document it properly
> - Drop the consolidation logic and let the lib/memregion logic to
> optimize out unnecessary regions -- simplifies many things.
> - Better and more comprehensive comments in source code.
> - Support tdomain/udomain like use cases on die 0.
>
> Changes in v2:
> - Major enhancement of PMP consolidation logic. Also fixed a Linux
> Panic bug due to the mismatch between PMP settings and reserved
> memory regions passed to Linux via FDT.
> - Also protects the OpenSBI firmware in uncached memory portion of
> address space.
> - More detailed documentation on EIC770X/P550
>
> ---
> Bo Gan (7):
> lib: sbi_hart_pmp: make sbi_hart_pmp_fence public
> lib: sbi_domain: add sbi_domain_get_oldpmp_flags
> lib: sbi_domain: make is_region_subset public
> lib: sbi: give platform choice of using single memregion to cover
> OpenSBI
> platform: generic: eswin: add EIC7700
> lib: utils/serial: Support multiple UART8250 devices
> platform: generic: eswin: Add shutdown/reboot support for Hifive
> Premier P550
Applied this series to the riscv/opensbi repo.
Thanks,
Anup
More information about the opensbi
mailing list