[PATCH 3/4] mtd/fpga: add fpga directory to mtd (with Cyclone 10)

Ulf Samuelsson u-boot at emagii.com
Mon Feb 13 10:30:15 CET 2023



Den 2023-02-12 kl. 23:40, skrev Marek Vasut:
> On 2/12/23 23:07, Ulf Samuelsson wrote:
>> Den 2023-02-12 kl. 21:01, skrev Marek Vasut:
>>  > On 2/12/23 20:52, Ulf Samuelsson wrote:
>>  >>
>>  >>
>>  >> Den 2023-02-12 kl. 20:31, skrev Marek Vasut:
>>  >>  > On 2/11/23 11:07, u-boot at emagii.com wrote:
>>  >>  >
>>  >>  > [...]
>>  >>  >
>>  >>  >> +static int cyc10_write(struct mtd_info *mtd, loff_t to, 
>> size_t len,
>>  >>  >> +                 size_t *retlen, const u_char *buf)
>>  >>  >> +{
>>  >>  >> +    struct udevice *dev = mtd->dev;
>>  >>  >> +    struct spi_slave *slave = dev_get_parent_priv(dev);
>>  >>  >> +    struct cyc10_plat *fpga = dev_get_plat(dev);
>>  >>  >> +    int ret;
>>  >>  >
>>  >>  > Do I read this right, that the 'write' callback is the only one 
>> doing
>>  >>  > meaningful work, all the other callbacks are just empty stubs ?
>>  >>  > Yes, you cannot read back the configuration data.
>>  >
>>  > That makes it look like any framework which supports "write" 
>> callback would be suitable, not just MTD framework.
>>  >
>>  >>  > Why not update drivers/fpga/cyclon2.c which is Passive Serial
>>  >>  > implementation already present in U-Boot for Altera Cyclone II 
>> FPGA ,
>>  >>  > with Cyclone 10 FPGA support ? I believe the PS protocol 
>> changed very
>>  >>  > little.
>>  >> Since the MTD command set is enough to configure the FPGA, the 
>> FPGA commands can be removed from the build. The FPGA command set 
>> requires you to supply addresses, but the MTD command set uses devices.
>>  >>
>>  >> So:
>>  >> * Smaller U-Boot image
>>  >
>>  > The MTD framework is rather large, compared to the trivial FPGA 
>> framework. Can you back this claim with any numbers ?
>>
>> I am assuming that the MTD framework is needed anyway.
> 
> FPGA and MTD support is orthogonal, you cannot make that assumption.
> Consider SoC-FPGA machine booting from eMMC, Altera Cyclone V SoC does 
> support that mode of operation, and MTD support can be disabled.

If I look at Altera SOCFPGAs, I find that 21 defconfigs have MTD support 
and 3 do not.
* socfpga_agilex_defconfig
* socfpga_chameleonv3_defconfig
* socfpga_n5x_defconfig
so in most cases there would be a reduction in code size.

>> We certainly need it.
>>  >
>>  >> * Simplified user interface.
>>  >
>>  > If I am to select between 'fpga load' and 'mtd write' for FPGA 
>> bitstream loading , my obvious choice would be 'fpga load' . How is 
>> using 'mtd write' any better or simpler ?
>>  >
>> fpga load 0   ${loadaddr} ${filesize}
>> mtd write spy ${loadaddr}
>>
>> The questions I ask myself.
>> So is "0" the "spy" FPGA or the "spx" FPGA?
> 
> You can use DT /aliases node to enumerate the FPGAs the same way i2c 
> busses, SPI NORs, SD/MMC devices etc. are enumerated . Also have a look 
> at e.g. 'net list' command, similar functionality can be added to the 
> FPGA command to list all registered FPGAs.
> 
>> Why should I have to remember the size of the FPGA bitstream?
> 
> Because it is not always possible to extract that information from the 
> bitstream blob, remember, some of those blobs may be just raw binaries 
> of the SRAM/flash content .
> 
The size of the FPGA will be in the devicetree, so there is no need
to supply that in the command itself.

>>  >> * The FPGA is an SPI peripheral, so why not add it to the SPI part 
>> of the device tree?
>>  >
>>  > You can add the device into DT and still operate it using the 
>> U-Boot FPGA framework, just add the DT support. Why not do it that way ?
>>

>> I don't think you can add the device into DT in U-Boot as it is today.
>> You can create FPGA contents and add that to the device tree, but not
>> the configuration itself. At least, I have not seen it.
>> If I have missed it, where is an example?
> 
> Have a look at the Linux FPGA DT bindings in 
> Documentation/devicetree/bindings/fpga/ . You can implement parsing of 
> those bindings into the U-Boot FPGA framework and then add your FPGA 
> device configuration interface into the DT.
> 

The "altr,fpga-passive-serial" driver is very close to what I did.
My driver supports a superset of a devicetree for that driver.
It does not look like U-Boot is setup to use that.

I feel that the FPGA manager needs a total rework to make this work
and I cannot justify that. If someone adds devicetree support to the 
FPGA manager, I will certainly look to adopt to it.

>> The FPGA framework is not really setup to use device-tree to describe
>> configuration.
>>
>> Only 5 defconfigs in U-Boot uses the FPGA framework.
>> * astro_mcf5373l_defconfig
>> * syzygy_hub_defconfig
>> * xilinx_zynqmp_virt_defconfig
>> * xilinx_zynq_virt_defconfig
> 
> These two ^ cover very much every zynq 7000 and zynqmp device in 
> existence, since the way those are used is in combination with provided 
> custom board DT.
> 
>> * bitmain_antminer_s9_defconfig
> 
> There is also arch/arm/mach-socfpga/Kconfig: imply FPGA_SOCFPGA , which 
> activates the CONFIG_FPGA on all of Altera Cyclone V/Arria V/Stratix 
> 10/Agilex and whatever new SoCFPGA Intel has.
> 
>> Their device trees have leafs for configuration:
>> * compatible = "fpga-region";
>> * compatible = "xlnx,zynq-devcfg-1.0";
>> Neither "fpga-region" or "xlnx,zynq-devcfg-1.0" have any compatible 
>> drivers, so there is really no support for configuration based on 
>> device-tree at the moment.
> 
> That's correct
> 
>> If I look at boards using the Altera, no board uses a driver
>> to configure the FPGA. Instead they implement a number of callbacks
>> in the board files which manually handles the SPI bus outside the SPI 
>> driver. No trace of device tree.
> 
> Which boards do you refer to ?
> 
Every board using the Altera drivers have an Altera_desc which contains 
links to callbacks used by the altera driver.

cls; rgrep Altera_desc | grep -v -e drivers -e include
board/beckhoff/mx53cx9020/mx53cx9020.c:static Altera_desc ccat_fpga = {
board/astro/mcf5373l/fpga.c:Altera_desc altera_fpga[FPGA_COUNT] = {
board/theadorable/fpga.c:static Altera_desc altera_fpga[] = {

They all access the FPGA using spi, gpio etc. outside the driver model.

Not a trace of devicetree support unfortunately.


>>  > Let me be blunt about this, I have this feeling that what is 
>> happening here is just overloading of MTD framework with unrelated 
>> functionality (FPGA bitstream loading). MTD framework simply is not 
>> the right place, esp. if there is dedicated FPGA framework, with 
>> existing Altera PS driver no less.
>>
>> When you are configuring an FPGA, you are writing a bitstream
>> to an SRAM inside the FPGA. SRAM are memories.
>>
>> The MTD framework does exactly what is needed for passive serial.
>> I do not see that there is another place to add a device-tree based
>> FPGA configuration, so you basically have to replicate the MTD 
>> framework, in order to have FPGA configuration in the device tree.
> 
> Update the existing FPGA framework to parse the necessary DT bindings.
> 


> Please do not overload existing framework (MTD or whatever) with 
> unrelated functionality only because it provides the .write callback. 
> While this may look like a good idea to cover one very specific use 
> case, it would fail once all the other use cases which are already 
> covered by the FPGA framework come into picture.

I do not see why other chips could not be supported by an MTD driver.
Conceptually, there is not much difference between reading/writing a
NAND flash and configuring an FPGA.

Obviously, someone would have to take the time to do it, but it is 
certainly possible.

Best Regards
Ulf Samuelsson


More information about the U-Boot mailing list