359 lines
13 KiB
YAML
359 lines
13 KiB
YAML
|
# SPDX-License-Identifier: GPL-2.0
|
||
|
%YAML 1.2
|
||
|
---
|
||
|
$id: http://devicetree.org/schemas/fpga/fpga-region.yaml#
|
||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||
|
|
||
|
title: FPGA Region
|
||
|
|
||
|
maintainers:
|
||
|
- Michal Simek <michal.simek@amd.com>
|
||
|
|
||
|
description: |
|
||
|
CONTENTS
|
||
|
- Introduction
|
||
|
- Terminology
|
||
|
- Sequence
|
||
|
- FPGA Region
|
||
|
- Supported Use Models
|
||
|
- Constraints
|
||
|
|
||
|
|
||
|
Introduction
|
||
|
============
|
||
|
|
||
|
FPGA Regions represent FPGA's and partial reconfiguration regions of FPGA's in
|
||
|
the Device Tree. FPGA Regions provide a way to program FPGAs under device tree
|
||
|
control.
|
||
|
|
||
|
The documentation hits some of the high points of FPGA usage and
|
||
|
attempts to include terminology used by both major FPGA manufacturers. This
|
||
|
document isn't a replacement for any manufacturers specifications for FPGA
|
||
|
usage.
|
||
|
|
||
|
|
||
|
Terminology
|
||
|
===========
|
||
|
|
||
|
Full Reconfiguration
|
||
|
* The entire FPGA is programmed.
|
||
|
|
||
|
Partial Reconfiguration (PR)
|
||
|
* A section of an FPGA is reprogrammed while the rest of the FPGA is not
|
||
|
affected.
|
||
|
* Not all FPGA's support PR.
|
||
|
|
||
|
Partial Reconfiguration Region (PRR)
|
||
|
* Also called a "reconfigurable partition"
|
||
|
* A PRR is a specific section of an FPGA reserved for reconfiguration.
|
||
|
* A base (or static) FPGA image may create a set of PRR's that later may
|
||
|
be independently reprogrammed many times.
|
||
|
* The size and specific location of each PRR is fixed.
|
||
|
* The connections at the edge of each PRR are fixed. The image that is loaded
|
||
|
into a PRR must fit and must use a subset of the region's connections.
|
||
|
* The busses within the FPGA are split such that each region gets its own
|
||
|
branch that may be gated independently.
|
||
|
|
||
|
Persona
|
||
|
* Also called a "partial bit stream"
|
||
|
* An FPGA image that is designed to be loaded into a PRR. There may be
|
||
|
any number of personas designed to fit into a PRR, but only one at a time
|
||
|
may be loaded.
|
||
|
* A persona may create more regions.
|
||
|
|
||
|
FPGA Bridge
|
||
|
* FPGA Bridges gate bus signals between a host and FPGA.
|
||
|
* FPGA Bridges should be disabled while the FPGA is being programmed to
|
||
|
prevent spurious signals on the cpu bus and to the soft logic.
|
||
|
* FPGA bridges may be actual hardware or soft logic on an FPGA.
|
||
|
* During Full Reconfiguration, hardware bridges between the host and FPGA
|
||
|
will be disabled.
|
||
|
* During Partial Reconfiguration of a specific region, that region's bridge
|
||
|
will be used to gate the busses. Traffic to other regions is not affected.
|
||
|
* In some implementations, the FPGA Manager transparently handles gating the
|
||
|
buses, eliminating the need to show the hardware FPGA bridges in the
|
||
|
device tree.
|
||
|
* An FPGA image may create a set of reprogrammable regions, each having its
|
||
|
own bridge and its own split of the busses in the FPGA.
|
||
|
|
||
|
FPGA Manager
|
||
|
* An FPGA Manager is a hardware block that programs an FPGA under the control
|
||
|
of a host processor.
|
||
|
|
||
|
Base Image
|
||
|
* Also called the "static image"
|
||
|
* An FPGA image that is designed to do full reconfiguration of the FPGA.
|
||
|
* A base image may set up a set of partial reconfiguration regions that may
|
||
|
later be reprogrammed.
|
||
|
|
||
|
---------------- ----------------------------------
|
||
|
| Host CPU | | FPGA |
|
||
|
| | | |
|
||
|
| ----| | ----------- -------- |
|
||
|
| | H | | |==>| Bridge0 |<==>| PRR0 | |
|
||
|
| | W | | | ----------- -------- |
|
||
|
| | | | | |
|
||
|
| | B |<=====>|<==| ----------- -------- |
|
||
|
| | R | | |==>| Bridge1 |<==>| PRR1 | |
|
||
|
| | I | | | ----------- -------- |
|
||
|
| | D | | | |
|
||
|
| | G | | | ----------- -------- |
|
||
|
| | E | | |==>| Bridge2 |<==>| PRR2 | |
|
||
|
| ----| | ----------- -------- |
|
||
|
| | | |
|
||
|
---------------- ----------------------------------
|
||
|
|
||
|
Figure 1: An FPGA set up with a base image that created three regions. Each
|
||
|
region (PRR0-2) gets its own split of the busses that is independently gated by
|
||
|
a soft logic bridge (Bridge0-2) in the FPGA. The contents of each PRR can be
|
||
|
reprogrammed independently while the rest of the system continues to function.
|
||
|
|
||
|
|
||
|
Sequence
|
||
|
========
|
||
|
|
||
|
When a DT overlay that targets an FPGA Region is applied, the FPGA Region will
|
||
|
do the following:
|
||
|
|
||
|
1. Disable appropriate FPGA bridges.
|
||
|
2. Program the FPGA using the FPGA manager.
|
||
|
3. Enable the FPGA bridges.
|
||
|
4. The Device Tree overlay is accepted into the live tree.
|
||
|
5. Child devices are populated.
|
||
|
|
||
|
When the overlay is removed, the child nodes will be removed and the FPGA Region
|
||
|
will disable the bridges.
|
||
|
|
||
|
|
||
|
FPGA Region
|
||
|
===========
|
||
|
|
||
|
FPGA Regions represent FPGA's and FPGA PR regions in the device tree. An FPGA
|
||
|
Region brings together the elements needed to program on a running system and
|
||
|
add the child devices:
|
||
|
|
||
|
* FPGA Manager
|
||
|
* FPGA Bridges
|
||
|
* image-specific information needed to the programming.
|
||
|
* child nodes
|
||
|
|
||
|
The intended use is that a Device Tree overlay (DTO) can be used to reprogram an
|
||
|
FPGA while an operating system is running.
|
||
|
|
||
|
An FPGA Region that exists in the live Device Tree reflects the current state.
|
||
|
If the live tree shows a "firmware-name" property or child nodes under an FPGA
|
||
|
Region, the FPGA already has been programmed. A DTO that targets an FPGA Region
|
||
|
and adds the "firmware-name" property is taken as a request to reprogram the
|
||
|
FPGA. After reprogramming is successful, the overlay is accepted into the live
|
||
|
tree.
|
||
|
|
||
|
The base FPGA Region in the device tree represents the FPGA and supports full
|
||
|
reconfiguration. It must include a phandle to an FPGA Manager. The base
|
||
|
FPGA region will be the child of one of the hardware bridges (the bridge that
|
||
|
allows register access) between the cpu and the FPGA. If there are more than
|
||
|
one bridge to control during FPGA programming, the region will also contain a
|
||
|
list of phandles to the additional hardware FPGA Bridges.
|
||
|
|
||
|
For partial reconfiguration (PR), each PR region will have an FPGA Region.
|
||
|
These FPGA regions are children of FPGA bridges which are then children of the
|
||
|
base FPGA region. The "Full Reconfiguration to add PRR's" example below shows
|
||
|
this.
|
||
|
|
||
|
If an FPGA Region does not specify an FPGA Manager, it will inherit the FPGA
|
||
|
Manager specified by its ancestor FPGA Region. This supports both the case
|
||
|
where the same FPGA Manager is used for all of an FPGA as well the case where
|
||
|
a different FPGA Manager is used for each region.
|
||
|
|
||
|
FPGA Regions do not inherit their ancestor FPGA regions' bridges. This prevents
|
||
|
shutting down bridges that are upstream from the other active regions while one
|
||
|
region is getting reconfigured (see Figure 1 above). During PR, the FPGA's
|
||
|
hardware bridges remain enabled. The PR regions' bridges will be FPGA bridges
|
||
|
within the static image of the FPGA.
|
||
|
|
||
|
|
||
|
Supported Use Models
|
||
|
====================
|
||
|
|
||
|
In all cases the live DT must have the FPGA Manager, FPGA Bridges (if any), and
|
||
|
a FPGA Region. The target of the Device Tree Overlay is the FPGA Region. Some
|
||
|
uses are specific to an FPGA device.
|
||
|
|
||
|
* No FPGA Bridges
|
||
|
In this case, the FPGA Manager which programs the FPGA also handles the
|
||
|
bridges behind the scenes. No FPGA Bridge devices are needed for full
|
||
|
reconfiguration.
|
||
|
|
||
|
* Full reconfiguration with hardware bridges
|
||
|
In this case, there are hardware bridges between the processor and FPGA that
|
||
|
need to be controlled during full reconfiguration. Before the overlay is
|
||
|
applied, the live DT must include the FPGA Manager, FPGA Bridges, and a
|
||
|
FPGA Region. The FPGA Region is the child of the bridge that allows
|
||
|
register access to the FPGA. Additional bridges may be listed in a
|
||
|
fpga-bridges property in the FPGA region or in the device tree overlay.
|
||
|
|
||
|
* Partial reconfiguration with bridges in the FPGA
|
||
|
In this case, the FPGA will have one or more PRR's that may be programmed
|
||
|
separately while the rest of the FPGA can remain active. To manage this,
|
||
|
bridges need to exist in the FPGA that can gate the buses going to each FPGA
|
||
|
region while the buses are enabled for other sections. Before any partial
|
||
|
reconfiguration can be done, a base FPGA image must be loaded which includes
|
||
|
PRR's with FPGA bridges. The device tree should have an FPGA region for each
|
||
|
PRR.
|
||
|
|
||
|
Constraints
|
||
|
===========
|
||
|
|
||
|
It is beyond the scope of this document to fully describe all the FPGA design
|
||
|
constraints required to make partial reconfiguration work[1] [2] [3], but a few
|
||
|
deserve quick mention.
|
||
|
|
||
|
A persona must have boundary connections that line up with those of the partition
|
||
|
or region it is designed to go into.
|
||
|
|
||
|
During programming, transactions through those connections must be stopped and
|
||
|
the connections must be held at a fixed logic level. This can be achieved by
|
||
|
FPGA Bridges that exist on the FPGA fabric prior to the partial reconfiguration.
|
||
|
|
||
|
--
|
||
|
[1] www.altera.com/content/dam/altera-www/global/en_US/pdfs/literature/ug/ug_partrecon.pdf
|
||
|
[2] tspace.library.utoronto.ca/bitstream/1807/67932/1/Byma_Stuart_A_201411_MAS_thesis.pdf
|
||
|
[3] https://www.xilinx.com/support/documentation/sw_manuals/xilinx14_1/ug702.pdf
|
||
|
|
||
|
properties:
|
||
|
$nodename:
|
||
|
pattern: "^fpga-region(@.*|-([0-9]|[1-9][0-9]+))?$"
|
||
|
|
||
|
compatible:
|
||
|
const: fpga-region
|
||
|
|
||
|
reg:
|
||
|
maxItems: 1
|
||
|
|
||
|
ranges: true
|
||
|
"#address-cells": true
|
||
|
"#size-cells": true
|
||
|
|
||
|
config-complete-timeout-us:
|
||
|
description:
|
||
|
The maximum time in microseconds time for the FPGA to go to operating
|
||
|
mode after the region has been programmed.
|
||
|
|
||
|
encrypted-fpga-config:
|
||
|
type: boolean
|
||
|
description:
|
||
|
Set if the bitstream is encrypted.
|
||
|
|
||
|
external-fpga-config:
|
||
|
type: boolean
|
||
|
description:
|
||
|
Set if the FPGA has already been configured prior to OS boot up.
|
||
|
|
||
|
firmware-name:
|
||
|
maxItems: 1
|
||
|
description:
|
||
|
Should contain the name of an FPGA image file located on the firmware
|
||
|
search path. If this property shows up in a live device tree it indicates
|
||
|
that the FPGA has already been programmed with this image.
|
||
|
If this property is in an overlay targeting an FPGA region, it is
|
||
|
a request to program the FPGA with that image.
|
||
|
|
||
|
fpga-bridges:
|
||
|
$ref: /schemas/types.yaml#/definitions/phandle-array
|
||
|
description:
|
||
|
Should contain a list of phandles to FPGA Bridges that must be
|
||
|
controlled during FPGA programming along with the parent FPGA bridge.
|
||
|
This property is optional if the FPGA Manager handles the bridges.
|
||
|
If the fpga-region is the child of an fpga-bridge, the list should not
|
||
|
contain the parent bridge.
|
||
|
|
||
|
fpga-mgr:
|
||
|
$ref: /schemas/types.yaml#/definitions/phandle
|
||
|
description:
|
||
|
Should contain a phandle to an FPGA Manager. Child FPGA Regions
|
||
|
inherit this property from their ancestor regions. An fpga-mgr property
|
||
|
in a region will override any inherited FPGA manager.
|
||
|
|
||
|
partial-fpga-config:
|
||
|
type: boolean
|
||
|
description:
|
||
|
Set if partial reconfiguration is to be done, otherwise full
|
||
|
reconfiguration is done.
|
||
|
|
||
|
region-freeze-timeout-us:
|
||
|
description:
|
||
|
The maximum time in microseconds to wait for bridges to successfully
|
||
|
become disabled before the region has been programmed.
|
||
|
|
||
|
region-unfreeze-timeout-us:
|
||
|
description:
|
||
|
The maximum time in microseconds to wait for bridges to successfully
|
||
|
become enabled after the region has been programmed.
|
||
|
|
||
|
required:
|
||
|
- compatible
|
||
|
- fpga-mgr
|
||
|
|
||
|
additionalProperties:
|
||
|
type: object
|
||
|
|
||
|
examples:
|
||
|
- |
|
||
|
/*
|
||
|
* Full Reconfiguration without Bridges with DT overlay
|
||
|
*/
|
||
|
fpga_region0: fpga-region@0 {
|
||
|
compatible = "fpga-region";
|
||
|
reg = <0 0>;
|
||
|
#address-cells = <1>;
|
||
|
#size-cells = <1>;
|
||
|
fpga-mgr = <&fpga_mgr0>;
|
||
|
ranges = <0x10000000 0x20000000 0x10000000>;
|
||
|
|
||
|
/* DT Overlay contains: &fpga_region0 */
|
||
|
firmware-name = "zynq-gpio.bin";
|
||
|
gpio@40000000 {
|
||
|
compatible = "xlnx,xps-gpio-1.00.a";
|
||
|
reg = <0x40000000 0x10000>;
|
||
|
gpio-controller;
|
||
|
#gpio-cells = <2>;
|
||
|
};
|
||
|
};
|
||
|
|
||
|
- |
|
||
|
/*
|
||
|
* Partial reconfiguration with bridge
|
||
|
*/
|
||
|
fpga_region1: fpga-region@0 {
|
||
|
compatible = "fpga-region";
|
||
|
reg = <0 0>;
|
||
|
ranges;
|
||
|
#address-cells = <1>;
|
||
|
#size-cells = <1>;
|
||
|
fpga-mgr = <&fpga_mgr1>;
|
||
|
fpga-bridges = <&fpga_bridge1>;
|
||
|
partial-fpga-config;
|
||
|
|
||
|
/* DT Overlay contains: &fpga_region1 */
|
||
|
firmware-name = "zynq-gpio-partial.bin";
|
||
|
clk: clock {
|
||
|
compatible = "fixed-factor-clock";
|
||
|
clocks = <&parentclk>;
|
||
|
#clock-cells = <0>;
|
||
|
clock-div = <2>;
|
||
|
clock-mult = <1>;
|
||
|
};
|
||
|
axi {
|
||
|
compatible = "simple-bus";
|
||
|
#address-cells = <1>;
|
||
|
#size-cells = <1>;
|
||
|
ranges;
|
||
|
gpio@40000000 {
|
||
|
compatible = "xlnx,xps-gpio-1.00.a";
|
||
|
reg = <0x40000000 0x10000>;
|
||
|
#gpio-cells = <2>;
|
||
|
gpio-controller;
|
||
|
clocks = <&clk>;
|
||
|
};
|
||
|
};
|
||
|
};
|