[U-Boot] [PATCH 0/5] Virtex2 FPGA enhancements

Robert Hancock hancock at sedsystems.ca
Tue Jun 25 15:53:57 UTC 2019


On 2019-06-25 7:01 a.m., Michal Simek wrote:
> On 21. 06. 19 18:10, Robert Hancock wrote:
>> On 2019-06-21 12:19 a.m., Michal Simek wrote:
>>>> If it helps, here is part of our board file that does the FPGA GPIO and
>>>> SPI initialization and initializes the FPGA callbacks. We are using an
>>>> ITB image that has the FPGA .bit file as one of the entries and which
>>>> gets loaded as part of the bootm command.
>>>
>>> thanks for this.
>>>
>>>>
>>>> static struct gpio_desc fpga_done;
>>>> static struct gpio_desc fpga_prog;
>>>> static struct gpio_desc fpga_init_in;
>>>>
>>>> static struct spi_slave *fpga_slave;
>>>>
>>>> ...
>>>>
>>>> /*
>>>>  * Initialize before download
>>>>  */
>>>> static int fpga_pre_fn(int cookie)
>>>> {
>>>> 	/* Initialize GPIO pins */
>>>> 	dm_gpio_set_dir_flags(&fpga_prog, GPIOD_IS_OUT);
>>>> 	dm_gpio_set_value(&fpga_prog, 1);
>>>>
>>>> 	return cookie;
>>>> }
>>>>
>>>> /*
>>>>  * Set the FPGA's active-low program line to the specified level
>>>>  */
>>>> static int fpga_pgm_fn(int assert, int flush, int cookie)
>>>> {
>>>> 	dm_gpio_set_value(&fpga_prog, !assert);
>>>> 	return assert;
>>>> }
>>>>
>>>> /*
>>>>  * Test the state of the active-low FPGA INIT line.  Return 1 on INIT
>>>>  * asserted (low).
>>>>  */
>>>> static int fpga_init_fn(int cookie)
>>>> {
>>>> 	return !dm_gpio_get_value(&fpga_init_in);
>>>> }
>>>>
>>>> /*
>>>>  * Test the state of the active-high FPGA DONE pin
>>>>  */
>>>> static int fpga_done_fn(int cookie)
>>>> {
>>>> 	return dm_gpio_get_value(&fpga_done) ? FPGA_SUCCESS : FPGA_FAIL;
>>>> }
>>>>
>>>> static int fpga_wbulkdata_fn(void *buf, size_t len, int flush, int cookie)
>>>> {
>>>> 	int ret = spi_xfer(fpga_slave, len * 8, buf, NULL,
>>>> 			   SPI_XFER_BEGIN | SPI_XFER_END);
>>>> 	if (ret) {
>>>> 		printf("Failed to transfer %zu bytes of SPI data: %d\n",
>>>> 		       len, ret);
>>>> 	}
>>>> 	return cookie;
>>>> }
>>>>
>>>> static int fpga_post_fn(int cookie)
>>>> {
>>>> 	return cookie;
>>>> }
>>>>
>>>> static int fpga_abort_fn(int cookie)
>>>> {
>>>> 	return fpga_post_fn(cookie);
>>>> }
>>>>
>>>> static int fpga_busy_fn(int cookie)
>>>> {
>>>> 	return 0;
>>>> }
>>>>
>>>> static xilinx_virtex2_slave_fns fpga_fns = {
>>>> 	.pre = fpga_pre_fn,
>>>> 	.pgm = fpga_pgm_fn,
>>>> 	.init = fpga_init_fn,
>>>> 	.done = fpga_done_fn,
>>>> 	.wbulkdata = fpga_wbulkdata_fn,
>>>> 	.busy = fpga_busy_fn,
>>>> 	.abort = fpga_abort_fn,
>>>> 	.post = fpga_post_fn,
>>>> };
>>>>
>>>> static xilinx_desc fpga = {
>>>> 	.family = xilinx_virtex2,
>>>> 	.iface = slave_serial,
>>>> 	.size = 6692572,
>>>> 	.iface_fns = &fpga_fns,
>>>> 	.cookie = 0,
>>>> 	.operations = &virtex2_op,
>>>> 	.name = "7k160tffg676"
>>>
>>> This doesn't look like virtex2. It looks like kintex-7.
>>> What do you really have there?
>>
>> Correct, it's a Kintex 7 part. The slave serial protocol doesn't appear
>> to have changed much from Virtex2 onward, so the same driver can be used.
>>
> 
> Question here is if we should be really using virtex2 file and not any
> generic one if this can be used for multiple fpgas.
> But enabling virtex2 driver for programming kintex7 is weird for sure.

I did note in the Kconfig help text that the driver can be used for a
bunch of newer FPGA families as well. However we could rename the driver
to be more generic - I'm just not sure what to call it, since there are
some older FPGAs like Spartan3 that still have specific support elsewhere.

-- 
Robert Hancock
Senior Software Developer
SED Systems, a division of Calian Ltd.
Email: hancock at sedsystems.ca


More information about the U-Boot mailing list