platform/kernel/opensbi.git
5 years agolib: Add a simple brain-dead allocator to manage extra scratch space
Anup Patel [Tue, 21 May 2019 06:21:01 +0000 (11:51 +0530)]
lib: Add a simple brain-dead allocator to manage extra scratch space

We have extra space above scratch space (sbi_scratch) which we are
currently using to manage per-HART IPI data and TLB request management.

In future, more parts of OpenSBI will use the extra scratch space so
it will become difficult to manage extra scratch space using just
defines and macros.

This patch adds a simple brain-dead allocator to manage extra scratch
space. This allocator never expects anything to be free-ed hence it
keeps incrementing to next allocation offset until it runs-out of space.

In future, we can have more sophisticated allocator which will allow
us to re-claim free-ed space and also allows us to track owner of
allocated space.

Signed-off-by: Anup Patel <anup.patel@wdc.com>
Reviewed-by: Atish Patra <atish.patra@wdc.com>
5 years agolib: Flush everything when remote TLB flush range is too large
Anup Patel [Mon, 20 May 2019 05:50:53 +0000 (11:20 +0530)]
lib: Flush everything when remote TLB flush range is too large

On latest Linux kernel (i.e. 5.2-rc1), we get large TLB flush
request for user space addresses (typically, start=x and end=-1).
This is caused by Linux kernel commit a21344dfc6 ("riscv: fix
sbi_remote_sfence_vma{,_asid}").

It's not practical to execute large number of sfence instructions
for a large TLB flush range because it takes too much time and
eventually causes CPU stall in Linux kernel.

This patch addresses above issue by upgrading TLB flush range to
TLB flush all whenever TLB flush range is greater than 1GB.

Signed-off-by: Anup Patel <anup.patel@wdc.com>
Reviewed-by: Atish Patra <atish.patra@wdc.com>
5 years agodocs: Add documentation about dynamic firmware
Anup Patel [Mon, 29 Apr 2019 07:20:33 +0000 (12:50 +0530)]
docs: Add documentation about dynamic firmware

This patch adds documenation about dynamic firmware.

Signed-off-by: Anup Patel <anup.patel@wdc.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Reviewed-by: Atish Patra <atish.patra@wdc.com>
5 years agoplatform: Enable dynamic firmware for appropriate platforms
Anup Patel [Mon, 29 Apr 2019 06:41:06 +0000 (12:11 +0530)]
platform: Enable dynamic firmware for appropriate platforms

This patch enables FW_DYNAMIC option (i.e. dynamic firmware) for
all appropriate/applicable platforms.

Signed-off-by: Anup Patel <anup.patel@wdc.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
5 years agofirmware: Add fw_dynamic firmware
Anup Patel [Mon, 29 Apr 2019 06:25:19 +0000 (11:55 +0530)]
firmware: Add fw_dynamic firmware

This patch provides first-cut implementation of fw_dynamic firmware.

As compared to fw_jump and fw_payload, the fw_dynamic obtains next
address, next mode and OpenSBI options from struct fw_dynamic_info.

The previous booting stage can create struct fw_dynamic_info in memory
and pass address of struct fw_dynamic_info in 'a2' register. Also, the
struct fw_dynamic_info has versioning as well so changes to the struct
fw_dynamic_info can be done in a backward compatible manner.

Signed-off-by: Anup Patel <anup.patel@wdc.com>
Reviewed-by: Atish Patra <atish.patra@wdc.com>
5 years agofirmware: Allow firmwares to provide next mode and options
Anup Patel [Mon, 29 Apr 2019 05:14:15 +0000 (10:44 +0530)]
firmware: Allow firmwares to provide next mode and options

This patch extends existing firmwares (i.e. fw_jump and fw_payload)
to explicitly provide next mode and options to fw_base.

We also introduce fw_save_info() which is called by fw_base very
early on boot HART. This function can be used by existing firmwares
(i.e. fw_jump and fw_payload) to save information passed by previous
booting stage.

Overall, this is a preparatory patch for implementing fw_dynamic.

Signed-off-by: Anup Patel <anup.patel@wdc.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Reviewed-by: Atish Patra <atish.patra@wdc.com>
5 years agodocs: update CONTRIBUTORS.md from git history
Karsten Merker [Sun, 5 May 2019 10:33:26 +0000 (12:33 +0200)]
docs: update CONTRIBUTORS.md from git history

OpenSBI has recently gained a CONTRIBUTORS.md file as a way
to make contributions to OpenSBI more visible.  Add previous
contributors from the git history who have acked their
inclusion in the list to the file.

Signed-off-by: Karsten Merker <merker@debian.org>
Acked-by: Alistair Francis <alistair@alistair23.me>
Acked-by: Anup Patel <anup.patel@wdc.com>
Acked-by: Atish Patra <atish.patra@wdc.com>
Acked-by: Bin Meng <bmeng.cn@gmail.com>
Acked-by: Damien Le Moal <damien.lemoal@wdc.com>
Acked-by: Nick Kossifidis <mickflemm@gmail.com>
Acked-by: Shawn Chang <citypw@gmail.com>
Acked-by: Xiang Wang <wxjstz@126.com>
5 years agodocs: miscellaneous documentation fixes and updates
Karsten Merker [Sun, 5 May 2019 10:33:25 +0000 (12:33 +0200)]
docs: miscellaneous documentation fixes and updates

- fix some broken hyperlinks
- add additional hyperlinks to references to external documents
- reformat some paragraphs to keep lines under 80 characters
- unify the enumeration style between different parts of the
  documentation
- fix spelling/grammar mistakes
- extend the copyright notice in README.md to be the same as the
  one in COPYING.BSD

Signed-off-by: Karsten Merker <merker@debian.org>
Reviewed-by: Atish Patra <atish.patra@wdc.com>
5 years agoUpdate sifive_fu540.md
Loys Ollivier [Fri, 3 May 2019 09:08:59 +0000 (11:08 +0200)]
Update sifive_fu540.md

Fix typo on parenthesis.

5 years agoMakefile: explicitly disable PIE
Karsten Merker [Fri, 26 Apr 2019 10:04:06 +0000 (12:04 +0200)]
Makefile: explicitly disable PIE

The various available RISC-V toolchains differ in their default
configuration regarding PIE, e.g. the buildroot RISC-V toolchain
has PIE disabled by default while the Debian toolchain has it
enabled by default.

OpenSBI currently doesn't support being built with PIE enabled,
therefore disable it explicitly by passing "-fno-pie -no-pie" in
CFLAGS.

Signed-off-by: Karsten Merker <merker@debian.org>
Acked-by: Anup Patel <anup.patel@wdc.com>
5 years agoplatform/common/libfdt: fix unnecessary multiple inclusions
Xiang Wang [Thu, 25 Apr 2019 03:52:08 +0000 (11:52 +0800)]
platform/common/libfdt: fix unnecessary multiple inclusions

Signed-off-by: Xiang Wang <wxjstz@126.com>
5 years agodocs: Add a payload section about coreboot support #116
Shawn Chang [Wed, 24 Apr 2019 09:44:58 +0000 (17:44 +0800)]
docs: Add a payload section about coreboot support #116

Signed-off-by: Shawn Chang <citypw@gmail.com>
5 years agoall: run clang-format and update checked-in files
Olof Johansson [Thu, 11 Apr 2019 00:41:52 +0000 (17:41 -0700)]
all: run clang-format and update checked-in files

Noisy commit, no functional changes.

Generated with an current upstream clang-format and:

clang-format -i $(find . -name \*.[ch])

Signed-off-by: Olof Johansson <olof@lixom.net>
5 years agoall: Annotate some tables to have clang-format leave them alone
Olof Johansson [Thu, 11 Apr 2019 00:41:46 +0000 (17:41 -0700)]
all: Annotate some tables to have clang-format leave them alone

One of the shortcomings of clang-format is that it doesn't allow
for aligned define tables, which is used for a number of constants.

Add annotation to disable the automatic formatting where needed.

Signed-off-by: Olof Johansson <olof@lixom.net>
5 years agolibfdt: don't try to clang-format
Olof Johansson [Thu, 11 Apr 2019 00:41:42 +0000 (17:41 -0700)]
libfdt: don't try to clang-format

Add an empty clang-format to disable reformatting of imported code and
make it easier to merge in upstream changes of that project over time.

Signed-off-by: Olof Johansson <olof@lixom.net>
5 years agotop: add .clang-format
Olof Johansson [Thu, 11 Apr 2019 00:41:37 +0000 (17:41 -0700)]
top: add .clang-format

Add a clang-format to automate consistent code formatting.

Automating coding style reformatting removes a lot of manual
checkpatch-type fixups, and can easily be implemented as a linter in
code review environments.

Signed-off-by: Olof Johansson <olof@lixom.net>
5 years agolib: Redirect unhandled traps from non-M modes to S mode
Nick Kossifidis [Tue, 16 Apr 2019 17:21:55 +0000 (20:21 +0300)]
lib: Redirect unhandled traps from non-M modes to S mode

In case we didn't handle a trap with one of the available
handlers, check if the trap comes from S or U mode and
redirect it to S mode's trap handler.

Signed-off-by: Nick Kossifidis <mick@ics.forth.gr>
5 years agodoc: Update docs as per latest kernel/u-boot status.
Atish Patra [Thu, 11 Apr 2019 17:46:27 +0000 (10:46 -0700)]
doc: Update docs as per latest kernel/u-boot status.

All dependant patches are merged in U-Boot and Linux kernel now.
Update the unleashed guide to reflect that and fix the documentation
about tftp loading path as well.

Signed-off-by: Atish Patra <atish.patra@wdc.com>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
5 years agotop: Add CONTRIBUTORS.md file
Anup Pate [Mon, 15 Apr 2019 03:44:53 +0000 (09:14 +0530)]
top: Add CONTRIBUTORS.md file

We add CONTRIBUTORS.md file to provide a list of individuals and
organizations actively contributing to the OpenSBI project.

Signed-off-by: Anup Patel <anup.patel@wdc.com>
5 years agodocs: qemu/virt platform documentation fixes and updates
Karsten Merker [Sun, 14 Apr 2019 18:47:17 +0000 (20:47 +0200)]
docs: qemu/virt platform documentation fixes and updates

- Correct the payload address in the RV64 examples that use
  fw_jump.elf.

- Change the qemu console configuration in the examples from
  "-display none -serial stdio" to "-nographic". This results in
  qemu handing down a CTRL-C on the emulated console to the VM
  instead of terminating the qemu process.

- Provide examples for RV32.

- Various text corrections.

Signed-off-by: Karsten Merker <merker@debian.org>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
5 years agolib: Optimize TLB flush IPIs
Atish Patra [Fri, 5 Apr 2019 00:21:09 +0000 (17:21 -0700)]
lib: Optimize TLB flush IPIs

Simulatenous requests for tlbflush IPIs can have overlapping address
ranges.

Ignore if address range is same or within already existing fifo entries.
Update the tlb flush info in fifo directly if the one of the existing
entry lies within the new flush request.
Delete all entries if flush all request is recieved for the vma.

Signed-off-by: Atish Patra <atish.patra@wdc.com>
5 years agolib: Provide a lock enabled iteration of fifo.
Atish Patra [Fri, 5 Apr 2019 00:10:12 +0000 (17:10 -0700)]
lib: Provide a lock enabled iteration of fifo.

Implement a lock enabled iteration for fifo so that
caller can determine if next entry can be skipped or
any existing entries in fifo can be updated before enqueue.

Signed-off-by: Atish Patra <atish.patra@wdc.com>
5 years agoTOP: Allow building platform out-of-tree
Anup Patel [Thu, 4 Apr 2019 06:19:43 +0000 (11:49 +0530)]
TOP: Allow building platform out-of-tree

This patch extends our current build-system for building platform
sources which are not part of OpenSBI sources.

For example:

Let's say we have out-of-tree ABC platform sources. We place these
sources under <XYZ>/ABC directory along with its config.mk and
objects.mk.

To build out-of-tree ABC platform from OpenSBI directory:
$ make PLATFORM_DIR=<XYZ>/ABC
OR
$ make PLATFORM_DIR=<XYZ> PLATFORM=ABC

To build out-of-tree ABC platform from <XYZ>/ABC directory:
$ make PLATFORM_DIR=<XYZ>/ABC -C <path_to_opensbi>
OR
$ make PLATFORM_DIR=<XYZ> PLATFORM=ABC -C <path_to_opensbi>

Signed-off-by: Anup Patel <anup.patel@wdc.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
5 years agolib: Fix the ecall macro definitions
Alistair Francis [Fri, 5 Apr 2019 21:05:15 +0000 (14:05 -0700)]
lib: Fix the ecall macro definitions

Fix the ECALL definitions to matc the latest information in the
privlidge spec table 5.5.

Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
5 years agofirmware: Fix source fdt alignment
Xiang Wang [Tue, 2 Apr 2019 08:57:22 +0000 (16:57 +0800)]
firmware: Fix source fdt alignment

When I tried to start opensbi with coreboot, I found that aligning to a 16-byte
boundary would make a copy error.

Corrected to align to an machine word length boundary.

Signed-off-by: Xiang Wang <wxjstz@126.com>
5 years agolib: Pack struct sbi_fifo
Anup Patel [Wed, 3 Apr 2019 06:57:27 +0000 (12:27 +0530)]
lib: Pack struct sbi_fifo

This patch reduces memory consumed by struct sbi_fifo by droping
redundant "head" member and using u16 in-place of "unsigned long".

Signed-off-by: Anup Patel <anup.patel@wdc.com>
5 years agolib: More improvements to sbi_fifo
Anup Patel [Wed, 3 Apr 2019 04:54:03 +0000 (10:24 +0530)]
lib: More improvements to sbi_fifo

This patch does following improvements to sbi_fifo:
1. Use valid SBI_Exxxx error codes instead of -1
2. The sbi_fifo_is_full() and sbi_fifo_is_empty() did
   not acquire qlock before accessing head and tail
   hence fixed it
3. Added avail member for ease in debugging and simplifying
   head/tail updates.

Due to above changes size of sbi_fifo changes from 48 bytes
to 56 bytes.

Signed-off-by: Anup Patel <anup.patel@wdc.com>
5 years agodocs: Update mailing list details in contributing.md
Anup Patel [Wed, 3 Apr 2019 05:29:12 +0000 (10:59 +0530)]
docs: Update mailing list details in contributing.md

We now have an OpenSBI mailing list available for development
and discussiong so update contributing.md accordingly. The
Github PR based review and issue tracking will also continue
to exist.

Signed-off-by: Anup Patel <anup.patel@wdc.com>
5 years agolib: Use a fifo to keep track of sfence related IPIs.
Atish Patra [Tue, 2 Apr 2019 00:07:54 +0000 (17:07 -0700)]
lib: Use a fifo to keep track of sfence related IPIs.

Currently, there is no provision for tracking multiple IPIs sent
to a single hart at the same time by different harts.

Use a fifo manage the outstanding requests. While dequeueing, read all
the entries once, because we have only 1 bit to track the type of IPI.
Once the queue is full, busy wait until the there is space available in
queue. This is not the most elegant approach. It should be changed in
favor of a wakeup event once available in opensbi.

Signed-off-by: Atish Patra <atish.patra@wdc.com>
5 years agolib: Increase the scratch space to 512 bytes.
Atish Patra [Tue, 2 Apr 2019 00:05:53 +0000 (17:05 -0700)]
lib: Increase the scratch space to 512 bytes.

Currently scratch space per hart is 256 bytes. Increase it to 512 bytes
to accomodate ipi queue.

Signed-off-by: Atish Patra <atish.patra@wdc.com>
5 years agolib: Introduce a tlb info type.
Atish Patra [Tue, 2 Apr 2019 00:04:57 +0000 (17:04 -0700)]
lib: Introduce a tlb info type.

Add a tlb info to distinguish between different type of tlb flush
request pending.

Signed-off-by: Atish Patra <atish.patra@wdc.com>
5 years agolib: Add a fifo implementation.
Atish Patra [Tue, 2 Apr 2019 00:04:05 +0000 (17:04 -0700)]
lib: Add a fifo implementation.

Implement a fifo to accomodate outstanding IPIs for a specific hart
at the same time.

Signed-off-by: Atish Patra <atish.patra@wdc.com>
5 years agokendryte/k210: Fix file headers
Damien Le Moal [Wed, 3 Apr 2019 01:22:13 +0000 (10:22 +0900)]
kendryte/k210: Fix file headers

Add missing SPDX and copyright information.

Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com>
5 years agoREADME: Update license information
Damien Le Moal [Tue, 2 Apr 2019 13:38:15 +0000 (22:38 +0900)]
README: Update license information

Add information regarding the Apache License Version 2.0 of some of the
Kendryte/k210 platform files. Also repeat this information in a new
ThirdPartyNotices.md file.

Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com>
5 years agoinclude: Make mstatus parameter optional for get_insn()
Anup Patel [Sat, 30 Mar 2019 13:13:49 +0000 (18:43 +0530)]
include: Make mstatus parameter optional for get_insn()

The mstatus parameter of get_insn() is used to return MSTATUS CSR
value which get_insn() saw. Most of the get_insn() callers don't
use the value returned in mstatus so this patch makes mstatus
parameter optional for get_insn().

Signed-off-by: Anup Patel <anup.patel@wdc.com>
5 years agoinclude: Rename sbi_unpriv.h to riscv_unpriv.h
Anup Patel [Sat, 30 Mar 2019 12:13:23 +0000 (17:43 +0530)]
include: Rename sbi_unpriv.h to riscv_unpriv.h

The sbi_unpriv.h has quite a few load_xyz() and store_xyz() helper
routines based on RISC-V inline assembly for unpriviledged accesses
from M-mode. These helper routines are similar to helper routines
present in riscv_locks.h, riscv_io.h, and riscv_atomic.h so let's
rename sbi_unpriv.h to riscv_unpriv.h.

Signed-off-by: Anup Patel <anup.patel@wdc.com>
5 years agolib: Remove unused mepc arg from load_xyz() and store_xyz() functions
Anup Patel [Sat, 30 Mar 2019 12:05:48 +0000 (17:35 +0530)]
lib: Remove unused mepc arg from load_xyz() and store_xyz() functions

This patch removes unused mepc arg from load_xyz() and store_xyz()
unpriviledge access functions.

Signed-off-by: Anup Patel <anup.patel@wdc.com>
5 years agolib: Disable the boot prints if SBI_SCRATCH_NO_BOOT_PRINTS is set
Bin Meng [Wed, 27 Mar 2019 14:58:49 +0000 (22:58 +0800)]
lib: Disable the boot prints if SBI_SCRATCH_NO_BOOT_PRINTS is set

Use the newly introduced "options" in "struct sbi_scratch" to
conditionally disable the boot prints.

Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
5 years agolib: Group all prints during boot into sbi_boot_prints()
Bin Meng [Wed, 27 Mar 2019 14:39:08 +0000 (22:39 +0800)]
lib: Group all prints during boot into sbi_boot_prints()

Refactor the codes a little bit to put all prints during boot into
sbi_boot_prints().

Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
5 years agofirmware: Introduce "options" in "struct sbi_scratch"
Bin Meng [Wed, 27 Mar 2019 14:57:20 +0000 (22:57 +0800)]
firmware: Introduce "options" in "struct sbi_scratch"

Introduce "options" in "struct sbi_scratch" and firmware can update
it based on optional compile time flags before calling sbi_init().

Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
5 years agoplatform: plic: Fix comments of programming the interrupt enable register
Bin Meng [Thu, 14 Mar 2019 08:12:44 +0000 (16:12 +0800)]
platform: plic: Fix comments of programming the interrupt enable register

The codes that currently program the interrupt enable register for
S-mode disagrees with what the comments say. Fix the comments.

While we are here, add one line comment to describe what is done
for M-mode too.

Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
5 years agolib: Return ENOTSUPP incase of invalid SBI function ID
Atish Patra [Wed, 13 Mar 2019 18:08:31 +0000 (11:08 -0700)]
lib: Return ENOTSUPP incase of invalid SBI function ID

OpenSBI should show error trace only if any valid SBI function
does not perform as expected.

However, OpenSBI should show notify the caller with a negative
error if given SBI function ID is not valid.

Signed-off-by: Atish Patra <atish.patra@wdc.com>
5 years agoplatform: plic: Bypass interrupt ID 0's priority programming
Bin Meng [Wed, 13 Mar 2019 16:13:32 +0000 (00:13 +0800)]
platform: plic: Bypass interrupt ID 0's priority programming

Per PLIC spec, interrupt ID 0 is defined to mean "no interrupt".
We should bypass it.

Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
5 years agoplatform: plic: Fix plic_set_priority()
Bin Meng [Wed, 13 Mar 2019 16:00:35 +0000 (00:00 +0800)]
platform: plic: Fix plic_set_priority()

At present plic_set_priority() ignores the 'source' and the priority
register to be programmed is constant. Fix it.

Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
5 years agofirmware: Move scratch setup to _start instead of _start_warm
Atish Patra [Mon, 4 Mar 2019 21:58:37 +0000 (13:58 -0800)]
firmware: Move scratch setup to _start instead of _start_warm

Scratch space setup needs to be done once for reboot for each
hart. _start_warm may be called several times if hart hotplug
is implemented.

Move scratch space setup to the beginning so that it is done
only once.

Signed-off-by: Atish Patra <atish.patra@wdc.com>
5 years agolib: Fix full tlb flush behavior
Atish Patra [Tue, 12 Mar 2019 20:50:37 +0000 (13:50 -0700)]
lib: Fix full tlb flush behavior

Currently, global page mappings are not flushed if start and size
arguments are zero.

Flush entire TLB if both size and start argument is passed as zero.

Fixes : 90cb491 (lib: Implement sfence.vma correctly)

Signed-off-by: Atish Patra <atish.patra@wdc.com>
5 years agoplatform: fu540: Fix cosmetic styling issues
Bin Meng [Tue, 12 Mar 2019 13:40:28 +0000 (21:40 +0800)]
platform: fu540: Fix cosmetic styling issues

There are some spaces or mixed usage of spaces and tabs in the macro
definition. Change to use tab consistently.

Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
5 years agodocs: firmware: Fix spelling of U-Boot
Bin Meng [Tue, 12 Mar 2019 13:32:35 +0000 (21:32 +0800)]
docs: firmware: Fix spelling of U-Boot

It's U-Boot, not U-boot.

Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
5 years agolib: Implement sfence.vma correctly.
Atish Patra [Sat, 9 Mar 2019 20:57:20 +0000 (12:57 -0800)]
lib: Implement sfence.vma correctly.

Currently, OpenSBI doesn't distinguish between sfence.vma
and sfence.vm asid calls. Moreover, it ignores the page
ranges and just flush entire TLB everytime.

Fix the sfence implementation by keeping all the tlb flush
info in scratch area.

The relevant Linux kernel code was added by
https://patchwork.kernel.org/project/linux-riscv/list/?series=89695

However, this patch is backward compatible with older version kernel
that doesn't have the above patches as well.

Fixes #87
Signed-off-by: Atish Patra <atish.patra@wdc.com>
5 years agolib: Create a sbi_ipi_data structure
Alistair Francis [Fri, 8 Mar 2019 19:22:22 +0000 (11:22 -0800)]
lib: Create a sbi_ipi_data structure

Create a sbi_ipi_data structure that holds unpacked IPI information. At
the same time remove ipi_type from the sbi_scratch struct and use a
fixed offset to access it.

This structure fits in behind the sbi_scratch structure.

This fixes https://github.com/riscv/opensbi/issues/81

Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
5 years agofirmware: Reset all registers and flush icache
Atish Patra [Wed, 6 Mar 2019 23:18:29 +0000 (15:18 -0800)]
firmware: Reset all registers and flush icache

A warm reset using reset button may put icache and registers
in non-coherent state.

Flush the icache and reset all registers for every hart.

Signed-off-by: Atish Patra <atish.patra@wdc.com>
5 years agofirmware: Add nop to reduce bus traffic.
Atish Patra [Wed, 6 Mar 2019 02:03:27 +0000 (18:03 -0800)]
firmware: Add nop to reduce bus traffic.

All the non-boot harts run in a tight loop which may cause a heavy load
on the memory bus. This may delay the boot hart to complete the cold boot
process.

Introduce few nop that will ease up the traffic.

Signed-off-by: Atish Patra <atish.patra@wdc.com>
5 years agoRevert "firmware: Add a barrier instruction for wait for boot hart"
Atish Patra [Wed, 6 Mar 2019 02:01:00 +0000 (18:01 -0800)]
Revert "firmware: Add a barrier instruction for wait for boot hart"

This reverts commit 05602e2bf4812533adcb7acb1a67e43726c0e7bb.

Introducing a fence causes warm reset issue to reappear. Revert it
for the time being.

5 years agoplatform: Make the `platform` read-only
Xiang Wang [Wed, 6 Mar 2019 07:29:34 +0000 (15:29 +0800)]
platform: Make the `platform` read-only

platform should be a read-only variable, if it is placed in the data
segment, it may be exploited.

Signed-off-by: Xiang Wang <wxjstz@126.com>
5 years agofirmware: Reset all the general purpose registers to zero.
Atish Patra [Mon, 4 Mar 2019 22:08:17 +0000 (14:08 -0800)]
firmware: Reset all the general purpose registers to zero.

A warm reset by pressing the reset button may not initialize all the
registers to zero. Do it for every hart during warm boot.

Signed-off-by: Atish Patra <atish.patra@wdc.com>
5 years agofirmware: Ensure the mtvec is updated.
Atish Patra [Wed, 27 Feb 2019 19:08:26 +0000 (11:08 -0800)]
firmware: Ensure the mtvec is updated.

Signed-off-by: Atish Patra <atish.patra@wdc.com>
5 years agofirmware: Fix a typo
Atish Patra [Thu, 28 Feb 2019 00:07:56 +0000 (16:07 -0800)]
firmware: Fix a typo

Signed-off-by: Atish Patra <atish.patra@wdc.com>
5 years agolib:platform: Fix sbi_getc return type.
Atish Patra [Thu, 28 Feb 2019 01:42:17 +0000 (17:42 -0800)]
lib:platform: Fix sbi_getc return type.

As per the current SBI specification, sbi_getc should return
an int instead of char.

In case of FIFO is empty, return -1 as per the specification.

Reported-by: Sergi Granell <xerpi.g.12@gmail.com>
Suggested-by:Thadeu Lima de Souza Cascardo <cascardo@cascardo.eti.br>
Signed-off-by: Atish Patra <atish.patra@wdc.com>
5 years agofirmware: Add a barrier instruction for wait for boot hart
Xiang Wang [Mon, 4 Mar 2019 09:22:37 +0000 (17:22 +0800)]
firmware: Add a barrier instruction for wait for boot hart

Multi-core communication via memory requires the addition of a barrier
instructions to ensure cache coherency.

Signed-off-by: Xiang Wang <wxjstz@126.com>
5 years agofirmware: Move _boot_hart_done to the data section
Xiang Wang [Mon, 4 Mar 2019 09:17:08 +0000 (17:17 +0800)]
firmware: Move _boot_hart_done to the data section

Writable code section can cause some security problems, so move _boot_hart_done
to the data section

Signed-off-by: Xiang Wang <wxjstz@126.com>
5 years agoAdd tags to .gitignore for being development friendly
Xiang Wang [Mon, 4 Mar 2019 03:20:58 +0000 (11:20 +0800)]
Add tags to .gitignore for being development friendly

Signed-off-by: Xiang Wang <wxjstz@126.com>
5 years agoFix missing quotes in Makefile
Andreas Schwab [Wed, 27 Feb 2019 11:57:56 +0000 (12:57 +0100)]
Fix missing quotes in Makefile

5 years agoFix makefile dependency generation
Andreas Schwab [Wed, 27 Feb 2019 11:53:07 +0000 (12:53 +0100)]
Fix makefile dependency generation

5 years agoinclude: Bump-up version to 0.3 v0.3
Anup Patel [Tue, 26 Feb 2019 16:54:59 +0000 (22:24 +0530)]
include: Bump-up version to 0.3

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

Signed-off-by: Anup Patel <anup.patel@wdc.com>
5 years agoMakefile: Set the platform variables before parsing the platforms
Alistair Francis [Fri, 22 Feb 2019 23:02:55 +0000 (15:02 -0800)]
Makefile: Set the platform variables before parsing the platforms

Ensure the platform variable PLATFORM_RISCV_XLEN is set before we parse
the platform files.

This fixes the 32-bit openSBI FW_JUMP_ADDR.

Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
5 years agoinclude: Bump-up version to 0.2 v0.2
Anup Patel [Fri, 22 Feb 2019 06:03:22 +0000 (11:33 +0530)]
include: Bump-up version to 0.2

This patch increases OpenSBI version to 0.2.

Signed-off-by: Anup Patel <anup.patel@wdc.com>
5 years agoscripts: Add script for creating binary archive
Anup Patel [Wed, 20 Feb 2019 08:48:12 +0000 (14:18 +0530)]
scripts: Add script for creating binary archive

This patch adds scripts/create-binary-archive.sh which helps
us create a common tarball containing headers, static library
and firmware ELFs for all platforms.

This script can be used for release purpose OR for compile
testing all platforms.

Example usage commands are as follows:

1) Binary release archive for 32bit systems
./scripts/create-binary-archive.sh -s "bin" -x 32 -d

2) Binary release archive for 64bit systems
./scripts/create-binary-archive.sh -s "bin" -d

3) Compile test for 32bit systems
./scripts/create-binary-archive.sh -x 32 -t

4) Compile test for 64bit systems
./scripts/create-binary-archive.sh -t

Signed-off-by: Anup Patel <anup.patel@wdc.com>
5 years agoMakefile: Rename compile_ld() to compile_elf()
Anup Patel [Wed, 20 Feb 2019 08:46:48 +0000 (14:16 +0530)]
Makefile: Rename compile_ld() to compile_elf()

The compile_ld() is actually used to create ELF files so
the name is misleading hence this patch renames it to
compile_elf(). We also rename LDFLAGS to ELFFLAGS because
these will be used for ELF creation only.

Signed-off-by: Anup Patel <anup.patel@wdc.com>
5 years agodoc: Fix root partition details for fu540.
Atish Patra [Fri, 22 Feb 2019 02:04:07 +0000 (18:04 -0800)]
doc: Fix root partition details for fu540.

Signed-off-by: Atish Patra <atish.patra@wdc.com>
5 years agofirmware: Improve low-level trap handler for M-mode to M-mode traps
Anup Patel [Tue, 19 Feb 2019 12:41:22 +0000 (18:11 +0530)]
firmware: Improve low-level trap handler for M-mode to M-mode traps

This patch extends our low-level trap handler in fw_base.S for
handling M-mode to M-mode traps without overwritting stack.

Signed-off-by: Anup Patel <anup.patel@wdc.com>
5 years agoinclude: Add PRILX define to help print unsigned long
Anup Patel [Tue, 19 Feb 2019 12:36:46 +0000 (18:06 +0530)]
include: Add PRILX define to help print unsigned long

The unsigned long is always machine word size. This means it is
4 bytes on 32bit system and 8 bytes on 64bit system.

This patch adds PRILX define for sbi_printf() which will help us
print unsigned long without worrying whether it is 32bit or 64bit
system.

Signed-off-by: Anup Patel <anup.patel@wdc.com>
5 years agotemplate: Fix some callback names
Sergi Granell [Tue, 19 Feb 2019 06:35:06 +0000 (07:35 +0100)]
template: Fix some callback names

5 years agotemplate: Remove trailing ';'
Sergi Granell [Mon, 18 Feb 2019 14:46:29 +0000 (15:46 +0100)]
template: Remove trailing ';'

5 years agotemplate: Fix typo in platform_final_init
Sergi Granell [Mon, 18 Feb 2019 14:40:25 +0000 (15:40 +0100)]
template: Fix typo in platform_final_init

There was a space instead of '_' in the function `platform_final_init`.

5 years agodocs: Update unleashed platform guide.
Atish Patra [Tue, 19 Feb 2019 07:18:04 +0000 (23:18 -0800)]
docs: Update unleashed platform guide.

Following updates to fu540 platform guide.

1. Update a section about flashing the firmware binary
to sdcard with correct partition identifier.
2. Refer the individual payload section.
3. Update uboot booting section.

Signed-off-by: Atish Patra <atish.patra@wdc.com>
5 years agodocs: Add a payload section describing different payloads.
Atish Patra [Tue, 19 Feb 2019 07:17:16 +0000 (23:17 -0800)]
docs: Add a payload section describing different payloads.

Signed-off-by: Atish Patra <atish.patra@wdc.com>
5 years agodocs: Wrap text to 80 columns.
Atish Patra [Sat, 16 Feb 2019 05:47:37 +0000 (21:47 -0800)]
docs: Wrap text to 80 columns.

Signed-off-by: Atish Patra <atish.patra@wdc.com>
5 years agodocs: Update about toolchain section.
Atish Patra [Sat, 16 Feb 2019 04:57:12 +0000 (20:57 -0800)]
docs: Update about toolchain section.

Signed-off-by: Atish Patra <atish.patra@wdc.com>
5 years agoMakefile: Use sed instead of awk to parse OpenSBI version
Anup Patel [Tue, 19 Feb 2019 07:45:35 +0000 (13:15 +0530)]
Makefile: Use sed instead of awk to parse OpenSBI version

This patch replaces use of awk with sed in top-level makefile
to parse OpenSBI version from include/sbi/sbi_version.h.

Signed-off-by: Anup Patel <anup.patel@wdc.com>
5 years agoMakefile: Fix error evaluating OPENSBI_CC_XLEN
Anup Patel [Mon, 18 Feb 2019 04:10:51 +0000 (09:40 +0530)]
Makefile: Fix error evaluating OPENSBI_CC_XLEN

We get following error evaluating OPENSBI_CC_XLEN on
Ubuntu-18.04:
/bin/sh: 1: Bad substitution

This patch fixes above error by using "awk" in string
assigned to OPENSBI_CC_XLEN and it also moves "Setup
compilation commands" before OPENSBI_CC_XLEN.

Signed-off-by: Anup Patel <anup.patel@wdc.com>
5 years agolib: Fix mask shift in sbi_ipi_send_many()
Anup Patel [Mon, 18 Feb 2019 13:09:02 +0000 (18:39 +0530)]
lib: Fix mask shift in sbi_ipi_send_many()

The mask shift in for-loop of sbi_ipi_send_many() is
broken with commit 918c1354b75c74b62f67c4e929551d643f035443
("lib: Improve delivery of SBI_IPI_EVENT_HALT")

This patch fix it.

Signed-off-by: Anup Patel <anup.patel@wdc.com>
5 years agolib: Fix small typo on sbi_ipi.c
Nick Kossifidis [Sun, 17 Feb 2019 21:43:41 +0000 (23:43 +0200)]
lib: Fix small typo on sbi_ipi.c

5 years agolib: Improve delivery of SBI_IPI_EVENT_HALT
Nick Kossifidis [Sun, 17 Feb 2019 07:00:20 +0000 (09:00 +0200)]
lib: Improve delivery of SBI_IPI_EVENT_HALT

When sbi_ipi_send_many gets called with the current hartid
included on pmask (or when pmask is NULL), and we send
a HALT event, since the for loop works sequentially over
all hartids on the mask, we may send a HALT event to the
current hart before the loop finishes. So we will halt
the current hart before it can deliver a HALT IPI to the
rest and some harts will remain active.

Make sure we send an IPI to the current hart after we've
finished with everybody else.

Signed-off-by: Nick Kossifidis <mick@ics.forth.gr>
5 years agoplatform: qemu-virt: Implement system shutdown
Nick Kossifidis [Sun, 17 Feb 2019 02:02:15 +0000 (04:02 +0200)]
platform: qemu-virt: Implement system shutdown

In order for QEMU to be compatible with Spike, it implements
a simple protocol used for reporting back the simulation's
status, through the memory-mapped "test finisher" device. We
use that protocol to make QEMU exit on system shutdown.

Signed-off-by: Nick Kossifidis <mick@ics.forth.gr>
5 years agolib: Send IPI for all harts to hang on system shutdown
Nick Kossifidis [Sun, 17 Feb 2019 01:52:44 +0000 (03:52 +0200)]
lib: Send IPI for all harts to hang on system shutdown

In case the platform specific method for shutting down
the system fails (or is not implemented), at least make
sure that all harts hang instead of just the current hart.

Signed-off-by: Nick Kossifidis <mick@ics.forth.gr>
5 years agoMakefile: Fix the assignment of OPENSBI_CC_XLEN
Alistair Francis [Fri, 15 Feb 2019 22:56:53 +0000 (14:56 -0800)]
Makefile: Fix the assignment of OPENSBI_CC_XLEN

Previously OPENSBI_CC_XLEN was not being correctly assigned either 32 or
64. It also was not assigned before config.mk was parsed. Ensure that it
will always be assigned.

Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
5 years agoMerge pull request #59 from avpatel/make-run
Alistair Francis [Fri, 15 Feb 2019 23:02:19 +0000 (15:02 -0800)]
Merge pull request #59 from avpatel/make-run

Add 'make run' command for platform specific run

5 years agoMakefile: Add 'make run' command for platform specific run
Olof Johansson [Fri, 15 Feb 2019 03:46:47 +0000 (09:16 +0530)]
Makefile: Add 'make run' command for platform specific run

Makes for easy and quick build-run one-stop command.

For now only added for qemu targets. It can be added for
any platform having simulator/emulator (such as QEMU).

Signed-off-by: Olof Johansson <olof@lixom.net>
Signed-off-by: Anup Patel <anup.patel@wdc.com>
5 years agodocs: fu540: Add steps for the Microsemi Expansion board
Alistair Francis [Tue, 12 Feb 2019 23:39:38 +0000 (15:39 -0800)]
docs: fu540: Add steps for the Microsemi Expansion board

Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
5 years agoplatform: fu540: Initial commit of Microsemi device tree
Alistair Francis [Mon, 11 Feb 2019 22:12:57 +0000 (14:12 -0800)]
platform: fu540: Initial commit of Microsemi device tree

Add a device tree for th HiFive Unleashed that includes the Microsemi
PCIe root complex.

Once we have support for u-boot and in tree Linux kernel device trees
this device tree should be removed.

Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
5 years agoplatform: fu540: Fix missing newline
Alistair Francis [Tue, 12 Feb 2019 23:31:14 +0000 (15:31 -0800)]
platform: fu540: Fix missing newline

Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
5 years agofirmware: Ensure the payloads are 4 bit alligned
Alistair Francis [Thu, 14 Feb 2019 22:47:41 +0000 (14:47 -0800)]
firmware: Ensure the payloads are 4 bit alligned

We expect the payloads to be 4 bit alligned as we later AND them
with ~0xf. As most of the addresses are manually specified we don't
really need this, but better to be over cautious.

Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
5 years agoMakefile: Make sure ld is always aware of the target abi/emulation
Nick Kossifidis [Thu, 14 Feb 2019 03:37:13 +0000 (05:37 +0200)]
Makefile: Make sure ld is always aware of the target abi/emulation

On Makefile merge_objs calls ld without providing any hints
on the target so on a multilib toolchain for example it will
always pick the default one (elf64-littleriscv) which will
then result a failure when compiling on RV32 since the objects
will be 32bits and the target will be 64bits. The same happens
on compile_ld that calls gcc without CFLAGS so it doesn't
get mabi/march.

With this patch OpenSBI compiles on RV32 (PLATFORM_RISCV_XLEN=32),
I tested fw_jump.elf on qemu (but it doesn't boot the kernel yet
-bbl also doesn't boot the kernel so it may be something else).

Signed-off-by: Nick Kossifidis <mickflemm@gmail.com>
5 years agofirmware: Use CSR_<FOO> instead of <foo> for csr*
Atish Patra [Wed, 13 Feb 2019 19:03:53 +0000 (11:03 -0800)]
firmware: Use CSR_<FOO> instead of <foo> for csr*

Some older toolchains may not have all the csr's defined. Update all
the csr functions to use the CSR_ #define values instead of the
toolchain defined values.

Signed-off-by: Atish Patra <atish.patra@wdc.com>
5 years agoplatform: Use CSR_<FOO> instead of <foo> for csr_*()
Atish Patra [Wed, 13 Feb 2019 02:32:58 +0000 (18:32 -0800)]
platform: Use CSR_<FOO> instead of <foo> for csr_*()

Some older toolchains may not have all the csr's defined. Update all
the csr functions to use the CSR_ #define values instead of the
toolchain defined values.

Suggested-by: Olof Johansson <olof@lixom.net>
Signed-off-by: Atish Patra <atish.patra@wdc.com>
5 years agolib: Use CSR_<FOO> instead of <foo> for csr_*()
Atish Patra [Wed, 13 Feb 2019 02:32:06 +0000 (18:32 -0800)]
lib: Use CSR_<FOO> instead of <foo> for csr_*()

Some older toolchains may not have all the csr's defined. Update all
the csr functions to use the CSR_ #define values instead of the
toolchain defined values.

Suggested-by: Olof Johansson <olof@lixom.net>
Signed-off-by: Atish Patra <atish.patra@wdc.com>
5 years agodocs: Use normal hyphen instead of non-breaking hyphen
Atish Patra [Tue, 12 Feb 2019 21:02:58 +0000 (13:02 -0800)]
docs: Use normal hyphen instead of non-breaking hyphen

Usage non-breaking hyphen breaks make docs as doxygen doesn't know
how to handle this.

Signed-off-by: Atish Patra <atish.patra@wdc.com>
5 years agoMakefile: Set ABI, ISA and Code Model in top-level make
Anup Patel [Fri, 8 Feb 2019 07:17:01 +0000 (12:47 +0530)]
Makefile: Set ABI, ISA and Code Model in top-level make

This patch introduces following optional PLATFORM options:
PLATFORM_RISCV_XLEN -> RISC-V register width
PLATFORM_RISCV_ABI -> RISC-V GCC ABI
PLATFORM_RISCV_ISA -> RISC-V GCC ISA string
PLATFORM_RISCV_CODE_MODEL -> RISC-V GCC Code Model

If the above options are not provided by platform config.mk
or by command-line parameters then:
1. PLATFORM_RISCV_XLEN will be determined using toolchain
capability
2. PLATFORM_RISCV_ABI, PLATFORM_RISCV_ISA, and
PLATFORM_RISCV_CODE_MODEL is set to value best suited for
generic libsbi.a

As a result of these optional PLATFORM options, the
platform-cflags-y and platform-asflags-y is further
simplified for platform config.mk.

Signed-off-by: Anup Patel <anup.patel@wdc.com>
5 years agoplatform: qemu: Set FW_JUMP_ADDR and FW_PAYLOAD_OFFSET as-per XLEN
Anup Patel [Fri, 8 Feb 2019 04:43:07 +0000 (10:13 +0530)]
platform: qemu: Set FW_JUMP_ADDR and FW_PAYLOAD_OFFSET as-per XLEN

The current 4MB aligned FW_JUMP_ADDR and FW_PAYLOAD_OFFSET breaks
U-Boot on QEMU virt and sifive_u machines.

Instead of using 4MB aligned for both 32bit and 64bit systems, we
use different values based compiler XLEN. Another advantage of this
approach will be that our fw_payload.bin will smaller for 64bit
systems.

Signed-off-by: Anup Patel <anup.patel@wdc.com>
5 years agoplatform: template: Improve comments for FW_JUMP_ADDR and FW_PAYLOAD_OFFSET
Anup Patel [Fri, 8 Feb 2019 04:16:12 +0000 (09:46 +0530)]
platform: template: Improve comments for FW_JUMP_ADDR and FW_PAYLOAD_OFFSET

Both FW_JUMP_ADDR and FW_PAYLOAD_OFFSET, should be:
1. 4MB aligned for 32bit system
2. 2MB aligned for 64bit system

Explicitly specify the above details in config.mk comments
for template platform.

Signed-off-by: Anup Patel <anup.patel@wdc.com>