blob: 9190e32c9fb129c50475607d4e07978935f84985 [file] [log] [blame] [view]
{% set rfcid = "RFC-0111" %}
{% include "docs/contribute/governance/rfcs/_common/_rfc_header.md" %}
# {{ rfc.name }}: {{ rfc.title }}
<!-- *** DO NOT EDIT ABOVE THIS LINE -->
## Summary {#summary}
This RFC details an initial set of technical specifications for a given hardware
platform to be compatible with Fuchsia, contributed to the Fuchsia project, and
categorized within the Fuchsia project. This RFC is intended to both codify an
initial set of hardware specifications and to outline the process for proposing
hardware-related source code contributions to the `fuchsia.git` repository.
Changes to the hardware specifications can only made through the
[Fuchsia RFC process](/docs/contribute/governance/rfcs).
## Overview {#overview}
This document details the initial technical specifications for a given hardware platform
to be compatible with Fuchsia, contributed to the Fuchsia project, and
categorized as either **Supported** or **Experimental** hardware. Within the
Supported hardware and Experimental hardware categories, there are
Required and Recommended specifications.
Note: This RFC establishes the _current_ and _intial_ set of technical
specifications for a given hardware platform to be compatible with Fuchsia.
Hardware categories as well as their respective Recommended and Required
specifications are subject to change and could be modified as the Fuchsia
project progresses.
While compatibility with a wide range of hardware and form factors is desirable,
each new hardware target imposes architectural, maintenance, testing, and
validation costs to the Fuchsia project. This document lists Fuchsia's hardware
platform specifications and explains the rationales associated with each
hardware choice.
Specifications may be updated as the Fuchsia project evolves. Specification
changes that have broad technical impact to the project are either approved or
rejected through the [Fuchsia RFC process.](/docs/contribute/governance/rfcs)
This policy covers different kinds of hardware in Fuchsia, including
the following:
* Architectures (e.g. ARM, x86, RISC-V),
* Boards (e.g. VIM3, Raspberry Pi, Intel NUC)
* Drivers for other hardware (e.g. USB devices, network adapters,
HID devices, etc.).
The "Initial Fuchsia hardware platform specifications" policy doesn't cover
device drivers written by external contributors using the Driver SDK and hosted outside any Fuchsia source tree repository. Developers can write drivers using
the Driver SDK and distribute the source and binaries outside of the Fuchsia
open source project repositories.
### Hardware platform categories {#hardware-platform-categories-overview}
Hardware platforms that the Fuchsia project performs Fuchsia project-hosted
testing on are categorized as **Supported** hardware. **Experimental**
hardware fulfills the minimum requirements for a hardware platform to be
compatible with running Fuchsia but no Fuchsia-hosted testing is performed.
Experimental Hardware platforms should not be considered as appropriate for
production environments. Rather, the Fuchsia project considers Experimental
hardware as avenues for exploring and learning about Fuchsia.
This document defines hardware specifications for Fuchsia-compatible hardware
platforms, specifically:
1. "Base hardware specifications" -- these are the minimum specifications for
Fuchsia to run on a given hardware platform. Base hardware specifications are
categorized as either Required or Recommended. Experimental hardware only needs
to comply with the Required Base hardware specifications.
2. "Supported hardware specifications" -- these are the specifications necessary
for the hardware platform to potentially be categorized as Supported hardware.
In addition to these specifications, hardware in this category must also be
approved through the RFC process, due to the resulting testing requirements.
The document also defines the availability expectations associated with
Supported hardware and Experimental hardware. Finally, the document defines a
process for adding hardware platforms to the Fuchsia source.
### Peripherals {#peripherals}
The "Initial Fuchsia hardware platform specifications" RFC covers the
specification of hardware for the base system that allows for peripheral
devices to work with a given platform. This includes USB storage drivers and
drivers for graphics cards (both permanently attached and
removable graphics cards).
"Initial Fuchsia hardware platform specifications" does not cover the details of
the operation of external peripherals beyond interactions directly observable by
the system running fuchsia. For instance, operating details of firmware on
the following is not covered:
* Machine Learning (ML) accelerators
* Audio hardware digital signal processors (DSPs)
* Graphic cards internals (not the driver that allows communication with
the main system).
The "Initial Fuchsia hardware platform specifications" policy also does
not cover bootloaders that are not the final stage bootloader.
### Document Definitions {#document-definitions}
The following terms are used in this document:
<table>
<tr>
<td><strong>Term</strong>
</td>
<td><strong>Definition</strong>
</td>
</tr>
<tr>
<td>Architecture
</td>
<td>A processor architecture like x86 or ARM.
</td>
</tr>
<tr>
<td>System
</td>
<td>A complete computer hardware platform with a CPU, memory,
peripherals, etc. Also commonly referred to as a "board".
</td>
</tr>
<tr>
<td>Hardware platform
</td>
<td>The System on a chip (SoC) (for example ARM-based SoCs) or the
combination of the Central processing unit (CPU) and the chipset
(for example many x86-based systems).
</td>
</tr>
<tr>
<td>SoC
</td>
<td>System on a chip; typically consists of a processor with integrated
peripherals in the same silicon package, typically used as the heart of a
computer system. Often has multiple CPU cores.
</td>
</tr>
<tr>
<td>CPU
</td>
<td>Central processing unit.
</td>
</tr>
<tr>
<td>Change
</td>
<td>The Fuchsia project uses Gerrit's web-based UI to manage code and
documentation reviews. When a commit is uploaded to Gerrit, it is referred
to as a change. Note that the underlying revision control system is git.
</td>
</tr>
<tr>
<td>Fuchsia-project hosted testing
</td>
<td>Testing that occurs through the Fuchsia project build and integration
process.
</td>
</tr>
<tr>
<td>CI/CQ
</td>
<td>Continuous Integration / Commit Queue: systems that build proposed
changes before integrating into the main source tree, and continuously test
the entire source to discover regressions caused by the interaction of
multiple integrated changes.
</td>
</tr>
</table>
## Base hardware specifications {#base-hardware-specifications}
The following are the base hardware specifications for Fuchsia.
Base specifications are further divided into two categories: Required and
Recommended.
Note: This section of the RFC establishes the _current_ and _intial_ set of
technical specifications for Base hardware. The Base hardware category as well
as its related Recommended and Required specifications are subject to change and could be modified
as the Fuchsia project progresses.
<table>
<tr>
<td><strong>Base specification</strong>
</td>
<td><strong>Definition</strong>
</td>
</tr>
<tr>
<td>Required
</td>
<td>Without this specification, Fuchsia is not able to build and install on
a given hardware platform.
</td>
</tr>
<tr>
<td>Recommended
</td>
<td>This specification is highly desirable but not required for Fuchsia to
build and install on a given hardware platform. Without this specification,
Fuchsia's functionality or performance is compromised.
</td>
</tr>
</table>
### Required Hardware Features {#required-base-hardware-features}
The following hardware specifications are required.
#### Required specifications
Required specifications are the basic technical requirements for Fuchsia to
build and install on a given hardware platform.
##### Required: 64-bit CPU and platform
The hardware platform CPU must support a 64-bit address space operating mode.
It is acceptable if the platform or CPU starts in a non-64 bit mode as long as
it is only used during early boot before the Zircon kernel starts.
###### Rationale
A 64-bit address space is needed with sufficient space to efficiently and
effectively implement features such as address space layout
randomization (ASLR).
###### Examples
All x86-64 hardware platforms; all ARMv8-A and later processors (except A32).
##### Required: Full featured memory management unit (MMU)
The hardware platform must provide a full-featured, modern memory management
unit that allows for creating an arbitrary number of address spaces, mapping
physical memory in reasonably sized pages to any of those spaces, and enforcing
protection between separate address spaces through hardware access
control mechanisms.
###### Rationale
Fuchsia makes heavy use of virtual memory objects, so efficient memory
management is critical to the operation of a Fuchsia hardware platform.
Fuchsia's [basic security guarantees](/docs/concepts/principles/secure.md)
are not possible without hardware-enforced memory access controls.
###### Examples
ARM v8.0-A or later; all modern x86 CPUs (2010 and beyond).
##### Required: Little-endian mode
The hardware platform must support little-endian (LE) byte-ordering mode.
###### Rationale
Dealing with arbitrary endianness is expensive in code development and testing
time. In theory, Fuchsia's code can be made endian-agnostic, but the Fuchsia
project is not prepared to commit to the effort at this time. Most modern
architectures are either LE native or support LE mode.
###### Examples
All x86; all modern ARM processors are little-endian capable.
##### Required: For x86-64, the x86-64-v2 instruction set architecture
Hardware platforms based on the x86-64 processor architecture must support
the [x86-64-v2 instruction set architecture](https://en.wikipedia.org/wiki/X86-64#Microarchitecture_levels)
(ISA) as described in [Fuchsia RFC-0073](/docs/contribute/governance/rfcs/0073_x86_64_platform_requirement.md).
This covers all Intel Westmere and newer CPUs and all AMD Bulldozer and
newer CPUs.
###### Rationale
Having a minimum ISA target allows useful optimizations that assume the
presence of certain instructions. Full details are in
[RFC-0073](/docs/contribute/governance/rfcs/0073_x86_64_platform_requirement.md):
Raising x86-64 platform requirement to x86-64-v2.
##### Required: Clock and timers
Clock and timers must:
* Be invariant such that they do not arbitrarily change frequency as other parts
of the system undergo frequency scaling.
* Be at least 56 bits wide with roll-over time of not less than 40 years.
* Have a nominal frequency which is explicitly knowable without the need for any
runtime calibration.
### Required toolchain and language support {#required-base-toolchain-and-language-support}
The following toolchain and language support specifications are required.
#### Required: LLVM toolchain support
The architecture, platform, and target board in question must be in
the [LLVM core tier](https://llvm.org/docs/SupportPolicy.html) fully supported
by upstream [LLVM](https://llvm.org/). Clang toolchain support for the
given platform must be kept up to date. For more information on the targets
supported by LLVM see
[CMakeLists.txt](https://github.com/llvm/llvm-project/blob/f749550cfe9f0bf2364abb2139835348587062ed/llvm/CMakeLists.txt#L291)
in the LLVM project.
##### Rationale
Fuchsia uses LLVM as its default compilation toolchain.
#### Required: Tier 2 Rust language support
The architecture, platform, and target board in question must be at least
in [Rust Tier 2](https://doc.rust-lang.org/nightly/rustc/platform-support.html#tier-2)
, and [preferably](#tier-1-rust-language-support)
in Rust Tier 1.
##### Rationale
Fuchsia uses Rust extensively.
#### Required: Dart language support
The architecture, platform, and target board in question must be supported by
[Dart](https://dart.dev/overview#platform).
##### Rationale
The majority of Fuchsia's user interface is built using Flutter,
which uses Dart.
#### Required: Go language support
The architecture, platform, and target board in question must be supported by
[Go](https://blog.golang.org/ports).
##### Rationale
Fuchsia's netstack uses Go.
### Recommended Hardware Features {#recommended-base-hardware-features}
The following hardware specifications are recommended.
#### Recommended specifications
While not required to build and install Fuchsia, the following specifications
are highly desirable supplements to the base specifications because they improve
Fuchsia's functionality on a given hardware platform.
##### Recommended: Clock and timers
* Have timers which can deliver interrupts to cores when the timer value exceeds
a given absolute threshold.
* Be implemented as part of the architecture itself, not as a peripheral present
in the target layer.
##### Recommended: I/O memory management unit (IOMMU)
The Fuchsia project recommends that the hardware platform supports a hardware
I/O memory management unit. The IOMMU must be able to NAK read or write
transactions initiated from uniquely identifiable hardware units in the system
when there is no explicit permission to do so granted via the IOMMU.
Optionally, the IOMMU could also include the following nice-to-have features:
* The ability to do address translation for hardware DMA operations (this would
allow the Fuchsia project to use pinned but discontinuous physical memory
for HW DMA).
* The ability to detect and debug IOMMU page-fault situations (e.g. if a unit
steps out of bounds, it would be nice to be able to get an exception, and some
context like which unit attempted which operation at which location).
###### Rationale
Zircon drivers are user-mode software components with very restricted hardware
access. An IOMMU defends against bugs or attacks from devices with access to
physical memory, and is more reliable than auditing the hardware and software.
This improves the overall security of the Fuchsia operating system.
###### Examples
ARM's IOMMU specification: System Memory Management Unit (SMMU)
Intel's x86 IOMMU specifications: Intel VT-d, AMD-Vi
##### Recommended: Hardware cryptographic acceleration support
The Fuchsia project recommends that the hardware platform provides hardware
acceleration for both AES and SHA cryptographic operations.
###### Rationale
Fuchsia makes extensive use of cryptographic operations, so hardware
acceleration is highly desirable for acceptable performance, especially on
smaller hardware platforms.
###### Examples
ARM v8.0-A (Cortex A-34) or later:
* AES: AESE, AESD, AESMC, AESIMC, PMULL and PMULL2
* SHA2: SHA256H, SHA256H2, SHA256U0, SHA256U1
ARM 8.1 or later (or ARMv8-A if supported):
* CRC32
x86 processors:
* AES-NI: Intel ('Westmere' and newer; 'Silvermont' Atoms and newer)
* AES-NI: AMD ('Bulldozer' and newer; 'Jaguar' and newer)
* SHA(1, 256): Intel ('Ice Lake' and newer; 'Goldmont Plus' Atoms and newer)
* SHA(1, 256): AMD ('Zen' and newer)
* CRC32 (Processors supporting SSE 4.2)
### Recommended toolchain and language support {#recommended-base-toolchain-and-language-support}
The following toolchain and language support specifications are recommended but
not required.
#### Recommended: GCC toolchain support
The Fuchsia project recommends that the given architecture, platform and target
board be fully supported by the GCC toolchain. For pure application development
which is not platform specific, LLVM-only support is acceptable.
##### Rationale
Having a second toolchain uncovers more bugs.
#### Recommended: Tier 1 Rust language support {#tier-1-rust-language-support}
The Fuchsia project recommends
[Tier 1](https://doc.rust-lang.org/nightly/rustc/platform-support.html#tier-1)
Rust support for any given architecture, platform, and target board.
##### Rationale
Fuchsia uses Rust extensively. For additional information on the benefits of
Tier 1 support, see
[Tier 1 Target Policy](https://doc.rust-lang.org/nightly/rustc/target-tier-policy.html#tier-1-target-policy).
## Supported hardware specifications {#supported-hardware-specifications}
The following are specifications for **Supported hardware**. Tests, hosted
by the Fuchsia project, are run on Supported hardware as a part of Fuchsia's
continuous integration and testing process. Fuchsia-project hosted testing is
performed on Supported hardware and its results can be seen by external
contributors. Examples of Supported hardware include
the [Intel NUC](/docs/development/hardware/intel_nuc.md)
and VIM3. For more information on the support expectations for
Supported hardware, see [Specification Summary](#hardware-platform-summary).
Supported hardware specifications are further divided into two
categories: Required and Recommended.
Note: This section of the RFC establishes the _current_ and _intial_ set of
technical specifications for Supported hardware. The Supported hardware
category as well as its related Recommended and Required specifications are
subject to change and could be modified as the Fuchsia project progresses.
See the following table for the further details about Required and
Recommended specifications:
<table>
<tr>
<td><strong>Supported hardware specification</strong>
</td>
<td><strong>Definition</strong>
</td>
</tr>
<tr>
<td>Required
</td>
<td>Without this specification, this hardware platform cannot be categorized
as Supported hardware.
</td>
</tr>
<tr>
<td>Recommended
</td>
<td>This specification is highly desirable but not required for the
Supported hardware categorization. Without this specification, Fuchsia's
functionality or performance will be compromised.
</td>
</tr>
</table>
### Required specifications {#required-supported-specifications}
In addition to the [base specifications](#base-hardware-specifications),
Supported hardware must also comply with the following specifications to
be considered for the Supported hardware support tier.
#### Required: Bootloader openness
The final stage bootloader, which is the software component of the boot process
that loads the Fuchsia kernel, must adhere to the following requirements:
* The Fuchsia project must be able to make changes to the bootloader.
* The Fuchsia project must be able to build the bootloader.
* The Fuchsia project must be able to distribute the source and binary that
result from any changes made by the Fuchsia project to the bootloader.
The bootloader does not need to have a Fuchsia-compatible license. Earlier
stages in the boot process before the bootloader do not need to be open source,
but this is highly preferred if possible. See also
[requirements for documentation and support](#recommended-documentation-and-support).
It is highly desirable for the source to be developed in the open, that the
source project owners accept bug reports and external changes to be
integrated, and that they provide continuing support for the project.
##### Rationale
Open source bootloaders can be modified to directly support loading Fuchsia
rather than using boot shims. Proprietary blobs are difficult to debug or audit
for security. Parts of the early boot process are often unavailable as open
source and would be impractical to replace with open versions; for example
vendor proprietary versions of the ARM Trusted Execution Environment, or
Unified Extensible Firmware Interface (UEFI) implementations on x86 platforms.
##### Examples
[coreboot](https://coreboot.org), [U-boot](https://www.denx.de/wiki/U-Boot).
#### Required: Architecture must be supported by QEMU
The architecture must be supported by the latest Fuchsia project QEMU
version. It is desirable but not necessary that:
* The specific platform is supported.
* The architecture is virtualizable under QEMU.
* QEMU be able to run on host QEMU machines with the same architecture
(i.e. QEMU-kvm x86 on x86 host, or QEMU-kvm arm64 on arm64 host).
If the architecture has modes that are targeted, for example ARM Trustzone, QEMU
should be able to emulate them.
##### Rationale
To provide scalable hardware support for building and testing, QEMU is used for
continuous integration. Without QEMU support for a target architecture, code
cannot be built or tested in a scalable way.
#### Required: Serial console access
The hardware platform must support some form of serial console access for
development purposes. It is not required to be present for production systems
delivered to end users. The serial console must support interrupt driven TX and
RX.
DMA support is a nice to have feature, although using DMA must not be required.
##### Rationale
A simple serial console is the most reliable way to develop and debug during
early platform development.
### Recommended specifications {#recommended-supported-specifications}
While not required for the Supported hardware tier, the following specifications
are highly desirable supplements to the Required Supported specifications.
#### Recommended: Documentation and support {#recommended-documentation-and-support}
The platform should have reasonable publicly-available documentation, including:
* Register maps
* Theory of operation
* Information about boot time hardware state
A board that is only documented using a fork of Linux or the Android Open Source
Project is not acceptable. The platform vendor must be willing to answer
questions either in person or through email.
##### Rationale
Without accurate documentation, writing drivers and debugging is reduced to
reverse engineering existing software, which is error-prone and slow. Using
existing source code for documentation that has a license incompatible with
Fuchsia's license may risk inadvertent copying of code.
#### Recommended: Bootloader support for fastboot
The Fuchsia project recommends that the bootloader support the set of fastboot
protocol commands listed in the [Appendix](#appendix).
The Fuchsia project recommends that fastboot occurs on non-proprietary
transports.
##### Rationale
Uniformly supporting fastboot makes it easier to work with different
hardware platforms, and assists with automation when dealing with fleets of
multiple machines.
#### Recommended: Virtualization support
The Fuchsia project recommends that the platform and bootloader allow full
virtualization support.
##### Intel x86
Within the Fuchsia project, the following is needed to fully support
virtualization on Intel x86 CPUs:
* VMX
* EPT
* RDTSCP
* x2APIC
* VPID
* Unrestricted guests
* TPR virtualization
* MSR bitmaps
* Exception bitmaps
Optionally, the Fuchsia project recommends:
* INVPCID
* PAUSE-loop exiting
##### ARM
Within the Fuchsia project, the following is needed to fully support
virtualization on ARM:
* ARMv8.0
* EL2 access
* Host physical timer / guest virtual timer split
* GICv2 or GICv3
* GIC virtualization
##### Rationale
Virtualization is useful for many purposes. For example on ARM64, if
Zircon executes at EL2, EL1/EL0 can be virtualized for improved isolation.
##### Examples
ARM: Armv8-A AArch64; x86: Intel VT-x, AMD VT
#### Recommended: Hardware assisted tracing
The hardware platform should support some form of hardware control flow tracing.
##### Rationale
Low-cost tracing makes it more feasible to do automated feedback-directed
optimization (AutoFDO) of release builds.
##### Examples
ARM: CoreSight ETM; x86: Intel last branch records (LBR).
## Hardware platform categories {#hardware-platform-categories}
The Fuchsia project has two categories for Fuchsia-compatible hardware
platforms: Supported and Experimental. Fuchsia's hardware specifications differ
based on the category. Both Supported and Experimental hardware must fulfill
their required [base specifications](#base-hardware-specifications).
While not required, the Fuchsia project encourages both Supported and
Experimental hardware to comply with their respective Recommended
specifications, as listed in the
[Hardware platform summary](#hardware-platform-summary).
For a summary of the differences between Supported and Experimental
hardware, see [Hardware platform summary](#hardware-platform-summary).
### Supported hardware {#supported-hardware}
Supported hardware has the following benefits:
* Supported hardware is tested by the Fuchsia project.
* No Experimental hardware contributions can break Supported hardware.
* The Fuchsia project is committed to responding to Monorail issues filed
against Supported hardware. [Members](/docs/contribute/community/contributor-roles.md#member), as
defined in Fuchsia contributor roles, can propose patches to add new Supported hardware platforms
or fix existing Supported hardware platforms.
### Experimental hardware {#experimental-hardware}
Experimental Hardware platforms should not be considered as appropriate for
production environments. Rather, the Fuchsia project considers Experimental
hardware as avenues for exploring and learning about Fuchsia. Experimental
hardware is built on a best-effort basis, meaning, Fuchsia may or may not work
at any given point in time on that given hardware platform.
Experimental hardware is not tested by the Fuchsia project and is not guaranteed
to work, but [Members](/docs/contribute/community/contributor-roles.md#member) who develop for Fuchsia
on the Experimental tier hardware can propose patches
to add a new Experimental hardware or fix existing Experimental hardware.
Gerrit changes that add new Experimental hardware or alter existing Experimental
hardware may not break Supported hardware or introduce external code
dependencies in Zircon or other Fuchsia project code.
Members developing for hardware within the Experimental hardware category only
need to comply with the [base specifications](#base-hardware-specifications).
### Hardware platform summary {#hardware-platform-summary}
The following table summarizes Fuchsia's hardware specifications categories as
well as the availability and testing expectations associated with the Supported
hardware and Experimental hardware platforms.
<table>
<tr>
<td><strong>Hardware platform category</strong>
<p>
</td>
<td><strong>Capabilities</strong>
</td>
<td><strong>Accepts contributions</strong>
</td>
<td><strong>Availability expectations</strong>
<p>
</td>
<td><strong>Testing expectations</strong>
</td>
<td><strong>Required specifications</strong>
</td>
<td><strong>Recommended specifications</strong>
</td>
</tr>
<tr>
<td>Supported hardware
</td>
<td><ul>
<li>Developers can expect to build and install Fuchsia on Supported hardware.
<li>This hardware may not depend on any <a href="/docs/contribute/governance/policy/open-source-licensing-policies#external_code">external code</a>. </li>
</li>
</td>
<td>
Yes, provided that these contributions don't break Supported hardware or
introduce Experimental code dependencies in Zircon or other
non-Experimental code.
</td>
<td><ul>
<li>The Fuchsia project tests against Supported hardware and blocks
contributions that might cause Supported hardware to break.
<li>Monorail Issues filed against hardware in the Supported hardware tier are
responded to but there is no service level objective (SLO).</li>
</li></ul>
</td>
<td><ul>
<li>Fuchsia project-hosted testing is performed on Supported hardware. All
contributors can see results of these tests.</li></ul>
</td>
<td>
<a href="#base-hardware-specifications">All Required Base hardware specifications</a> which include:
<ul>
<li><a href="#required-base-hardware-features">Required Hardware Features</a></li>
<li><a href="#required-base-toolchain-and-language-support">Required toolchain and language support</a></li>
</ul> and
<a href="#required-supported-specifications">All Required Supported hardware specifications</a>
</td>
<td>
<a href="#recommended-supported-specifications">All Recommended Supported specifications</a>
</td>
</tr>
<tr>
<td>Experimental hardware
</td>
<td><ul>
<li>Developers can expect to build and install Fuchsia on Experimental
hardware.
<li>Any external contributor may propose patches to add a new Experimental
hardware platform, but changes may not break Supported hardware, or introduce
Experimental code dependencies in Zircon or other common code. </li></ul>
</li>
</td>
<td>
Yes, provided that these contributions don't break Supported hardware or
introduce Experimental code dependencies in Zircon or other non-Experimental code.
</td>
<td><ul>
<li>Experimental hardware is built on a best-effort basis and may or may not
work at any given point in time.
<li>Any Experimental contribution that could break Supported hardware
is rejected.</li>
</li></ul>
</td>
<td><ul>
<li>No Fuchsia project-hosted hardware-specific testing is done for Experimental
hardware beyond the standard testing done to submit and merge any Fuchsia
commit.</li></ul>
</td>
<td>
<a href="#base-hardware-specifications">All Required Base hardware specifications</a>
which include:
<ul>
<li><a href="#required-base-hardware-features">Required Hardware Features</a></li>
<li><a href="#required-base-toolchain-and-language-support">Required toolchain and language support</a></li>
</ul>
</td>
<td>
<a href="#base-hardware-specifications">All Recommended Base hardware specifications</a> which include:
<ul>
<li><a href="#recommended-base-hardware-features">Recommended Hardware Features</a></li>
<li><a href="#recommended-base-toolchain-and-language-support">Recommended toolchain and language support</a></li>
</ul>
</td>
</tr>
</table>
## Adding hardware platforms to the Fuchsia source {#add-hardware-to-fuchsia-source}
This section details the process for adding new hardware to the Fuchsia source
and the associated responsibilities with adding hardware to the Fuchsia source.
The Fuchsia project accepts Gerrit contributions to both the Supported hardware
and Experimental hardware platform categories.
### Understanding contribution guidelines {#understanding-contribution-guidelines}
The Fuchsia project encourages contributions to both Supported and Experimental
hardware categories with the fundamental understanding that hardware
contributions cannot break Supported hardware. Any contribution that breaks
Supported hardware won't be merged into the Fuchsia source.
Changes that fix bugs in Fuchsia that would otherwise block Experimental
hardware are encouraged, and go through the typical code review process
described
in [Contribute changes](/docs/development/source_code/contribute_changes.md). However, any proposed change may be rejected if it
introduces a substantial new testing, maintenance, or support burden for
Supported hardware in the Fuchsia project.
### Contribution process {#contribution-process}
The process for adding hardware platforms to the Fuchsia source varies
depending on whether you are adding architecture, boards, or drivers.
#### Experimental contributions {#experimental-contributions-process}
##### Processor Architecture
There is no project-endorsed method for adding an Experimental processor
architecture.
##### Boards and Drivers
To add an Experimental board or driver, use Fuchsia's
[code review process](/docs/development/source_code/contribute_changes.md)
and ensure that your Gerrit change conforms to the Rubric.
###### Code management
In your Gerrit change, make sure to create a folder in the appropriate location.
For example, to add a board, create a new folder
in `/src/devices/boards/drivers`. In your Gerrit change include an OWNERS file
that states the email address of each owner of the board or driver. For more
information on OWNERS' responsibilities, see [Responsibilities](#experimental-contributions-responsibilities).
##### Responsibilities {#experimental-contributions-responsibilities}
In addition to the responsibilities [listed](#experimental-contributions-responsibilities) for OWNERS of non-hardware
related code, boards and driver OWNERS must comply with the following
Service Level Objectives (SLOs):
* **Code review SLO:** Reply to code review requests for the repository they
own within 3 calendar days. Anyone listed in the repository's OWNERS file can
perform the code review.
* Failure to comply with this SLO may result in either of the following
scenarios:
* Any member of the Fuchsia project performing the review.
* The temporary disabling of the board or driver from the build
system.
* **Refactor SLO:** Implement refactors required to advance the driver SDK
within 5 calendar days. If the refactor is too complex for the 5 day SLO, an
extended period can be defined in the refactor request by the Fuchsia project.
Refactor requests will be sent through e-mail sent to addresses listed in the
respective OWNERS file.
* Refactors required to advance the Fuchsia frameworks may be reviewed by
members of the Fuchsia project without expecting a review from an OWNER of
a particular board or driver repository. CCing OWNERS on Gerrit changes
that implement these types of refactorings is encouraged but not
required. For more information on the CC property in Gerrit, see
[Change properties](https://gerrit-review.googlesource.com/Documentation/concept-changes.html)
in the Gerrit documentation.
* Refactors include but aren't limited to the following:
* [FDF](/docs/development/drivers/concepts/fdf.md),
driver [FIDL](/sdk/fidl/)
`[fuchsia.hardware.\*]` and [Banjo](/sdk/banjo/)
interfaces, syscalls
* Failure to comply with the SLO may result in the temporary disabling
of the board or driver from the build system.
Note: Modifications to FIDL interfaces that are used outside of `fuchsia.git`
must comply with the FIDL
[transitions](/docs/development/source_code/working_across_petals.md)
process.
##### Disabled boards and drivers
Boards and drivers that have been temporarily disabled can be re-enabled once
either the refactor or review that prompted the disabling has been
resolved/completed.
Boards and drivers may be removed from `fuchsia.git `if there are 3 instances
of not complying with the listed SLOs. Compliance with these SLOs indicate clear commitment from the OWNERS to support the
code in their repositories. If you wish to dispute the removal of your
driver from `fuchsia.git`, you must confer with the
Fuchsia Engineering Council through the
[Fuchsia RFC process](/docs/contribute/governance/rfcs/rfc_process.md).
###### Deleted Drivers
For drivers removed based on this policy, a `/docs/reference/hardware/_driver_epitaphs.yaml` file
will list all deleted drivers and include the following information:
* `Short_description: `Provides a description of the deleted driver.
* `Tracking_bug`: A Monorail issue that describes the reason for the
driver's deletion.
* `Gerrit_change_id: `The ID of the Gerrit change used to delete the driver.
* `Available_in_git: `The last known git SHA that still includes the driver.
* `Path: `The path of the deleted driver.
For example:
```
- short_description: 'Qualcomm Peripheral Image Loading driver'
tracking_bug: '123456'
gerrit_change_id: '506858'
available_in_git: 'f441460db6b70ba38150c3437f42ff3d045d2b71'
path: '/src/devices/fw/drivers/qcom-pil'
```
Note: Generally, deleted drivers are available through the source
control history.
The process to delete a driver includes:
1. Get approval from at least one OWNER of the driver. If all of the OWNERS
have abandoned the driver and are not responding, then an OWNER higher in the
Fuchsia tree needs to approve the CL that performs the deletion.
2. Add an entry in the `/docs/reference/hardware/_driver_epitaphs.yaml` file
for each driver deleted, including a git hash for the fuchsia.git repository
that contained the driver before deletion.
### Supported contributions {#supported-contributions-process}
#### Processor Architecture
To propose adding a new architecture to the Fuchsia source, use
the [Fuchsia RFC process](/docs/contribute/governance/rfcs).
Adding a new architecture can add a significant amount of work to Fuchsia
development and, as such, needs to be resolved through the RFC process.
Any processor added through the RFC process is categorized as
Supported hardware.
##### Code management
If your RFC is Accepted, then you can create a Gerrit change
that includes your proposed architecture and request a code review using
Fuchsia's [code review process](/docs/development/source_code/contribute_changes.md).
In your Gerrit change include an OWNERS file that states
the email address of each owner of the architecture. For more information on
OWNERS' responsibilities, see [Responsibilities](#experimental-contributions-responsibilities).
#### Boards and Drivers
To add a Supported hardware board or driver, use the
[Fuchsia RFC process](/docs/contribute/governance/rfcs).
Multiple drivers can be included in one RFC. A single RFC can also propose
both a board and a driver.
Supported hardware requires infrastructure for Google-hosted testing, which
adds significant resource utilization. Allocation of resources for RFC-approved
Supported hardware may require additional review which is outside the scope of
this document.
Adding a driver for a part of a computer system that was previously approved
through the RFC process does not require a new RFC; it can simply be added
through the
code [review process](/docs/development/source_code/contribute_changes.md).
##### Code management
If your RFC is Accepted, then you can create a Gerrit change that includes
your board or driver and request a code review using Fuchsia's
[code review process](/docs/development/source_code/contribute_changes.md).
In your Gerrit change, make sure to create a folder in the appropriate location.
For example, to add a board, create a new folder in `/src/devices/boards`. In
your Gerrit change, include an OWNERS file that states the email address of
each owner of the board or driver. For more information on OWNERS'
responsibilities, see [Responsibilities](#experimental-contributions-responsibilities).
### Certification
At this time adding new boards or drivers will be only required to comply with
the Rubric as described above.
## Appendix {#appendix}
### Required fastboot commands
The bootloader must reliably fail when given an unsupported fastboot command
(not hang or prevent the device from functioning). Unexpected commands should
either succeed or reliably fail. For more information about fastboot, see
[fastboot](https://android.googlesource.com/platform/system/core/+/refs/heads/master/fastboot).
Note: Commands should return to the fastboot command prompt after terminating,
to allow additional commands.
The following standard fastboot commands are required:
* erase &lt;partition>
* flash &lt;partition> &lt;file>
* getvar &lt;name>
* reboot
* reboot bootloader
* reboot recovery
* set\_active {a,b}
* boot &lt;file>
Required getvar variables:
* current-slot
* hw-revision
* max-download-size
* product
* serialno
* slot-retry-count:a
* slot-retry-count:b
* slot-successful:a
* slot-successful:b
* slot-unbootable:a
* slot-unbootable:b
* version
* all
The following commands are optional but can be helpful for development:
* oem stage-partition &lt;partition> + get\_staged