platform/kernel/opensbi.git
14 months agosbi: sbi_domain_context: Check privilege spec version before accessing S-mode CSRs
Yu Chien Peter Lin [Thu, 28 Mar 2024 03:33:02 +0000 (11:33 +0800)]
sbi: sbi_domain_context: Check privilege spec version before accessing S-mode CSRs

SCOUNTEREN and SENVCFG may not be supported on certain RISC-V core,
so check the existence of these CSRs via privilege spec version to
prevent illegal instructions.

Signed-off-by: Yu Chien Peter Lin <peterlin@andestech.com>
Signed-off-by: Alvin Chang <alvinga@andestech.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
14 months agolib: sbi: Wakeup non-coldboot HARTs early in the coldboot path
Anup Patel [Tue, 19 Mar 2024 12:26:24 +0000 (17:56 +0530)]
lib: sbi: Wakeup non-coldboot HARTs early in the coldboot path

Currently, all non-coldboot HARTs busy spin in wait_for_coldboot()
until the entire coldboot init sequence is completed.

This means:
1) On QEMU, all non-coldboot HARTs will eat host CPU time and
   also slow down the coldboot HART until the entire coldboot
   init sequence is completed.
2) On real HW, all non-coldboot HARTs will consume more CPU
   power until the entire coldboot init sequence is completed.

To address this, wake up all non-coldboot HARTs as early as
possible in the coldboot init sequence.

Signed-off-by: Anup Patel <apatel@ventanamicro.com>
14 months agolib: sbi: Simplify wait_for_coldboot() implementation
Anup Patel [Fri, 15 Mar 2024 14:25:23 +0000 (19:55 +0530)]
lib: sbi: Simplify wait_for_coldboot() implementation

On QEMU virt machine with large number of HARTs, some of the HARTs
randomly fail to come out of wait_for_coldboot() due to one of the
following race-conditions:

1) Failing HARTs are not able to acquire the coldboot_lock and
   update the coldboot_hartmask in wait_for_coldboot() before
   the coldboot HART acquires the coldboot_lock and sends IPI
   in wake_coldboot_harts() hence the failing HARTs never
   receive IPI from the coldboot HART.

2) Failing HARTs acquire the coldbood_lock and update the
   coldboot_hartmask before coldboot HART does sbi_scratch_init()
   so the sbi_hartmask_set_hartid() does not update the
   coldboot_hartmask on the failing HARTs hence they never
   receive IPI from the coldboot HART.

To address this, use a simple busy-loop in wait_for_coldboot() for
polling on coldboot_done flag.

Signed-off-by: Anup Patel <apatel@ventanamicro.com>
14 months agoplatform: generic: allwinner: Optimize current hart scratch access
Samuel Holland [Mon, 18 Mar 2024 14:49:29 +0000 (07:49 -0700)]
platform: generic: allwinner: Optimize current hart scratch access

The address of the local scratch area is stored in each hart's mscratch
CSR. It is more efficient to read the CSR than to compute the address
from the hart ID.

Signed-off-by: Samuel Holland <samuel.holland@sifive.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
14 months agolib: utils/timer: Optimize current hart scratch access
Samuel Holland [Mon, 18 Mar 2024 14:49:28 +0000 (07:49 -0700)]
lib: utils/timer: Optimize current hart scratch access

The address of the local scratch area is stored in each hart's mscratch
CSR. It is more efficient to read the CSR than to compute the address
from the hart ID.

Signed-off-by: Samuel Holland <samuel.holland@sifive.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
14 months agoinclude: sbi: Support byteorder macros in assembly
Vivian Wang [Fri, 15 Mar 2024 17:36:39 +0000 (01:36 +0800)]
include: sbi: Support byteorder macros in assembly

Avoid using C types and casts if sbi/sbi_byteorder.h is included in
assembly code

Signed-off-by: Vivian Wang <dramforever@live.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
14 months agolib: sbi: Add SSE support for PMU events
Clément Léger [Thu, 21 Mar 2024 15:57:18 +0000 (16:57 +0100)]
lib: sbi: Add SSE support for PMU events

Add SSE callbacks registration to PMU driver in order to disable
interrupt delegation for PMU interrupts. When interrupts are
undelegated send the PMU SSE event upon LCOFIP IRQ.

Signed-off-by: Clément Léger <cleger@rivosinc.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
14 months agolib: sbi: Implement SBI SSE extension
Clément Léger [Thu, 21 Mar 2024 15:57:17 +0000 (16:57 +0100)]
lib: sbi: Implement SBI SSE extension

The SBI SSE extension defines a set of function that can be called to
register and handle supervisor sofwtare events. This patch implements
all of the functionality defined in the specification.

Signed-off-by: Clément Léger <cleger@rivosinc.com>
Reviewed-by: Himanshu Chauhan <hchauhan@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
14 months agolib: sbi: Add support for Supervisor Software Events extension
Clément Léger [Thu, 21 Mar 2024 15:57:16 +0000 (16:57 +0100)]
lib: sbi: Add support for Supervisor Software Events extension

This extension [1] allows to deliver events from SBI to supervisor via
a software mechanism. This extension defines events (either local or
global) which are signaled by the SBI on specific signal sources (IRQ,
exceptions, etc) and are injected to be executed in supervisor mode.

[1] https://lists.riscv.org/g/tech-prs/message/798

Signed-off-by: Clément Léger <cleger@rivosinc.com>
Reviewed-by: Himanshu Chauhan <hchauhan@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
14 months agofirmware: remove copy-base relocation
Xiang W [Tue, 12 Mar 2024 08:24:59 +0000 (16:24 +0800)]
firmware: remove copy-base relocation

Remove copy-base relocations that are no longer needed.

Signed-off-by: Xiang W <wxjstz@126.com>
Reviewed-by: Samuel Holland <samuel.holland@sifive.com>
Tested-by: Samuel Holland <samuel.holland@sifive.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
14 months agoplatform: generic: allwinner: sun20i-d1: Remove duplicated CSR definitions
Christoph Müllner [Tue, 19 Mar 2024 09:26:42 +0000 (10:26 +0100)]
platform: generic: allwinner: sun20i-d1: Remove duplicated CSR definitions

All T-Head CSRs are already defined in thead/c9xx_encoding.h.
Let's reuse the values from there instead of redefining them with
a slightly different name.

Signed-off-by: Christoph Müllner <christoph.muellner@vrull.eu>
Reviewed-by: Anup Patel <anup@brainfault.org>
14 months agodocs: writing_tests: Make docs correspond the latest changes
Ivan Orlov [Tue, 19 Mar 2024 16:02:39 +0000 (16:02 +0000)]
docs: writing_tests: Make docs correspond the latest changes

We should store test object files list in the `libsbi-objs-y` Makefile
variable, not in `libsbitests-objs-y`. Update the documentation
correspondingly.

Since we don't use the `console_dev` static variable directly in the
`sbi_console_test` unit test anymore, remove the paragraph which says
that we do.

Fixes: 86224ec36aed ("docs/writing_tests: Update tests paths")
Signed-off-by: Ivan Orlov <ivan.orlov0322@gmail.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
14 months agolib: sbi: Extend sbi_trap_error() to dump state in a nested trap
Anup Patel [Tue, 12 Mar 2024 08:22:53 +0000 (13:52 +0530)]
lib: sbi: Extend sbi_trap_error() to dump state in a nested trap

The sbi_trap_error() should dump state of all in-flight traps upon
failure in a nested trap so extend it accordingly.

Signed-off-by: Anup Patel <apatel@ventanamicro.com>
Tested-by: Samuel Holland <samuel.holland@sifive.com>
14 months agolib: sbi: Pass trap context pointer to sbi_ecall_handler()
Anup Patel [Mon, 11 Mar 2024 12:45:20 +0000 (18:15 +0530)]
lib: sbi: Pass trap context pointer to sbi_ecall_handler()

To be consistent with other trap handlers, pass trap context pointer
to sbi_ecall_handler().

Signed-off-by: Anup Patel <apatel@ventanamicro.com>
Reviewed-by: Samuel Holland <samuel.holland@sifive.com>
Tested-by: Samuel Holland <samuel.holland@sifive.com>
Reviewed-by: Clément Léger <cleger@rivosinc.com>
14 months agolib: sbi: Remove regs parameter from trap irq handling functions
Anup Patel [Mon, 11 Mar 2024 12:30:50 +0000 (18:00 +0530)]
lib: sbi: Remove regs parameter from trap irq handling functions

The trap irq handling functions no longer require regs parameter
so remove it.

Signed-off-by: Anup Patel <apatel@ventanamicro.com>
Reviewed-by: Samuel Holland <samuel.holland@sifive.com>
Tested-by: Samuel Holland <samuel.holland@sifive.com>
14 months agolib: sbi: Remove regs paramter of sbi_irqchip_process()
Anup Patel [Mon, 11 Mar 2024 12:23:41 +0000 (17:53 +0530)]
lib: sbi: Remove regs paramter of sbi_irqchip_process()

The irqchip handlers will typically not need pointer to trap registers
so remove regs parameter of sbi_irqchip_process().

Signed-off-by: Anup Patel <apatel@ventanamicro.com>
Reviewed-by: Samuel Holland <samuel.holland@sifive.com>
Tested-by: Samuel Holland <samuel.holland@sifive.com>
Reviewed-by: Clément Léger <cleger@rivosinc.com>
14 months agolib: sbi: Simplify parameters of sbi_illegal_insn_handler()
Anup Patel [Mon, 11 Mar 2024 10:24:56 +0000 (15:54 +0530)]
lib: sbi: Simplify parameters of sbi_illegal_insn_handler()

The struct sbi_trap_context already has the information needed by
sbi_illegal_insn_handler() so directly pass struct sbi_trap_context
pointer to this function.

Signed-off-by: Anup Patel <apatel@ventanamicro.com>
Reviewed-by: Samuel Holland <samuel.holland@sifive.com>
Tested-by: Samuel Holland <samuel.holland@sifive.com>
14 months agolib: sbi: Simplify parameters of misaligned and access fault handlers
Anup Patel [Mon, 11 Mar 2024 09:51:53 +0000 (15:21 +0530)]
lib: sbi: Simplify parameters of misaligned and access fault handlers

The struct sbi_trap_context already has the information needed by
misaligned load/store and access fault load/store handlers so directly
pass struct sbi_trap_context pointer to these functions.

Signed-off-by: Anup Patel <apatel@ventanamicro.com>
Reviewed-by: Samuel Holland <samuel.holland@sifive.com>
Tested-by: Samuel Holland <samuel.holland@sifive.com>
Reviewed-by: Clément Léger <cleger@rivosinc.com>
14 months agolib: sbi: Introduce trap context
Anup Patel [Mon, 11 Mar 2024 09:10:12 +0000 (14:40 +0530)]
lib: sbi: Introduce trap context

Club the struct sbi_trap_regs and struct sbi_trap_info a new
struct sbi_trap_context (aka trap context) which must be saved
by low-level trap handler before calling sbi_trap_handler().

To track nested traps, the struct sbi_scratch points to the current
trap context and the trap context has pointer to pervious context
of previous trap.

Signed-off-by: Anup Patel <apatel@ventanamicro.com>
Reviewed-by: Samuel Holland <samuel.holland@sifive.com>
Tested-by: Samuel Holland <samuel.holland@sifive.com>
14 months agoinclude: sbi: Add trap_context pointer in struct sbi_scratch
Anup Patel [Mon, 11 Mar 2024 07:09:00 +0000 (12:39 +0530)]
include: sbi: Add trap_context pointer in struct sbi_scratch

To track nested traps, the struct sbi_scratch needs a pointer the
current trap context so add trap_context pointer in struct sbi_context.

Signed-off-by: Anup Patel <apatel@ventanamicro.com>
Reviewed-by: Samuel Holland <samuel.holland@sifive.com>
Tested-by: Samuel Holland <samuel.holland@sifive.com>
14 months agolib: sbi: Remove sbi_trap_exit() and related code
Anup Patel [Mon, 11 Mar 2024 05:34:50 +0000 (11:04 +0530)]
lib: sbi: Remove sbi_trap_exit() and related code

Over the years, no uses of sbi_trap_exit() have been found so remove
it and also remove related code from fw_base.S and sbi_scratch.h.

Signed-off-by: Anup Patel <apatel@ventanamicro.com>
Reviewed-by: Samuel Holland <samuel.holland@sifive.com>
Tested-by: Samuel Holland <samuel.holland@sifive.com>
14 months agolib: sbi: Remove epc from struct sbi_trap_info
Samuel Holland [Mon, 11 Mar 2024 17:47:50 +0000 (10:47 -0700)]
lib: sbi: Remove epc from struct sbi_trap_info

In the only places this value is used, it duplicates mepc from
struct sbi_trap_regs.

Signed-off-by: Samuel Holland <samuel.holland@sifive.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
14 months agodocs/writing_tests: Update tests paths
Ivan Orlov [Wed, 13 Mar 2024 15:01:58 +0000 (15:01 +0000)]
docs/writing_tests: Update tests paths

Since the tests should be moved to the lib/sbi/tests directory, the
documentation should be updated correspondingly. So, update the paths
where they have to be changed.

Signed-off-by: Ivan Orlov <ivan.orlov0322@gmail.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
14 months agolib: tests: Move tests to a separate directory
Ivan Orlov [Wed, 13 Mar 2024 15:01:57 +0000 (15:01 +0000)]
lib: tests: Move tests to a separate directory

Move all of the SBIUnit-related code into the lib/sbi/tests directory.
Update 'Makefile' to index objects from the tests subdirectory.

I don't think creating the full separate list of Makefile variables
(libsbitests-objs-path-y, libsbitests-object-mks, etc. as it is done for
libsbiutils) is necessary for the tests because:

1) `lib/sbi/tests/objects.mk` is already indexed into
'libsbi-objects-mks' since the find expression for the libsbi-object-mks
variable looks for objects.mk files in the nested directories as well).

2) Tests are tightly coupled with the `lib/sbi/` sources, therefore it
may be reasonable to store the list of lib/sbi and lib/sbi/tests object
files together in the libsbi-objs-path-y variable.

Additionally, update relative paths in the tests where necessary.

Signed-off-by: Ivan Orlov <ivan.orlov0322@gmail.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
15 months agolib: sbi: call platform load/store emulators
Bo Gan [Wed, 6 Mar 2024 02:35:40 +0000 (18:35 -0800)]
lib: sbi: call platform load/store emulators

sbi_load/store_access_handler now tries to call platform emulators
if defined. Otherwise, redirects the fault. If the platform code
returns failure, this means the H/S/U has accessed the emulated
devices in an unexpected manner, which is very likely caused by
buggy code in H/S/U. We redirect the fault, so lower privileged
level can get notified, and act accordingly. (E.g., oops in Linux)

We let the handler truly fail if the trap was originated from M mode.
In this case, something must be very wrong and we should just fail.

Signed-off-by: Bo Gan <ganboing@gmail.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
15 months agoinclude: sbi: add emulate_load/store handler to platform ops
Bo Gan [Wed, 6 Mar 2024 02:35:39 +0000 (18:35 -0800)]
include: sbi: add emulate_load/store handler to platform ops

This patch allows the platform to define load/store emulators. This
enables a platform to trap-and-emulate special devices or filter
access to existing physical devices.

Signed-off-by: Bo Gan <ganboing@gmail.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
15 months agolib: sbi: abstract out insn decoding to unify mem fault handlers
Bo Gan [Wed, 6 Mar 2024 02:35:38 +0000 (18:35 -0800)]
lib: sbi: abstract out insn decoding to unify mem fault handlers

This patch abstracts out the instruction decoding part of misaligned ld/st
fault handlers, so it can be reused by ld/st access fault handlers.
Also Added lb/lbu/sb decoding. (previously unreachable by misaligned fault)

sbi_trap_emulate_load/store is now the common handler which takes a `emu`
parameter that is responsible for emulating the misaligned or access fault.
The `emu` callback is expected to fixup the fault, and based on the return
code of `emu`, sbi_trap_emulate_load/store will:

  r/wlen => the fixup is successful and regs/mepc needs to be updated.
  0      => the fixup is successful, but regs/mepc should be left untouched
            (this is usually used if `emu` does `sbi_trap_redirect`)
  -err   => failed, sbi_trap_error will be called

For now, load/store access faults are blindly redirected. It will be
enhanced in the following patches.

Signed-off-by: Bo Gan <ganboing@gmail.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
15 months agolib: sbi: change prototype of sbi_misaligned_load/store_handler
Bo Gan [Wed, 6 Mar 2024 02:35:37 +0000 (18:35 -0800)]
lib: sbi: change prototype of sbi_misaligned_load/store_handler

This simplifies both handlers such that when the handler needs to
redirect the original trap, it's readily available.

Signed-off-by: Bo Gan <ganboing@gmail.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
15 months agolib: sbi: change prototype of sbi_trap_redirect
Bo Gan [Wed, 6 Mar 2024 02:35:36 +0000 (18:35 -0800)]
lib: sbi: change prototype of sbi_trap_redirect

sbi_trap_redirect now uses const pointer to `trap`.
This ensures the caller that we never change `trap` in sbi_trap_redirect.

Signed-off-by: Bo Gan <ganboing@gmail.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
15 months agoinclude: sbi: rename sbi_misaligned_ldst.h to sbi_trap_ldst.h
Bo Gan [Wed, 6 Mar 2024 02:35:35 +0000 (18:35 -0800)]
include: sbi: rename sbi_misaligned_ldst.h to sbi_trap_ldst.h

Signed-off-by: Bo Gan <ganboing@gmail.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
15 months agolib: sbi: rename sbi_misaligned_ldst.c to sbi_trap_ldst.c
Bo Gan [Wed, 6 Mar 2024 02:35:34 +0000 (18:35 -0800)]
lib: sbi: rename sbi_misaligned_ldst.c to sbi_trap_ldst.c

Signed-off-by: Bo Gan <ganboing@gmail.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
15 months agolib: sbi: Add initial domain context management support
Qingyu Shang [Wed, 6 Mar 2024 11:15:58 +0000 (19:15 +0800)]
lib: sbi: Add initial domain context management support

The domain context management component in OpenSBI provides basic CPU
context management routines for existing OpenSBI domain. As domain
extension, it was initially designed to facilitate the suspension
and resumption of domains, enabling secure domains to efficiently
share CPU resources.

The patch also provides an addition to the OpenSBI domain to provide
updates on hart-domain assignment and declarations of contexts within
the domain.

Signed-off-by: Qingyu Shang <2931013282@sjtu.edu.cn>
Reviewed-by: Yu Chien Peter Lin <peterlin@andestech.com>
Tested-by: Yu Chien Peter Lin <peterlin@andestech.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
15 months agolib: tests: Add sbi_console test
Ivan Orlov [Mon, 4 Mar 2024 21:45:51 +0000 (21:45 +0000)]
lib: tests: Add sbi_console test

Add the test suite covering some of the functions from
lib/sbi/sbi_console.c: putc, puts and printf. The test covers a variety
of format specifiers for printf and different strings and characters for
putc and puts.

In order to do that, the test "mocks" the sbi_console_device structure
by setting the 'console_dev' variable to the virtual console.

Signed-off-by: Ivan Orlov <ivan.orlov0322@gmail.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
15 months agolib: tests: Add a test for sbi_bitmap
Ivan Orlov [Mon, 4 Mar 2024 21:45:50 +0000 (21:45 +0000)]
lib: tests: Add a test for sbi_bitmap

Add test suite covering all of the functions from lib/sbi/sbi_bitmap.c:
__bitmap_and, __bitmap_or and __bitmap_xor.

Signed-off-by: Ivan Orlov <ivan.orlov0322@gmail.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
15 months agolib: Add SBIUnit testing macros and functions
Ivan Orlov [Mon, 4 Mar 2024 21:45:49 +0000 (21:45 +0000)]
lib: Add SBIUnit testing macros and functions

This patch introduces all of the SBIUnit macros and functions which
can be used during the test development process. Also, it defines
the 'run_all_tests' function, which is being called during the
'init_coldboot' right after printing the boot hart information.

Also, add the CONFIG_SBIUNIT Kconfig entry in order to be able to
turn the tests on and off. When the CONFIG_SBIUNIT is disabled,
the tests and all related code is excluded completely on the
compilation stage.

Signed-off-by: Ivan Orlov <ivan.orlov0322@gmail.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
15 months agodocs: Add documentation about tests and SBIUnit
Ivan Orlov [Mon, 4 Mar 2024 21:45:48 +0000 (21:45 +0000)]
docs: Add documentation about tests and SBIUnit

This patch contains the documentation for SBIUnit. It describes:

- What is SBIUnit
- Simple test writing scenario
- How we can cover static functions
- How we can "mock" structures in order to test the functions which
operate on them
- SBIUnit API Reference

Signed-off-by: Ivan Orlov <ivan.orlov0322@gmail.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
15 months agofirmware: fw_base.S: fix _reset_regs
Xiang W [Mon, 4 Mar 2024 12:15:52 +0000 (20:15 +0800)]
firmware: fw_base.S: fix _reset_regs

a3 and a4 cannot be reset because used in fw_platform_init.

Signed-off-by: Xiang W <wxjstz@126.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
15 months agofirmware: fw_base.S: Remove _relocate_lottery
Xiang W [Mon, 4 Mar 2024 12:15:51 +0000 (20:15 +0800)]
firmware: fw_base.S: Remove _relocate_lottery

Remove _relocate_lottery and use _boot_status instead.

Signed-off-by: Xiang W <wxjstz@126.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
15 months agofirmware: fw_dynamic.S: Remove _bad_dynamic_info
Xiang W [Mon, 4 Mar 2024 12:15:50 +0000 (20:15 +0800)]
firmware: fw_dynamic.S: Remove _bad_dynamic_info

_bad_dynamic_info is same as _start_hang, so remove it.

Signed-off-by: Xiang W <wxjstz@126.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
15 months agofirmware: fw_base: Simplified setup trap handler
Xiang W [Mon, 4 Mar 2024 12:15:49 +0000 (20:15 +0800)]
firmware: fw_base: Simplified setup trap handler

The same detection was done twice when setting mtvec and trap_exit.
Merging can reduce code size.

Signed-off-by: Xiang W <wxjstz@126.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
15 months agofirmware: fw_base.S: Simplify address get
Xiang W [Mon, 4 Mar 2024 12:15:48 +0000 (20:15 +0800)]
firmware: fw_base.S: Simplify address get

Simplify address get and remove _link_start _link_end _load_start.

Signed-off-by: Xiang W <wxjstz@126.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
15 months agolib: sbi_misaligned_ldst: Add handling of C.LHU/C.LH and C.SH
Nylon Chen [Mon, 26 Feb 2024 05:56:44 +0000 (13:56 +0800)]
lib: sbi_misaligned_ldst: Add handling of C.LHU/C.LH and C.SH

Added exception handling for compressed instructions C.LHU, C.LH, and
C.SH from the zcb extension to the sbi_misaligned_ldst library.

Signed-off-by: Nylon Chen <nylon.chen@sifive.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
15 months agoplatform: andes: Drop andes_pmu_setup()
Yu Chien Peter Lin [Thu, 22 Feb 2024 09:18:38 +0000 (17:18 +0800)]
platform: andes: Drop andes_pmu_setup()

andes_pmu_setup() [1] was intended to populate event mapping from
hardcoded arrays, however, this increases firmware size and we should
just use PMU DT node [2] instead.

Link: https://lists.infradead.org/pipermail/opensbi/2023-November/006032.html
Link: https://github.com/riscv-software-src/opensbi/blob/v1.4/docs/pmu_support.md#example-3
Signed-off-by: Yu Chien Peter Lin <peterlin@andestech.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
15 months agolib: sbi: Add support for smcsrind and smcdeleg
Atish Patra [Sat, 17 Feb 2024 00:06:08 +0000 (16:06 -0800)]
lib: sbi: Add support for smcsrind and smcdeleg

Smcsrind allows generic indirect CSR access mechanism while
Smcdeleg allows delegating hpmcounters in Supervisor mode.

Enable both extensions and set the appropriate bits in mstateen
and menvcfg.

Co-developed-by: Kaiwen Xue <kaiwenxue1@gmail.com>
Signed-off-by: Atish Patra <atishp@rivosinc.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
15 months agolib: sbi_hsm: Restor hart state to stop when fails to start
Joshua Yeong [Mon, 19 Feb 2024 07:14:06 +0000 (15:14 +0800)]
lib: sbi_hsm: Restor hart state to stop when fails to start

Hart state should change back to hart stop when hsm_device_hart_start()
or sbi_ipi_raw_send() fails to perform hart start.

Signed-off-by: Joshua Yeong <joshua.yeong@starfivetech.com>
Reviewed-by: Xiang W <wxjstz@126.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
15 months agodocs/firmware: document new options for jump and payload firmwares
Inochi Amaoto [Fri, 23 Feb 2024 08:18:15 +0000 (16:18 +0800)]
docs/firmware: document new options for jump and payload firmwares

Adding relocatable address brings new configuration options for jump
and payload firmwares. Describe these new options in documentation.

Signed-off-by: Inochi Amaoto <inochiama@outlook.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
15 months agoplatform: Apply relocatable address
Inochi Amaoto [Fri, 23 Feb 2024 08:18:14 +0000 (16:18 +0800)]
platform: Apply relocatable address

Since jump and payload firmware support relocatable address, make
general platform use runtime relocatable address.

Signed-off-by: Inochi Amaoto <inochiama@outlook.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
15 months agofirmware: Add relocatable FW_PAYLOAD_FDT_ADDR
Inochi Amaoto [Fri, 23 Feb 2024 08:18:13 +0000 (16:18 +0800)]
firmware: Add relocatable FW_PAYLOAD_FDT_ADDR

The fw_payload.bin has the same issue as described in previous patch.
But only FW_PAYLOAD_FDT_ADDR is affected.

Add FW_PAYLOAD_FDT_OFFSET to identify relocatable payload fdt address.

Signed-off-by: Inochi Amaoto <inochiama@outlook.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
15 months agofirmware: Add relocatable FW_JUMP_ADDR and FW_JUMP_FDT_ADDR
Inochi Amaoto [Fri, 23 Feb 2024 08:18:12 +0000 (16:18 +0800)]
firmware: Add relocatable FW_JUMP_ADDR and FW_JUMP_FDT_ADDR

If FW_PIC=y is defined, the fw_jump.bin will be broken if
FW_TEXT_START is wrong. This is not the desired behavior.

Add two new variables to identify relocatable jump address:
FW_JUMP_OFFSET and FW_JUMP_FDT_ADDR. To keep the existing
ABI, FW_JUMP_ADDR and FW_JUMP_FDT_ADDR is prefered if they
are defined.

Signed-off-by: Inochi Amaoto <inochiama@outlook.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
15 months agoplatform: starfive: call starfive_jh7110_inst_init() in pm_reset_init()
Nam Cao [Thu, 22 Feb 2024 08:16:19 +0000 (09:16 +0100)]
platform: starfive: call starfive_jh7110_inst_init() in pm_reset_init()

The function starfive_jh7110_inst_init() initialize some power
management unit address and clock addresses, needed for the reset
driver. It doesn't do anything else, and also the reset driver doesn't
work without calling this function. Thus, it does not make much sense
that this function is independent from pm_reset_init().

Delete the separate call to starfive_jh7110_inst_init(), and instead
just call this function inside pm_reset_init().

Doing this also fixes another problem: if starfive_jh7110_inst_init()
returns an error code, it gets propagated to final_init() and OpenSBI
hangs. This hang is not necessary, because failures within
starfive_jh7110_inst_init() only mean OpenSBI cannot perform reboot or
shutdown, but the system can still function normally.

Signed-off-by: Nam Cao <namcao@linutronix.de>
Tested-by: Minda Chen <minda.chen@starfivetech.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
15 months agoplatform: starfive: return error if needed devices are not present
Nam Cao [Thu, 22 Feb 2024 08:16:18 +0000 (09:16 +0100)]
platform: starfive: return error if needed devices are not present

Jh7110's reset driver needs power management device and clock controller
device to work. Currently, the driver proceed anyway without these
devices, and invalid addresses (jh7110_inst.pmu_reg_base and
jh7110_inst.clk_reg_base) are used during reboot, which causes
unpredictable broken behaviors.

If these devices are not present, return -SBI_ENODEV.

Signed-off-by: Nam Cao <namcao@linutronix.de>
Tested-by: Minda Chen <minda.chen@starfivetech.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
15 months agoplatform: starfive: rename "stf,axp15060-regulator" -> "x-powers,axp15060"
Nam Cao [Thu, 22 Feb 2024 08:16:17 +0000 (09:16 +0100)]
platform: starfive: rename "stf,axp15060-regulator" -> "x-powers,axp15060"

OpenSBI uses the device tree compatible string "stf,axp15060-regulator"
for the regulator node. However, the string used by U-Boot (and Linux)
is actually "x-powers,axp15060". As OpenSBI gets the device tree from
U-Boot, this causes the regulator device to be undetected, and OpenSBI
does not use this device to perform board reset/shutdown.

Rename this device tree compatible string to match U-Boot (and Linux).

Signed-off-by: Nam Cao <namcao@linutronix.de>
Acked-by: Minda Chen <minda.chen@starfivetech.com>
Tested-by: Minda Chen <minda.chen@starfivetech.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
15 months agoplatform: starfive: remove redundant compatibility check in pmic_ops
Nam Cao [Thu, 22 Feb 2024 08:16:16 +0000 (09:16 +0100)]
platform: starfive: remove redundant compatibility check in pmic_ops

pmic_ops() is only called if a compatible device is found in device
tree. It is redundant for this function to check the compability again.
Remove this check.

Signed-off-by: Nam Cao <namcao@linutronix.de>
Tested-by: Minda Chen <minda.chen@starfivetech.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
15 months agoplatform: starfive: get I2C offset address from clocks property
Nam Cao [Thu, 22 Feb 2024 08:16:15 +0000 (09:16 +0100)]
platform: starfive: get I2C offset address from clocks property

The current code gets the I2C offset address using the device tree node
name: it get the I2C device index from the 4th character in the node
name (for example, "i2c5" -> i2c device 5). However, the device tree
node's name in U-Boot is actually just "i2c" without the number, so the
current code cannot be used with the device tree from U-Boot.

Get the I2C offset address from the "clocks" property instead.

Signed-off-by: Nam Cao <namcao@linutronix.de>
Reviewed-by: Minda Chen <minda.chen@starfivetech.com>
Tested-by: Minda Chen <minda.chen@starfivetech.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
15 months agoplatform: starfive: correct system clock device tree node
Nam Cao [Thu, 22 Feb 2024 08:16:14 +0000 (09:16 +0100)]
platform: starfive: correct system clock device tree node

Starfive names the system clock device tree node "starfive,jh7110-clkgen"
in all their git repositories. However, a different name is used in
upstream U-Boot (and also Linux): "starfive,jh7110-syscrg". Since
OpenSBI gets the device tree from U-Boot, this inconsistency leads the
problem that OpenSBI doesn't know the system clock device exists.

Correct this name to keep the consistency.

Signed-off-by: Nam Cao <namcao@linutronix.de>
Acked-by: Minda Chen <minda.chen@starfivetech.com>
Tested-by: Minda Chen <minda.chen@starfivetech.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
15 months agolib: sbi_pmu: Before using we should ensure PMU init done
yang.zhang [Thu, 1 Feb 2024 02:01:26 +0000 (10:01 +0800)]
lib: sbi_pmu: Before using we should ensure PMU init done

If trap earlier before sbi_pmu_init done, some path would call
sbi_pmu_ctr_incr_fw, then it would go wrong:
1. if phs_ptr_offset is zero, then it get a wrong pmu state ptr
2. if phs_ptr_offset is ok, but we didn't call pmu_set_hart_state_ptr
it would be NULL POINT

Of course, the above situation will not occur at present, but it is
reasonable to check before using.

Signed-off-by: yang.zhang <yang.zhang@hexintek.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
15 months agodocs: move documentation of system suspend test.
Cheng Yang [Thu, 8 Feb 2024 03:14:35 +0000 (11:14 +0800)]
docs: move documentation of system suspend test.

This patch move documentation of "system-suspend-test" from
docs/domain_support.md to docs/opensbi_config.md

Signed-off-by: Cheng Yang <yangcheng.work@foxmail.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
15 months agoplatform: generic: Parse system suspend test from config node.
Cheng Yang [Thu, 8 Feb 2024 03:14:34 +0000 (11:14 +0800)]
platform: generic: Parse system suspend test from config node.

This patch update generic_domains_init() so that "system-suspend-test"
is parsed from "/chosen/opensbi-config" DT node.

Signed-off-by: Cheng Yang <yangcheng.work@foxmail.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
15 months agodocs: Add OpenSBI DT configuration guide.
Cheng Yang [Thu, 8 Feb 2024 03:14:33 +0000 (11:14 +0800)]
docs: Add OpenSBI DT configuration guide.

This patch add docs/opensbi_config.md which describes the
"/chosen/opensbi-config" DT node and properties

Signed-off-by: Cheng Yang <yangcheng.work@foxmail.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
15 months agoplatform: generic: Add support for specify coldboot harts in DT
Cheng Yang [Thu, 8 Feb 2024 03:14:32 +0000 (11:14 +0800)]
platform: generic: Add support for specify coldboot harts in DT

Added support for the generic platform to specify the set of coldboot
hart in DT. If not specified in DT, all harts are allowed to coldboot
as before.

The functions related to sbi_hartmask are not available before coldboot,
so I used bitmap, and added a new bitmap_test() function to test whether
a certain bit of the bitmap is set.

Signed-off-by: Cheng Yang <yangcheng.work@foxmail.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
16 months agofirmware: fw_base.S: remove _runtime_offset
Xiang W [Wed, 17 Jan 2024 10:41:59 +0000 (18:41 +0800)]
firmware: fw_base.S: remove _runtime_offset

_runtime_offset is a variable not used elsewhere, so remove it.

Signed-off-by: Xiang W <wxjstz@126.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
16 months agofirmware: fw_base.S: Improve loading u32
Xiang W [Wed, 17 Jan 2024 10:41:58 +0000 (18:41 +0800)]
firmware: fw_base.S: Improve loading u32

lwu exists under the current rv64 and should also exist under the rv128
in the future, so I modified the conditions of conditional compilation
so that it can adapt to the future situation

Signed-off-by: Xiang W <wxjstz@126.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
16 months agofirmware: always create dynsym section
Leon M. Busch-George [Fri, 26 Jan 2024 15:21:25 +0000 (16:21 +0100)]
firmware: always create dynsym section

With a bare-metal linkers (e.g. riscv64-elf-ld), there exists no
dynsym section. The dynsym section is not used by OpenSBI but
discarding it makes linkers with dynamic library support unhappy.

Signed-off-by: Leon M. Busch-George <leon@georgemail.eu>
Reviewed-by: Anup Patel <anup@brainfault.org>
16 months agoMakefile: check for --exclude-libs
Leon M. Busch-George [Fri, 26 Jan 2024 15:21:24 +0000 (16:21 +0100)]
Makefile: check for --exclude-libs

While writing to the dynsym is futile, the --exclude-libs options is not
recognized by all linkers (e.g. riscv64-elf-ld.bfd).

Signed-off-by: Leon M. Busch-George <leon@georgemail.eu>
Reviewed-by: Anup Patel <anup@brainfault.org>
16 months agoMakefile: don't pass -mstrict-align if not supported
Kalle Wachsmuth [Thu, 18 Jan 2024 18:02:31 +0000 (19:02 +0100)]
Makefile: don't pass -mstrict-align if not supported

Support for that option will be added in LLVM 18:
https://github.com/llvm/llvm-project/commit/23ce5368409c760f3dd49d0f17f34772b0b869d8

Clang 17.0.6, however, will error when passed the
`-mstrict-align` flag.
We should only use the flag if it is supported.

Signed-off-by: Kalle Wachsmuth <kalle.wachsmuth@gmail.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
Reviewed-by: Xiang W <wxjstz@126.com>
16 months agofw_base.S: Fix comment errors
Zhang Runmin [Sun, 17 Dec 2023 13:48:36 +0000 (21:48 +0800)]
fw_base.S: Fix comment errors

When calling '_reset_regs', it'll reset all registers except some
specific registers (ra, a0, a1, and a2).

Both boot HART and non-boot HARTs will execute the '_start_warm'
function. Therefore, when '_reset_regs' is called in '_start_warm', it
will reset all registers except some specific registers (ra, a0, a1 and
a2) for both boot HART and non-boot HARTs.

Signed-off-by: Zhang Runmin <fmrt19zrmin@163.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
16 months agolib: sbi: Use mask to check the free bit during trigger allocation
Himanshu Chauhan [Tue, 2 Jan 2024 16:46:24 +0000 (22:16 +0530)]
lib: sbi: Use mask to check the free bit during trigger allocation

The trigger allocation function uses bit shift instead of mask to check the
mapped status of the triggers. This causes index 0 to be return always. As a
result, the older triggers are overwritten.

Use the mask for MAPPED field in state word to check if the trigger is mapped.

Fixes: 97f234f15 ("lib: sbi: Introduce the SBI debug triggers extension support")
Signed-off-by: Himanshu Chauhan <hchauhan@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
17 months agolib: sbi: Print number of debug triggers found
Himanshu Chauhan [Tue, 9 Jan 2024 17:00:20 +0000 (22:30 +0530)]
lib: sbi: Print number of debug triggers found

Print the total number of triggers found on the boot hart.

Signed-off-by: Himanshu Chauhan <hchauhan@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
17 months agolib: sbi: Implement SBI debug trigger extension
Himanshu Chauhan [Tue, 9 Jan 2024 17:00:19 +0000 (22:30 +0530)]
lib: sbi: Implement SBI debug trigger extension

This patch adds functions to register ecalls for debug triggers
and handler to handle the debug trigger function IDs.

Signed-off-by: Himanshu Chauhan <hchauhan@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
17 months agoinclude: sbi: Add SBI debug trigger extension related defines
Himanshu Chauhan [Tue, 9 Jan 2024 17:00:18 +0000 (22:30 +0530)]
include: sbi: Add SBI debug trigger extension related defines

This patch adds defines for SBI debug trigger extension and
function IDs to access the extension.

Signed-off-by: Himanshu Chauhan <hchauhan@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
17 months agolib: sbi: Introduce the SBI debug triggers extension support
Himanshu Chauhan [Tue, 9 Jan 2024 17:00:17 +0000 (22:30 +0530)]
lib: sbi: Introduce the SBI debug triggers extension support

RISC-V Debug specification includes Sdtrig ISA extension
which describes Trigger Module. Triggers can cause
a breakpoint exception or trace action without execution
of a special instruction. They can be used to implement
hardware breakpoints and watchpoints for native debugging.

The SBI Debut Trigger extension (Draft v6) can be found at:
https://lists.riscv.org/g/tech-debug/topic/99825362#1302

This patch is an initial implementation of SBI Debug
Trigger Extension (Draft v6) in OpenSBI.

The following features are supported:
 * mcontrol, mcontrol6 triggers
 * Breakpoint and trace actions

NOTE: Chained triggers are not supported

Signed-off-by: Himanshu Chauhan <hchauhan@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
17 months agolib: sbi: Detect support of debug triggers
Himanshu Chauhan [Tue, 9 Jan 2024 17:00:16 +0000 (22:30 +0530)]
lib: sbi: Detect support of debug triggers

Detect if debug triggers, sdtrig extension, is supported
by the CPU. The support is detected by access traps and
ISA string parsing.

Signed-off-by: Himanshu Chauhan <hchauhan@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
17 months agoinclude: sbi: Introduce debug trigger register encodings
Himanshu Chauhan [Tue, 9 Jan 2024 17:00:15 +0000 (22:30 +0530)]
include: sbi: Introduce debug trigger register encodings

This patch introduces Mcontrol and M6 control register
encodings along with macros to manipulate them.

Signed-off-by: Himanshu Chauhan <hchauhan@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
17 months agoinclude: sbi: Add TINFO debug trigger CSR
Himanshu Chauhan [Tue, 9 Jan 2024 17:00:14 +0000 (22:30 +0530)]
include: sbi: Add TINFO debug trigger CSR

Add the missing TINFO debug trigger CSR.

Signed-off-by: Himanshu Chauhan <hchauhan@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
17 months agoinclude: sbi: Introduce common endianess conversion macro
Himanshu Chauhan [Tue, 9 Jan 2024 17:00:13 +0000 (22:30 +0530)]
include: sbi: Introduce common endianess conversion macro

Introduce cpu_to_lle and lle_to_cpu macros which invoke
correct word length cpu_to_le<64/32> conversion based on
__riscv_xlen.

Signed-off-by: Himanshu Chauhan <hchauhan@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
17 months agoinclude: Bump-up version to 1.4 upstream v1.4
Anup Patel [Wed, 27 Dec 2023 07:02:58 +0000 (12:32 +0530)]
include: Bump-up version to 1.4

This patch updates OpenSBI version to 1.4 as part of
release preparation.

Signed-off-by: Anup Patel <apatel@ventanamicro.com>
Signed-off-by: Anup Patel <anup@brainfault.org>
17 months agolib: sbi: Detect Zicntr extension only based on traps
Anup Patel [Wed, 27 Dec 2023 06:55:09 +0000 (12:25 +0530)]
lib: sbi: Detect Zicntr extension only based on traps

OpenSBI uses time CSR if Zicntr extension present which causes
it to crash on an older QEMU because QEMU generates Zicntr in
the ISA string for unleashed machine which only has CYCLE and
INSTRET counters.

Fixes: 776770d2adbf ("lib: sbi: Using one array to define the
name of extensions")
Signed-off-by: Anup Patel <apatel@ventanamicro.com>
Signed-off-by: Anup Patel <anup@brainfault.org>
17 months agolib: utils/timer: mtimer: only use regname for aclint
Inochi Amaoto [Wed, 27 Dec 2023 00:46:11 +0000 (08:46 +0800)]
lib: utils/timer: mtimer: only use regname for aclint

The parser will fail if the timer is clint timer and has regname
property. As the regname is only meaningful for aclint, it is more
robust to only check regname for aclint timer.

Fixes: 6112d58 ("lib: utils/fdt: Allow to use reg-names when parsing ACLINT")
Signed-off-by: Inochi Amaoto <inochiama@outlook.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
17 months agolib: sbi: Fix shift bug in sbi_system_reset
Xiang W [Thu, 21 Dec 2023 01:44:27 +0000 (09:44 +0800)]
lib: sbi: Fix shift bug in sbi_system_reset

There is a problem with judging whether the current hart belongs to
hmask. If cur_hartid minus hbase is greater than BITS_PER_LONG, the
previous hmask will also have a bit cleared incorrectly, which will
cause some harts to lose ipi.

Signed-off-by: Xiang W <wxjstz@126.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
17 months agolib: sbi: Do not enter OpenSBI with mseccfg.MML == 1
Anup Patel [Tue, 12 Dec 2023 09:49:11 +0000 (15:19 +0530)]
lib: sbi: Do not enter OpenSBI with mseccfg.MML == 1

On platforms with Smepmp, the previous booting stage must enter
OpenSBI with mseccfg.MML == 0. This allows OpenSBI to configure
it's own M-mode only regions without depending on the previous
booting stage.

Signed-off-by: Anup Patel <apatel@ventanamicro.com>
17 months agolib: sbi: Remove the SBI_ETRAP error code
Anup Patel [Mon, 11 Dec 2023 15:41:03 +0000 (21:11 +0530)]
lib: sbi: Remove the SBI_ETRAP error code

The SBI_ETRAP error code was introduced only for doing trap
redirection in generic sbi_ecall_handler(). Now the trap
redirection is moved into sbi_ecall_legacy.c and SBI_ETRAP
error code is only used in this source file so let us remove
it.

Signed-off-by: Anup Patel <apatel@ventanamicro.com>
17 months agolib: sbi: Allow ecall handlers to directly update register state
Anup Patel [Mon, 11 Dec 2023 15:29:14 +0000 (20:59 +0530)]
lib: sbi: Allow ecall handlers to directly update register state

Some of the upcoming SBI extensions (such as SSE) will directly
update register state so improve the prototype of ecall handler
to accommodate this. Further, this flexibility allows us to
push the trap redirection from sbi_ecall_handler() to the
sbi_ecall_legacy_handler().

Signed-off-by: Anup Patel <apatel@ventanamicro.com>
17 months agolib: utils/irqchip: Add shared MMIO region for PLIC in root domain
Anup Patel [Mon, 11 Dec 2023 08:37:56 +0000 (14:07 +0530)]
lib: utils/irqchip: Add shared MMIO region for PLIC in root domain

On platforms with Smepmp, the MMIO regions accessed by M-mode need
to be explicitly marked with M-mode only read/write or shared (both
(M-mode and S-mode) read/write permission.

If the above is not done then runtime PLIC access from M-mode on
platforms with Smepmp will result in access fault when further
results in CPU hotplug not working.

Signed-off-by: Anup Patel <apatel@ventanamicro.com>
17 months agoplatform: generic: Fine tune fw_platform_calculate_heap_size()
Anup Patel [Mon, 11 Dec 2023 08:03:58 +0000 (13:33 +0530)]
platform: generic: Fine tune fw_platform_calculate_heap_size()

Let's use SBI_TLB_INFO_SIZE instead of hard-coded 0x40 in
fw_platform_calculate_heap_size() to fine tune the heap size
required for per-hart TLB fifos.

Signed-off-by: Anup Patel <apatel@ventanamicro.com>
17 months agolib: sbi_tlb: Reduce size of struct sbi_tlb_info
Anup Patel [Mon, 11 Dec 2023 07:56:49 +0000 (13:26 +0530)]
lib: sbi_tlb: Reduce size of struct sbi_tlb_info

Let us reduce the size of struct sbi_tlb_info by doing the
following:
1) Change the data type of asid and vmid fields to uint16_t
2) Replace local_fn() function pointer with an enum

Based on the above, the size of struct sbi_tlb_info is reduced
by 16 bytes on RV64 and 4 bytes on RV32.

Signed-off-by: Anup Patel <apatel@ventanamicro.com>
17 months agolib: sbi: Detect extensions from the ISA string in DT
Yong-Xuan Wang [Tue, 12 Dec 2023 08:58:35 +0000 (08:58 +0000)]
lib: sbi: Detect extensions from the ISA string in DT

Enable access to some extensions through menvcfg and show them in "Boot
HART ISA Extensions" if they are present in the device tree.

Signed-off-by: Yong-Xuan Wang <yongxuan.wang@sifive.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
17 months agolib: sbi: Using one array to define the name of extensions
Yong-Xuan Wang [Tue, 12 Dec 2023 08:58:34 +0000 (08:58 +0000)]
lib: sbi: Using one array to define the name of extensions

Define an array sbi_hart_ext to map extension ID and name , and use it
for ISA parsing and printing out the supported extensions.

Signed-off-by: Yong-Xuan Wang <yongxuan.wang@sifive.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
17 months agolib: sbi: Refactor the code for enable extensions in menvfg CSR
Yong-Xuan Wang [Tue, 12 Dec 2023 08:58:33 +0000 (08:58 +0000)]
lib: sbi: Refactor the code for enable extensions in menvfg CSR

Use 1 variable to store the value of menvcfg.

Signed-off-by: Yong-Xuan Wang <yongxuan.wang@sifive.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
17 months agolib: sbi: Improve the code of privilege mode and extensions detection
Yong-Xuan Wang [Tue, 12 Dec 2023 08:58:32 +0000 (08:58 +0000)]
lib: sbi: Improve the code of privilege mode and extensions detection

We can enhance the code by creating 2 unified interface with macro  for
privilege mode and extensions detection, which relies on supported
privilege modes and CSRs.

Signed-off-by: Yong-Xuan Wang <yongxuan.wang@sifive.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
17 months agolib: sbi: Simplify the initialization of root_hmask in sbi_domain_init
Xiang W [Mon, 11 Dec 2023 13:29:50 +0000 (21:29 +0800)]
lib: sbi: Simplify the initialization of root_hmask in sbi_domain_init

The original code has multiple conversions between hartid and
hartindex. Can call sbi_hartmask_set_hartindex directly to
avoid conversion.

Signed-off-by: Xiang W <wxjstz@126.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
17 months agolib: sbi_ipi: Drop unnecessary ipi_process check
Samuel Holland [Fri, 8 Dec 2023 21:22:59 +0000 (13:22 -0800)]
lib: sbi_ipi: Drop unnecessary ipi_process check

sbi_ipi_event_create() disallows registering an IPI event with a NULL
.process callback, so the function pointer will never be NULL here.

Signed-off-by: Samuel Holland <samuel.holland@sifive.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
Reviewed-by: Xiang W <wxjstz@126.com>
17 months agolib: sbi_ipi: Process self-IPIs in sbi_ipi_send()
Samuel Holland [Fri, 8 Dec 2023 21:22:58 +0000 (13:22 -0800)]
lib: sbi_ipi: Process self-IPIs in sbi_ipi_send()

An IPI sent to the local hart can be processed directly instead of
triggering the IPI device. This is more efficient, and it avoids a
deadlock when the .sync callback is defined. Since interrupts are
disabled while handling an ecall, the IPI would not get delivered
until the next mret, but sbi_ipi_sync() is called before then.

Signed-off-by: Samuel Holland <samuel.holland@sifive.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
Reviewed-by: Xiang W <wxjstz@126.com>
17 months agolib: sbi_ipi: Do not ignore errors from sbi_ipi_send()
Samuel Holland [Mon, 18 Dec 2023 12:43:45 +0000 (18:13 +0530)]
lib: sbi_ipi: Do not ignore errors from sbi_ipi_send()

Currently, failures in sbi_ipi_send() are silently ignored, which makes
them difficult to debug. Instead, abort sending the IPI and pass back
the error, but still synchronize any IPIs already sent.

Signed-off-by: Samuel Holland <samuel.holland@sifive.com>
Signed-off-by: Anup Patel <anup@brainfault.org>
18 months agolib: sbi_tlb: Check tlb_range_flush_limit only once per request
Samuel Holland [Fri, 8 Dec 2023 20:29:55 +0000 (12:29 -0800)]
lib: sbi_tlb: Check tlb_range_flush_limit only once per request

The tlb_update() callback is called for each destination hart.
Move the size check earlier, so it is executed only once.

Signed-off-by: Samuel Holland <samuel.holland@sifive.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
18 months agolib: utils/fdt: Allow to use reg-names when parsing ACLINT
Inochi Amaoto [Fri, 17 Nov 2023 12:13:09 +0000 (20:13 +0800)]
lib: utils/fdt: Allow to use reg-names when parsing ACLINT

Currently, the fdt_parse_aclint_node() follows a fixed order to parse
ACLINT timer. This may cause the undesirable result when the ACLINT
device does not support mtime without adding an empty entry for it in
the DT.

To be robust, make fdt_parse_aclint_node() support "reg-names" property,
so it can parse the DT in an order independent way. For compatibility,
fdt_parse_aclint_node() only use "reg-names" when parsing ACLINT timer,
and will fallback to the old way if "reg-names" property is not found.

Link: https://lore.kernel.org/all/20231114-skedaddle-precinct-66c8897227bb@squawk/
Signed-off-by: Inochi Amaoto <inochiama@outlook.com>
Reviewed-by: Anup patel <anup@brainfault.org>
18 months agolib: sbi: skip wait_for_coldboot when coolboot done
Xiang W [Sun, 10 Dec 2023 15:21:39 +0000 (23:21 +0800)]
lib: sbi: skip wait_for_coldboot when coolboot done

When warmboot via HSM, coolboot has been completed and
wait_for_coldboot can be skipped to speed up.

Signed-off-by: Xiang W <wxjstz@126.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
18 months agoplatform: recalculate heap size to support new tlb entry number
Inochi Amaoto [Sun, 10 Dec 2023 09:44:54 +0000 (17:44 +0800)]
platform: recalculate heap size to support new tlb entry number

Previous patch introduced a change that using hart count as the default
number of tlb entries in the fifo. This makes the default tlb fifo size
grow in square with the number of harts. So the default heap size is
not enough to allocate tlb fifo when the hart count is big.

Fixes: 52fd64b ("platform: Uses hart count as the default size of tlb info")
Signed-off-by: Inochi Amaoto <inochiama@outlook.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
18 months agolib: sbi_hsm: Put the resume_pending hart in the interruptible hart mask
Nick Hu [Fri, 1 Dec 2023 09:51:47 +0000 (17:51 +0800)]
lib: sbi_hsm: Put the resume_pending hart in the interruptible hart mask

Current interruptible hart mask doesn't include the hart which HSM state
is SBI_HSM_STATE_RESUME_PENDING. So when there is a request to send an
IPI to the hart which is in the resume process, this hart would miss the
IPI forever. Put the SBI_HSM_STATE_RESUME_PENDING hart in the
interruptible hart mask to fix the issue.

Signed-off-by: Nick Hu <nick.hu@sifive.com>
Reviewed-by: Xiang W <wxjstz@126.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
18 months agofirmware: fix section types
Matt Waltz [Tue, 5 Dec 2023 15:13:44 +0000 (08:13 -0700)]
firmware: fix section types

These sections are only intended to hold data, and should not be executable.

Signed-off-by: Matt Waltz <matthewwaltzis@gmail.com>
Reviewed-by: Xiang W <wxjstz@126.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
18 months agolib: sbi_pmu: Fix the counter info function
Atish Patra [Thu, 7 Dec 2023 22:23:50 +0000 (14:23 -0800)]
lib: sbi_pmu: Fix the counter info function

The counter info should only return valid hardware counters for the ones
set in the counter mask. Otherwise, it will report incorrect number of
hardware counters to the supervisor if the platform has discontiguous
counters.

Fixes: c744ed77b18c ("lib: sbi_pmu: Enable noncontigous hpm event and counters")
Signed-off-by: Atish Patra <atishp@rivosinc.com>
Reviewed-by: Xiang W <wxjstz@126.com>
Reviewed-by: Anup Patel <anup@brainfault.org>