platform/kernel/opensbi.git
17 months agolib: utils: Mark only the largest region as reserved in FDT
Himanshu Chauhan [Fri, 27 Jan 2023 04:19:23 +0000 (09:49 +0530)]
lib: utils: Mark only the largest region as reserved in FDT

In commit 230278dcf, RX and RW regions were marked separately.
When the RW region grows (e.g. with more harts) and it isn't a
power-of-two, sbi_domain_memregion_init will upgrade the region
to the next power-of-two. This will make RX and RW both start
at the same base address, like so (with 64 harts):
Domain0 Region01 : 0x0000000080000000-0x000000008001ffff M: (R,X) S/U: ()
Domain0 Region02 : 0x0000000080000000-0x00000000800fffff M: (R,W) S/U: ()

This doesn't break the permission enforcement because of static
priorities in PMP but makes the kernel complain about the regions
overlapping each other. Like so:
[    0.000000] OF: reserved mem: OVERLAP DETECTED!
[    0.000000] mmode_resv0@80000000 (0x0000000080000000--0x0000000080020000) \
overlaps with mmode_resv1@80000000 (0x0000000080000000--0x0000000080100000)

To fix this warning, among the multiple regions having same base
address but different sizes, add only the largest region as reserved
region during fdt fixup.

Fixes: 230278dcf (lib: sbi: Add separate entries for firmware RX and RW regions)
Signed-off-by: Himanshu Chauhan <hchauhan@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
17 months agolib: sbi_hsm: Use csr_set to restore the MIP
Nick Hu [Tue, 17 Jan 2023 08:14:28 +0000 (16:14 +0800)]
lib: sbi_hsm: Use csr_set to restore the MIP

If we use the csr_write to restore the MIP, we may clear the SEIP.
In generic behavior of QEMU, if the pending bits of PLIC are set and we
clear the SEIP, the QEMU may not set it back immediately. It may cause
the interrupts won't be handled anymore until the new interrupts arrived
and QEMU set the bits back.

Signed-off-by: Nick Hu <nick.hu@sifive.com>
Signed-off-by: Jim Shu <jim.shu@sifive.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
17 months agofirmware: Not to clear all the MIP
Nick Hu [Tue, 17 Jan 2023 08:14:27 +0000 (16:14 +0800)]
firmware: Not to clear all the MIP

In generic behavior of QEMU, if the pending bits of PLIC are still set and
we clear the SEIP, the QEMU may not set the SEIP back immediately and the
interrupt may not be handled anymore until the new interrupts arrived and
QEMU set the SEIP back which is a generic behavior in QEMU.

Signed-off-by: Nick Hu <nick.hu@sifive.com>
Signed-off-by: Jim Shu <jim.shu@sifive.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
17 months agofirmware: Fix fw_rw_offset computation in fw_base.S
Jessica Clarke [Thu, 26 Jan 2023 15:40:03 +0000 (21:10 +0530)]
firmware: Fix fw_rw_offset computation in fw_base.S

It seems BFD just does totally nonsensical things for SHN_ABS symbols
when producing position-independent outputs (both -pie and -shared)
for various historical reasons, and so SHN_ABS symbols are still
subject to relocation as far as BFD is concerned (except AArch64,
which fixes it in limited cases that don’t apply here...).

The above affects the _fw_rw_offset provided through fw_base.ldS
linker script which results in OpenSBI firmware failing to boot
when loaded at an address different from FW_TEXT_START.

Fixes: c10e3fe5f9a1 ("firmware: Add RW section offset in scratch")
Signed-off-by: Jessica Clarke <jrtc27@jrtc27.com>
Reported-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Tested-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Tested-by: Anup Patel <apatel@ventanamicro.com>
Signed-off-by: Anup Patel <apatel@ventanamicro.com>
17 months agoplatform: generic: allwinner: Advertise nonretentive suspend
Samuel Holland [Mon, 23 Jan 2023 06:32:07 +0000 (00:32 -0600)]
platform: generic: allwinner: Advertise nonretentive suspend

Add D1's nonretentive suspend state to the devicetree so S-mode software
knows about it and can use it.

Latency and power measurements were taken on an Allwinner Nezha board:
 - Entry latency was measured from the beginning of sbi_ecall_handler()
   to before the call to wfi() in sun20i_d1_hart_suspend().
 - Exit latency was measured from the beginning of sbi_init() to before
   the call to sbi_hart_switch_mode() in init_warmboot().
 - There was a 17.5 mW benefit from non-retentive suspend compared to
   WFI, with a 170 mW cost during the 107 us entry/exit period. This
   provides a break-even point around 1040 us. Residency includes entry
   latency, so round this up to 1100 us.
 - The hardware power sequence latency (after the WFI) is assumed to be
   negligible, so set the wakeup latency to the exit latency.

Reviewed-by: Anup Patel <anup@brainfault.org>
Signed-off-by: Samuel Holland <samuel@sholland.org>
17 months agolib: utils: Add fdt_add_cpu_idle_states() helper function
Samuel Holland [Mon, 23 Jan 2023 06:32:06 +0000 (00:32 -0600)]
lib: utils: Add fdt_add_cpu_idle_states() helper function

Since the availability and latency properties of CPU idle states depend
on the specific SBI HSM implementation, it is appropriate that the idle
states are added to the devicetree at runtime by that implementation.

This helper function adds a platform-provided array of idle states to
the devicetree, following the SBI idle state binding.

Reviewed-by: Anup Patel <anup@brainfault.org>
Signed-off-by: Samuel Holland <samuel@sholland.org>
18 months agoplatform: renesas/rzfive: Configure Local memory regions as part of root domain
Lad Prabhakar [Fri, 13 Jan 2023 16:47:19 +0000 (16:47 +0000)]
platform: renesas/rzfive: Configure Local memory regions as part of root domain

Renesas RZ/Five RISC-V SoC has Instruction local memory and Data local
memory (ILM & DLM) mapped between region 0x30000 - 0x4FFFF. When a
virtual address falls within this range, the MMU doesn't trigger a page
fault; it assumes the virtual address is a physical address which can
cause undesired behaviours for statically linked applications/libraries.

To avoid this, add the ILM/DLM memory regions to the root domain region
of the PMPU with permissions set to 0x0 for S/U modes so that any access
to these regions gets blocked and for M-mode we grant full access (R/W/X).

Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
18 months agolib: sbi: Add separate entries for firmware RX and RW regions
Himanshu Chauhan [Thu, 19 Jan 2023 15:18:26 +0000 (20:48 +0530)]
lib: sbi: Add separate entries for firmware RX and RW regions

Add two entries for firmware in the root domain:

1. TEXT: fw_start to _fw_rw_offset with RX permissions
2. DATA: _fw_rw_offset to fw_size with RW permissions

These permissions are still not enforced from M-mode but lay
the ground work for enforcing them for M-mode. SU-mode don't
have any access to these regions.

Sample output:
 Domain0 Region01  : 0x0000000080000000-0x000000008001ffff M: (R,X) S/U: ()
 Domain0 Region02  : 0x0000000080020000-0x000000008003ffff M: (R,W) S/U: ()

Signed-off-by: Himanshu Chauhan <hchauhan@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
18 months agolib: sbi: Print the RW section offset
Himanshu Chauhan [Thu, 19 Jan 2023 15:18:25 +0000 (20:48 +0530)]
lib: sbi: Print the RW section offset

Print the RW section offset when firmware base and size is
being printed.

Signed-off-by: Himanshu Chauhan <hchauhan@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
18 months agofirmware: Add RW section offset in scratch
Himanshu Chauhan [Thu, 19 Jan 2023 15:18:24 +0000 (20:48 +0530)]
firmware: Add RW section offset in scratch

Add the RW section offset, provided by _fw_rw_offset symbol,
to the scratch structure. This will be used to program
separate pmp entry for RW section.

Signed-off-by: Himanshu Chauhan <hchauhan@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
18 months agofirmware: Move dynsym and reladyn sections to RX section
Himanshu Chauhan [Thu, 19 Jan 2023 15:18:23 +0000 (20:48 +0530)]
firmware: Move dynsym and reladyn sections to RX section

Currently, the dynsym and reladyn sections are under RW data.
They are moved to the Read-only/Executable region.

Signed-off-by: Himanshu Chauhan <hchauhan@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
18 months agofirmware: Split RO/RX and RW sections
Himanshu Chauhan [Thu, 19 Jan 2023 15:18:22 +0000 (20:48 +0530)]
firmware: Split RO/RX and RW sections

Split the RO/RX and RW sections so that they can have
independent pmp entries with required permissions. The
split size is ensured to be a power-of-2 as required by
pmp.

_fw_rw_offset symbol marks the beginning of the data
section.

Signed-off-by: Himanshu Chauhan <hchauhan@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
18 months agolib: utils: Fix reserved memory node for firmware memory
Mayuresh Chitale [Sat, 21 Jan 2023 06:45:59 +0000 (12:15 +0530)]
lib: utils: Fix reserved memory node for firmware memory

The commit 9e0ba090 introduced more fine grained permissions for memory
regions and did not update the fdt_reserved_memory_fixup() function. As
a result, the fdt_reserved_memory_fixup continued to use the older coarse
permissions which causes the reserved memory node to be not inserted
into the DT.

To fix the above issue, we correct the flags used for memory region
permission checks in the fdt_reserved_memory_fixup() function.

Fixes: 9e0ba090 ("include: sbi: Fine grain the permissions for M and SU modes")
Signed-off-by: Mayuresh Chitale <mchitale@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
18 months agolib: reset/fdt_reset_atcwdt200: Use defined macros and function in atcsmu.h
Yu Chien Peter Lin [Fri, 20 Jan 2023 03:05:12 +0000 (11:05 +0800)]
lib: reset/fdt_reset_atcwdt200: Use defined macros and function in atcsmu.h

Reuse the smu related macros and function in atcsmu.h.

Signed-off-by: Yu Chien Peter Lin <peterlin@andestech.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
18 months agoplatform: andes/ae350: Implement hart hotplug using HSM extension
Yu Chien Peter Lin [Fri, 20 Jan 2023 03:05:11 +0000 (11:05 +0800)]
platform: andes/ae350: Implement hart hotplug using HSM extension

Add hart_start() and hart_stop() callbacks for the multi-core ae350
platform, it utilizes the ATCSMU to put the harts into power-gated
deep sleep mode. The programming sequence is stated as below:

1. Set the wakeup events to PCSm_WE
2. Set the sleep command to PCSm_CTL
3. Set the reset vector to HARTm_RESET_VECTOR_{LO|HI}
4. Write back and invalidate D-cache by executing the CCTL command L1D_WBINVAL_ALL
5. Disable I/D-cache by clearing mcache_ctl.{I|D}C_EN
6. Disable D-cache coherency by clearing mcache_ctl_.DC_COHEN
7. Wait for mcache_ctl.DC_COHSTA to be cleared to ensure the previous step is completed
8. Execute WFI

Signed-off-by: Yu Chien Peter Lin <peterlin@andestech.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
18 months agolib: utils: atcsmu: Add Andes System Management Unit support
Yu Chien Peter Lin [Fri, 20 Jan 2023 03:05:10 +0000 (11:05 +0800)]
lib: utils: atcsmu: Add Andes System Management Unit support

This patch adds atcsmu support for Andes AE350 platforms. The SMU
provides system management capabilities, including clock, reset
and power control based on power domain partitions.

Signed-off-by: Yu Chien Peter Lin <peterlin@andestech.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
18 months agoinclude: types: add always inline compiler attribute
Yu Chien Peter Lin [Fri, 20 Jan 2023 03:05:09 +0000 (11:05 +0800)]
include: types: add always inline compiler attribute

Provide __always_inline to sbi_types header.

Signed-off-by: Yu Chien Peter Lin <peterlin@andestech.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
18 months agolib: sbi_hsm: handle failure when hart_stop returns SBI_ENOTSUPP
Yu Chien Peter Lin [Fri, 20 Jan 2023 03:05:08 +0000 (11:05 +0800)]
lib: sbi_hsm: handle failure when hart_stop returns SBI_ENOTSUPP

Make use of generic warm-boot path when platform hart_stop callback
returns SBI_ENOTSUPP, in case certain hart can not turn off its
power domain, or it detects some error occured in power management
unit, it can fall through warm-boot flow and wait for interrupt in
sbi_hsm_hart_wait().

Also improves comment in sbi_hsm_hart_wait().

Signed-off-by: Yu Chien Peter Lin <peterlin@andestech.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Atish Patra <atishp@rivosinc.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
18 months agodocs: generic.md: fix typo of andes-ae350
Yu Chien Peter Lin [Fri, 20 Jan 2023 03:05:07 +0000 (11:05 +0800)]
docs: generic.md: fix typo of andes-ae350

Fix hyperlink due to the typo.

Signed-off-by: Yu Chien Peter Lin <peterlin@andestech.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
18 months agoplatform: generic: allwinner: Fix PLIC array bounds
Samuel Holland [Tue, 27 Dec 2022 18:44:44 +0000 (12:44 -0600)]
platform: generic: allwinner: Fix PLIC array bounds

The two referenced commits passed incorrect bounds to the PLIC save/
restore functions, causing out-of-bounds memory access. The functions
expect "num" to be the 1-based number of interrupt sources, equivalent
to the "riscv,ndev" devicetree property. Thus, "num" must be strictly
smaller than the 0-based size of the array storing the register values.

However, the referenced commits incorrectly passed in the unmodified
size of the array as "num". Fix this by reducing PLIC_SOURCES (matching
"riscv,ndev" on this platform), while keeping the same array sizes.

Addresses-Coverity-ID: 1530251 ("Out-of-bounds access")
Addresses-Coverity-ID: 1530252 ("Out-of-bounds access")
Fixes: 8509e46ca63a ("lib: utils/irqchip: plic: Ensure no out-of-bound access in priority save/restore helpers")
Fixes: 9a2eeb4aaeac ("lib: utils/irqchip: plic: Ensure no out-of-bound access in context save/restore helpers")
Signed-off-by: Samuel Holland <samuel@sholland.org>
Reviewed-by: Anup Patel <anup@brainfault.org>
18 months agodocs: Update domain's region permissions and requirements
Himanshu Chauhan [Mon, 9 Jan 2023 05:20:43 +0000 (05:20 +0000)]
docs: Update domain's region permissions and requirements

Updated the various permissions bits available for domains
defined in DT node and restrictions on them.

Signed-off-by: Himanshu Chauhan <hchauhan@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
Tested-by: Anup Patel <anup@brainfault.org>
18 months agolib: utils: Add M-mode {R/W} flags to the MMIO regions
Himanshu Chauhan [Mon, 9 Jan 2023 05:20:42 +0000 (05:20 +0000)]
lib: utils: Add M-mode {R/W} flags to the MMIO regions

Add the M-mode readable/writable flags to mmio regions
of various drivers.

Signed-off-by: Himanshu Chauhan <hchauhan@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
Tested-by: Anup Patel <anup@brainfault.org>
18 months agolib: utils: Disallow non-root domains from adding M-mode regions
Himanshu Chauhan [Mon, 9 Jan 2023 05:20:41 +0000 (05:20 +0000)]
lib: utils: Disallow non-root domains from adding M-mode regions

The M-mode regions can only be added to the root domain. The non-root
domains shouldn't be able to add them from FDT.

Signed-off-by: Himanshu Chauhan <hchauhan@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
Tested-by: Anup Patel <anup@brainfault.org>
18 months agolib: utils: Use SU-{R/W/X} flags for region permissions during parsing
Himanshu Chauhan [Mon, 9 Jan 2023 05:20:40 +0000 (05:20 +0000)]
lib: utils: Use SU-{R/W/X} flags for region permissions during parsing

Use the newer SU-{R/W/X} flags for checking and assigning region
permissions.

Signed-off-by: Himanshu Chauhan <hchauhan@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
Tested-by: Anup Patel <anup@brainfault.org>
18 months agolib: sbi: Modify the boot time region flag prints
Himanshu Chauhan [Mon, 9 Jan 2023 05:20:39 +0000 (05:20 +0000)]
lib: sbi: Modify the boot time region flag prints

With the finer permission semantics, the region access
permissions must be displayed separately for M and SU mode.

Signed-off-by: Himanshu Chauhan <hchauhan@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
Tested-by: Anup Patel <anup@brainfault.org>
18 months agolib: sbi: Use finer permission sematics to decide on PMP bits
Himanshu Chauhan [Mon, 9 Jan 2023 05:20:38 +0000 (05:20 +0000)]
lib: sbi: Use finer permission sematics to decide on PMP bits

Use the fine grained permission bits to decide if the region
permissions are to be enforced on all modes. Also use the new
permission bits for deciding on R/W/X bits in pmpcfg register.

Signed-off-by: Himanshu Chauhan <hchauhan@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
Tested-by: Anup Patel <anup@brainfault.org>
18 months agolib: sbi: Add permissions for the firmware start till end
Himanshu Chauhan [Mon, 9 Jan 2023 05:20:37 +0000 (05:20 +0000)]
lib: sbi: Add permissions for the firmware start till end

Change the zero flag to M-mode R/W/X flag for the firmware
region.

Signed-off-by: Himanshu Chauhan <hchauhan@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
Tested-by: Anup Patel <anup@brainfault.org>
18 months agolib: sbi: Use finer permission semantics for address validation
Himanshu Chauhan [Mon, 9 Jan 2023 05:20:36 +0000 (05:20 +0000)]
lib: sbi: Use finer permission semantics for address validation

Use the fine grained permisssion semantics for address validation
of a given region.

Signed-off-by: Himanshu Chauhan <hchauhan@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
Tested-by: Anup Patel <anup@brainfault.org>
18 months agoinclude: sbi: Fine grain the permissions for M and SU modes
Himanshu Chauhan [Mon, 9 Jan 2023 05:20:35 +0000 (05:20 +0000)]
include: sbi: Fine grain the permissions for M and SU modes

Split the permissions for M-mode and SU-mode. This would
help if different sections of OpenSBI need to be given
different permissions and if M-mode has different permisssions
than the SU-mode over a region.

Signed-off-by: Himanshu Chauhan <hchauhan@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
Tested-by: Anup Patel <anup@brainfault.org>
18 months agodocs: domain_support: Use capital letter for privilege modes
Bin Meng [Fri, 30 Dec 2022 05:07:51 +0000 (13:07 +0800)]
docs: domain_support: Use capital letter for privilege modes

The RISC-V convention for the privilege mode is capital letter, like
'M-mode', instead of 'm-mode'.

Signed-off-by: Bin Meng <bmeng@tinylab.org>
Reviewed-by: Atish Patra <atishp@rivosinc.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
18 months agolib: sbi_hsm: Rename 'priv' argument to 'arg1'
Bin Meng [Fri, 30 Dec 2022 05:07:23 +0000 (13:07 +0800)]
lib: sbi_hsm: Rename 'priv' argument to 'arg1'

'priv' argument of sbi_hsm_hart_start() and sbi_hsm_hart_suspend()
may mislead people to think it stands for 'privilege mode', but it
is not. Change it to 'arg1' to clearly indicate the a1 register.

Signed-off-by: Bin Meng <bmeng@tinylab.org>
Reviewed-by: Samuel Holland <samuel@sholland.org>
Tested-by: Samuel Holland <samuel@sholland.org>
Reviewed-by: Atish Patra <atishp@rivosinc.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
18 months agogeneric/starfive: Add Starfive JH7110 platform implementation
Wei Liang Lim [Thu, 29 Dec 2022 02:56:18 +0000 (10:56 +0800)]
generic/starfive: Add Starfive JH7110 platform implementation

Add Starfive JH7110 platform implementation

Signed-off-by: Wei Liang Lim <weiliang.lim@starfivetech.com>
Reviewed-by: Chee Hong Ang <cheehong.ang@starfivetech.com>
Reviewed-by: Jun Liang Tan <junliang.tan@starfivetech.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
18 months agoplatform: generic: Allow platform_override to perform firmware init
Wei Liang Lim [Thu, 29 Dec 2022 02:56:17 +0000 (10:56 +0800)]
platform: generic: Allow platform_override to perform firmware init

We add a generic platform override callback to allow platform specific firmware init.

Signed-off-by: Wei Liang Lim <weiliang.lim@starfivetech.com>
Reviewed-by: Chee Hong Ang <cheehong.ang@starfivetech.com>
Reviewed-by: Jun Liang Tan <junliang.tan@starfivetech.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
18 months agoplatform: generic: Allow platform_override to select cold boot HART
Anup Patel [Thu, 29 Dec 2022 02:56:16 +0000 (10:56 +0800)]
platform: generic: Allow platform_override to select cold boot HART

We add a generic platform override callback to allow platform specific
selection of cold boot HART.

Signed-off-by: Anup Patel <apatel@ventanamicro.com>
18 months agolib: sbi: Allow platform to influence cold boot HART selection
Anup Patel [Thu, 29 Dec 2022 02:56:15 +0000 (10:56 +0800)]
lib: sbi: Allow platform to influence cold boot HART selection

We add an optional cold_boot_allowed() platform callback which allows
platform support to decide which HARTs can do cold boot initialization.

If this platform callback is not available then any HART can do cold
boot initialization.

Signed-off-by: Anup Patel <apatel@ventanamicro.com>
18 months agolib: utils/sys: Allow custom HTIF base address for RV32
Bin Meng [Mon, 26 Dec 2022 03:36:03 +0000 (11:36 +0800)]
lib: utils/sys: Allow custom HTIF base address for RV32

commit 6dde43584f18 ("lib: utils/sys: Extend HTIF library to allow custom base address")
forgot to update do_tohost_fromhost() codes for RV32, which still
accesses the HTIF registers using the ELF symbol address directly.

Fixes: 6dde43584f18 ("lib: utils/sys: Extend HTIF library to allow custom base address")
Signed-off-by: Bin Meng <bmeng@tinylab.org>
Tested-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
18 months agoMakefile: Remove -N ldflag to prevent linker RWX warning
Rahul Pathak [Sun, 25 Dec 2022 03:22:11 +0000 (08:52 +0530)]
Makefile: Remove -N ldflag to prevent linker RWX warning

-N option coalesce all sections into single LOAD segment which causes
data and other sections to have executable permission causing warning
with new binutils ld 2.39.
New ld emits warning when any segment have all three permissions RWX.

ld.bfd: warning: test.elf has a LOAD segment with RWX permissions
ld.bfd: warning: fw_dynamic.elf has a LOAD segment with RWX permissions
ld.bfd: warning: fw_jump.elf has a LOAD segment with RWX permissions
ld.bfd: warning: fw_payload.elf has a LOAD segment with RWX permissions

This option was added in below commit -
commit: eeab92f2423e ("Makefile: Convert to a more standard format")

Removing -N option allows to have text and rodata into one LOAD
segment and other sections into separate LOAD segment which prevents
RWX permissions on single LOAD segment. Here X == E

Current
 LOAD           0x0000000000000120 0x0000000080000000 0x0000000080000000
                 0x000000000001d4d0 0x0000000000032ed8  RWE    0x10

-N removed
  LOAD           0x0000000000001000 0x0000000080000000 0x0000000080000000
                 0x00000000000198cc 0x00000000000198cc  R E    0x1000
  LOAD           0x000000000001b000 0x000000008001a000 0x000000008001a000
                 0x00000000000034d0 0x0000000000018ed8  RW     0x1000

Signed-off-by: Rahul Pathak <rpathak@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
Tested-by: Samuel Holland <samuel@sholland.org>
18 months agotreewide: Replace TRUE/FALSE with true/false
Bin Meng [Wed, 21 Dec 2022 11:38:06 +0000 (19:38 +0800)]
treewide: Replace TRUE/FALSE with true/false

C language standard uses true/false for the boolean type.
Let's switch to that for better language compatibility.

Signed-off-by: Bin Meng <bmeng@tinylab.org>
Reviewed-by: Anup Patel <anup@brainfault.org>
Reviewed-by: Samuel Holland <samuel@sholland.org>
Tested-by: Samuel Holland <samuel@sholland.org>
19 months agoinclude: Bump-up version to 1.2 v1.2
Anup Patel [Sat, 24 Dec 2022 06:06:49 +0000 (11:36 +0530)]
include: Bump-up version to 1.2

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

Signed-off-by: Anup Patel <apatel@ventanamicro.com>
19 months agodocs: pmu: Update the pmu doc with removal of mcountinhbit restriction
Atish Patra [Thu, 22 Dec 2022 20:38:50 +0000 (12:38 -0800)]
docs: pmu: Update the pmu doc with removal of mcountinhbit restriction

Since commit b28f070, it is possible for platforms to run perf monitoring
even if mcountinhibit is not supported. Sampling still won't be possible
though as it requires sscofpmf extension.

Update the docs to remove the restriction.

Signed-off-by: Atish Patra <atishp@rivosinc.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
19 months agodocs: pmu: update a reference to a deprecated property name
Conor Dooley [Thu, 22 Dec 2022 19:39:14 +0000 (19:39 +0000)]
docs: pmu: update a reference to a deprecated property name

event-to-mhpmevent was deprecated and replaced by
riscv,event-to-mhpmevent, but a reference remains to the old name.
Replace it with the new one.

Signed-off-by: Conor Dooley <conor.dooley@microchip.com>
Reviewed-by: Atish Patra <atishp@rivosinc.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
19 months agodocs: pmu: fix binding example
Conor Dooley [Wed, 21 Dec 2022 13:59:40 +0000 (13:59 +0000)]
docs: pmu: fix binding example

The first PMU binding example does not terminate properties with a ;,
which is invalid. Noticed while converting the binding to yaml.

Signed-off-by: Conor Dooley <conor.dooley@microchip.com>
Reviewed-by: Bin Meng <bmeng@tinylab.org>
Reviewed-by: Anup Patel <anup@brainfault.org>
19 months agolib: utils/timer: mtimer: add T-Head C9xx CLINT compatible
Icenowy Zheng [Mon, 12 Dec 2022 08:22:38 +0000 (16:22 +0800)]
lib: utils/timer: mtimer: add T-Head C9xx CLINT compatible

As we already added the quirk for lacking mtime register to MTIMER
driver, add T-Head C9xx CLINT compatible to it and wire the quirk.

Signed-off-by: Icenowy Zheng <uwu@icenowy.me>
Reviewed-by: Anup Patel <anup@brainfault.org>
19 months agolib: utils/timer: mtimer: add a quirk for lacking mtime register
Icenowy Zheng [Mon, 12 Dec 2022 08:22:37 +0000 (16:22 +0800)]
lib: utils/timer: mtimer: add a quirk for lacking mtime register

T-Head developers surely have a different understanding of time CSR and
CLINT's mtime register with SiFive ones, that they did not implement
the mtime register at all -- as shown in openC906 source code, their
time CSR value is just exposed at the top of their processor IP block
and expects an external continous counter, which makes it not
overrideable, and thus mtime register is not implemented, even not for
reading. However, if CLINTEE is not enabled in T-Head's MXSTATUS
extended CSR, these systems still rely on the mtimecmp registers to
generate timer interrupts. This makes it necessary to implement T-Head
C9xx CLINT support in OpenSBI MTIMER driver, which skips implementing
reading mtime register and falls back to default code that reads time
CSR.

Add a quirk into MTIMER driver, which represents a mtime register is
lacking and time CSR value should be used instead.

Signed-off-by: Icenowy Zheng <uwu@icenowy.me>
Reviewed-by: Anup Patel <anup@brainfault.org>
19 months agolib: utils/ipi: mswi: add T-Head C9xx CLINT compatible
Icenowy Zheng [Mon, 12 Dec 2022 08:22:36 +0000 (16:22 +0800)]
lib: utils/ipi: mswi: add T-Head C9xx CLINT compatible

Althoug the MTIMER part of a C9xx CLINT differs from a SiFive one, the
MSWI part is compliant.

Add T-Head C9xx CLINT compatible string to fdt_ipi_mswi code, sharing
the same codepath with SiFive CLINT.

Signed-off-by: Icenowy Zheng <uwu@icenowy.me>
Reviewed-by: Anup Patel <anup@brainfault.org>
19 months agolib: utils/irqchip: plic: Ensure no out-of-bound access in context save/restore helpers
Bin Meng [Sun, 11 Dec 2022 06:54:24 +0000 (14:54 +0800)]
lib: utils/irqchip: plic: Ensure no out-of-bound access in context save/restore helpers

Currently the context save/restore helpers writes/reads the provided
array using an index whose maximum value is determined by PLIC, which
potentially may disagree with the caller to these helpers.

Add a parameter to ask the caller to provide the size limit of the
array to ensure no out-of-bound access happens.

Signed-off-by: Bin Meng <bmeng@tinylab.org>
Reviewed-by: Anup Patel <anup@brainfault.org>
19 months agolib: utils/irqchip: plic: Fix the off-by-one error in context save/restore helpers
Bin Meng [Sun, 11 Dec 2022 06:54:23 +0000 (14:54 +0800)]
lib: utils/irqchip: plic: Fix the off-by-one error in context save/restore helpers

plic->num_src holds the number of interrupt sources without interrupt
source 0 but the interrupt enable register includes a bit for the
interrupt source 0 in the first word.

Fixes: 415ecf28f7ad ("lib: irqchip/plic: Add context save/restore helpers")
Signed-off-by: Bin Meng <bmeng@tinylab.org>
Reviewed-by: Anup Patel <anup@brainfault.org>
Reviewed-by: Samuel Holland <samuel@sholland.org>
19 months agolib: utils/irqchip: plic: Fix the off-by-one error in plic_context_init()
Bin Meng [Sun, 11 Dec 2022 06:54:22 +0000 (14:54 +0800)]
lib: utils/irqchip: plic: Fix the off-by-one error in plic_context_init()

The number of interrupt enable register in words was once correct,
but was wrongly changed to have an off-by-one error since
commit 8c362e7d065e ("lib: irqchip/plic: Factor out a context init function").

Fixes: 8c362e7d065e ("lib: irqchip/plic: Factor out a context init function")
Signed-off-by: Bin Meng <bmeng@tinylab.org>
Reviewed-by: Anup Patel <anup@brainfault.org>
Reviewed-by: Samuel Holland <samuel@sholland.org>
19 months agolib: utils/irqchip: plic: Ensure no out-of-bound access in priority save/restore...
Bin Meng [Sun, 11 Dec 2022 06:54:21 +0000 (14:54 +0800)]
lib: utils/irqchip: plic: Ensure no out-of-bound access in priority save/restore helpers

Currently the priority save/restore helpers writes/reads the provided
array using an index whose maximum value is determined by PLIC, which
potentially may disagree with the caller to these helpers.

Add a parameter to ask the caller to provide the size limit of the
array to ensure no out-of-bound access happens.

Signed-off-by: Bin Meng <bmeng@tinylab.org>
Reviewed-by: Anup Patel <anup@brainfault.org>
19 months agolib: utils/irqchip: plic: Fix the off-by-one error in priority save/restore helpers
Bin Meng [Sun, 11 Dec 2022 06:54:20 +0000 (14:54 +0800)]
lib: utils/irqchip: plic: Fix the off-by-one error in priority save/restore helpers

Interrupt source 0 is reserved. Hence the irq should start from 1.

Fixes: 2b79b694a805 ("lib: irqchip/plic: Add priority save/restore helpers")
Signed-off-by: Bin Meng <bmeng@tinylab.org>
Reviewed-by: Anup Patel <anup@brainfault.org>
19 months agodocs: platform: Add documentation for Renesas RZ/Five SoC
Lad Prabhakar [Sat, 10 Dec 2022 10:30:11 +0000 (10:30 +0000)]
docs: platform: Add documentation for Renesas RZ/Five SoC

This patch adds documentation to build Renesas RZ/Five (R9A07G043F) SoC.

Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
19 months agoplatform: generic: Add Renesas RZ/Five initial support
Lad Prabhakar [Sat, 10 Dec 2022 10:30:10 +0000 (10:30 +0000)]
platform: generic: Add Renesas RZ/Five initial support

This commit provides basic support for the Renesas RZ/Five
(R9A07G043F) SoC.

The RZ/Five microprocessor includes a single RISC-V CPU Core (Andes AX45MP)
1.0 GHz, 16-bit DDR3L/DDR4 interface. Supported interfaces include:
- Gigabit Ethernet 2ch
- CAN interface (CAN-FD) 2ch
- USB 2.0 interface 2ch
- SD interface 2ch
- AD converter 2ch

Useful links:
-------------
Links: https://www.renesas.com/us/en/products/microcontrollers-microprocessors/rz-mpus/rzfive-risc-v-general-purpose-microprocessors-risc-v-cpu-core-andes-ax45mp-single-10-ghz-2ch-gigabit-ethernet
Links: http://www.andestech.com/en/products-solutions/andescore-processors/riscv-ax45mp/

Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
19 months agolib: utils/irqchip: Add compatible string for Andestech NCEPLIC100
Lad Prabhakar [Sat, 10 Dec 2022 10:30:09 +0000 (10:30 +0000)]
lib: utils/irqchip: Add compatible string for Andestech NCEPLIC100

Add compatible string for Andestech NCEPLIC100 found on Renesas RZ/Five SoC
which is equipped with AX45MP AndesCore.

While at it drop the comma after the sentinel as it does not make sense to
have a comma after a sentinel, as any new elements must be added before the
sentinel.

dts example (Single-core AX45MP):

    soc: soc {
          ....
          plic: interrupt-controller@12c00000 {
              compatible = "renesas,r9a07g043-plic", "andestech,nceplic100";
              #interrupt-cells = <2>;
              #address-cells = <0>;
              riscv,ndev = <511>;
              interrupt-controller;
              reg = <0x0 0x12c00000 0 0x400000>;
              clocks = <&cpg CPG_MOD R9A07G043_NCEPLIC_ACLK>;
              power-domains = <&cpg>;
              resets = <&cpg R9A07G043_NCEPLIC_ARESETN>;
              interrupts-extended = <&cpu0_intc 11 &cpu0_intc 9>;
          };
          ....
    };

Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
Reviewed-by: Bin Meng <bmeng@tinylab.org>
19 months agolib: utils: serial: Add FDT driver for Renesas SCIF
Lad Prabhakar [Sat, 10 Dec 2022 10:30:08 +0000 (10:30 +0000)]
lib: utils: serial: Add FDT driver for Renesas SCIF

Add FDT driver for Renesas SCIF.

    dts example:

    soc: soc {
          ....
            scif0: serial@1004b800 {
                    compatible = "renesas,scif-r9a07g043",
                                 "renesas,scif-r9a07g044";
                    reg = <0 0x1004b800 0 0x400>;
                    interrupts = <412 IRQ_TYPE_LEVEL_HIGH>,
                                 <414 IRQ_TYPE_LEVEL_HIGH>,
                                 <415 IRQ_TYPE_LEVEL_HIGH>,
                                 <413 IRQ_TYPE_LEVEL_HIGH>,
                                 <416 IRQ_TYPE_LEVEL_HIGH>,
                                 <416 IRQ_TYPE_LEVEL_HIGH>;
                    interrupt-names = "eri", "rxi", "txi",
                                      "bri", "dri", "tei";
                    clocks = <&cpg CPG_MOD R9A07G043_SCIF0_CLK_PCK>;
                    clock-names = "fck";
                    power-domains = <&cpg>;
                    resets = <&cpg R9A07G043_SCIF0_RST_SYSTEM_N>;
                    status = "disabled";
            };
          ....
    };

Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
19 months agolib: utils: serial: Add Renesas SCIF driver
Lad Prabhakar [Sat, 10 Dec 2022 10:30:07 +0000 (10:30 +0000)]
lib: utils: serial: Add Renesas SCIF driver

Add Renesas SCIF driver.

Based on a patch in the BSP by Takeki Hamada
<takeki.hamada.ak@bp.renesas.com>
Link: https://github.com/renesas-rz/rz_opensbi/commits/work/OpenSBI-PMA
Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
19 months agoscripts: use env to invoke bash
Himanshu Chauhan [Fri, 9 Dec 2022 06:13:35 +0000 (11:43 +0530)]
scripts: use env to invoke bash

Not all systems have bash at a fixed location like /bin/bash.
FreeBSD, for example, would typically have it at /usr/local/bin/bash.
When building OpenSBI on freebsd system, the build breaks.

Its advisable to use: #!/usr/bin/env bash

Signed-off-by: Himanshu Chauhan <hchauhan@ventanamicro.com>
Reviewed-by: Xiang W <wxjstz@126.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
19 months agolib: sbi: Synchronize PMP settings with virtual memory system
Himanshu Chauhan [Mon, 5 Dec 2022 16:42:31 +0000 (22:12 +0530)]
lib: sbi: Synchronize PMP settings with virtual memory system

As per section 3.7.2 of RISC-V Privileged Specification,
PMP settings must be synchronized with the virtual memory
system after PMP settings have been written.

Signed-off-by: Himanshu Chauhan <hchauhan@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
19 months agolib: fix irqchip_plic_update_hartid_table
Heinrich Schuchardt [Thu, 8 Dec 2022 01:14:21 +0000 (02:14 +0100)]
lib: fix irqchip_plic_update_hartid_table

After determining cpu_offset we have to check this value.

Addresses-Coverity-ID: 1529706 ("Logically dead code")
Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
Reviewed-by: Xiang W <wxjstz@126.com>
Reviewed-by: Atish Patra <atishp@rivosinc.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
19 months agolib: fix __fdt_parse_region()
Heinrich Schuchardt [Thu, 8 Dec 2022 01:14:20 +0000 (02:14 +0100)]
lib: fix __fdt_parse_region()

If fdt_getprop() returns NULL, this indicates an error. In this case lenp
is set to an error code. But even if lenp = 0 we should not continue.

If fdt_getprop() returns a wider value than we expect this is a separate
error condition.

In both cases the device-tree is invalid.

Addresses-Coverity-ID: 1529703 ("Dereference after null check")
Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
Reviewed-by: Xiang W <wxjstz@126.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
19 months agolib: fix is_region_valid()
Heinrich Schuchardt [Thu, 8 Dec 2022 01:14:19 +0000 (02:14 +0100)]
lib: fix is_region_valid()

For 'reg->order == __riscv_xlen' the term 'BIT(reg->order)' is undefined.

Addresses-Coverity-ID: 1529706 ("Bad bit shift operation")
Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
Reviewed-by: Xiang W <wxjstz@126.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
19 months agoplatform: generic: Make use of fdt_match_node()
Lad Prabhakar [Wed, 7 Dec 2022 16:14:19 +0000 (16:14 +0000)]
platform: generic: Make use of fdt_match_node()

It makes sense to use fdt_match_node() instead of fdt_find_match()
in fw_platform_lookup_special() as we already have the start offset
to search from.

Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
19 months agogitignore: add vim swap files
Sergey Matyukevich [Sat, 3 Dec 2022 21:04:15 +0000 (00:04 +0300)]
gitignore: add vim swap files

Update .gitignore for vim swap files.

Signed-off-by: Sergey Matyukevich <sergey.matyukevich@syntacore.com>
Reviewed-by: Bin Meng <bmeng@tinylab.org>
Reviewed-by: Xiang W <wxjstz@126.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
19 months agolib: utils: Add fdt_fixup_node() helper function
Lad Prabhakar [Fri, 2 Dec 2022 11:59:47 +0000 (11:59 +0000)]
lib: utils: Add fdt_fixup_node() helper function

Add a helper function fdt_fixup_node() based on the compatible string.
This will avoid code duplication for every new node fixup being added.

Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Reviewed-by: Bin Meng <bmeng@tinylab.org>
Reviewed-by: Xiang W <wxjstz@126.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
19 months agoscripts/create-binary-archive.sh: remove andes/ae350 build directory
Yu Chien Peter Lin [Mon, 5 Dec 2022 02:04:00 +0000 (10:04 +0800)]
scripts/create-binary-archive.sh: remove andes/ae350 build directory

The andes-specific files have been moved to generic platform so we
can drop this line.

Signed-off-by: Yu Chien Peter Lin <peterlin@andestech.com>
Reviewed-by: Bin Meng <bmeng@tinylab.org>
Reviewed-by: Anup Patel <anup@brainfault.org>
19 months agodocs: andes-ae350.md: fix watchdog nodename in dts example
Yu Chien Peter Lin [Mon, 5 Dec 2022 02:03:59 +0000 (10:03 +0800)]
docs: andes-ae350.md: fix watchdog nodename in dts example

The example should use watchdog as nodename instead of wdt.
This is defined in watchdog common schemas:
https://github.com/torvalds/linux/blob/v6.0/Documentation/devicetree/bindings/watchdog/watchdog.yaml#L19

Signed-off-by: Yu Chien Peter Lin <peterlin@andestech.com>
Reviewed-by: Bin Meng <bmeng@tinylab.org>
Reviewed-by: Anup Patel <anup@brainfault.org>
19 months agodocs: platform: Update AE350 and generic platform documentation
Yu Chien Peter Lin [Mon, 5 Dec 2022 02:03:58 +0000 (10:03 +0800)]
docs: platform: Update AE350 and generic platform documentation

Update compile option and platform compatible string for AE350 and
add it to the generic platform list.

Signed-off-by: Yu Chien Peter Lin <peterlin@andestech.com>
Reviewed-by: Bin Meng <bmeng@tinylab.org>
Reviewed-by: Anup Patel <anup@brainfault.org>
19 months agoplatform: generic/andes: Enable generic platform support for AE350
Yu Chien Peter Lin [Mon, 5 Dec 2022 02:03:57 +0000 (10:03 +0800)]
platform: generic/andes: Enable generic platform support for AE350

We move andes directory to platform/generic as the necessary fdt
drivers are available, the users can enable the console, timer, ipi,
irqchip and reset devices by adding device tree nodes stated in the
docs/platform/andes-ae350.md.

Signed-off-by: Yu Chien Peter Lin <peterlin@andestech.com>
Reviewed-by: Bin Meng <bmeng@tinylab.org>
Reviewed-by: Anup Patel <anup@brainfault.org>
19 months agofirmware: Minor optimization for relocate
Dongdong Zhang [Tue, 29 Nov 2022 03:54:07 +0000 (11:54 +0800)]
firmware: Minor optimization for relocate

The t3 register stores the address of _load_end. If relocation is not
required, it is unnecessary to calculate the address of _load_end.

This can reduce the operation time of two instructions.

Signed-off-by: Dongdong Zhang <zhangdongdong@eswincomputing.com>
Reviewed-by: Bin Meng <bmeng@tinylab.org>
Reviewed-by: Anup Patel <anup@brainfault.org>
19 months agolib: fix fdt_parse_aclint_node()
Heinrich Schuchardt [Mon, 28 Nov 2022 09:14:20 +0000 (10:14 +0100)]
lib: fix fdt_parse_aclint_node()

After determining cpu_offset we have to check this variable and not
cpu_intc_offset.

Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
Reviewed-by: Xiang W <wxjstz@126.com>
Reviewed-by: Bin Meng <bmeng@tinylab.org>
19 months agolib: simplify fdt_translate_address()
Heinrich Schuchardt [Mon, 28 Nov 2022 09:14:19 +0000 (10:14 +0100)]
lib: simplify fdt_translate_address()

Don't assign a value to offset which is never used.

Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
Reviewed-by: Xiang W <wxjstz@126.com>
Reviewed-by: Bin Meng <bmeng@tinylab.org>
19 months agolib: fix fdt_parse_plicsw_node()
Heinrich Schuchardt [Mon, 28 Nov 2022 09:14:18 +0000 (10:14 +0100)]
lib: fix fdt_parse_plicsw_node()

cpu_offset and cpu_intc_offset must be int to detect failed invocations of
fdt_node_offset_by_phandle() or fdt_parent_offset().

After determining cpu_offset we have to check this value and not
cpu_intc_offset.

Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
Reviewed-by: Xiang W <wxjstz@126.com>
Reviewed-by: Yu Chien Peter Lin <peterlin@andestech.com>
Reviewed-by: Bin Meng <bmeng@tinylab.org>
19 months agolib: fix fdt_parse_plmt_node()
Heinrich Schuchardt [Mon, 28 Nov 2022 09:14:17 +0000 (10:14 +0100)]
lib: fix fdt_parse_plmt_node()

cpu_offset, cpu_intc_offset must be int to discover failed invocations of
fdt_node_offset_by_phandle() or fdt_parent_offset().

After determining cpu_offset we have to check this value and not
cpu_intc_offset.

Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
Reviewed-by: Xiang W <wxjstz@126.com>
Reviewed-by: Yu Chien Peter Lin <peterlin@andestech.com>
Reviewed-by: Bin Meng <bmeng@tinylab.org>
19 months agolib: simplify fdt_parse_plicsw_node()
Heinrich Schuchardt [Mon, 28 Nov 2022 09:14:16 +0000 (10:14 +0100)]
lib: simplify fdt_parse_plicsw_node()

We should not check !plicsw_base || !size twice.

Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
Reviewed-by: Xiang W <wxjstz@126.com>
Reviewed-by: Yu Chien Peter Lin <peterlin@andestech.com>
Reviewed-by: Bin Meng <bmeng@tinylab.org>
19 months agolib: simplify fdt_parse_plmt_node()
Heinrich Schuchardt [Mon, 28 Nov 2022 09:14:15 +0000 (10:14 +0100)]
lib: simplify fdt_parse_plmt_node()

We should not check !plmt_base || !plmt_size twice.

Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
Reviewed-by: Xiang W <wxjstz@126.com>
Reviewed-by: Yu Chien Peter Lin <peterlin@andestech.com>
Reviewed-by: Bin Meng <bmeng@tinylab.org>
19 months agolib: sbi: Fix is_region_valid()
Xiang W [Thu, 24 Nov 2022 03:16:05 +0000 (11:16 +0800)]
lib: sbi: Fix is_region_valid()

When order is equal to __riscv_xlen, the shift operation will not perform
any operation, which will cause reg->base & (BIT(reg->order) - 1) to always
be 0, and the condition has not been established.

This patch fixes this bug.

Signed-off-by: Xiang W <wxjstz@126.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
19 months agolib: sbi: Simplified mmio match checking
Xiang W [Thu, 24 Nov 2022 03:16:03 +0000 (11:16 +0800)]
lib: sbi: Simplified mmio match checking

We simplify the mmio flag matching in sbi_domain_check_addr().

Signed-off-by: Xiang W <wxjstz@126.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
19 months agoMakefile: bugfix for handling platform paths
Alejandro Cabrera Aldaya [Tue, 22 Nov 2022 10:28:25 +0000 (12:28 +0200)]
Makefile: bugfix for handling platform paths

If the path where this repo is located contains the platform name on
it, the original Makefile replaced its occurrences from the path making
it an invalid path. This commit prevents this behavior replacing only
the last part of the path as intended.

Signed-off-by: Alejandro Cabrera Aldaya <aldaya@gmail.com>
Reviewed-by: Xiang W <wxjstz@126.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
19 months agoMakefile: replace `echo` with `printf` for compatibility
KaDiWa [Mon, 21 Nov 2022 15:59:05 +0000 (16:59 +0100)]
Makefile: replace `echo` with `printf` for compatibility

I don't know why but `echo -n` didn't work for me. macOS supports
the `-n` option but it doesn't work in the makefile. What it does
instead is it literally writes `-n` to the file and then also
leaves a newline at the end.

I'm using GNU Make 4.4 (`gmake` from Homebrew).

Signed-off-by: KaDiWa <kalle.wachsmuth@gmail.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
19 months agoplatform: generic/allwinner: Remove ghostly type cast
Xiang W [Sat, 19 Nov 2022 08:55:07 +0000 (16:55 +0800)]
platform: generic/allwinner: Remove ghostly type cast

Corrected the same parameter of writel_relaxed in sun20i_d1_riscv_cfg_init
to be u32 for a while and u64 for a while.

Signed-off-by: Xiang W <wxjstz@126.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
20 months agoplatform: generic/allwinner: Remove unused header files
Leizheng Zhang [Fri, 18 Nov 2022 05:20:29 +0000 (13:20 +0800)]
platform: generic/allwinner: Remove unused header files

Remove "#include <sbi/sbi_console.h>"

Signed-off-by: Leizheng Zhang <zhangleizheng@eswincomputing.com>
Reviewed-by: Bin Meng <bmeng@tinylab.org>
Reviewed-by: Xiang W <wxjstz@126.com>
20 months agofirmware: payloads: Optimize usage of "ALIGN"
Leizheng Zhang [Mon, 21 Nov 2022 08:26:22 +0000 (16:26 +0800)]
firmware: payloads: Optimize usage of "ALIGN"

Delete the redundant "ALIGN" and adjust the position of "ALIGN"

Signed-off-by: Leizheng Zhang <zhangleizheng@eswincomputing.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Atish Patra <atishp@rivosinc.com>
Reviewed-by: Bin Meng <bmeng@tinylab.org>
20 months agolib: sbi_ecall: Split up sbi_ecall_replace
Vivian Wang [Wed, 9 Nov 2022 06:53:37 +0000 (14:53 +0800)]
lib: sbi_ecall: Split up sbi_ecall_replace

Split up sbi_ecall_replace so that each extension is in its individual
file.

Also reorganize the corresponding section in lib/sbi/objects.mk so
that it is grouped by extension, now that the object file targets are
split up.

Signed-off-by: Vivian Wang <dramforever@live.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
20 months agolib: utils/serial: Fix semihosting compile error using LLVM
Anup Patel [Tue, 8 Nov 2022 12:10:16 +0000 (17:40 +0530)]
lib: utils/serial: Fix semihosting compile error using LLVM

We fix the following semihosting compile error observed using LLVM:
lib/utils/serial/semihosting.c:158:12: error: result of comparison of constant -1 with expression of type 'char' is always true [-Werror,-Wtautological-constant-out-of-range-compare]
                ret = ch > -1 ? ch : -1;
                      ~~ ^ ~~

Fixes: 7f09fba86e43 ("lib: utils/serial: add semihosting support")
Signed-off-by: Anup Patel <apatel@ventanamicro.com>
Reviewed-by: Xiang W <wxjstz@126.com>
Reviewed-by: Bin Meng <bmeng@tinylab.org>
20 months agodocs: fix some typos
zhangdongdong [Tue, 25 Oct 2022 00:57:41 +0000 (08:57 +0800)]
docs: fix some typos

Corrected the typos of some documents in the 'docs' folder.

Signed-off-by: zhangdongdong <zhangdongdong@eswincomputing.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
20 months agolib: utils/fdt: Simplified code
Xiang W [Mon, 31 Oct 2022 11:21:45 +0000 (19:21 +0800)]
lib: utils/fdt: Simplified code

Simplified fdt_parse_xxx_uart_node which direct call
fdt_parse_uart_node_common.

Signed-off-by: Xiang W <wxjstz@126.com>
Reviewed-by: Atish Patra <atishp@rivosinc.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
20 months agolib: utils/fdt: Remove redundant code
Xiang W [Mon, 31 Oct 2022 11:21:44 +0000 (19:21 +0800)]
lib: utils/fdt: Remove redundant code

uart->reg_offset and uart->reg_io_width are only used on uart8250 and
not required on other platforms. Remove for sifive and gaisler.

Signed-off-by: Xiang W <wxjstz@126.com>
Reviewed-by: Atish Patra <atishp@rivosinc.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
21 months agolib: sbi_ecall: Add Kconfig option for each extension
Vivian Wang [Mon, 10 Oct 2022 16:34:45 +0000 (00:34 +0800)]
lib: sbi_ecall: Add Kconfig option for each extension

For each SBI extension, we:

- Add a Kconfig option for it
- Add the extension to sbi_ecall_exts only if the extension is enabled
- Add the corresponding sbi_ecall_* object file only if the extension is
  enabled

Special cases are as follows:

- The legacy extensions are lumped together as one 'big' extension, as
  has always been the case in OpenSBI code.
- The platform-defined vendor extensions are regarded as one extension.
- The Base extension cannot be disabled.
- sbi_ecall_replace implements multiple extensions, so it's not easy to
  avoid linking it in. Enable it always, and use #ifdef to
  disable/enable individual extensions.

Signed-off-by: Vivian Wang <dramforever@live.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
21 months agolib: sbi_ecall: Generate extensions list with carray
Vivian Wang [Mon, 10 Oct 2022 16:34:44 +0000 (00:34 +0800)]
lib: sbi_ecall: Generate extensions list with carray

Instead of hard-coding the list of extensions in C code, use carray to
generate the list of extensions.

Using carray makes adding and removing extensions slightly cleaner. This
also paves the way for using Kconfig to disable unneeded extensions.

Signed-off-by: Vivian Wang <dramforever@live.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
21 months agoMakefile: Add rules for carray sources in lib/sbi
Vivian Wang [Mon, 10 Oct 2022 16:34:43 +0000 (00:34 +0800)]
Makefile: Add rules for carray sources in lib/sbi

Add back the missing rules needed to build carray files in lib/sbi. This
allows future usage of carray in lib/sbi.

Fixes: de80e9337d81 ("Makefile: Compile lib/utils sources separately for each platform")
Signed-off-by: Vivian Wang <dramforever@live.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
21 months agodocs/firmware: update the document
Yangjie Zhang [Thu, 20 Oct 2022 14:41:08 +0000 (22:41 +0800)]
docs/firmware: update the document

Since
commit 9c07c513aa9b ("firmware:Remove FW_PAYLOAD_FDT_PATH compile-time option"),
the section where FDT would be embedded in has changed from *.text* to *.rodata*,
but some places in fw_payload.md and fw.md are still *.text*.
This patch updates the document.

Signed-off-by: Yangjie Zhang <pyjmstr@gmail.com>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
21 months agoMakefile: Add cscope support
Tan En De [Thu, 13 Oct 2022 01:26:23 +0000 (09:26 +0800)]
Makefile: Add cscope support

Add cscope support so that running `make cscope` will generate/update
cscope files used for source code browsing, while running `make
distclean` will remove the cscope files.

Also add entry in .gitignore to ignore generated cscope files.

Signed-off-by: Tan En De <ende.tan@linux.starfivetech.com>
Reviewed-by: Xiang W <wxjstz@126.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
21 months agodocs: andes-ae350.md: Update ae350 documentation for fdt driver support
Yu Chien Peter Lin [Fri, 14 Oct 2022 00:32:52 +0000 (08:32 +0800)]
docs: andes-ae350.md: Update ae350 documentation for fdt driver support

We update ae350 documentation to add details about platform device tree.
The nodes and their properties must be provided to properly initialize
data of underlying hardware and access their mmio registers.

Signed-off-by: Yu Chien Peter Lin <peterlin@andestech.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
21 months agoplatform: andes/ae350: Add AE350 domain support
Yu Chien Peter Lin [Fri, 14 Oct 2022 00:32:51 +0000 (08:32 +0800)]
platform: andes/ae350: Add AE350 domain support

Add domains_init platform hook for Andes AE350, users can add domain
description in device tree and select FDT domain support in Kconfig
to achieve system-level partitioning.

Signed-off-by: Yu Chien Peter Lin <peterlin@andestech.com>
Reviewed-by: Leo Yu-Chi Liang <ycliang@andestech.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
21 months agolib: utils/ipi: Add Andes fdt ipi driver support
Yu Chien Peter Lin [Fri, 14 Oct 2022 00:32:50 +0000 (08:32 +0800)]
lib: utils/ipi: Add Andes fdt ipi driver support

Move Andes PLICSW ipi device to fdt ipi framework, this patch is based
on Leo's modified IPI scheme on PLICSW.

Current IPI scheme uses bit 0 of pending reigster on PLICSW to send IPI
from hart 0 to hart 7, but bit 0 needs to be hardwired to 0 according
to spec. After some investigation, self-IPI seems to be seldom or never
used, so we re-order the IPI scheme to support 8 core platforms.

dts example (Quad-core AX45MP):

  plicsw: interrupt-controller@e6400000 {
          compatible = "andestech,plicsw";
          reg = <0x00000000 0xe6400000 0x00000000 0x00400000>;
          interrupts-extended = <&CPU0_intc 3
                                 &CPU1_intc 3
                                 &CPU2_intc 3
                                 &CPU3_intc 3>;
          interrupt-controller;
          #address-cells = <2>;
          #interrupt-cells = <2>;
  };

Signed-off-by: Yu Chien Peter Lin <peterlin@andestech.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
21 months agoplatform: andes/ae350: Add fw_platform_init for platform initialization
Yu Chien Peter Lin [Fri, 14 Oct 2022 00:32:49 +0000 (08:32 +0800)]
platform: andes/ae350: Add fw_platform_init for platform initialization

This patch adds fw_platform_init() to initialize ae350 platform.name
and platform.hart_count by parsing device tree.

Signed-off-by: Yu Chien Peter Lin <peterlin@andestech.com>
Reviewed-by: Leo Yu-Chi Liang <ycliang@andestech.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
21 months agoplatform: andes/ae350: Use fdt irqchip driver
Yu Chien Peter Lin [Fri, 14 Oct 2022 00:32:48 +0000 (08:32 +0800)]
platform: andes/ae350: Use fdt irqchip driver

Andes PLIC is compatible with plic driver. The PLIC base address and
number of source can be obtained by parsing the device tree.

Signed-off-by: Yu Chien Peter Lin <peterlin@andestech.com>
Reviewed-by: Leo Yu-Chi Liang <ycliang@andestech.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
21 months agolib: utils/reset: Add Andes fdt reset driver support
Yu Chien Peter Lin [Fri, 14 Oct 2022 00:32:47 +0000 (08:32 +0800)]
lib: utils/reset: Add Andes fdt reset driver support

Add ATCWDT200 as reset device of AE350 platform, this driver requires
SMU to program the reset vector registers before triggering WDT software
restart signal.

dts example:

  smu@f0100000 {
    compatible = "andestech,atcsmu";
    reg = <0x00000000 0xf0100000 0x00000000 0x00001000>;
  };

  wdt: wdt@f0500000 {
    compatible = "andestech,atcwdt200";
    reg = <0x00000000 0xf0500000 0x00000000 0x00001000>;
    interrupts = <3 4>;
    interrupt-parent = <&plic0>;
    clock-frequency = <15000000>;
  };

Signed-off-by: Yu Chien Peter Lin <peterlin@andestech.com>
Reviewed-by: Leo Yu-Chi Liang <ycliang@andestech.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
21 months agolib: utils/timer: Add Andes fdt timer support
Yu Chien Peter Lin [Fri, 14 Oct 2022 00:32:46 +0000 (08:32 +0800)]
lib: utils/timer: Add Andes fdt timer support

Since we can get the PLMT base address and timer frequency from
device tree, move plmt timer device to fdt timer framework.

dts example (Quad-core AX45MP):

  cpus {
      ...
      timebase-frequency = <0x3938700>;
      ...
  }
  soc {
      ...
      plmt0@e6000000 {
          compatible = "andestech,plmt0";
          reg = <0x00 0xe6000000 0x00 0x100000>;
          interrupts-extended = <&cpu0_intc 0x07
                                 &cpu1_intc 0x07
                                 &cpu2_intc 0x07
                                 &cpu3_intc 0x07>;
      };
      ...
  }

Signed-off-by: Yu Chien Peter Lin <peterlin@andestech.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
21 months agoplatform: andes/ae350: Use fdt serial driver
Yu Chien Peter Lin [Fri, 14 Oct 2022 00:32:45 +0000 (08:32 +0800)]
platform: andes/ae350: Use fdt serial driver

Andes UART is compatible with uart8250 driver. We can use
fdt_serial_init() as platform console init hook.

dts example:

  serial0: serial@f0300000 {
    compatible = "andestech,uart16550", "ns16550a";
    reg = <0x00000000 0xf0300000 0x00000000 0x00001000>;
    interrupts = <9 4>;
    interrupt-parent = <&plic0>;
    clock-frequency = <19660800>;
    current-speed = <38400>;
    reg-shift = <2>;
    reg-offset = <32>;
    reg-io-width = <4>;
    no-loopback-test = <1>;
  };

Signed-off-by: Yu Chien Peter Lin <peterlin@andestech.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
21 months agoplatform: andes/ae350: Use kconfig to set platform version and default name
Yu Chien Peter Lin [Fri, 14 Oct 2022 00:32:44 +0000 (08:32 +0800)]
platform: andes/ae350: Use kconfig to set platform version and default name

This patch makes andes platform name and version can be set in
menuconfig interface.

Signed-off-by: Yu Chien Peter Lin <peterlin@andestech.com>
Reviewed-by: Leo Yu-Chi Liang <ycliang@andestech.com>
Reviewed-by: Anup Patel <anup@brainfault.org>