[RFC] FPGA configuration as MTD using Device Tree
Ulf Samuelsson
u-boot at emagii.com
Mon Sep 14 17:38:35 CEST 2020
Den 2020-09-14 kl. 15:45, skrev Rob Westfall:
> Great idea Ulf.
>
> We (Xerox Corp) load the FPGAs in uBoot because they have the PCIe
> interface "hardware" and Linux comes up much easier if the PCIe
> hardware exists and is operational on boot instead of attempting to
> add it it later when Linux is up and you have to do a hot plug
> install.
>
> If we have FPGAs that don't have PCIe hardware, then we load them from
> Linux after the board is booted.
>
> The FPGA images are loaded from a network server by fetching the file
> using TFTP instead of a SPI device which adds cost and complexity to
> the hardware design. They are then load into the FPGA using a serial
> bitblt process.
>
> Yes, it does slow down the boot by a couple of seconds, but life is
> all about trade offs, and for us this is a good one.
>
Which FPGAs are You using?
We are using Cyclone 10, so that is what my driver supports.
BR
Ulf
> Rob Westfall
> Xerox Corporation
>
> On Mon, Sep 14, 2020 at 7:49 AM Michal Simek <monstr at monstr.eu> wrote:
>>
>> Hi,
>>
>> On 07. 09. 20 19:03, Ulf Samuelsson wrote:
>>> Hi,
>>> The FPGA support in u-boot looks a bit old-fashioned to me.
>>> I would like to have device-tree support and would
>>> like comments on my approach.
>>
>> Definitely there is a space for improvement.
>> In connection to DT - we should likely create fpga DM class for it.
>>
>>>
>>>
>>> ====================================================================
>>> BACKGROUND
>>> Need to support loading 2 x Cyclone-10 LP FPGAs using Passive Serial.
>>> Raw binary files (RBF) are stored in boot flash, and
>>> u-boot will load both FPGAs before booting the OS.
>>> The OS should be able to update the FPGAs as well.
>>> The FPGAs must be independently configurable.
>>>
>>> Hardwarewise, I have an SPI bus with 4 chip selects.
>>> SPI MOSI, SCK, CS2 and CS3 are connected to the synchronous serial bus
>>> of the FPGA (DATA0, DCLK, the FPGA1.nCS0 and the FPGA2.nCS0)
>>>
>>> Intel normally connect FPGA nCS0 to ground but I connect this to the SPI
>>> CS. The advantage is that I can have several FPGAs which are programmed
>>> independent to each other.
>>>
>>> The FPGAs require three other signals (nCONFIG, nSTATUS and CONF_DONE).
>>> Each FPGA have their own set of those signals.
>>> ====================================================================
>>>
>>> I have not found device-tree support for FPGAs in u-boot.
>>> Since the FPGAs are connected to the SPI, I thought adding them as MTD
>>> devices would result in a nice interface.
>>>
>>> ====================================================================
>>> Example Device tree connected to a bit-bang SPI driver supporting
>>> multiple chip select.
>>>
>>> The MTD configuration supplies
>>> * Name of the FPGA (fpga property)
>>> * The size of the configuration data
>>> * Sideband signals for starting and checking configuration.
>>>
>>> &soft_mcspi {
>>> compatible = "mcspi-gpio";
>>> pinctrl-names = "default";
>>> pinctrl-0 = <&soft_mcspi1_pins>;
>>> status = "okay";
>>> gpio-sck = <&gpio0 7 GPIO_ACTIVE_LOW>;
>>> gpio-miso = <&gpio1 8 GPIO_ACTIVE_HIGH>;
>>> gpio-mosi = <&gpio1 9 GPIO_ACTIVE_HIGH>;
>>> cs-gpios =
>>> <&gpio0 12 GPIO_ACTIVE_LOW>,
>>> <&gpio0 13 GPIO_ACTIVE_LOW>,
>>> <&gpio0 17 GPIO_ACTIVE_LOW>,
>>> <&gpio0 16 GPIO_ACTIVE_LOW>;
>>> num-chipselects = <4>;
>>> #address-cells = <1>;
>>> #size-cells = <0>;
>>> ...
>>> sspy-fpga-cfg at 3 { /* Intel Cyclone 10, 10CL025 */
>>> #address-cells = <1>;
>>> #size-cells = <1>;
>>> compatible = "intel,cyclone10";
>>> reg = <3>; /* Chip select 0 */
>>> spi-max-frequency = <1000000>;
>>> fpga = "spyf";
>>> config-size = <718569>;
>>> gpio-nconfig = <&gpio3 21 GPIO_ACTIVE_HIGH>;
>>> gpio-nstatus = <&gpio3 17 GPIO_ACTIVE_HIGH>;
>>> gpio-conf_done = <&gpio0 18 GPIO_ACTIVE_HIGH>;
>>> gpio-crc_error = <&gpio2 18 GPIO_ACTIVE_HIGH>;
>>> };
>>> };
>>> ====================================================================
>>>
>>> With a Cyclone 10 MTD driver, is would appear in the "mtd list" command
>>> and configuring the fpga would be done using
>>>
>>> $ mtd write.raw spyf <ram-addr>
>>>
>>> The driver would have to implement dummy read and erase commands.
>>>
>>> An alternative would be to add flags which would be tested by the mtd
>>> command which would block the read and erase if the mtd device is an
>>> FPGA or simply test for that in the mtd command.
>>>
>>> What would be best?
>>> ====================================================================
>>>
>>> The MTD driver would start configuration by toggling gpio-nconfig low
>>> and then wait for gpio-nstatus to go high.
>>>
>>> If OK, it would call the spi_xfer routine for the parent spi slave
>>> (soft-mcspi)
>>>
>>> When the spi write returns, the FPGA MTD driver would await the
>>> CONF_DONE signal before returning.
>>>
>>> ====================================================================
>>>
>>> What do you guys think of such an approach?
>>
>> You are writing that fpga should be loaded before OS. You likely have
>> any reason for it but I think that make sense to take a look at it from
>> different angle.
>> You have 4 fpgas and when you load all of them in u-boot you are slowing
>> down boot.
>> Anyway I think that make sense to take a look at Linux first.
>> https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/tree/drivers/fpga
>>
>> I see 4 spi based drivers where I expect none is using MTD layer for
>> programming. You will find out dt binding for these devices and the same
>> binding should be used also in u-boot.
>>
>> Thanks,
>> Michal
>>
>> --
>> Michal Simek, Ing. (M.Eng), OpenPGP -> KeyID: FE3D1F91
>> w: www.monstr.eu p: +42-0-721842854
>> Maintainer of Linux kernel - Xilinx Microblaze
>> Maintainer of Linux kernel - Xilinx Zynq ARM and ZynqMP ARM64 SoCs
>> U-Boot custodian - Xilinx Microblaze/Zynq/ZynqMP/Versal SoCs
>>
>>
>>
More information about the U-Boot
mailing list