summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
3 dayslib: sbi_domain: Rename per-domain data to per-domain stateHEADmasterRahul Pathak
The per-domain sbi_domain_data hold each domain associated state like hart context in sbi_domain_context, mpxy state in sbi_mpxy, and others like each domain backed by the corresponding MPT (SMMPT). DATA reads as a generic name, while every use stores state. Rename functions and macros appropriately. There are no functional changes. Signed-off-by: Rahul Pathak <rahul.pathak@oss.qualcomm.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260820121309.2551296-3-rahul.pathak@oss.qualcomm.com Signed-off-by: Anup Patel <anup@brainfault.org>
3 dayslib: sbi: Rename map_range/unmap_range functionsRahul Pathak
*_map_range and *_unmap_range functions are required in M-Mode to get the temporary access to S-Mode and U-Mode regions. Thse functions only operate using the TYPE_MEMORY memory protection mechanisms. Rename them to reflect the actual usage of these functions and let generic map/unmap_range names to implement generic functions Signed-off-by: Rahul Pathak <rahul.pathak@oss.qualcomm.com> Reviewed-by: Anup Patel <anup@brainfault.org> Reviewed-by: Pawandeep Oza <pawandeep.oza@oss.qualcomm.com> Link: https://lore.kernel.org/r/20260820121309.2551296-2-rahul.pathak@oss.qualcomm.com Signed-off-by: Anup Patel <anup@brainfault.org>
3 dayslib: sbi: Fix FP state enable in sbi_fp_savewhensun
sbi_fp_save() currently sets mstatus.VS before executing floating-point store instructions. VS controls vector state and does not enable floating-point instructions. Set mstatus.FS instead, matching sbi_fp_restore(), so floating-point state can be saved when FS was previously Off. Fixes: 718e1d194f5a ("lib: sbi: Add floating-point context save/restore support.") Signed-off-by: whensun <theodoruswensanfebruanto025@gmail.com> Co-developed-by: Huamao Wu <huamao.wu@spacemit.com> Signed-off-by: Huamao Wu <huamao.wu@spacemit.com> Link: https://lore.kernel.org/r/20260828213104.84490-1-theodoruswensanfebruanto025@gmail.com Signed-off-by: Anup Patel <anup@brainfault.org>
4 dayslib: sbi_irqchip: error handling in sbi_irqchip_raw_handler_default()Heinrich Schuchardt
sbi_irqchip_find_handler() may return NULL. Check the return value before dereferencing. Addresses-Coverity-ID: 1677408 Dereference null return value Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260820134431.167336-1-heinrich.schuchardt@canonical.com Signed-off-by: Anup Patel <anup@brainfault.org>
4 dayslib: sbi: respect scounteren when emulating timehBen Zong-You Xie
beef2f693785 ("lib: sbi: Respect scounteren when emulating the time CSR") restored it for TIME only, so on RV32 supervisor software still cannot restrict U-mode or VS-mode access to time: rdtime traps as intended while rdtimeh keeps returning the upper half. Signed-off-by: Ben Zong-You Xie <ben717@andestech.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260805093354.1022980-1-ben717@andestech.com Signed-off-by: Anup Patel <anup@brainfault.org>
4 dayslib: sbi_pmu: Fix counter and event info error codes as per SBI v3.0 specDavid E. Garcia Porras
Align the PMU extension implementation with the error codes required by the SBI v3.0 specification, chapter 11: - sbi_pmu_counter_start and sbi_pmu_counter_stop (secs 11.9-11.10, tables 39-42): the start_flags/stop_flags bits 2:(XLEN-1) are reserved and must be zero, so return SBI_ERR_INVALID_PARAM when any reserved flag bit is set. Introduce SBI_PMU_START_FLAGS_MASK and SBI_PMU_STOP_FLAGS_MASK for the valid bits of each function. - sbi_pmu_counter_start and sbi_pmu_counter_stop (tables 40 and 42): return SBI_ERR_ALREADY_STARTED / SBI_ERR_ALREADY_STOPPED when the set of counters includes a counter which is already started or stopped, instead of ignoring the error returned for each counter. - sbi_pmu_event_get_info (sec 11.14, table 47): the output word must indicate whether the event is supported, but firmware events were only matched against the hardware event map and were always reported as unsupported. Report a validated firmware event as supported. Signed-off-by: David E. Garcia Porras <david.garcia@aheadcomputing.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260818210023.466462-4-david.garcia@aheadcomputing.com Signed-off-by: Anup Patel <anup@brainfault.org>
5 dayslib: sbi_pmu: Match raw event selector only against raw event map entriesDavid E. Garcia Porras
sbi_pmu_event_get_info() walks hw_event_map[] to decide whether a requested event is supported. For SBI_PMU_EVENT_RAW_IDX and SBI_PMU_EVENT_RAW_V2_IDX it compares the requested event_data against temp->select / temp->select_mask without first checking that the map entry being examined is itself a raw event entry. Non-raw hardware event entries are added via sbi_pmu_add_hw_event_counter_map(), leave select and select_mask at zero, hence they satisfy: temp->select == (event_data & temp->select_mask) so the first non-raw entry visited will always match. The issue's observability depends purely on the ordering of hw_event_map[]: if the platform registers its raw events last, every raw event query, including unsupported ones, will be reported as supported. Fix it by checking event_idx against temp->start_idx and temp->end_idx before comparing select/select_mask. Fixes: e4345842168b ("lib: sbi_pmu: Implement SBI PMU event info function") Signed-off-by: David E. Garcia Porras <david.garcia@aheadcomputing.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260818210023.466462-3-david.garcia@aheadcomputing.com Signed-off-by: Anup Patel <anup@brainfault.org>
5 dayslib: sbi_pmu: Return invalid param error for reserved event_idx bitsDavid E. Garcia Porras
As per section 11.14 of the SBI specification (Function: Get PMU Event Info, FID #8), Table 47, the event_idx word of an event info entry only uses BIT[0:19]; BIT[20:31] are reserved for the future purpose and must be zero. Table 48 further requires the SBI implementation to return SBI_ERR_INVALID_PARAM if any reserved bit in an event_idx word is set. sbi_pmu_event_get_info() does not check the reserved bits, so a malformed event_idx is silently passed on to pmu_event_validate() instead of failing the call. Add SBI_PMU_EVENT_IDX_MBZ_MASK covering the must-be-zero bits and return SBI_ERR_INVALID_PARAM when any of them are set. Fixes: e4345842168b ("lib: sbi_pmu: Implement SBI PMU event info function") Signed-off-by: David E. Garcia Porras <david.garcia@aheadcomputing.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260818210023.466462-2-david.garcia@aheadcomputing.com Signed-off-by: Anup Patel <anup@brainfault.org>
7 dayslib: sbi: sse: clear SPV for non-virtualized eventsZhanpeng Zhang
SSE injection sets hstatus.SPV to the virtualization state of the interrupted context before entering the supervisor handler. This patch completes that existing requirement and does not change the SSE ABI. The existing code sets SPV when the interrupted context is virtualized, but leaves it unchanged otherwise. A stale SPV value can therefore make an event that interrupted host execution appear to have interrupted a guest. Event completion can then resume with virtualization enabled. Clear SPV when the interrupted context is not virtualized so the handler-visible state matches the interrupted context. This also lets supervisor software, such as the Linux PMU and perf code, reliably tell whether an SSE interrupted host or virtualized execution. Fixes: c8cdf01d8f3a ("lib: sbi: Add support for Supervisor Software Events extension") Signed-off-by: Zhanpeng Zhang <zhangzhanpeng.jasper@bytedance.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260731071820.7318-1-zhangzhanpeng.jasper@bytedance.com Signed-off-by: Anup Patel <anup@brainfault.org>
7 daysplatform: generic/andes: fix 32-bit shift overflow in decode_pmaaddrx()Randolph
decode_pmaaddrx() reconstructs the NAPOT region start and size from a pmaaddr CSR value using "1 << (k + 3)" and "1 << k". The integer literal 1 has type int, so these shifts are performed in 32-bit precision. Shifting a 32-bit value by 32 or more bits is undefined behavior, and on RV64 the compiler emits sllw, which truncates the shift amount modulo 32. As a result, any PMA region with size >= 4 GiB (k >= 29) is decoded incorrectly. For example, on the Andes QiLai SoC the PCIe region 0x1000000000 - 0x17ffffffff (pmaaddr = 0x4ffffffff, k = 32) is decoded as an 8-byte region at 0x13fffffffc. This is not merely cosmetic: decode_pmaaddrx() is used by has_pma_region_overlap() and andes_sbi_free_pma(), so overlap checks are performed against bogus ranges and freeing such an entry by its physical address always fails. Promote the shifts to unsigned long so they are performed in the native register width. Fixes: aa56084c4dfb ("platform: generic: andes: add a new Andes SBI call to set up a PMA entry") Signed-off-by: Randolph Lin <randolph@andestech.com> Tested-by: Benoît Monin <benoit.monin@bootlin.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260729092317.2848665-1-randolph@andestech.com Signed-off-by: Anup Patel <anup@brainfault.org>
7 dayslib: utils/andes: arm the SMU sleep command lastBen Zong-You Xie
Once the sleep command is written, the next WFI puts the core to sleep, so everything that can fail has to run before it. Also, use writel() so the command store cannot still be in flight at the WFI. Signed-off-by: Ben Zong-You Xie <ben717@andestech.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260728081041.2724668-8-ben717@andestech.com Signed-off-by: Anup Patel <anup@brainfault.org>
7 dayslib: utils/suspend: wait for the secondary Andes harts to sleepBen Zong-You Xie
A secondary hart may not have reached the target sleep state by the time the primary checks, so the one-shot check could fail spuriously. Poll each PCS status instead and give up after HART_SLEEP_TIMEOUT_MS. Rework atcsmu_pcs_is_sleep() into the atcsmu_hart_is_sleep() predicate so sbi_timer_waitms_until() can drive it. Signed-off-by: Ben Zong-You Xie <ben717@andestech.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260728081041.2724668-7-ben717@andestech.com Signed-off-by: Anup Patel <anup@brainfault.org>
7 dayslib: utils/hsm: wake sleeping Andes harts with an IPIBen Zong-You Xie
An IPI wakes a hart from light sleep and, once MSIP is kept as an SMU wakeup event, from deep sleep too. Drop the WAKEUP_CMD path and the boot state, hart type and sleep type conditions that selected it. Signed-off-by: Ben Zong-You Xie <ben717@andestech.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260728081041.2724668-6-ben717@andestech.com Signed-off-by: Anup Patel <anup@brainfault.org>
7 dayslib: utils/suspend: restore Andes CSRs on system-suspend resumeBen Zong-You Xie
A deep sleep resume leaves the boot hart in SUSPENDED state, so init_warmboot() dispatches to init_warm_resume(), which calls the SUSP device's system_resume callback and not sbi_platform_early_init(). The restore in ae350_early_init() is dead code on that path. Fixes: b27ecec76b8a ("lib: utils/suspend: add Andes ATCSMU suspend driver") Signed-off-by: Ben Zong-You Xie <ben717@andestech.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260728081041.2724668-5-ben717@andestech.com Signed-off-by: Anup Patel <anup@brainfault.org>
7 daysplatform: generic/andes: pair non-retentive CSR save/restore with a flagBen Zong-You Xie
The restore was gated on sbi_init_count() and the current sleep type, which is only a proxy for "did this hart actually save its CSRs". Track it explicitly instead, so restore is self-guarding and the call site needs no conditions. Signed-off-by: Ben Zong-You Xie <ben717@andestech.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260728081041.2724668-4-ben717@andestech.com Signed-off-by: Anup Patel <anup@brainfault.org>
7 dayslib: utils/andes: add the SMU and LLC registers to the root domainBen Zong-You Xie
When a hart implements Smepmp, S-mode and U-mode cannot reach either device unless its region is shared explicitly. Suspend and resume then take an access violation as soon as the supervisor touches the SMU or the LLC. Share both regions, and take their sizes from the DT nodes rather than ignoring them. Signed-off-by: Ben Zong-You Xie <ben717@andestech.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260728081041.2724668-3-ben717@andestech.com Signed-off-by: Anup Patel <anup@brainfault.org>
7 dayslib: utils/cache: fix andes_llcache_enable() return valueBen Zong-You Xie
The driver returned 1 on success where callers expect 0, so the suspend to RAM aborted right after disabling the LLC and before flushing it. Fixes: 82b0961821e4 ("lib: utils/cache: add Andes last level cache controller") Signed-off-by: Ben Zong-You Xie <ben717@andestech.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260728081041.2724668-2-ben717@andestech.com Signed-off-by: Anup Patel <anup@brainfault.org>
7 dayslib: sbi: dbtr: add platform device for per-slot trigger capabilitiesDavid E. Garcia Porras
The tinfo probe only discovers trigger types; WARL fields tied off inside an implemented trigger CSR (e.g. an mcontrol6 trigger without load/store address match) are not discoverable. sbi_alloc_trigger() also selects the first free trigger slot irrespective of the requested trigger type or configuration. Unsupported configurations are thus silently dropped by the hardware while SBI reports success, where SBI v3.0 sections 19.4 / 19.5 require SBI_ERR_NOT_SUPPORTED. Add an optional platform device, struct sbi_dbtr_device, with a trigger_supported(idx, tdata1, tdata2, tdata3) callback reporting whether the trigger slot selected by idx (the tselect value) supports a given configuration. Use it, together with the probed per-slot type_mask, to: - allocate only trigger slots supporting the requested configuration (new dbtr_find_free_slot() helper) - reject unsupportable install/update requests with SBI_ERR_NOT_SUPPORTED - count only supporting slots in sbi_dbtr_num_trig() (SBI v3.0 section 19.1) The install path now dry-runs the allocation of the whole batch before programming any trigger, so a partially-installed batch is never left behind. Without a registered device, only the type matching applies (unchanged behavior). Fixes: 97f234f15c96 ("lib: sbi: Introduce the SBI debug triggers extension support") Signed-off-by: David E. Garcia Porras <david.garcia@aheadcomputing.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260727183041.258377-2-david.garcia@aheadcomputing.com Signed-off-by: Anup Patel <anup@brainfault.org>
8 dayslib: sbi: dbtr: return SBI_ERR_INVALID_PARAM for invalid trigger configurationDavid E. Garcia Porras
sbi_dbtr_install_trig() returns the generic SBI_ERR_FAILED when dbtr_trigger_valid() rejects a trigger configuration (dmode or M-mode bits set), where SBI v3.0 section 19.4 defines SBI_ERR_INVALID_PARAM for an invalid trigger configuration entry. Return SBI_ERR_INVALID_PARAM instead. Fixes: 97f234f15c96 ("lib: sbi: Introduce the SBI debug triggers extension support") Signed-off-by: David E. Garcia Porras <david.garcia@aheadcomputing.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260727183041.258377-4-david.garcia@aheadcomputing.com Signed-off-by: Anup Patel <anup@brainfault.org>
8 dayslib: sbi: dbtr: return SBI_ERR_BAD_RANGE for invalid trigger index rangeDavid E. Garcia Porras
sbi_dbtr_read_trig() returns SBI_ERR_INVALID_PARAM for an out-of-range trigger index range, where SBI v3.0 section 19.3 defines SBI_ERR_BAD_RANGE. Return SBI_ERR_BAD_RANGE, matching the equivalent range check in sbi_dbtr_update_trig(). Fixes: 324021423d06 ("lib: sbi: dbtr: Fix update_triggers to match SBI") Signed-off-by: David E. Garcia Porras <david.garcia@aheadcomputing.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260727183041.258377-3-david.garcia@aheadcomputing.com Signed-off-by: Anup Patel <anup@brainfault.org>
8 dayslib: sbi: clamp sbi_ecall_get_extensions_str buffer offsetYudistira Putra
sbi_ecall_get_extensions_str() advanced offset by the nominal extension name length without checking remaining capacity. When the caller buffer was smaller than the concatenated extension list, offset could pass exts_str_size, so (exts_str_size - offset) became negative and was passed to sbi_snprintf() as a large u32, and the trailing NUL write could step past the caller buffer. The helper can write beyond a caller-provided destination when the registered extension list exceeds the supplied capacity. Mirror the guard already used by sbi_hart_get_extensions_str(): stop appending when the next name would not fit. Add an SBIUNIT regression that registers several extensions into a 16-byte buffer with a redzone and verifies no out-of-bounds write. Closes: https://github.com/riscv-software-src/opensbi/issues/416 Signed-off-by: Yudistira Putra <pyudistira519@gmail.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260719101125.190314-1-pyudistira519@gmail.com Signed-off-by: Anup Patel <anup@brainfault.org>
2026-08-20platform: generic: sophgo: Move SG2042 timer memregion workaroundXiang W
Commit 4813a2042096 ("lib: sbi_init: Call hart init and timer init before platform early init") reordered the cold/warm boot sequence so that sbi_timer_init() runs before sbi_platform_early_init(). The SG2042 platform workaround that merges the 16 separate timer regions into a single domain memregion was previously performed in early_init(). After the reordering the MTIMER driver therefore adds the individual regions first, defeating the purpose of the combined region (and wasting PMP entries). Move the addition of the combined memregion into extensions_init(), which is invoked from sbi_hart_init() and consequently still executes before sbi_timer_init(). Signed-off-by: Han Gao <gaohan@iscas.ac.cn> Signed-off-by: Xiang W <wangxiang@iscas.ac.cn> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260721150844.741606-1-wangxiang@iscas.ac.cn Signed-off-by: Anup Patel <anup@brainfault.org>
2026-08-20lib: sbi: Allow platforms to override local TLB operationsXiang W
Some T-Head based processors, for example the Sophgo SG2044, have a JTLB errata that requires special handling of certain TLB maintenance instructions (sfence.vma). Introduce a sbi_tlb_local_operations structure so platforms can provide custom local TLB flush implementations. Use it to implement the JTLB workaround on affected SoCs (currently Sophgo SG2044). Signed-off-by: Xiang W <wangxiang@iscas.ac.cn> Signed-off-by: Han Gao <gaohan@iscas.ac.cn> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260617112925.1144190-2-wangxiang@iscas.ac.cn Signed-off-by: Anup Patel <anup@brainfault.org>
2026-08-20Makefile: Support make -s to silence the buildMichael Ellerman
Add support for silencing the build with make -s, which means nothing is printed unless there is an error. Similar to the way Linux does it. Signed-off-by: Michael Ellerman <mpe@kernel.org> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260622-upstream-v1-1-792e1847e96e@kernel.org Signed-off-by: Anup Patel <anup@brainfault.org>
2026-08-20lib/utils/cppc: Emulate REFERENCE_CTR and DELIVERED_CTR locallySunil V L
Currently, REFERENCE_CTR and DELIVERED_CTR are always read by sending an RPMI message to the controller. This does not scale well since these registers are typically polled frequently by CPU frequency governors. The reference counter can be simply the TIME csr, so it can be read locally without going over RPMI. If the fast channel is supported, the delivered counter can also be emulated locally: the fast channel exposes the current frequency, which is multiplied by the elapsed TIME csr ticks since the last read to calculate the delivered performance counter. Signed-off-by: Sunil V L <sunilvl@oss.qualcomm.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260703050530.2460037-3-sunilvl@oss.qualcomm.com Signed-off-by: Anup Patel <anup@brainfault.org>
2026-08-20lib/sbi/sbi_timer: Add sbi_timer_frequency() functionSunil V L
Drivers and other library code sometimes need the timer frequency outside of lib/sbi/sbi_timer.c, but there is currently no accessor for it. Add sbi_timer_frequency() to expose the frequency of the registered timer device. Signed-off-by: Sunil V L <sunilvl@oss.qualcomm.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260703050530.2460037-2-sunilvl@oss.qualcomm.com Signed-off-by: Anup Patel <anup@brainfault.org>
2026-08-20lib: make SBI_HARTMASK_MAX_BITS customizable, default 256Heinrich Schuchardt
Linux has raised the default number of 64bit CPUs to 256 in commit 0fa749771993 ("riscv: Raise default NR_CPUS for 64BIT to 256"). OpenSBI should use a matching value for SBI_HARTMASK_MAX_BITS. Introduce configuration variable CONFIG_HARTMASK_MAX_BITS with range 32-512 and default 256. Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260706160544.697409-1-heinrich.schuchardt@canonical.com Signed-off-by: Anup Patel <anup@brainfault.org>
2026-08-20lib: utils/mpxy: logging: Use correct enum for enable notificationRanbir Singh
Logging file should be using its own enum and not others. Fixes: 262571217c75 ("lib: utils/mpxy: Add RPMI MPXY driver for logging service group") Signed-off-by: Ranbir Singh <ranbir.singh@oss.qualcomm.com> Reviewed-by: Rahul Pathak <rahul.pathak@oss.qualcomm.com> Link: https://lore.kernel.org/r/20260724080920.1629065-3-ranbir.singh@oss.qualcomm.com Signed-off-by: Anup Patel <anup@brainfault.org>
2026-08-20lib: utils/mpxy: mm: Add missing RPMI_MM_SRV_ENABLE_NOTIFICATION entryRanbir Singh
As RPMI_MM_SRV_ENABLE_NOTIFICATION is a mandatory service for RPMI MM service group, it must be added in its MPXY client driver here. Fixes: 0b041e58c078 ("lib: utils: Add MPXY client driver for RPMI MM service group") Signed-off-by: Ranbir Singh <ranbir.singh@oss.qualcomm.com> Reviewed-by: Rahul Pathak <rahul.pathak@oss.qualcomm.com> Link: https://lore.kernel.org/r/20260724080920.1629065-2-ranbir.singh@oss.qualcomm.com Signed-off-by: Anup Patel <anup@brainfault.org>
2026-08-20lib: utils/reset: Add Metanoia MT2824 system reset driverBenoît Monin
Add a driver for the system reset function found in Metanoia MT2824 SoC and enable it in the generic platform configuration. Originally-by: Jun Chang <jun.chang@metanoia-comm.com> Signed-off-by: Benoît Monin <benoit.monin@bootlin.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260724-mt5824-v3-2-9a7d17d69974@bootlin.com Signed-off-by: Anup Patel <anup@brainfault.org>
2026-08-20platform: generic: Add Metanoia MT2824 initial supportBenoît Monin
Add the Metanoia MT2824 as a generic platform. This SoC contains two AX45MP cores from Andes Technology and uses Andes PMU and vendor-specific extensions. Originally-by: Jun Chang <jun.chang@metanoia-comm.com> Signed-off-by: Benoît Monin <benoit.monin@bootlin.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260724-mt5824-v3-1-9a7d17d69974@bootlin.com Signed-off-by: Anup Patel <anup@brainfault.org>
2026-08-02lib: sbi: Print list of all hart protection mechanisms at boot timeAnup Patel
Instead of printing only the best hart memory protection name at boot time let's print a list of all hart projection mechanisms. Signed-off-by: Anup Patel <anup.patel@oss.qualcomm.com> Reviewed-by: Rahul Pathak <rahul.pathak@oss.qualcomm.com> Link: https://lore.kernel.org/r/20260727042504.1743250-6-anup.patel@oss.qualcomm.com Signed-off-by: Anup Patel <anup@brainfault.org>
2026-08-02lib: sbi: Extend hart protection abstraction to allow ID configurationAnup Patel
There are various ID configuration ISA extensions such as RISC-V Worlds, Supervisor domain ID, QoS ID, etc which need to be re-configured upon domain context switch on a hart. Extend hart protection abstraction to support both memory protection and ID configuration ISA extensions. Signed-off-by: Anup Patel <anup.patel@oss.qualcomm.com> Reviewed-by: Rahul Pathak <rahul.pathak@oss.qualcomm.com> Link: https://lore.kernel.org/r/20260727042504.1743250-5-anup.patel@oss.qualcomm.com Signed-off-by: Anup Patel <anup@brainfault.org>
2026-08-02lib: sbi: Add domain parameter to hart protection (un)configure()Anup Patel
The switch_to_next_domain_context() already has the pointers to current and next domains so pass them as parameters to hart protection configure() and unconfigure() callbacks. Signed-off-by: Anup Patel <anup.patel@oss.qualcomm.com> Reviewed-by: Rahul Pathak <rahul.pathak@oss.qualcomm.com> Link: https://lore.kernel.org/r/20260727042504.1743250-4-anup.patel@oss.qualcomm.com Signed-off-by: Anup Patel <anup@brainfault.org>
2026-08-02lib: sbi: Introduce sbi_hart_protection_reconfigure() functionAnup Patel
Instead of assuming that hart protection reconfiguration is unconfigure followed by configure, introduce a separate sbi_hart_protection_reconfigure() function and use it in switch_to_next_domain_context(). Signed-off-by: Anup Patel <anup.patel@oss.qualcomm.com> Reviewed-by: Rahul Pathak <rahul.pathak@oss.qualcomm.com> Link: https://lore.kernel.org/r/20260727042504.1743250-3-anup.patel@oss.qualcomm.com Signed-off-by: Anup Patel <anup@brainfault.org>
2026-08-02lib: sbi: Fix typos related to hart protectionAnup Patel
The hart protection is incorrectly mentioned as hart isolation at few places in sbi_init.c hence fix these typos. Signed-off-by: Anup Patel <anup.patel@oss.qualcomm.com> Reviewed-by: Rahul Pathak <rahul.pathak@oss.qualcomm.com> Link: https://lore.kernel.org/r/20260727042504.1743250-2-anup.patel@oss.qualcomm.com Signed-off-by: Anup Patel <anup@brainfault.org>
2026-07-22lib: utils/mpxy: bind channel access to owning domainOza Pawandeep
The MPXY framework currently stores registered channels in a global list and exposes them to all callers. However, the intended model is that each channel is assigned to a single supervisor domain at boot and remains owned by that domain for its lifetime. Introduce fixed owner-domain tracking in struct sbi_mpxy_channel and make channel lookup and enumeration domain-aware. A channel is now visible only when accessed from its owning domain. Also require the owner to be set before channel registration. This allows MPXY to support systems where the same hart may be reused by multiple domains while keeping channel ownership and visibility fixed to the domain that owns the service. Signed-off-by: Oza Pawandeep <pawandeep.oza@oss.qualcomm.com> Reviewed-by: Rahul Pathak <rahul.pathak@oss.qualcomm.com> Link: https://lore.kernel.org/r/20260721215758.695736-1-pawandeep.oza@oss.qualcomm.com Signed-off-by: Anup Patel <anup@brainfault.org>
2026-07-22lib: sbi_irqchip: fix MSI EIID gap and tail allocation logic in register_msiPawandeep Oza
Fix sbi_irqchip_register_msi() that prevented contiguous EIID allocation: - Gap check condition was inverted: the original `h->first_hwirq - hwirq < num_hwirq` incorrectly set `found = true` when the gap was too small to fit num_hwirq entries. Correct to `>= num_hwirq` so allocation only proceeds when sufficient space exists between registered handlers. - Tail-space check `!found && !hwirq` never triggered after iteration Replace with `(chip->num_hwirq - hwirq) >= num_hwirq` to correctly allocate if handler list is empty. Fixes: 79e63bc8348d ("irqchip: add sbi_irqchip_register_msi support") Signed-off-by: Oza Pawandeep <pawandeep.oza@oss.qualcomm.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260721214833.687361-7-pawandeep.oza@oss.qualcomm.com Signed-off-by: Anup Patel <anup@brainfault.org>
2026-07-22lib: utils/irqchip/imsic: track IRQ enable state and restore EIE on warm initPawandeep Oza
Add an irq_state field to struct sbi_irqchip_hwirq_data with a single IRQ_ENABLED flag (bit 0) to track whether a hardware interrupt has been enabled via the irqchip framework. Set IRQ_ENABLED in sbi_irqchip_unmask_hwirq() when the unmask callback is invoked. Add sbi_irqchip_get_irq_state() as a private inline accessor and expose sbi_irqchip_is_irq_enabled() as a public API for drivers to query the enabled state of a hardware interrupt by chip pointer and hwirq number. Refactor imsic_local_eix_update() to operate on a single interrupt ID instead of a base+count range, simplifying the CSR bit manipulation to a direct BIT(id) write without the inner loop. Update all call sites accordingly. Use sbi_irqchip_is_irq_enabled() in imsic_warm_irqchip_init() to restore per-EIID EIE CSR state on warm boot and HSM resume based on the saved irq_state, replacing the previous blanket disable of all interrupts. This ensures that EIIDs enabled during hotplug/warminit cycle are correctly re-enabled on the resuming hart without requiring software to re-register or re-unmask each interrupt. Signed-off-by: Oza Pawandeep <pawandeep.oza@oss.qualcomm.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260721214833.687361-6-pawandeep.oza@oss.qualcomm.com Signed-off-by: Anup Patel <anup@brainfault.org>
2026-07-22lib: utils/irqchip/imsic:migrate to irqchip frameworkPawandeep Oza
Rewrite imsic_process_hwirqs() to use container_of() for instance lookup, validate ownership via imsic_current_hart_owner(), mask IMSIC_TOPEI_ID_MASK on the raw CSR value, and dispatch non-IPI EIIDs through sbi_irqchip_process_hwirq() instead of an open-coded switch. Rewrite imsic_warm_irqchip_init() to resolve the imsic_data instance via container_of() from the sbi_irqchip_device pointer, and skip initialization silently for harts not owned by this instance. Extend the sbi_irqchip callback set: - hwirq_setup: registers sbi_irqchip_raw_handler_default for the EIID - hwirq_cleanup: clears EIE and EIP bits for the EIID on the owner hart - hwirq_eoi: no-op as claim/ack is already performed by CSR_MTOPEI read in imsic_process_hwirqs() - hwirq_set_affinity: reprograms the upstream MSI source via imsic_program_msi() to retarget the interrupt to the new hart - hwirq_mask: clears the EIE bit for the EIID on the owner hart - hwirq_unmask: sets the EIE bit for the EIID on the owner hart, skipping IPI (EIID 1) and non-owner harts Add imsic_compose_msi_msg() to compute the MMIO target address for a given hart and EIID by walking the imsic_regs array and applying file and guest index offsets. Add imsic_program_msi() that composes an MSI message and delivers it to the upstream interrupt source via sbi_irqchip_write_msi(), enabling APLIC TARGET register programming from the IMSIC driver. Migrate imsic_cold_irqchip_init() to the instance-based model: preserve any pre-configured target_harts mask set by platform or FDT code before applying the imsic_device template, falling back to sbi_hartmask_set_all() only when no mask was provided. Register the irqchip and reserved EIIDs on the embedded irqchip rather than the global singleton. Signed-off-by: Oza Pawandeep <pawandeep.oza@oss.qualcomm.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260721214833.687361-5-pawandeep.oza@oss.qualcomm.com Signed-off-by: Anup Patel <anup@brainfault.org>
2026-07-22lib: utils/irqchip/imsic: embed sbi_irqchip_device in imsic dataPawandeep Oza
Embed sbi_irqchip_device in struct imsic_data to enable instance-based irqchip registration, replacing the previous global imsic_device singleton. Include sbi_irqchip.h from imsic.h to make the embedded struct visible to consumers. Signed-off-by: Oza Pawandeep <pawandeep.oza@oss.qualcomm.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260721214833.687361-4-pawandeep.oza@oss.qualcomm.com Signed-off-by: Anup Patel <anup@brainfault.org>
2026-07-22lib: utils/irqchip/aplic: add MSI mode support with IMSIC parent linkingPawandeep Oza
Add parent_unique_id fields to struct aplic_data for IMSIC parent linking in MSI mode. Store parent IMSIC unique_id during FDT parsing of the APLIC node. Add aplic_is_msi_mode() complementing aplic_is_direct_mode() to consolidate delivery mode detection. Add APLIC_TARGET_EIID() macro for packing the EIID field into the TARGET register. Add parent_unique_id and parent_irq_map fields to struct aplic_data. parent_unique_id identifies the upstream IMSIC irqchip device resolved via sbi_irqchip_find_device() during hwirq_setup. parent_irq_map is a per-source array allocated at cold init time to track the EIID assigned by the IMSIC for each APLIC source. Restore aplic_writel_msicfg() and re-introduce MSI address register programming in aplic_init(), gated on aplic_is_msi_mode(). Set the DOMAINCFG_DM bit to switch the hardware to MSI delivery mode when no IDC structures are present. Add aplic_program_msi_target() to pack hart_index, guest_index, and EIID into the APLIC_TARGET register. Add aplic_write_msi() as the sbi_irqchip write_msi callback that extracts EIID and hart_index from the MSI message and calls aplic_program_msi_target(). Add aplic_msi_callback() as the MSI receive callback that dispatches to sbi_irqchip_process_hwirq() on the APLIC chip. Extend aplic_hwirq_setup() with an MSI path that resolves the parent IMSIC chip by parent_unique_id, registers an MSI route via sbi_irqchip_register_msi(), and stores the allocated EIID in parent_irq_map for the source being configured. Extend aplic_hwirq_set_affinity() with an MSI path that delegates affinity reprogramming to the parent IMSIC chip via sbi_irqchip_set_affinity() using the stored parent_irq_map entry. Guard warm_init, process_hwirqs, and hwirq_eoi with early returns in MSI mode as interrupt delivery and acknowledgement are handled by the IMSIC in that configuration. Signed-off-by: Oza Pawandeep <pawandeep.oza@oss.qualcomm.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260721214833.687361-3-pawandeep.oza@oss.qualcomm.com Signed-off-by: Anup Patel <anup@brainfault.org>
2026-07-22lib: utils/irqchip/aplic: implement direct mode irqchip callbacksPawandeep Oza
Add inline register accessors (aplic_sourcecfg_write/read, aplic_target_write, aplic_irq_setie/clrie/clrip, aplic_idc_base/ read/write) to consolidate all MMIO access behind typed helpers and eliminate open-coded address arithmetic throughout the driver. Add field-packing macros APLIC_TARGET_HART_IDX, APLIC_TARGET_IPRIO, and APLIC_TARGET_GUEST_IDX for constructing APLIC_TARGET register values. Add aplic_is_direct_mode() mode helper, aplic_hwirq_flags_to_sourcecfg() to map generic hwirq flags to APLIC source modes, aplic_hwirq_is_delegated() to detect S-mode delegated sources, aplic_find_idc_index() to map a hart index to its IDC slot, and aplic_first_target_hart() to select the first available IDC hart for initial interrupt targeting. Implement the full sbi_irqchip callback set for direct (IDC) mode: - warm_init: enables IDC interrupt delivery and threshold per hart - process_hwirqs: reads TOPI and dispatches via sbi_irqchip_process_hwirq, skipping delegated sources - hwirq_setup: programs sourcecfg from hwirq_flags and sets the TARGET register to the first available IDC hart - hwirq_cleanup: clears IE, IP, sourcecfg, and TARGET on teardown - hwirq_eoi: reads CLAIMI to acknowledge the interrupt on the IDC - hwirq_set_affinity: reprograms TARGET to the specified hart index - hwirq_mask/unmask: clears/sets IE via CLRIENUM/SETIENUM Register the irqchip device and populate target_harts from idc_map only when targets_mmode is set in aplic_cold_irqchip_init(). Co-developed-by: Raymond Mao <raymond.mao@riscstar.com> Signed-off-by Raymond Mao <raymond.mao@riscstar.com> Signed-off-by: Oza Pawandeep <pawandeep.oza@oss.qualcomm.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260721214833.687361-2-pawandeep.oza@oss.qualcomm.com Signed-off-by: Anup Patel <anup@brainfault.org>
2026-07-21lib: sbi: Move trap delegation setup to sbi_trap.cAnup Patel
Currently, the trap delegation setup is part of sbi_hart.c and called via sbi_hart_init() whereas the per-hart trap (aka exception and interrupt) handling is part of sbi_trap.c. Move trap delegation init to sbi_trap.c and call it via new sbi_trap_init() from both cold boot and warm boot path. This way trap delegation setup is in same place as trap handling. Signed-off-by: Anup Patel <anup.patel@oss.qualcomm.com> Link: https://lore.kernel.org/r/20260613132129.2135128-2-anup.patel@oss.qualcomm.com Signed-off-by: Anup Patel <anup@brainfault.org>
2026-07-21lib: sbi_ipi: Validate hartids against domain, not HSM stateChen Pei
Commit 37eaca4ab33d ("lib: sbi_ipi: Return error for invalid hartids") added a weight check against the HSM-interruptible mask, which excludes harts in STOPPED state. This causes sbi_ipi_send_many() to return SBI_EINVAL when the kernel sends a remote fence (e.g. TLB shootdown) whose hmask includes a hart that was stopped by CPU hotplug: __sbi_rfence_v02_call: hbase = [0] hmask = [0x3] failed (error [-22]) Validate requested hartids against the domain's assigned hartmask instead. This still rejects truly invalid or cross-domain hartids, but allows HSM-STOPPED harts to be silently skipped — which is safe because a stopped hart will do a full local TLB flush on its next HSM start before re-entering S-mode. Fixes: 37eaca4ab33d ("lib: sbi_ipi: Return error for invalid hartids") Signed-off-by: Chen Pei <cp0613@linux.alibaba.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260612115208.118132-1-cp0613@linux.alibaba.com Signed-off-by: Anup Patel <anup@brainfault.org>
2026-07-16lib: sbi_irqchip: fix device lookup by caps when first is NULLDavid E. Garcia Porras
When called with first == NULL, sbi_irqchip_find_device_by_caps() should scan the device list from the start. Instead it always returns NULL: "found" starts false and only flips true when an entry equals "first", but no entry ever equals NULL, so every entry hits "else continue" and nothing is checked. This breaks MSI detection in sbi_mpxy, which calls it with first == NULL: ms->msi_avail = !!sbi_irqchip_find_device_by_caps(SBI_IRQCHIP_CAPS_MSI, NULL); msi_avail is therefore always false, so mpxy_write_std_attr() silently drops the MSI attributes (MSI_ADDR_LO/HI, MSI_DATA, MSI_CONTROL) while still returning success, and MSI-based MPXY notifications are never delivered. Initialize "found" from "first" so a NULL "first" scans from the beginning, and always continue in the pre-match branch so a non-NULL "first" resumes after the given device. Fixes: 8570b938444d ("lib: sbi_irqchip: Allow irqchip drivers advertise capabilities") Signed-off-by: David E. Garcia Porras <david.garcia@aheadcomputing.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260701181334.969877-1-david.garcia@aheadcomputing.com Signed-off-by: Anup Patel <anup@brainfault.org>
2026-07-01lib: utils/mpxy: Add RPMI MPXY driver for logging service groupSubrahmanya Lingappa
Add RPMI MPXY proxy driver for LOGGING service group so that S-mode can leverage LOGGING service group implemented by the platform microcontroller. Reviewed-by: Rahul Pathak <rahul.pathak@oss.qualcomm.com> Signed-off-by: Subrahmanya Lingappa <subrahmanya.lingappa@oss.qualcomm.com> Link: https://lore.kernel.org/r/20260619103424.990954-1-subrahmanya.lingappa@oss.qualcomm.com Signed-off-by: Anup Patel <anup@brainfault.org>
2026-06-30include: Bump-up version to 1.9v1.9Anup Patel
Update the OpenSBI version to 1.9 as part of release preparation. Signed-off-by: Anup Patel <anup@brainfault.org>
2026-06-28firmware: Fix comment after relocation completionZong Li
After relocation is done, the code is running from the load address, not the link address. Fix the comment to correctly reflect this. Signed-off-by: Zong Li <zong.li@sifive.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260626022121.1885209-1-zong.li@sifive.com Signed-off-by: Anup Patel <anup@brainfault.org>
2026-06-28lib: sbi_pmu: fix integer overflow in pmu_ctr_idx_validateliutong
pmu_ctr_idx_validate() checks whether counter indices are in range using cbase + sbi_fls(cmask) < total_ctrs. Both operands are unsigned long, so a crafted cbase close to ULONG_MAX causes the addition to wrap around to a small value that passes the comparison. Once validation is bypassed, sbi_pmu_ctr_cfg_match() with the SKIP_MATCH flag uses the overflowed index directly as an array subscript into phs->active_events[], producing an out-of-bounds read in M-mode. Through the firmware-event code path, the same overflowed index reaches fw_counters_data[] and fw_counters_started, giving an attacker OOB write-zero and OOB bit-set primitives in M-mode memory. Fix pmu_ctr_idx_validate() by checking for unsigned overflow before the comparison, and add a secondary bounds check on cidx_first in the SKIP_MATCH path so that even if validation is somehow bypassed in the future, the array access remains bounded. Signed-off-by: liutong <liutong@iscas.ac.cn> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260624035049.1753003-1-liutong@iscas.ac.cn Signed-off-by: Anup Patel <anup@brainfault.org>