[opensbi] create opensbi from T-Head official:
repo: https://github.com/T-head-Semi/opensbi commit: 89182b257c8798e15e4c685c1af0c2862d528d2a Change-Id: I7b39d66729e0108661a6f4c9e28acbdb303684ea
This commit is contained in:
84
opensbi/docs/contributing.md
Normal file
84
opensbi/docs/contributing.md
Normal file
@ -0,0 +1,84 @@
|
||||
OpenSBI Contribution Guideline
|
||||
==============================
|
||||
|
||||
All contributions to OpenSBI can be sent in the following ways:
|
||||
1. Email patches to the OpenSBI mailing list at `opensbi@lists.infradead.org`
|
||||
2. GitHub Pull Requests (PRs) to the [OpenSBI main repository]
|
||||
|
||||
To join the OpenSBI mailing list, please visit the [OpenSBI infradead page].
|
||||
|
||||
The OpenSBI maintainers prefer patches via the OpenSBI mailing list
|
||||
(option 1 above) so that they are visible to a wider audience. All
|
||||
accepted patches on the OpenSBI mailing list will be taken by any of
|
||||
the OpenSBI maintainers and merged into the [OpenSBI main repository]
|
||||
using GitHub PRs.
|
||||
|
||||
All contributed work must follow the following rules:
|
||||
1. OpenSBI code should be written in accordance to the [Linux coding style].
|
||||
2. This project embraces the [Developer Certificate of Origin (DCO)] for
|
||||
contributions. This means that you must agree to the following prior to
|
||||
submitting patches: if you agree with this developer certificate you
|
||||
acknowledge this by adding a Signed-off-by tag to your patch commit log.
|
||||
Every submitted patch must have this tag.
|
||||
3. A commit message must have a subject line, followed by a blank line,
|
||||
followed by a description of the patch content. A blank line and the author
|
||||
Signed-off-by tag must follow this description.
|
||||
4. A commit subject line must start with a prefix followed by a ":". Common
|
||||
prefixes are for example "lib:", "platform:", "firmware:", "docs:", "utils:"
|
||||
and "top:".
|
||||
5. Maintainers should use "Rebase and Merge" when using GitHub to merge pull
|
||||
requests to avoid creating unnecessary merge commits.
|
||||
6. Maintainers should avoid creating branches directly in the main
|
||||
riscv/opensbi repository. Instead prefer using a fork of the riscv/opensbi main
|
||||
repository and branches within that fork to create pull requests.
|
||||
7. A maintainer cannot merge his own pull requests in the riscv/opensbi main
|
||||
repository.
|
||||
8. A pull request must get at least one review from a maintainer.
|
||||
9. A pull request must spend at least 24 hours in review to allow for other
|
||||
developers to review.
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
Developer Certificate of Origin
|
||||
Version 1.1
|
||||
|
||||
Copyright (C) 2004, 2006 The Linux Foundation and its contributors.
|
||||
660 York Street, Suite 102,
|
||||
San Francisco, CA 94110 USA
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim copies of this
|
||||
license document, but changing it is not allowed.
|
||||
|
||||
|
||||
Developer's Certificate of Origin 1.1
|
||||
|
||||
By making a contribution to this project, I certify that:
|
||||
|
||||
(a) The contribution was created in whole or in part by me and I
|
||||
have the right to submit it under the open source license
|
||||
indicated in the file; or
|
||||
|
||||
(b) The contribution is based upon previous work that, to the best
|
||||
of my knowledge, is covered under an appropriate open source
|
||||
license and I have the right under that license to submit that
|
||||
work with modifications, whether created in whole or in part
|
||||
by me, under the same open source license (unless I am
|
||||
permitted to submit under a different license), as indicated
|
||||
in the file; or
|
||||
|
||||
(c) The contribution was provided directly to me by some other
|
||||
person who certified (a), (b) or (c) and I have not modified
|
||||
it.
|
||||
|
||||
(d) I understand and agree that this project and the contribution
|
||||
are public and that a record of the contribution (including all
|
||||
personal information I submit with it, including my sign-off) is
|
||||
maintained indefinitely and may be redistributed consistent with
|
||||
this project or the open source license(s) involved.
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
[OpenSBI main repository]: https://github.com/riscv/opensbi
|
||||
[OpenSBI infradead page]: http://lists.infradead.org/mailman/listinfo/opensbi
|
||||
[Linux coding style]: https://www.kernel.org/doc/html/v4.10/process/coding-style.html
|
||||
[Developer Certificate of Origin (DCO)]: http://developercertificate.org/
|
||||
314
opensbi/docs/domain_support.md
Normal file
314
opensbi/docs/domain_support.md
Normal file
@ -0,0 +1,314 @@
|
||||
OpenSBI Domain Support
|
||||
======================
|
||||
|
||||
An OpenSBI domain is a system-level partition (subset) of underlying hardware
|
||||
having it's own memory regions (RAM and MMIO devices) and HARTs. The OpenSBI
|
||||
will try to achieve secure isolation between domains using RISC-V platform
|
||||
features such as PMP, ePMP, IOPMP, SiFive Shield, etc.
|
||||
|
||||
Important entities which help implement OpenSBI domain support are:
|
||||
|
||||
* **struct sbi_domain_memregion** - Representation of a domain memory region
|
||||
* **struct sbi_hartmask** - Representation of domain HART set
|
||||
* **struct sbi_domain** - Representation of a domain instance
|
||||
|
||||
Each HART of a RISC-V platform must have an OpenSBI domain assigned to it.
|
||||
The OpenSBI platform support is responsible for populating domains and
|
||||
providing HART id to domain mapping. The OpenSBI domain support will by
|
||||
default assign **the ROOT domain** to all HARTs of a RISC-V platform so
|
||||
it is not mandatory for the OpenSBI platform support to populate domains.
|
||||
|
||||
Domain Memory Region
|
||||
--------------------
|
||||
|
||||
A domain memory region is represented by **struct sbi_domain_memregion** in
|
||||
OpenSBI and has following details:
|
||||
|
||||
* **order** - The size of a memory region is **2 ^ order** where **order**
|
||||
must be **3 <= order <= __riscv_xlen**
|
||||
* **base** - The base address of a memory region is **2 ^ order**
|
||||
aligned start address
|
||||
* **flags** - The flags of a memory region represent memory type (i.e.
|
||||
RAM or MMIO) and allowed accesses (i.e. READ, WRITE, EXECUTE, etc)
|
||||
|
||||
Domain Instance
|
||||
---------------
|
||||
|
||||
A domain instance is represented by **struct sbi_domain** in OpenSBI and
|
||||
has following details:
|
||||
|
||||
* **index** - Logical index of this domain
|
||||
* **name** - Name of this domain
|
||||
* **assigned_harts** - HARTs assigned to this domain
|
||||
* **possible_harts** - HARTs possible in this domain
|
||||
* **regions** - Array of memory regions terminated by a memory region
|
||||
with order zero
|
||||
* **boot_hartid** - HART id of the HART booting this domain. The domain
|
||||
boot HART will be started at boot-time if boot HART is possible and
|
||||
assigned for this domain.
|
||||
* **next_addr** - Address of the next booting stage for this domain
|
||||
* **next_arg1** - Arg1 (or 'a1' register) of the next booting stage for
|
||||
this domain
|
||||
* **next_mode** - Privilege mode of the next booting stage for this
|
||||
domain. This can be either S-mode or U-mode.
|
||||
* **system_reset_allowed** - Is domain allowed to reset the system?
|
||||
|
||||
The memory regions represented by **regions** in **struct sbi_domain** have
|
||||
following additional constraints to align with RISC-V PMP requirements:
|
||||
|
||||
* A memory region to protect OpenSBI firmware from S-mode and U-mode
|
||||
should always be present
|
||||
* For two overlapping memory regions, one should be sub-region of another
|
||||
* Two overlapping memory regions should not be of same size
|
||||
* Two overlapping memory regions cannot have same flags
|
||||
* Memory access checks on overlapping address should prefer smallest
|
||||
overlapping memory region flags.
|
||||
|
||||
ROOT Domain
|
||||
-----------
|
||||
|
||||
**The ROOT domain** is the default OpenSBI domain which is assigned by
|
||||
default to all HARTs of a RISC-V platform. The OpenSBI domain support
|
||||
will hand-craft **the ROOT domain** very early at boot-time in the
|
||||
following manner:
|
||||
|
||||
* **index** - Logical index of the ROOT domain is always zero
|
||||
* **name** - Name of the ROOT domain is "root"
|
||||
* **assigned_harts** - At boot-time all valid HARTs of a RISC-V platform
|
||||
are assigned the ROOT domain which changes later based on OpenSBI
|
||||
platform support
|
||||
* **possible_harts** - All valid HARTs of a RISC-V platform are possible
|
||||
HARTs of the ROOT domain
|
||||
* **regions** - Two memory regions available to the ROOT domain:
|
||||
**A)** A memory region to protect OpenSBI firmware from S-mode and U-mode
|
||||
**B)** A memory region of **order=__riscv_xlen** allowing S-mode and
|
||||
U-mode access to full memory address space
|
||||
* **boot_hartid** - Coldboot HART is the HART booting the ROOT domain
|
||||
* **next_addr** - Next booting stage address in coldboot HART scratch
|
||||
space is the next address for the ROOT domain
|
||||
* **next_arg1** - Next booting stage arg1 in coldboot HART scratch space
|
||||
is the next arg1 for the ROOT domain
|
||||
* **next_mode** - Next booting stage mode in coldboot HART scratch space
|
||||
is the next mode for the ROOT domain
|
||||
* **system_reset_allowed** - The ROOT domain is allowed to reset the system
|
||||
|
||||
Domain Effects
|
||||
--------------
|
||||
|
||||
Few noteworthy effects of a system partitioned into domains are as follows:
|
||||
|
||||
* At any point in time, a HART is running in exactly one OpenSBI domain context
|
||||
* The SBI IPI and RFENCE calls from HART A are restricted to the HARTs in
|
||||
domain assigned to HART A
|
||||
* The SBI HSM calls which try to change/read state of HART B from HART A will
|
||||
only work if both HART A and HART B are assigned same domain
|
||||
* A HART running in S-mode or U-mode can only access memory based on the
|
||||
memory regions of the domain assigned to the HART
|
||||
|
||||
Domain Device Tree Bindings
|
||||
---------------------------
|
||||
|
||||
The OpenSBI domains can be described in the **device tree (DT) blob** (or
|
||||
flattened device tree) passed to the OpenSBI firmwares by the previous
|
||||
booting stage. This allows OpenSBI platform support to parse and populate
|
||||
OpenSBI domains from the device tree blob (or flattened device tree).
|
||||
|
||||
### Domain Configuration Node
|
||||
|
||||
All OpenSBI domain description related DT nodes should be under the domain
|
||||
configuration DT node. The **/chosen** DT node is the preferred parent of
|
||||
the domain configuration DT node.
|
||||
|
||||
The DT properties of a domain configuration DT node are as follows:
|
||||
|
||||
* **compatible** (Mandatory) - The compatible string of the domain
|
||||
configuration. This DT property should have value *"opensbi,domain,config"*
|
||||
|
||||
### Domain Memory Region Node
|
||||
|
||||
The domain memory region DT node describes details of a memory region and
|
||||
can be pointed by multiple domain instance DT nodes. The access permissions
|
||||
of the memory region are specified separately in domain instance node.
|
||||
|
||||
The DT properties of a domain memory region DT node are as follows:
|
||||
|
||||
* **compatible** (Mandatory) - The compatible string of the domain memory
|
||||
region. This DT property should have value *"opensbi,domain,memregion"*
|
||||
* **base** (Mandatory) - The base address of the domain memory region. This
|
||||
DT property should have a **2 ^ order** aligned 64 bit address (i.e. two
|
||||
DT cells).
|
||||
* **order** (Mandatory) - The order of the domain memory region. This DT
|
||||
property should have a 32 bit value (i.e. one DT cell) in the range
|
||||
**3 <= order <= __riscv_xlen**.
|
||||
* **mmio** (Optional) - A boolean flag representing whether the domain
|
||||
memory region is a memory-mapped I/O (MMIO) region.
|
||||
* **devices** (Optional) - The list of device DT node phandles for devices
|
||||
which fall under this domain memory region.
|
||||
|
||||
### Domain Instance Node
|
||||
|
||||
The domain instance DT node describes set of possible HARTs, set of memory
|
||||
regions, and other details of a domain instance.
|
||||
|
||||
The DT properties of a domain instance DT node are as follows:
|
||||
|
||||
* **compatible** (Mandatory) - The compatible string of the domain instance.
|
||||
This DT property should have value *"opensbi,domain,instance"*
|
||||
* **possible-harts** (Optional) - The list of CPU DT node phandles for the
|
||||
the domain instance. This list represents the possible HARTs of the
|
||||
domain instance.
|
||||
* **regions** (Optional) - The list of domain memory region DT node phandle
|
||||
and access permissions for the domain instance. Each list entry is a pair
|
||||
of DT node phandle and access permissions. The access permissions are
|
||||
represented as a 32bit bitmask having bits: **readable** (BIT[0]),
|
||||
**writeable** (BIT[1]), **executable** (BIT[2]), and **m-mode** (BIT[3]).
|
||||
* **boot-hart** (Optional) - The DT node phandle of the HART booting the
|
||||
domain instance. If coldboot HART is assigned to the domain instance then
|
||||
this DT property is ignored and the coldboot HART is assumed to be the
|
||||
boot HART of the domain instance.
|
||||
* **next-arg1** (Optional) - The 64 bit next booting stage arg1 for the
|
||||
domain instance. If this DT property is not available and coldboot HART
|
||||
is not assigned to the domain instance then **0x0** is used as default
|
||||
value. If this DT property is not available and coldboot HART is assigned
|
||||
to the domain instance then **next booting stage arg1 of coldboot HART**
|
||||
is used as default value.
|
||||
* **next-addr** (Optional) - The 64 bit next booting stage address for the
|
||||
domain instance. If this DT property is not available and coldboot HART
|
||||
is not assigned to the domain instance then **0x0** is used as default
|
||||
value. If this DT property is not available and coldboot HART is assigned
|
||||
to the domain instance then **next booting stage address of coldboot HART**
|
||||
is used as default value.
|
||||
* **next-mode** (Optional) - The 32 bit next booting stage mode for the
|
||||
domain instance. The possible values of this DT property are: **0x1**
|
||||
(s-mode), and **0x0** (u-mode). If this DT property is not available
|
||||
and coldboot HART is not assigned to the domain instance then **0x1**
|
||||
is used as default value. If this DT property is not available and
|
||||
coldboot HART is assigned to the domain instance then **next booting
|
||||
stage mode of coldboot HART** is used as default value.
|
||||
* **system-reset-allowed** (Optional) - A boolean flag representing
|
||||
whether the domain instance is allowed to do system reset.
|
||||
|
||||
### Assigning HART To Domain Instance
|
||||
|
||||
By default, all HARTs are assigned to **the ROOT domain**. The OpenSBI
|
||||
platform support can provide the HART to domain instance assignment using
|
||||
platform specific callback.
|
||||
|
||||
The HART to domain instance assignment can be parsed from the device tree
|
||||
using optional DT property **opensbi,domain** in each CPU DT node. The
|
||||
value of DT property **opensbi,domain** is the DT phandle of the domain
|
||||
instance DT node. If **opensbi,domain** DT property is not specified then
|
||||
corresponding HART is assigned to **the ROOT domain**.
|
||||
|
||||
### Domain Configuration Only Accessible to OpenSBI
|
||||
|
||||
The software running inside a domain instance should only be aware of
|
||||
devices and hardware resources accessible to itself.
|
||||
|
||||
To hide domain configuration from domain instances, the following should
|
||||
be done:
|
||||
|
||||
* The previous booting stage should preferably provide a separate device
|
||||
tree for each domain instance and mention location of device tree in
|
||||
respective domain instance DT nodes using **next-arg1** DT property.
|
||||
* If domain assigned to a HART does not have separate device tree then
|
||||
OpenSBI platform support should remove all domain configuration details
|
||||
from the device tree passed by previous booting stage before passing it
|
||||
to the next booting stage.
|
||||
|
||||
### Example
|
||||
|
||||
```
|
||||
chosen {
|
||||
opensbi-domains {
|
||||
compatible = "opensbi,domain,config";
|
||||
|
||||
tmem: tmem {
|
||||
compatible = "opensbi,domain,memregion";
|
||||
base = <0x0 0x80100000>;
|
||||
order = <20>;
|
||||
};
|
||||
|
||||
tuart: tuart {
|
||||
compatible = "opensbi,domain,memregion";
|
||||
base = <0x0 0x10011000>;
|
||||
order = <12>;
|
||||
mmio;
|
||||
devices = <&uart1>;
|
||||
};
|
||||
|
||||
allmem: allmem {
|
||||
compatible = "opensbi,domain,memregion";
|
||||
base = <0x0 0x0>;
|
||||
order = <64>;
|
||||
};
|
||||
|
||||
tdomain: trusted-domain {
|
||||
compatible = "opensbi,domain,instance";
|
||||
possible-harts = <&cpu0>;
|
||||
regions = <&tmem 0x7>, <&tuart 0x7>;
|
||||
boot-hart = <&cpu0>;
|
||||
next-arg1 = <0x0 0x0>;
|
||||
next-addr = <0x0 0x80100000>;
|
||||
next-mode = <0x0>;
|
||||
system-reset-allowed;
|
||||
};
|
||||
|
||||
udomain: untrusted-domain {
|
||||
compatible = "opensbi,domain,instance";
|
||||
possible-harts = <&cpu1 &cpu2 &cpu3 &cpu4>;
|
||||
regions = <&tmem 0x0>, <&tuart 0x0>, <&allmem 0x7>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
cpus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
timebase-frequency = <10000000>;
|
||||
|
||||
cpu0: cpu@0 {
|
||||
device_type = "cpu";
|
||||
reg = <0x00>;
|
||||
compatible = "riscv";
|
||||
opensbi-domain = <&tdomain>;
|
||||
...
|
||||
};
|
||||
|
||||
cpu1: cpu@1 {
|
||||
device_type = "cpu";
|
||||
reg = <0x01>;
|
||||
compatible = "riscv";
|
||||
opensbi-domain = <&udomain>;
|
||||
...
|
||||
};
|
||||
|
||||
cpu2: cpu@2 {
|
||||
device_type = "cpu";
|
||||
reg = <0x02>;
|
||||
compatible = "riscv";
|
||||
opensbi-domain = <&udomain>;
|
||||
...
|
||||
};
|
||||
|
||||
cpu3: cpu@3 {
|
||||
device_type = "cpu";
|
||||
reg = <0x03>;
|
||||
compatible = "riscv";
|
||||
opensbi-domain = <&udomain>;
|
||||
...
|
||||
};
|
||||
|
||||
cpu4: cpu@4 {
|
||||
device_type = "cpu";
|
||||
reg = <0x04>;
|
||||
compatible = "riscv";
|
||||
opensbi-domain = <&udomain>;
|
||||
...
|
||||
};
|
||||
};
|
||||
|
||||
uart1: serial@10011000 {
|
||||
...
|
||||
};
|
||||
```
|
||||
2462
opensbi/docs/doxygen.cfg
Normal file
2462
opensbi/docs/doxygen.cfg
Normal file
File diff suppressed because it is too large
Load Diff
32
opensbi/docs/external/coreboot.md
vendored
Normal file
32
opensbi/docs/external/coreboot.md
vendored
Normal file
@ -0,0 +1,32 @@
|
||||
OpenSBI as coreboot payload
|
||||
===========================
|
||||
|
||||
[coreboot] is a free/libre and open source firmware platform support multiple
|
||||
hardware architectures(x86, ARMv7, arm64, PowerPC64, MIPS and RISC-V) and
|
||||
diverse hardware models. In RISC-V world, coreboot currently support HiFive
|
||||
Unleashed with OpenSBI as a payload to boot GNU/Linux:
|
||||
|
||||
```
|
||||
SiFive HiFive unleashed's original firmware boot process:
|
||||
+-----------+
|
||||
+------+ +------+ +------+ | BBL |
|
||||
| MSEL |--->| ZSBL |--->| FSBL |--->| +-------+
|
||||
+------+ +------+ +------+ | | linux |
|
||||
+---+-------+
|
||||
|
||||
coreboot boot process:
|
||||
+---------------------------------------------------------------------+
|
||||
| coreboot |
|
||||
+------+ +------+ | +-----------+ +----------+ +----------+ +-----------------------+
|
||||
| MSEL |-->| ZSBL |-->| | bootblock |->| romstage |->| ramstage |->| payload ( OpenSBI) |
|
||||
+------+ +------+ | +-----------+ +----------+ +----------+ | +-------+ |
|
||||
| | | linux | |
|
||||
+---------------------------------------------+-------------+-------+-+
|
||||
```
|
||||
|
||||
The upstreaming work is still in progress. There's a [documentation] about how
|
||||
to build [out-of-tree code] to load OpenSBI.
|
||||
|
||||
[coreboot]: https://www.coreboot.org/
|
||||
[documentation]: https://github.com/hardenedlinux/embedded-iot_profile/blob/master/docs/riscv/hifiveunleashed_coreboot_notes-en.md
|
||||
[out-of-tree code]: https://github.com/hardenedlinux/coreboot-HiFiveUnleashed
|
||||
111
opensbi/docs/firmware/fw.md
Normal file
111
opensbi/docs/firmware/fw.md
Normal file
@ -0,0 +1,111 @@
|
||||
OpenSBI Platform Firmwares
|
||||
==========================
|
||||
|
||||
OpenSBI provides firmware builds for specific platforms. Different types of
|
||||
firmwares are supported to deal with the differences between different platforms
|
||||
early boot stage. All firmwares will execute the same initialization procedure
|
||||
of the platform hardware according to the platform specific code as well as
|
||||
OpenSBI generic library code. The supported firmwares type will differ in how
|
||||
the arguments passed by the platform early boot stage are handled, as well as
|
||||
how the boot stage following the firmware will be handled and executed.
|
||||
|
||||
OpenSBI currently supports three different types of firmwares.
|
||||
|
||||
Firmware with Dynamic Information (*FW_DYNAMIC*)
|
||||
------------------------------------------------
|
||||
|
||||
The *FW_DYNAMIC* firmware gets information about the next booting stage entry,
|
||||
e.g. a bootloader or an OS kernel, from previous booting stage at runtime.
|
||||
|
||||
A *FW_DYNAMIC* firmware is particularly useful when the booting stage executed
|
||||
prior to OpenSBI firmware is capable of loading both the OpenSBI firmware
|
||||
and the booting stage binary to follow OpenSBI firmware.
|
||||
|
||||
Firmware with Jump Address (*FW_JUMP*)
|
||||
--------------------------------------
|
||||
|
||||
The *FW_JUMP* firmware assumes a fixed address of the next booting stage
|
||||
entry, e.g. a bootloader or an OS kernel, without directly including the
|
||||
binary code for this next stage.
|
||||
|
||||
A *FW_JUMP* firmware is particularly useful when the booting stage executed
|
||||
prior to OpenSBI firmware is capable of loading both the OpenSBI firmware
|
||||
and the booting stage binary to follow OpenSBI firmware.
|
||||
|
||||
Firmware with Payload (*FW_PAYLOAD*)
|
||||
------------------------------------
|
||||
|
||||
The *FW_PAYLOAD* firmware directly includes the binary code for the booting
|
||||
stage to follow OpenSBI firmware execution. Typically, this payload will be a
|
||||
bootloader or an OS kernel.
|
||||
|
||||
A *FW_PAYLOAD* firmware is particularly useful when the booting stage executed
|
||||
prior to OpenSBI firmware is not capable of loading both OpenSBI firmware and
|
||||
the booting stage to follow OpenSBI firmware.
|
||||
|
||||
A *FW_PAYLOAD* firmware is also useful for cases where the booting stage prior
|
||||
to OpenSBI firmware does not pass a *flattened device tree (FDT file)*. In such
|
||||
case, a *FW_PAYLOAD* firmware allows embedding a flattened device tree in the
|
||||
.text section of the final firmware.
|
||||
|
||||
Firmware Configuration and Compilation
|
||||
--------------------------------------
|
||||
|
||||
All firmware types support the following common compile time configuration
|
||||
parameters:
|
||||
|
||||
* **FW_TEXT_ADDR** - Defines the execution address of the OpenSBI firmware.
|
||||
This configuration parameter is mandatory.
|
||||
* **FW_FDT_PATH** - Path to an external flattened device tree binary file to
|
||||
be embedded in the *.rodata* section of the final firmware. If this option
|
||||
is not provided then the firmware will expect the FDT to be passed as an
|
||||
argument by the prior booting stage.
|
||||
* **FW_FDT_PADDING** - Optional zero bytes padding to the embedded flattened
|
||||
device tree binary file specified by **FW_FDT_PATH** option.
|
||||
|
||||
Additionally, each firmware type as a set of type specific configuration
|
||||
parameters. Detailed information for each firmware type can be found in the
|
||||
following documents.
|
||||
|
||||
* *[FW_DYNAMIC]*: The *Firmware with Dynamic Information (FW_DYNAMIC)* is
|
||||
described in more details in the file *fw_dynamic.md*.
|
||||
* *[FW_JUMP]*: The *Firmware with Jump Address (FW_JUMP)* is described in more
|
||||
details in the file *fw_jump.md*.
|
||||
* *[FW_PAYLOAD]*: The *Firmware with Payload (FW_PAYLOAD)* is described in more
|
||||
details in the file *fw_payload.md*.
|
||||
|
||||
[FW_DYNAMIC]: fw_dynamic.md
|
||||
[FW_JUMP]: fw_jump.md
|
||||
[FW_PAYLOAD]: fw_payload.md
|
||||
|
||||
Providing different payloads to OpenSBI Firmware
|
||||
------------------------------------------------
|
||||
OpenSBI firmware can accept various payloads using a compile time option.
|
||||
Typically, these payloads refer to the next stage boot loader (e.g. U-Boot)
|
||||
or operating system kernel images (e.g. Linux). By default, OpenSBI
|
||||
automatically provides a test payload if no specific payload is specified
|
||||
at compile time.
|
||||
|
||||
To specify a payload at compile time, the make variable _FW_PAYLOAD_PATH_ is
|
||||
used.
|
||||
```
|
||||
make PLATFORM=<platform_subdir> FW_PAYLOAD_PATH=<payload path>
|
||||
```
|
||||
The instructions to build each payload is different and the details can
|
||||
be found in the
|
||||
*docs/firmware/payload_<payload_name>.md* files.
|
||||
|
||||
Options for OpenSBI Firmware behaviors
|
||||
--------------------------------------
|
||||
An optional compile time flag FW_OPTIONS can be used to control the OpenSBI
|
||||
firmware run-time behaviors.
|
||||
|
||||
```
|
||||
make PLATFORM=<platform_subdir> FW_OPTIONS=<options>
|
||||
```
|
||||
|
||||
FW_OPTIONS is a bitwise or'ed value of various options, eg: *FW_OPTIONS=0x1*
|
||||
stands for disabling boot prints from the OpenSBI library.
|
||||
|
||||
For all supported options, please check "enum sbi_scratch_options" in the
|
||||
*include/sbi/sbi_scratch.h* header file.
|
||||
35
opensbi/docs/firmware/fw_dynamic.md
Normal file
35
opensbi/docs/firmware/fw_dynamic.md
Normal file
@ -0,0 +1,35 @@
|
||||
OpenSBI Firmware with Dynamic Information (FW_DYNAMIC)
|
||||
======================================================
|
||||
|
||||
OpenSBI **firmware with dynamic info (FW_DYNAMIC)** is a firmware which gets
|
||||
information about next booting stage (e.g. a bootloader or an OS) and runtime
|
||||
OpenSBI library options from previous booting stage.
|
||||
|
||||
The previous booting stage will pass information to *FW_DYNAMIC* by creating
|
||||
*struct fw_dynamic_info* in memory and passing it's address to *FW_DYNAMIC*
|
||||
via *a2* register of RISC-V CPU.
|
||||
|
||||
A *FW_DYNAMIC* firmware is particularly useful when the booting stage executed
|
||||
prior to OpenSBI firmware is capable of loading both the OpenSBI firmware and
|
||||
the booting stage binary to follow OpenSBI firmware.
|
||||
|
||||
*FW_DYNAMIC* Compilation
|
||||
------------------------
|
||||
|
||||
A platform can enable *FW_DYNAMIC* firmware using any of the following methods.
|
||||
|
||||
1. Specifying `FW_DYNAMIC=y` on the top level `make` command line.
|
||||
2. Specifying `FW_DYNAMIC=y` in the target platform *config.mk* configuration
|
||||
file.
|
||||
|
||||
The compiled *FW_DYNAMIC* firmware ELF file is named *fw_dynamic.elf*. It's
|
||||
expanded image file is *fw_dynamic.bin*. Both files are created in the platform
|
||||
specific build directory under the *build/platform/<platform_subdir>/firmware*
|
||||
directory.
|
||||
|
||||
*FW_DYNAMIC* Firmware Configuration Options
|
||||
-------------------------------------------
|
||||
|
||||
The *FW_DYNAMIC* firmware does not requires any platform specific configuration
|
||||
parameters because all required information is passed by previous booting stage
|
||||
at runtime via *struct fw_dynamic_info*.
|
||||
51
opensbi/docs/firmware/fw_jump.md
Normal file
51
opensbi/docs/firmware/fw_jump.md
Normal file
@ -0,0 +1,51 @@
|
||||
OpenSBI Firmware with Jump Address (FW_JUMP)
|
||||
============================================
|
||||
|
||||
OpenSBI **firmware with Jump Address (FW_JUMP)** is a firmware which only
|
||||
handles the address of the next booting stage entry, e.g. a bootloader or an OS
|
||||
kernel, without directly including the binary code for this next stage.
|
||||
|
||||
A *FW_JUMP* firmware is particularly useful when the booting stage executed
|
||||
prior to the OpenSBI firmware is capable of loading both the OpenSBI firmware
|
||||
and the booting stage binary to follow the OpenSBI firmware.
|
||||
|
||||
*FW_JUMP* Compilation
|
||||
---------------------
|
||||
|
||||
A platform *FW_JUMP* firmware can be enabled by any of the following methods:
|
||||
|
||||
1. Specifying `FW_JUMP=y` on the top level `make` command line.
|
||||
2. Specifying `FW_JUMP=y` in the target platform *config.mk* configuration file.
|
||||
|
||||
The compiled *FW_JUMP* firmware ELF file is named *fw_jump.elf*. Its expanded
|
||||
image file is *fw_jump.bin*. Both files are created in the platform-specific
|
||||
build directory under the *build/platform/<platform_subdir>/firmware* directory.
|
||||
|
||||
*FW_JUMP* Firmware Configuration Options
|
||||
----------------------------------------
|
||||
|
||||
To operate correctly, a *FW_JUMP* firmware requires some configuration
|
||||
parameters to be defined using either the top level `make` command line or the
|
||||
target platform *config.mk* configuration file. The possible parameters are as
|
||||
follows:
|
||||
|
||||
* **FW_JUMP_ADDR** - Address of the entry point of the booting stage to be
|
||||
executed following OpenSBI firmware. This address generally corresponds
|
||||
exactly to the address where this next booting stage was loaded. This is a
|
||||
mandatory parameter. Compilation errors will result from not defining this
|
||||
address.
|
||||
|
||||
* **FW_JUMP_FDT_ADDR** - Address where the *flattened device tree (FDT file)*
|
||||
passed by the prior booting stage will be placed in memory before executing
|
||||
the booting stage following the OpenSBI firmware. If this option is not
|
||||
provided, then the OpenSBI firmware will pass the FDT address passed by the
|
||||
previous booting stage to the next booting stage.
|
||||
|
||||
*FW_JUMP* Example
|
||||
-----------------
|
||||
|
||||
The *[qemu/virt]* platform illustrates how to configure and use a *FW_JUMP*
|
||||
firmware. Detailed information regarding these platforms can be found in the
|
||||
platform documentation files.
|
||||
|
||||
[qemu/virt]: ../platform/qemu_virt.md
|
||||
72
opensbi/docs/firmware/fw_payload.md
Normal file
72
opensbi/docs/firmware/fw_payload.md
Normal file
@ -0,0 +1,72 @@
|
||||
OpenSBI Firmware with Payload (FW_PAYLOAD)
|
||||
==========================================
|
||||
|
||||
OpenSBI **firmware with Payload (FW_PAYLOAD)** is a firmware which directly
|
||||
includes the binary for the booting stage to follow the OpenSBI firmware
|
||||
execution. Typically, this payload will be a bootloader or an OS kernel.
|
||||
|
||||
A *FW_PAYLOAD* firmware is particularly useful when the booting stage executed
|
||||
prior to the OpenSBI firmware is not capable of loading both the OpenSBI
|
||||
firmware and the booting stage to follow OpenSBI firmware.
|
||||
|
||||
A *FW_PAYLOAD* firmware is also useful for cases where the booting stage prior
|
||||
to the OpenSBI firmware does not pass a *flattened device tree (FDT file)*. In
|
||||
such a case, a *FW_PAYLOAD* firmware allows embedding a flattened device tree
|
||||
in the .text section of the final firmware.
|
||||
|
||||
Enabling *FW_PAYLOAD* compilation
|
||||
---------------------------------
|
||||
|
||||
The *FW_PAYLOAD* firmware can be enabled by any of the following methods:
|
||||
|
||||
1. Specifying `FW_PAYLOAD=y` on the top level `make` command line.
|
||||
2. Specifying `FW_PAYLOAD=y` in the target platform *config.mk* configuration
|
||||
file.
|
||||
|
||||
The compiled *FW_PAYLOAD* firmware ELF file is named *fw_jump.elf*. Its
|
||||
expanded image file is *fw_payload.bin*. Both files are created in the
|
||||
platform-specific build directory under the
|
||||
*build/platform/<platform_subdir>/firmware* directory.
|
||||
|
||||
Configuration Options
|
||||
---------------------
|
||||
|
||||
A *FW_PAYLOAD* firmware is built according to configuration parameters and
|
||||
options. These configuration parameters can be defined using either the top
|
||||
level `make` command line or the target platform *config.mk* configuration
|
||||
file. The parameters currently defined are as follows:
|
||||
|
||||
* **FW_PAYLOAD_OFFSET** - Offset from *FW_TEXT_BASE* where the payload binary
|
||||
will be linked in the final *FW_PAYLOAD* firmware binary image. This
|
||||
configuration parameter is mandatory if *FW_PAYLOAD_ALIGN* is not defined.
|
||||
Compilation errors will result from an incorrect definition of
|
||||
*FW_PAYLOAD_OFFSET* or of *FW_PAYLOAD_ALIGN*, or if neither of these
|
||||
parameters are defined.
|
||||
|
||||
* **FW_PAYLOAD_ALIGN** - Address alignment constraint where the payload binary
|
||||
will be linked after the end of the base firmware binary in the final
|
||||
*FW_PAYLOAD* firmware binary image. This configuration parameter is mandatory
|
||||
if *FW_PAYLOAD_OFFSET* is not defined. If both *FW_PAYLOAD_OFFSET* and
|
||||
*FW_PAYLOAD_ALIGN* are defined, *FW_PAYLOAD_OFFSET* is used and
|
||||
*FW_PAYLOAD_ALIGN* is ignored.
|
||||
|
||||
* **FW_PAYLOAD_PATH** - Path to the image file of the next booting stage
|
||||
binary. If this option is not provided then a simple test payload is
|
||||
automatically generated and used as a payload. This test payload executes
|
||||
an infinite `while (1)` loop after printing a message on the platform console.
|
||||
|
||||
* **FW_PAYLOAD_FDT_ADDR** - Address where the FDT passed by the prior booting
|
||||
stage or specified by the *FW_FDT_PATH* parameter and embedded in the
|
||||
*.rodata* section will be placed before executing the next booting stage,
|
||||
that is, the payload firmware. If this option is not provided, then the
|
||||
firmware will pass the FDT address passed by the previous booting stage
|
||||
to the next booting stage.
|
||||
|
||||
*FW_PAYLOAD* Example
|
||||
--------------------
|
||||
|
||||
The *[qemu/virt]* platforms illustrate how to configure and use a *FW_PAYLOAD*
|
||||
firmware. Detailed information regarding these platforms can be found in the
|
||||
platform documentation files.
|
||||
|
||||
[qemu/virt]: ../platform/qemu_virt.md
|
||||
9
opensbi/docs/firmware/payload_linux.md
Normal file
9
opensbi/docs/firmware/payload_linux.md
Normal file
@ -0,0 +1,9 @@
|
||||
Linux as a direct payload to OpenSBI
|
||||
====================================
|
||||
|
||||
OpenSBI has the capability to load a Linux kernel image directly in supervisor
|
||||
mode. The flattened image generated by the Linux kernel build process can be
|
||||
provided as a payload to OpenSBI.
|
||||
|
||||
Detailed examples can be found in both the [QEMU](../platform/qemu_virt.md)
|
||||
and the [HiFive Unleashed](../platform/sifive_fu540.md) platform guides.
|
||||
15
opensbi/docs/firmware/payload_uboot.md
Normal file
15
opensbi/docs/firmware/payload_uboot.md
Normal file
@ -0,0 +1,15 @@
|
||||
U-Boot as a payload to OpenSBI
|
||||
==============================
|
||||
|
||||
[U-Boot](https://www.denx.de/wiki/U-Boot) is an open-source primary boot loader.
|
||||
It can be used as first and/or second stage boot loader in an embedded
|
||||
environment. In the context of OpenSBI, U-Boot can be specified as a payload to
|
||||
the OpenSBI firmware, becoming the boot stage following the OpenSBI firmware
|
||||
execution.
|
||||
|
||||
Building and Generating U-Boot images
|
||||
=====================================
|
||||
Please refer to the U-Boot build documentation for detailed instructions on
|
||||
how to build U-Boot image and boot high level operating systems from U-Boot
|
||||
prompt.
|
||||
|
||||
89
opensbi/docs/library_usage.md
Normal file
89
opensbi/docs/library_usage.md
Normal file
@ -0,0 +1,89 @@
|
||||
OpenSBI Library Usage
|
||||
=====================
|
||||
|
||||
OpenSBI provides two types of static libraries:
|
||||
|
||||
1. *libsbi.a* - A platform-independent generic static library implementing the
|
||||
interface defined by the SBI specifications. Platform-specific processing
|
||||
hooks for the execution of this interface must be provided by the firmware or
|
||||
bootloader linking with this library. This library is installed as
|
||||
*<install_directory>/lib/libsbi.a*
|
||||
2. *libsbiutils.a* - A static library that will contain all common code required
|
||||
by any platform supported in OpenSBI. It will be built by default and included
|
||||
in libplatsbi.a. This library is installed as
|
||||
*<install_directory>/lib/libsbiutils.a*.
|
||||
3. *libplatsbi.a* - An example platform-specific static library integrating
|
||||
*libsbi.a* with platform-specific hooks. This library is available only for
|
||||
the platforms supported by OpenSBI. This library is installed as
|
||||
*<install_directory>/platform/<platform_subdir>/lib/libplatsbi.a*
|
||||
|
||||
Implementations may choose either *libsbi.a* or *libplatsbi.a* to link with
|
||||
their firmware or bootloader. In the case of *libsbi.a*, platform-specific
|
||||
hooks in the form of a *struct sbi_platform* instance need to be provided.
|
||||
|
||||
The platform-specific example firmwares provided by OpenSBI are not mandatory.
|
||||
An implementation may choose to link the OpenSBI generic static library together
|
||||
with an M-mode firmware or bootloader providing the hardware-specific hooks.
|
||||
Since OpenSBI is a statically linked library, users must ensure that the
|
||||
license of these external components is compatible with the OpenSBI license.
|
||||
|
||||
Constraints on OpenSBI usage from external firmware
|
||||
---------------------------------------------------
|
||||
|
||||
Users have to ensure that an external firmware or bootloader linking against
|
||||
OpenSBI static libraries (*libsbi.a* or *libplatsbi.a*) is compiled with the
|
||||
same GCC target options *-mabi*, *-march*, and *-mcmodel*.
|
||||
|
||||
There are only two constraints on calling any OpenSBI library function from an
|
||||
external M-mode firmware or bootloader:
|
||||
|
||||
1. The RISC-V *MSCRATCH* CSR must point to a valid OpenSBI scratch space
|
||||
(i.e. a *struct sbi_scratch* instance).
|
||||
2. The RISC-V *SP* register (i.e. the stack pointer) must be set per-HART
|
||||
pointing to distinct non-overlapping stacks.
|
||||
|
||||
The most important functions from an external firmware or bootloader
|
||||
perspective are *sbi_init()* and *sbi_trap_handler()*.
|
||||
|
||||
In addition to the above constraints, the external firmware or bootloader must
|
||||
ensure that interrupts are disabled in the *MSTATUS* and *MIE* CSRs when calling
|
||||
the functions *sbi_init()* and *sbi_trap_handler()*.
|
||||
|
||||
The *sbi_init()* function should be called by the external firmware or
|
||||
bootloader for each HART that is powered-up at boot-time or in response to a
|
||||
CPU hotplug event.
|
||||
|
||||
The *sbi_trap_handler()* function should be called by the external firmware or
|
||||
bootloader to service the following interrupts and traps:
|
||||
|
||||
1. M-mode timer interrupt
|
||||
2. M-mode software interrupt
|
||||
3. Illegal instruction trap
|
||||
4. Misaligned load trap
|
||||
5. Misaligned store trap
|
||||
6. Supervisor ecall trap
|
||||
7. Hypervisor ecall trap
|
||||
|
||||
**Note:** external firmwares or bootloaders can be more conservative by
|
||||
forwarding all traps and interrupts to *sbi_trap_handler()*.
|
||||
|
||||
Definitions of OpenSBI Data Types for the External Firmware
|
||||
-----------------------------------------------------------
|
||||
|
||||
OpenSBI can be built as library using external firmware build system such as EDK2
|
||||
code base (The open source of UEFI firmware implementation) and linked with external
|
||||
firmware drivers based on the external firmware architecture.
|
||||
|
||||
**OPENSBI_EXTERNAL_SBI_TYPES** identifier is introduced to *sbi_types.h* for selecting
|
||||
external header file during the build preprocess in order to define OpensSBI data types
|
||||
based on external firmware data type binding.
|
||||
For example, *bool* is declared as *int* in sbi_types.h. However in EDK2 build system,
|
||||
*bool* is declared as *BOOLEAN* which is defined as *unsigned char* data type.
|
||||
|
||||
External firmware can define **OPENSBI_EXTERNAL_SBI_TYPES** in CFLAGS and specify it to the
|
||||
header file maintained in its code tree. However, the external build system has to address
|
||||
the additional include directory for the external header file based on its own build system.
|
||||
For example,
|
||||
*-D***OPENSBI_EXTERNAL_SBI_TYPES***=OpensbiTypes.h*
|
||||
Above tells *sbi_types.h* to refer to *OpensbiTypes.h* instead of using original definitions of
|
||||
data types.
|
||||
30
opensbi/docs/platform/andes-ae350.md
Normal file
30
opensbi/docs/platform/andes-ae350.md
Normal file
@ -0,0 +1,30 @@
|
||||
Andes AE350 SoC Platform
|
||||
========================
|
||||
The AE350 AXI/AHB-based platform N25(F)/NX25(F)/D25F/A25/AX25 CPU with level-one
|
||||
memories,interrupt controller, debug module, AXI and AHB Bus Matrix Controller,
|
||||
AXI-to-AHB Bridge and a collection of fundamentalAHB/APB bus IP components
|
||||
pre-integrated together as a system design.The high-quality and configurable
|
||||
AHB/APB IPs suites a majority embedded systems, and the verified platform serves
|
||||
as a starting point to jump start SoC designs.
|
||||
|
||||
To build platform specific library and firmwares, provide the
|
||||
*PLATFORM=andes/ae350* parameter to the top level make command.
|
||||
|
||||
Platform Options
|
||||
----------------
|
||||
|
||||
The Andes AE350 platform does not have any platform-specific options.
|
||||
|
||||
Building Andes AE350 Platform
|
||||
-----------------------------
|
||||
|
||||
To use Linux v5.2 should be used to build Andes AE350 OpenSBI binaries by using
|
||||
the compile time option FW_FDT_PATH.
|
||||
|
||||
AE350's dts is included in https://github.com/andestech/linux/tree/ast-v3_2_0-release-public
|
||||
|
||||
**Linux Kernel Payload**
|
||||
|
||||
```
|
||||
make PLATFORM=andes/ae350 FW_PAYLOAD_PATH=<linux_build_directory>/arch/riscv/boot/Image FW_FDT_PATH=<ae350.dtb path>
|
||||
```
|
||||
38
opensbi/docs/platform/fpga-ariane.md
Normal file
38
opensbi/docs/platform/fpga-ariane.md
Normal file
@ -0,0 +1,38 @@
|
||||
Ariane FPGA SoC Platform
|
||||
========================
|
||||
Ariane is a 6-stage, single issue, in-order CPU which implements the 64-bit
|
||||
RISC-V instruction set. The Ariane FPGA development platform is based on FPGA
|
||||
SoC (which currently supports only Genesys 2 board) and is capable of running
|
||||
Linux.
|
||||
|
||||
The FPGA SoC currently contains the following peripherals:
|
||||
- DDR3 memory controller
|
||||
- SPI controller to conncet to an SDCard
|
||||
- Ethernet controller
|
||||
- JTAG port (see debugging section below)
|
||||
- Bootrom containing zero stage bootloader and device tree.
|
||||
|
||||
To build platform specific library and firmwares, provide the
|
||||
*PLATFORM=fpga/ariane* parameter to the top level `make` command.
|
||||
|
||||
Platform Options
|
||||
----------------
|
||||
|
||||
The *Ariane FPGA* platform does not have any platform-specific options.
|
||||
|
||||
Building Ariane FPGA Platform
|
||||
-----------------------------
|
||||
|
||||
**Linux Kernel Payload**
|
||||
|
||||
```
|
||||
make PLATFORM=fpga/ariane FW_PAYLOAD_PATH=<linux_build_directory>/arch/riscv/boot/Image
|
||||
```
|
||||
|
||||
Booting Ariane FPGA Platform
|
||||
----------------------------
|
||||
|
||||
**Linux Kernel Payload**
|
||||
|
||||
As Linux kernel image is embedded in the OpenSBI firmware binary, Ariane will
|
||||
directly boot into Linux directly after powered on.
|
||||
33
opensbi/docs/platform/fpga-openpiton.md
Normal file
33
opensbi/docs/platform/fpga-openpiton.md
Normal file
@ -0,0 +1,33 @@
|
||||
OpenPiton FPGA SoC Platform
|
||||
========================
|
||||
OpenPiton is the world's first open source, general purpose, multithreaded
|
||||
manycore processor. It is a tiled manycore framework scalable from one to
|
||||
1/2 billion cores. Currently, OpenPiton supports the 64bit Ariane RISC-V
|
||||
processor from ETH Zurich. To this end, Ariane has been equipped with a
|
||||
different L1 cache subsystem that follows a write-through protocol and that has
|
||||
support for cache invalidations and atomics.
|
||||
|
||||
To build platform specific library and firmwares, provide the
|
||||
*PLATFORM=fpga/openpiton* parameter to the top level `make` command.
|
||||
|
||||
Platform Options
|
||||
----------------
|
||||
|
||||
The *OpenPiton* platform does not have any platform-specific options.
|
||||
|
||||
Building Ariane FPGA Platform
|
||||
-----------------------------
|
||||
|
||||
**Linux Kernel Payload**
|
||||
|
||||
```
|
||||
make PLATFORM=fpga/openpiton FW_PAYLOAD_PATH=<linux_build_directory>/arch/riscv/boot/Image
|
||||
```
|
||||
|
||||
Booting Ariane FPGA Platform
|
||||
----------------------------
|
||||
|
||||
**Linux Kernel Payload**
|
||||
|
||||
As Linux kernel image is embedded in the OpenSBI firmware binary, Ariane will
|
||||
directly boot into Linux directly after powered on.
|
||||
56
opensbi/docs/platform/generic.md
Normal file
56
opensbi/docs/platform/generic.md
Normal file
@ -0,0 +1,56 @@
|
||||
Generic Platform
|
||||
================
|
||||
|
||||
The **Generic** platform is a flattened device tree (FDT) based platform
|
||||
where all platform specific functionality is provided based on FDT passed
|
||||
by previous booting stage. The **Generic** platform allows us to use same
|
||||
OpenSBI firmware binaries on various emulators, simulators, FPGAs, and
|
||||
boards.
|
||||
|
||||
By default, the generic FDT platform makes following assumptions:
|
||||
|
||||
1. platform FW_TEXT_START is 0x80000000
|
||||
2. platform features are default
|
||||
3. platform stack size is default
|
||||
4. platform has no quirks or work-arounds
|
||||
|
||||
The above assumptions (except 1) can be overridden by adding special platform
|
||||
callbacks which will be called based on FDT root node compatible string.
|
||||
|
||||
Users of the generic FDT platform will have to ensure that:
|
||||
|
||||
1. Various FDT based drivers under lib/utils directory are upto date
|
||||
based on their platform requirements
|
||||
2. The FDT passed by previous booting stage has DT compatible strings and
|
||||
DT properties in sync with the FDT based drivers under lib/utils directory
|
||||
3. The FDT must have "stdout-path" DT property in the "/chosen" DT node when
|
||||
a platform has multiple serial ports or consoles
|
||||
4. On multi-HART platform, the FDT must have a DT node for IPI device and
|
||||
lib/utils/ipi directory must have corresponding FDT based IPI driver
|
||||
5. The FDT must have a DT node for timer device and lib/utils/timer directory
|
||||
must have corresponding FDT based timer driver
|
||||
|
||||
To build the platform-specific library and firmware images, provide the
|
||||
*PLATFORM=generic* parameter to the top level `make` command.
|
||||
|
||||
For custom FW_TEXT_START, we can build the platform-specific library and
|
||||
firmware images by passing *PLATFORM=generic FW_TEXT_START=<custom_text_start>*
|
||||
parameter to the top level `make` command.
|
||||
|
||||
Platform Options
|
||||
----------------
|
||||
|
||||
The *Generic* platform does not have any platform-specific options.
|
||||
|
||||
RISC-V Platforms Using Generic Platform
|
||||
---------------------------------------
|
||||
|
||||
* **QEMU RISC-V Virt Machine** (*[qemu_virt.md]*)
|
||||
* **Spike** (*[spike.md]*)
|
||||
* **Shakti C-class SoC Platform** (*[shakti_cclass.md]*)
|
||||
* **T-HEAD C9xx series Processors** (*[thead-c9xx.md]*)
|
||||
|
||||
[qemu_virt.md]: qemu_virt.md
|
||||
[spike.md]: spike.md
|
||||
[shakti_cclass.md]: shakti_cclass.md
|
||||
[thead-c9xx.md]: thead-c9xx.md
|
||||
22
opensbi/docs/platform/nuclei_ux600.md
Normal file
22
opensbi/docs/platform/nuclei_ux600.md
Normal file
@ -0,0 +1,22 @@
|
||||
|
||||
Nuclei UX600 Platform
|
||||
=====================
|
||||
|
||||
The **Nuclei UX600** is a 64-bit RISC-V Core which is capable of running Linux.
|
||||
|
||||
> Nuclei UX600: single core, pipeline as single-issue and 6~9 variable stages, in-order dispatch and out-of-order write-back, running up to >1.2GHz
|
||||
|
||||
To build the platform-specific library and firmware images, provide the
|
||||
*PLATFORM=nuclei/ux600* parameter to the top level `make` command.
|
||||
|
||||
Platform Options
|
||||
----------------
|
||||
|
||||
The *Nuclei UX600* platform does not have any platform-specific options.
|
||||
|
||||
Building Nuclei UX600 Platform
|
||||
------------------------------
|
||||
|
||||
```
|
||||
make PLATFORM=nuclei/ux600 clean all
|
||||
```
|
||||
56
opensbi/docs/platform/platform.md
Normal file
56
opensbi/docs/platform/platform.md
Normal file
@ -0,0 +1,56 @@
|
||||
OpenSBI Supported Platforms
|
||||
===========================
|
||||
|
||||
OpenSBI currently supports the following virtual and hardware platforms:
|
||||
|
||||
* **Generic**: Flattened device tree (FDT) based platform where platform
|
||||
specific functionality is provided based on the FDT passed by previous
|
||||
booting stage. More details on this platform can be found in the file
|
||||
*[generic.md]*.
|
||||
|
||||
* **QEMU RISC-V Virt Machine**: Platform support for the QEMU *virt* virtual
|
||||
RISC-V machine. This virtual machine is intended for RISC-V software
|
||||
development and tests. More details on this platform can be found in the
|
||||
file *[qemu_virt.md]*.
|
||||
|
||||
* **SiFive FU540 SoC**: Platform support for SiFive FU540 SoC used on the
|
||||
HiFive Unleashed board, as well as the *sifive_u* QEMU virtual RISC-V
|
||||
machine. More details on this platform can be found in the file
|
||||
*[sifive_fu540.md]*.
|
||||
|
||||
* **Kendryte K210 SoC**: Platform support for the Kendryte K210 SoC used on
|
||||
boards such as the Kendryte KD233 or the Sipeed MAIX Dock.
|
||||
|
||||
* **Ariane FPGA SoC**: Platform support for the Ariane FPGA SoC used on
|
||||
Genesys 2 board. More details on this platform can be found in the file
|
||||
*[fpga-ariane.md]*.
|
||||
|
||||
* **Andes AE350 SoC**: Platform support for the Andes's SoC (AE350). More
|
||||
details on this platform can be found in the file *[andes-ae350.md]*.
|
||||
|
||||
* **Spike**: Platform support for the Spike emulator. More
|
||||
details on this platform can be found in the file *[spike.md]*.
|
||||
|
||||
* **OpenPiton FPGA SoC**: Platform support OpenPiton research platform based
|
||||
on ariane core. More details on this platform can be found in the file
|
||||
*[fpga-openpiton.md]*.
|
||||
|
||||
* **Shakti C-class SoC Platform**: Platform support for Shakti C-class
|
||||
processor based SOCs. More details on this platform can be found in the
|
||||
file *[shakti_cclass.md]*.
|
||||
|
||||
The code for these supported platforms can be used as example to implement
|
||||
support for other platforms. The *platform/template* directory also provides
|
||||
template files for implementing support for a new platform. The *object.mk*,
|
||||
*config.mk* and *platform.c* template files provides enough comments to
|
||||
facilitate the implementation.
|
||||
|
||||
[generic.md]: generic.md
|
||||
[qemu_virt.md]: qemu_virt.md
|
||||
[sifive_fu540.md]: sifive_fu540.md
|
||||
[fpga-ariane.md]: fpga-ariane.md
|
||||
[andes-ae350.md]: andes-ae350.md
|
||||
[thead-c910.md]: thead-c910.md
|
||||
[spike.md]: spike.md
|
||||
[fpga-openpiton.md]: fpga-openpiton.md
|
||||
[shakti_cclass.md]: shakti_cclass.md
|
||||
149
opensbi/docs/platform/qemu_virt.md
Normal file
149
opensbi/docs/platform/qemu_virt.md
Normal file
@ -0,0 +1,149 @@
|
||||
QEMU RISC-V Virt Machine Platform
|
||||
=================================
|
||||
|
||||
The **QEMU RISC-V Virt Machine** is a virtual platform created for RISC-V
|
||||
software development and testing. It is also referred to as
|
||||
*QEMU RISC-V VirtIO machine* because it uses VirtIO devices for network,
|
||||
storage, and other types of IO.
|
||||
|
||||
To build the platform-specific library and firmware images, provide the
|
||||
*PLATFORM=generic* parameter to the top level `make` command.
|
||||
|
||||
Platform Options
|
||||
----------------
|
||||
|
||||
The *QEMU RISC-V Virt Machine* platform does not have any platform-specific
|
||||
options.
|
||||
|
||||
Execution on QEMU RISC-V 64-bit
|
||||
-------------------------------
|
||||
|
||||
**No Payload Case**
|
||||
|
||||
Build:
|
||||
```
|
||||
make PLATFORM=generic
|
||||
```
|
||||
|
||||
Run:
|
||||
```
|
||||
qemu-system-riscv64 -M virt -m 256M -nographic \
|
||||
-bios build/platform/generic/firmware/fw_payload.bin
|
||||
```
|
||||
|
||||
**U-Boot Payload**
|
||||
|
||||
Note: the command line examples here assume that U-Boot was compiled using
|
||||
the `qemu-riscv64_smode_defconfig` configuration.
|
||||
|
||||
Build:
|
||||
```
|
||||
make PLATFORM=generic FW_PAYLOAD_PATH=<uboot_build_directory>/u-boot.bin
|
||||
```
|
||||
|
||||
Run:
|
||||
```
|
||||
qemu-system-riscv64 -M virt -m 256M -nographic \
|
||||
-bios build/platform/generic/firmware/fw_payload.elf
|
||||
```
|
||||
or
|
||||
```
|
||||
qemu-system-riscv64 -M virt -m 256M -nographic \
|
||||
-bios build/platform/generic/firmware/fw_jump.bin \
|
||||
-kernel <uboot_build_directory>/u-boot.bin
|
||||
```
|
||||
|
||||
**Linux Kernel Payload**
|
||||
|
||||
Note: We assume that the Linux kernel is compiled using
|
||||
*arch/riscv/configs/defconfig*.
|
||||
|
||||
Build:
|
||||
```
|
||||
make PLATFORM=generic FW_PAYLOAD_PATH=<linux_build_directory>/arch/riscv/boot/Image
|
||||
```
|
||||
|
||||
Run:
|
||||
```
|
||||
qemu-system-riscv64 -M virt -m 256M -nographic \
|
||||
-bios build/platform/generic/firmware/fw_payload.elf \
|
||||
-drive file=<path_to_linux_rootfs>,format=raw,id=hd0 \
|
||||
-device virtio-blk-device,drive=hd0 \
|
||||
-append "root=/dev/vda rw console=ttyS0"
|
||||
```
|
||||
or
|
||||
```
|
||||
qemu-system-riscv64 -M virt -m 256M -nographic \
|
||||
-bios build/platform/generic/firmware/fw_jump.bin \
|
||||
-kernel <linux_build_directory>/arch/riscv/boot/Image \
|
||||
-drive file=<path_to_linux_rootfs>,format=raw,id=hd0 \
|
||||
-device virtio-blk-device,drive=hd0 \
|
||||
-append "root=/dev/vda rw console=ttyS0"
|
||||
```
|
||||
|
||||
|
||||
Execution on QEMU RISC-V 32-bit
|
||||
-------------------------------
|
||||
|
||||
**No Payload Case**
|
||||
|
||||
Build:
|
||||
```
|
||||
make PLATFORM=generic PLATFORM_RISCV_XLEN=32
|
||||
```
|
||||
|
||||
Run:
|
||||
```
|
||||
qemu-system-riscv32 -M virt -m 256M -nographic \
|
||||
-bios build/platform/generic/firmware/fw_payload.bin
|
||||
```
|
||||
|
||||
**U-Boot Payload**
|
||||
|
||||
Note: the command line examples here assume that U-Boot was compiled using
|
||||
the `qemu-riscv32_smode_defconfig` configuration.
|
||||
|
||||
Build:
|
||||
```
|
||||
make PLATFORM=generic PLATFORM_RISCV_XLEN=32 FW_PAYLOAD_PATH=<uboot_build_directory>/u-boot.bin
|
||||
```
|
||||
|
||||
Run:
|
||||
```
|
||||
qemu-system-riscv32 -M virt -m 256M -nographic \
|
||||
-bios build/platform/generic/firmware/fw_payload.elf
|
||||
```
|
||||
or
|
||||
```
|
||||
qemu-system-riscv32 -M virt -m 256M -nographic \
|
||||
-bios build/platform/generic/firmware/fw_jump.bin \
|
||||
-kernel <uboot_build_directory>/u-boot.bin
|
||||
```
|
||||
|
||||
**Linux Kernel Payload**
|
||||
|
||||
Note: We assume that the Linux kernel is compiled using
|
||||
*arch/riscv/configs/rv32_defconfig*.
|
||||
|
||||
Build:
|
||||
```
|
||||
make PLATFORM=generic PLATFORM_RISCV_XLEN=32 FW_PAYLOAD_PATH=<linux_build_directory>/arch/riscv/boot/Image
|
||||
```
|
||||
|
||||
Run:
|
||||
```
|
||||
qemu-system-riscv32 -M virt -m 256M -nographic \
|
||||
-bios build/platform/generic/firmware/fw_payload.elf \
|
||||
-drive file=<path_to_linux_rootfs>,format=raw,id=hd0 \
|
||||
-device virtio-blk-device,drive=hd0 \
|
||||
-append "root=/dev/vda rw console=ttyS0"
|
||||
```
|
||||
or
|
||||
```
|
||||
qemu-system-riscv32 -M virt -m 256M -nographic \
|
||||
-bios build/platform/generic/firmware/fw_jump.bin \
|
||||
-kernel <linux_build_directory>/arch/riscv/boot/Image \
|
||||
-drive file=<path_to_linux_rootfs>,format=raw,id=hd0 \
|
||||
-device virtio-blk-device,drive=hd0 \
|
||||
-append "root=/dev/vda rw console=ttyS0"
|
||||
```
|
||||
33
opensbi/docs/platform/shakti_cclass.md
Normal file
33
opensbi/docs/platform/shakti_cclass.md
Normal file
@ -0,0 +1,33 @@
|
||||
Shakti C-class SoC Platform
|
||||
===========================
|
||||
C-Class is a member of the SHAKTI family of processors from
|
||||
Indian Institute of Technology - Madras (IIT-M).
|
||||
|
||||
It is an extremely configurable and commercial-grade 5-stage
|
||||
in-order core supporting the standard RV64GCSUN ISA extensions.
|
||||
|
||||
For more details, refer:
|
||||
* https://gitlab.com/shaktiproject/cores/c-class/blob/master/README.md
|
||||
* https://c-class.readthedocs.io/en/latest
|
||||
* https://shakti.org.in
|
||||
|
||||
Platform Options
|
||||
----------------
|
||||
|
||||
The *Shakti C-class SoC* platform does not have any platform-specific
|
||||
options.
|
||||
|
||||
Building Shakti C-class Platform
|
||||
--------------------------------
|
||||
|
||||
**Linux Kernel Payload**
|
||||
|
||||
```
|
||||
make PLATFORM=generic FW_PAYLOAD_PATH=<linux_build_directory>/arch/riscv/boot/Image FW_FDT_PATH=<shakti.dtb path>
|
||||
```
|
||||
|
||||
**Test Payload**
|
||||
|
||||
```
|
||||
make PLATFORM=generic FW_FDT_PATH=<shakti.dtb path>
|
||||
```
|
||||
196
opensbi/docs/platform/sifive_fu540.md
Normal file
196
opensbi/docs/platform/sifive_fu540.md
Normal file
@ -0,0 +1,196 @@
|
||||
SiFive FU540 SoC Platform
|
||||
=========================
|
||||
The FU540-C000 is the world’s first 4+1 64-bit RISC-V SoC from SiFive.
|
||||
The HiFive Unleashed development platform is based on FU540-C000 and capable
|
||||
of running Linux.
|
||||
|
||||
With QEMU v4.2 or above release, the 'sifive_u' machine can be used to test
|
||||
OpenSBI image built for the real hardware as well.
|
||||
|
||||
To build platform specific library and firmwares, provide the
|
||||
*PLATFORM=sifive/fu540* parameter to the top level `make` command.
|
||||
|
||||
Platform Options
|
||||
----------------
|
||||
|
||||
The *SiFive FU540 SoC* platform does not have any platform-specific
|
||||
options.
|
||||
|
||||
Building SiFive Fu540 Platform
|
||||
------------------------------
|
||||
|
||||
In order to boot SMP Linux in U-Boot, Linux v5.1 (or higher) and latest
|
||||
U-Boot v2020.01 (or higher) should be used.
|
||||
|
||||
**Linux Kernel Payload**
|
||||
|
||||
The HiFive Unleashed device tree(DT) is merged in Linux v5.2 release. This
|
||||
DT (device tree) is not backward compatible with the DT passed from FSBL.
|
||||
|
||||
To use Linux v5.2 (or higher), the pre-built DTB (DT binary) from Linux v5.2
|
||||
(or higher) should be used to build SiFive FU540 OpenSBI binaries by using
|
||||
the compile time option *FW_FDT_PATH*.
|
||||
|
||||
```
|
||||
make PLATFORM=sifive/fu540 FW_PAYLOAD_PATH=<linux_build_directory>/arch/riscv/boot/Image
|
||||
or
|
||||
(For Linux v5.2 or higher)
|
||||
make PLATFORM=sifive/fu540 FW_PAYLOAD_PATH=<linux_build_directory>/arch/riscv/boot/Image FW_FDT_PATH=<hifive-unleashed-a00.dtb path from Linux kernel>
|
||||
```
|
||||
|
||||
**U-Boot Payload**
|
||||
|
||||
The command-line example here assumes that U-Boot was compiled using the
|
||||
sifive_fu540_defconfig configuration and with U-Boot v2020.01, and up to
|
||||
v2021.04. sifive_unleashed_defconfig shall be used with v2021.07 or above.
|
||||
|
||||
```
|
||||
make PLATFORM=sifive/fu540 FW_PAYLOAD_PATH=<u-boot_build_dir>/u-boot-dtb.bin
|
||||
```
|
||||
For U-Boot v2020.07-rc4 or later releases, SPL support was added in U-Boot.
|
||||
Please refer to the detailed U-Boot booting guide available at [U-Boot].
|
||||
|
||||
Flashing the OpenSBI firmware binary to storage media:
|
||||
------------------------------------------------------
|
||||
The first stage boot loader ([FSBL]) expects the storage media to have a GPT
|
||||
partition table. It tries to look for a partition with following GUID to load
|
||||
the next stage boot loader (OpenSBI in this case).
|
||||
|
||||
```
|
||||
2E54B353-1271-4842-806F-E436D6AF6985
|
||||
```
|
||||
|
||||
That's why the generated firmware binary in above steps should be copied to
|
||||
the partition of the sdcard with above GUID.
|
||||
|
||||
```
|
||||
dd if=build/platform/sifive/fu540/firmware/fw_payload.bin of=/dev/disk2s1 bs=1024
|
||||
```
|
||||
|
||||
In my case, it is the first partition is **disk2s1** that has been formatted
|
||||
with the above specified GUID.
|
||||
|
||||
In case of a brand new sdcard, it should be formatted with below partition
|
||||
tables as described here.
|
||||
|
||||
```
|
||||
sgdisk --clear \
|
||||
--new=1:2048:67583 --change-name=1:bootloader --typecode=1:2E54B353-1271-4842-806F-E436D6AF6985 \
|
||||
--new=2:264192: --change-name=2:root --typecode=2:0FC63DAF-8483-4772-8E79-3D69D8477DE4 \
|
||||
${DISK}
|
||||
```
|
||||
|
||||
Booting SiFive Fu540 Platform
|
||||
-----------------------------
|
||||
|
||||
**Linux Kernel Payload**
|
||||
|
||||
As Linux kernel image is embedded in the OpenSBI firmware binary, HiFive
|
||||
Unleashed will directly boot into Linux directly after powered on.
|
||||
|
||||
**U-Boot Payload**
|
||||
|
||||
As U-Boot image is used as payload, HiFive Unleashed will boot into a U-Boot
|
||||
prompt. U-Boot tftp boot method can be used to load kernel image in U-Boot
|
||||
prompt. Here are the steps do a tftpboot.
|
||||
|
||||
1. Set the ip address of the board.
|
||||
```
|
||||
setenv ipaddr <ipaddr of the board>
|
||||
```
|
||||
2. Set the tftpboot server IP.
|
||||
```
|
||||
setenv serverip <ipaddr of the tftp server>
|
||||
```
|
||||
3. Set the network gateway address.
|
||||
```
|
||||
setenv gatewayip <ipaddress of the network gateway>
|
||||
```
|
||||
4. Load the Linux kernel image from the tftp server.
|
||||
```
|
||||
tftpboot ${kernel_addr_r} <Image path in tftpboot directory>
|
||||
```
|
||||
5. Load the ramdisk image from the tftp server. This is only required if
|
||||
ramdisk is loaded from tftp server. This step is optional, if rootfs is
|
||||
already part of the kernel or loaded from an external storage by kernel.
|
||||
```
|
||||
tftpboot ${ramdisk_addr_r} <ramdisk path in tftpboot directory>
|
||||
```
|
||||
6. Load the pre-compiled device tree via tftpboot.
|
||||
```
|
||||
tftpboot ${fdt_addr_r} <hifive-unleashed-a00.dtb path in tftpboot directory>
|
||||
```
|
||||
7. Set the boot command-line arguments.
|
||||
```
|
||||
setenv bootargs "root=<root partition> rw console=ttySIF0 earlycon=sbi"
|
||||
```
|
||||
(Note: root partition should point to
|
||||
** /dev/ram ** - If a ramdisk is used
|
||||
** root=/dev/mmcblk0pX ** - If a rootfs is already on some other partition
|
||||
of sdcard)
|
||||
8. Now boot into Linux.
|
||||
```
|
||||
booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r}
|
||||
or
|
||||
(If ramdisk is not loaded from network)
|
||||
booti ${kernel_addr_r} - ${fdt_addr_r}
|
||||
```
|
||||
|
||||
**U-Boot & Linux Kernel as a single payload**
|
||||
|
||||
At U-Boot prompt execute the following boot command to boot Linux.
|
||||
|
||||
```
|
||||
booti ${kernel_addr_r} - ${fdt_addr_r}
|
||||
```
|
||||
|
||||
QEMU Specific Instructions
|
||||
--------------------------
|
||||
If you want to test OpenSBI with QEMU 'sifive_u' machine, please follow the
|
||||
same instructions above, with the exception of not passing FW_FDT_PATH.
|
||||
|
||||
This is because QEMU generates a device tree blob on the fly based on the
|
||||
command line parameters and it's compatible with the one used in the upstream
|
||||
Linux kernel.
|
||||
|
||||
When U-Boot v2021.07 (or higher) is used as the payload, as the SiFive FU540
|
||||
DTB for the real hardware is embedded in U-Boot binary itself, due to the same
|
||||
reason above, we need to switch the U-Boot sifive_unleashed_defconfig
|
||||
configuration from **CONFIG_OF_SEPARATE** to **CONFIG_OF_PRIOR_STAGE** so that
|
||||
U-Boot uses the DTB generated by QEMU, and u-boot.bin should be used as the
|
||||
payload image, like:
|
||||
|
||||
```
|
||||
make PLATFORM=sifive/fu540 FW_PAYLOAD_PATH=<u-boot_build_dir>/u-boot.bin
|
||||
```
|
||||
|
||||
U-Boot v2020.07 release added SPL support to SiFive HiFive Unleashed board,
|
||||
hence a build error will be seen after you switch to **CONFIG_OF_PRIOR_STAGE**.
|
||||
|
||||
```
|
||||
./tools/mkimage: Can't open arch/riscv/dts/hifive-unleashed-a00.dtb: No such file or directory
|
||||
./tools/mkimage: failed to build FIT
|
||||
Makefile:1402: recipe for target 'u-boot.img' failed
|
||||
make: *** [u-boot.img] Error 1
|
||||
```
|
||||
|
||||
The above errors can be safely ignored as we don't run U-Boot SPL under QEMU.
|
||||
|
||||
Run:
|
||||
```
|
||||
qemu-system-riscv64 -M sifive_u -m 256M -nographic \
|
||||
-bios build/platform/sifive/fu540/firmware/fw_payload.bin
|
||||
```
|
||||
or
|
||||
```
|
||||
qemu-system-riscv64 -M sifive_u -m 256M -nographic \
|
||||
-bios build/platform/sifive/fu540/firmware/fw_jump.bin \
|
||||
-kernel <uboot_build_dir>/u-boot.bin
|
||||
```
|
||||
|
||||
While the real hardware operates at the 64-bit mode, it's possible for QEMU to
|
||||
test the 32-bit OpenSBI firmware. This can be helpful for testing 32-bit SiFive
|
||||
specific drivers.
|
||||
|
||||
[U-Boot]: https://gitlab.denx.de/u-boot/u-boot/blob/master/doc/board/sifive/fu540.rst
|
||||
[FSBL]: https://github.com/sifive/freedom-u540-c000-bootloader
|
||||
89
opensbi/docs/platform/spike.md
Normal file
89
opensbi/docs/platform/spike.md
Normal file
@ -0,0 +1,89 @@
|
||||
Spike Simulator Platform
|
||||
========================
|
||||
|
||||
The **Spike** is a RISC-V ISA simulator which implements a functional model
|
||||
of one or more RISC-V harts. The **Spike** compatible virtual platform is
|
||||
also available on QEMU. In fact, we can use same OpenSBI firmware binaries
|
||||
on **Spike** simulator and QEMU Spike machine.
|
||||
|
||||
For more details, refer [Spike on GitHub](https://github.com/riscv/riscv-isa-sim)
|
||||
|
||||
To build the platform-specific library and firmware images, provide the
|
||||
*PLATFORM=generic* parameter to the top level `make` command.
|
||||
|
||||
Platform Options
|
||||
----------------
|
||||
|
||||
The *Spike* platform does not have any platform-specific options.
|
||||
|
||||
Execution on Spike Simulator
|
||||
----------------------------
|
||||
|
||||
**No Payload Case**
|
||||
|
||||
Build:
|
||||
```
|
||||
make PLATFORM=generic
|
||||
```
|
||||
|
||||
Run:
|
||||
```
|
||||
spike build/platform/generic/firmware/fw_payload.elf
|
||||
```
|
||||
|
||||
**Linux Kernel Payload**
|
||||
|
||||
Note: We assume that the Linux kernel is compiled using
|
||||
*arch/riscv/configs/defconfig*.
|
||||
|
||||
Build:
|
||||
```
|
||||
make PLATFORM=generic FW_PAYLOAD_PATH=<linux_build_directory>/arch/riscv/boot/Image
|
||||
```
|
||||
|
||||
Run:
|
||||
```
|
||||
spike --initrd <path_to_cpio_ramdisk> build/platform/generic/firmware/fw_payload.elf
|
||||
```
|
||||
|
||||
Execution on QEMU RISC-V 64-bit
|
||||
-------------------------------
|
||||
|
||||
**No Payload Case**
|
||||
|
||||
Build:
|
||||
```
|
||||
make PLATFORM=generic
|
||||
```
|
||||
|
||||
Run:
|
||||
```
|
||||
qemu-system-riscv64 -M spike -m 256M -nographic \
|
||||
-bios build/platform/generic/firmware/fw_payload.elf
|
||||
```
|
||||
|
||||
**Linux Kernel Payload**
|
||||
|
||||
Note: We assume that the Linux kernel is compiled using
|
||||
*arch/riscv/configs/defconfig*.
|
||||
|
||||
Build:
|
||||
```
|
||||
make PLATFORM=generic FW_PAYLOAD_PATH=<linux_build_directory>/arch/riscv/boot/Image
|
||||
```
|
||||
|
||||
Run:
|
||||
```
|
||||
qemu-system-riscv64 -M spike -m 256M -nographic \
|
||||
-bios build/platform/generic/firmware/fw_payload.elf \
|
||||
-initrd <path_to_cpio_ramdisk> \
|
||||
-append "root=/dev/ram rw console=hvc0 earlycon=sbi"
|
||||
```
|
||||
or
|
||||
```
|
||||
qemu-system-riscv64 -M spike -m 256M -nographic \
|
||||
-bios build/platform/generic/firmware/fw_jump.elf \
|
||||
-kernel <linux_build_directory>/arch/riscv/boot/Image \
|
||||
-initrd <path_to_cpio_ramdisk> \
|
||||
-append "root=/dev/ram rw console=hvc0 earlycon=sbi"
|
||||
```
|
||||
204
opensbi/docs/platform/thead-c9xx.md
Normal file
204
opensbi/docs/platform/thead-c9xx.md
Normal file
@ -0,0 +1,204 @@
|
||||
T-HEAD C9xx Series Processors
|
||||
=============================
|
||||
|
||||
The **C9xx** series processors are high-performance RISC-V architecture
|
||||
multi-core processors with AI vector acceleration engine.
|
||||
|
||||
For more details, refer [T-HEAD.CN](https://www.t-head.cn/)
|
||||
|
||||
To build the platform-specific library and firmware images, provide the
|
||||
*PLATFORM=generic* parameter to the top level `make` command.
|
||||
|
||||
Platform Options
|
||||
----------------
|
||||
|
||||
The *T-HEAD C9xx* does not have any platform-specific compile options
|
||||
because it use generic platform.
|
||||
|
||||
```
|
||||
CROSS_COMPILE=riscv64-linux-gnu- PLATFORM=generic FW_PIC=y /usr/bin/make
|
||||
```
|
||||
|
||||
The *T-HEAD C9xx* DTB provided to OpenSBI generic firmwares will usually have
|
||||
"riscv,clint0", "riscv,plic0", "thead,reset-sample" compatible strings.
|
||||
|
||||
DTS Example1: (Single core, eg: Allwinner D1 - c906)
|
||||
----------------------------------------------------
|
||||
|
||||
```
|
||||
cpus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
timebase-frequency = <3000000>;
|
||||
cpu@0 {
|
||||
device_type = "cpu";
|
||||
reg = <0>;
|
||||
status = "okay";
|
||||
compatible = "riscv";
|
||||
riscv,isa = "rv64imafdcv";
|
||||
mmu-type = "riscv,sv39";
|
||||
cpu0_intc: interrupt-controller {
|
||||
#interrupt-cells = <1>;
|
||||
compatible = "riscv,cpu-intc";
|
||||
interrupt-controller;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
soc {
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
compatible = "simple-bus";
|
||||
ranges;
|
||||
|
||||
reset: reset-sample {
|
||||
compatible = "thead,reset-sample";
|
||||
plic-delegate = <0x0 0x101ffffc>;
|
||||
};
|
||||
|
||||
clint0: clint@14000000 {
|
||||
compatible = "riscv,clint0";
|
||||
interrupts-extended = <
|
||||
&cpu0_intc 3 &cpu0_intc 7
|
||||
>;
|
||||
reg = <0x0 0x14000000 0x0 0x04000000>;
|
||||
clint,has-no-64bit-mmio;
|
||||
};
|
||||
|
||||
intc: interrupt-controller@10000000 {
|
||||
#interrupt-cells = <1>;
|
||||
compatible = "riscv,plic0";
|
||||
interrupt-controller;
|
||||
interrupts-extended = <
|
||||
&cpu0_intc 0xffffffff &cpu0_intc 9
|
||||
>;
|
||||
reg = <0x0 0x10000000 0x0 0x04000000>;
|
||||
reg-names = "control";
|
||||
riscv,max-priority = <7>;
|
||||
riscv,ndev = <200>;
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
DTS Example2: (Multi cores with soc reset-regs)
|
||||
-----------------------------------------------
|
||||
|
||||
```
|
||||
cpus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
timebase-frequency = <3000000>;
|
||||
cpu@0 {
|
||||
device_type = "cpu";
|
||||
reg = <0>;
|
||||
status = "okay";
|
||||
compatible = "riscv";
|
||||
riscv,isa = "rv64imafdc";
|
||||
mmu-type = "riscv,sv39";
|
||||
cpu0_intc: interrupt-controller {
|
||||
#interrupt-cells = <1>;
|
||||
compatible = "riscv,cpu-intc";
|
||||
interrupt-controller;
|
||||
};
|
||||
};
|
||||
cpu@1 {
|
||||
device_type = "cpu";
|
||||
reg = <1>;
|
||||
status = "fail";
|
||||
compatible = "riscv";
|
||||
riscv,isa = "rv64imafdc";
|
||||
mmu-type = "riscv,sv39";
|
||||
cpu1_intc: interrupt-controller {
|
||||
#interrupt-cells = <1>;
|
||||
compatible = "riscv,cpu-intc";
|
||||
interrupt-controller;
|
||||
};
|
||||
};
|
||||
cpu@2 {
|
||||
device_type = "cpu";
|
||||
reg = <2>;
|
||||
status = "fail";
|
||||
compatible = "riscv";
|
||||
riscv,isa = "rv64imafdc";
|
||||
mmu-type = "riscv,sv39";
|
||||
cpu2_intc: interrupt-controller {
|
||||
#interrupt-cells = <1>;
|
||||
compatible = "riscv,cpu-intc";
|
||||
interrupt-controller;
|
||||
};
|
||||
};
|
||||
cpu@3 {
|
||||
device_type = "cpu";
|
||||
reg = <3>;
|
||||
status = "fail";
|
||||
compatible = "riscv";
|
||||
riscv,isa = "rv64imafdc";
|
||||
mmu-type = "riscv,sv39";
|
||||
cpu3_intc: interrupt-controller {
|
||||
#interrupt-cells = <1>;
|
||||
compatible = "riscv,cpu-intc";
|
||||
interrupt-controller;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
soc {
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
compatible = "simple-bus";
|
||||
ranges;
|
||||
|
||||
reset: reset-sample {
|
||||
compatible = "thead,reset-sample";
|
||||
plic-delegate = <0xff 0xd81ffffc>;
|
||||
entry-reg = <0xff 0xff019050>;
|
||||
entry-cnt = <4>;
|
||||
control-reg = <0xff 0xff015004>;
|
||||
control-val = <0x1c>;
|
||||
csr-copy = <0x7f3 0x7c0 0x7c1 0x7c2 0x7c3 0x7c5 0x7cc>;
|
||||
};
|
||||
|
||||
clint0: clint@ffdc000000 {
|
||||
compatible = "riscv,clint0";
|
||||
interrupts-extended = <
|
||||
&cpu0_intc 3 &cpu0_intc 7
|
||||
&cpu1_intc 3 &cpu1_intc 7
|
||||
&cpu2_intc 3 &cpu2_intc 7
|
||||
&cpu3_intc 3 &cpu3_intc 7
|
||||
&cpu4_intc 3 &cpu4_intc 7
|
||||
>;
|
||||
reg = <0xff 0xdc000000 0x0 0x04000000>;
|
||||
clint,has-no-64bit-mmio;
|
||||
};
|
||||
|
||||
intc: interrupt-controller@ffd8000000 {
|
||||
#interrupt-cells = <1>;
|
||||
compatible = "riscv,plic0";
|
||||
interrupt-controller;
|
||||
interrupts-extended = <
|
||||
&cpu0_intc 0xffffffff &cpu0_intc 9
|
||||
&cpu1_intc 0xffffffff &cpu1_intc 9
|
||||
&cpu2_intc 0xffffffff &cpu2_intc 9
|
||||
&cpu3_intc 0xffffffff &cpu3_intc 9
|
||||
>;
|
||||
reg = <0xff 0xd8000000 0x0 0x04000000>;
|
||||
reg-names = "control";
|
||||
riscv,max-priority = <7>;
|
||||
riscv,ndev = <80>;
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
DTS Example2: (Multi cores with old reset csrs)
|
||||
-----------------------------------------------
|
||||
```
|
||||
reset: reset-sample {
|
||||
compatible = "thead,reset-sample";
|
||||
plic-delegate = <0xff 0xd81ffffc>;
|
||||
using-csr-reset;
|
||||
csr-copy = <0x7c0 0x7c1 0x7c2 0x7c3 0x7c5 0x7cc
|
||||
0x3b0 0x3b1 0x3b2 0x3b3
|
||||
0x3b4 0x3b5 0x3b6 0x3b7
|
||||
0x3a0>;
|
||||
};
|
||||
```
|
||||
42
opensbi/docs/platform_guide.md
Normal file
42
opensbi/docs/platform_guide.md
Normal file
@ -0,0 +1,42 @@
|
||||
OpenSBI Platform Support Guideline
|
||||
==================================
|
||||
|
||||
The OpenSBI platform support allows an implementation to define a set of
|
||||
platform-specific hooks (hardware manipulation functions) in the form of a
|
||||
*struct sbi_platform* data structure instance. This instance is required by
|
||||
the platform-independent *libsbi.a* to execute platform-specific operations.
|
||||
|
||||
Each of the reference platform supports provided by OpenSBI defines an instance
|
||||
of the *struct sbi_platform* data structure. For each supported platform,
|
||||
*libplatsbi.a* integrates this instance with *libsbi.a* to create a
|
||||
platform-specific OpenSBI static library. This library is installed
|
||||
in *<install_directory>/platform/<platform_subdir>/lib/libplatsbi.a*
|
||||
|
||||
OpenSBI also provides implementation examples of bootable runtime firmwares for
|
||||
the supported platforms. These firmwares are linked against *libplatsbi.a*.
|
||||
Firmware binaries are installed in
|
||||
*<install_directory>/platform/<platform_subdir>/bin*. These firmwares can be
|
||||
used as executable runtime firmwares on the supported platforms as a replacement
|
||||
for the legacy *riskv-pk* boot loader (BBL).
|
||||
|
||||
A complete doxygen-style documentation of *struct sbi_platform* and related
|
||||
APIs is available in the file *include/sbi/sbi_platform.h*.
|
||||
|
||||
Adding support for a new platform
|
||||
---------------------------------
|
||||
|
||||
Support for a new platform named *<xyz>* can be added as follows:
|
||||
|
||||
1. Create a directory named *<xyz>* under the *platform/* directory.
|
||||
2. Create a platform configuration file named *config.mk* under the
|
||||
*platform/<xyz>/* directory. This configuration file will provide
|
||||
compiler flags, and select firmware options.
|
||||
3. Create a *platform/<xyz>/objects.mk* file for listing the
|
||||
platform-specific object files to be compiled.
|
||||
4. Create a *platform/<xyz>/platform.c* file providing a *struct sbi_platform*
|
||||
instance.
|
||||
|
||||
A platform support code template is available under the *platform/template*
|
||||
directory. Copying this directory and its content as a new directory named
|
||||
*<xyz>* under the *platform/* directory will create all the files mentioned
|
||||
above.
|
||||
44
opensbi/docs/platform_requirements.md
Normal file
44
opensbi/docs/platform_requirements.md
Normal file
@ -0,0 +1,44 @@
|
||||
OpenSBI Platform Requirements
|
||||
=============================
|
||||
|
||||
The RISC-V platform requirements for OpenSBI can change over time
|
||||
with advances in RISC-V specifications and ecosystem.
|
||||
|
||||
To handle this, we have two types of RISC-V platform requirements:
|
||||
|
||||
1. **Base platform requirements** which apply to all OpenSBI releases
|
||||
2. **Release specific platform requirements** which apply to a OpenSBI
|
||||
release and later releases
|
||||
|
||||
Currently, we don't have any **Release specific platform requirements**
|
||||
but such platform requirements will be added in future.
|
||||
|
||||
Base Platform Requirements
|
||||
--------------------------
|
||||
|
||||
The base RISC-V platform requirements for OpenSBI are as follows:
|
||||
|
||||
1. At least rv32ima or rv64ima required on all HARTs
|
||||
2. At least one HART should have S-mode support because:
|
||||
|
||||
* SBI calls are meant for RISC-V S-mode (Supervisor mode)
|
||||
* OpenSBI implements SBI calls for S-mode software
|
||||
|
||||
3. The MTVEC CSR on all HARTs must support direct mode
|
||||
4. The PMP CSRs are optional. If PMP CSRs are not implemented then
|
||||
OpenSBI cannot protect M-mode firmware and secured memory regions
|
||||
5. The TIME CSR is optional. If TIME CSR is not implemented in
|
||||
hardware then a 64-bit MMIO counter is required to track time
|
||||
and emulate TIME CSR
|
||||
6. Hardware support for injecting M-mode software interrupts on
|
||||
a multi-HART platform
|
||||
|
||||
The RISC-V extensions not covered by rv32ima or rv64ima are optional
|
||||
for OpenSBI. Although, OpenSBI will detect and handle some of these
|
||||
optional RISC-V extensions at runtime.
|
||||
|
||||
The optional RISC-V extensions handled by OpenSBI at runtime are:
|
||||
|
||||
* D-extension: Double precision floating point
|
||||
* F-extension: Single precision floating point
|
||||
* H-extension: Hypervisor
|
||||
Reference in New Issue
Block a user