[U-Boot] [PATCH 0/6] FPGA changes

Hi,
This series is based on FPGA changes I have sent http://lists.denx.de/pipermail/u-boot/2014-April/178204.html
Series contain fpga chagnes for cleaning up full and partial bitstream loading. Also compressed bitstreams are supported. Bitstream detection was done based on device size but it doesn't work for compressed bitstreams. That's why user has to decide which bitstream works with. For that purpose LOADP/LOADBP commands have been created.
LOADMK was guarded to have an option to disable it for systems with limited amount of memory.
For easier testing full branch with all patches and patman description is available here. http://git.denx.de/?p=u-boot/u-boot-microblaze.git;a=shortlog;h=refs/heads/x...
Thanks, Michal
Michal Simek (5): configs: iocom: Fix typo on CMD_FPGA command fpga: Define bitstream type based on command selection fpga: Add support to load partial bitstreams fpga: zynqpl: Clean partial bitstream handling zynq: Enable fpga loadp and loadbp commands
Siva Durga Prasad Paladugu (1): fpga: Guard the LOADMK functionality with CMD_FPGA_LOADMK
README | 13 +++++++++ board/matrix_vision/common/mv_common.c | 2 +- common/cmd_fpga.c | 51 +++++++++++++++++++++++++++++++--- drivers/fpga/fpga.c | 8 ++++-- drivers/fpga/spartan2.c | 3 +- drivers/fpga/spartan3.c | 3 +- drivers/fpga/virtex2.c | 3 +- drivers/fpga/xilinx.c | 10 ++++--- drivers/fpga/zynqpl.c | 22 ++++++--------- include/configs/GEN860T.h | 1 + include/configs/MVBC_P.h | 1 + include/configs/MVBLM7.h | 1 + include/configs/MVSMR.h | 1 + include/configs/alpr.h | 1 + include/configs/astro_mcf5373l.h | 1 + include/configs/balloon3.h | 1 + include/configs/coreboot.h | 1 + include/configs/grsim.h | 1 + include/configs/grsim_leon2.h | 1 + include/configs/iocon.h | 3 +- include/configs/mt_ventoux.h | 1 + include/configs/omap3_mvblx.h | 1 + include/configs/x600.h | 1 + include/configs/zynq-common.h | 3 ++ include/fpga.h | 11 ++++++-- include/xilinx.h | 5 ++-- 26 files changed, 116 insertions(+), 34 deletions(-)
-- 1.8.2.3

Fix typo in CMD_FPGA command enabling.
Signed-off-by: Michal Simek michal.simek@xilinx.com ---
include/configs/iocon.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/include/configs/iocon.h b/include/configs/iocon.h index f36c2a3..b32095c 100644 --- a/include/configs/iocon.h +++ b/include/configs/iocon.h @@ -62,7 +62,7 @@ * Commands additional to the ones defined in amcc-common.h */ #define CONFIG_CMD_CACHE -#define CONFIG_CMD_FPGAD +#define CONFIG_CMD_FPGA #undef CONFIG_CMD_EEPROM
/* -- 1.8.2.3

Argh. Just noticed this.
Fix typo in CMD_FPGA command enabling.
Signed-off-by: Michal Simek michal.simek@xilinx.com
CONFIG_CMD_FPGAD is *NOT* a typo, it is about enbaling our own FPGA command common/cmd_fpgad.c
So NAK for this one.
As it already got pulled to rc we have to find a solution. And there has been already a commit (64e809afeaf1572c3246a5bca198a77d0498fd89) on top of this.
How can we get rid of this?
Cheers Dirk

On 06/16/2014 10:19 AM, Dirk Eibach wrote:
Argh. Just noticed this.
Fix typo in CMD_FPGA command enabling.
Signed-off-by: Michal Simek michal.simek@xilinx.com
CONFIG_CMD_FPGAD is *NOT* a typo, it is about enbaling our own FPGA command common/cmd_fpgad.c
So NAK for this one.
Ah sorry for that. I missed that there is cmd_fpgad.c. Will send fix for that.
Thanks, Michal

From: Siva Durga Prasad Paladugu siva.durga.paladugu@xilinx.com
Guard the LOADMK functionality with config to provide an option to enable or disable it. Enable it for all platforms in mainline which enable CONFIG_CMD_FPGA.
Signed-off-by: Siva Durga Prasad Paladugu sivadur@xilinx.com Signed-off-by: Michal Simek michal.simek@xilinx.com ---
README | 4 ++++ common/cmd_fpga.c | 8 ++++++++ include/configs/GEN860T.h | 1 + include/configs/MVBC_P.h | 1 + include/configs/MVBLM7.h | 1 + include/configs/MVSMR.h | 1 + include/configs/alpr.h | 1 + include/configs/astro_mcf5373l.h | 1 + include/configs/balloon3.h | 1 + include/configs/coreboot.h | 1 + include/configs/grsim.h | 1 + include/configs/grsim_leon2.h | 1 + include/configs/iocon.h | 1 + include/configs/mt_ventoux.h | 1 + include/configs/omap3_mvblx.h | 1 + include/configs/x600.h | 1 + include/configs/zynq-common.h | 1 + 17 files changed, 27 insertions(+)
diff --git a/README b/README index 39e05d3..ca33bdc 100644 --- a/README +++ b/README @@ -2508,6 +2508,10 @@ CBFS (Coreboot Filesystem) support
Specify the number of FPGA devices to support.
+ CONFIG_CMD_FPGA_LOADMK + + Enable support for fpga loadmk command + CONFIG_SYS_FPGA_PROG_FEEDBACK
Enable printing of hash marks during FPGA configuration. diff --git a/common/cmd_fpga.c b/common/cmd_fpga.c index 010cd24..68b5427 100644 --- a/common/cmd_fpga.c +++ b/common/cmd_fpga.c @@ -126,10 +126,12 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) if (!fpga_data || !data_size) wrong_parms = 1; break; +#if defined(CONFIG_CMD_FPGA_LOADMK) case FPGA_LOADMK: if (!fpga_data) wrong_parms = 1; break; +#endif }
if (wrong_parms) { @@ -153,6 +155,7 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) rc = fpga_loadbitstream(dev, fpga_data, data_size); break;
+#if defined(CONFIG_CMD_FPGA_LOADMK) case FPGA_LOADMK: switch (genimg_get_format(fpga_data)) { case IMAGE_FORMAT_LEGACY: @@ -231,6 +234,7 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) break; } break; +#endif
case FPGA_DUMP: rc = fpga_dump(dev, fpga_data, data_size); @@ -257,8 +261,10 @@ static int fpga_get_op(char *opstr) op = FPGA_LOADB; else if (!strcmp("load", opstr)) op = FPGA_LOAD; +#if defined(CONFIG_CMD_FPGA_LOADMK) else if (!strcmp("loadmk", opstr)) op = FPGA_LOADMK; +#endif else if (!strcmp("dump", opstr)) op = FPGA_DUMP;
@@ -277,10 +283,12 @@ U_BOOT_CMD(fpga, 6, 1, do_fpga, " load\t[dev] [address] [size]\tLoad device from memory buffer\n" " loadb\t[dev] [address] [size]\t" "Load device from bitstream buffer (Xilinx only)\n" +#if defined(CONFIG_CMD_FPGA_LOADMK) " loadmk [dev] [address]\tLoad device generated with mkimage" #if defined(CONFIG_FIT) "\n" "\tFor loadmk operating on FIT format uImage address must include\n" "\tsubimage unit name in the form of addr:<subimg_uname>" #endif +#endif ); diff --git a/include/configs/GEN860T.h b/include/configs/GEN860T.h index 2822a08..fd6c976 100644 --- a/include/configs/GEN860T.h +++ b/include/configs/GEN860T.h @@ -219,6 +219,7 @@ #define CONFIG_CMD_ELF #define CONFIG_CMD_DATE #define CONFIG_CMD_FPGA +#define CONFIG_CMD_FPGA_LOADMK #define CONFIG_CMD_MII #define CONFIG_CMD_BEDBUG
diff --git a/include/configs/MVBC_P.h b/include/configs/MVBC_P.h index 036396c..1ab2b3d 100644 --- a/include/configs/MVBC_P.h +++ b/include/configs/MVBC_P.h @@ -89,6 +89,7 @@ #define CONFIG_CMD_SDRAM #define CONFIG_CMD_PCI #define CONFIG_CMD_FPGA +#define CONFIG_CMD_FPGA_LOADMK #define CONFIG_CMD_I2C
#undef CONFIG_WATCHDOG diff --git a/include/configs/MVBLM7.h b/include/configs/MVBLM7.h index 27c2fa0..1ee4d7c 100644 --- a/include/configs/MVBLM7.h +++ b/include/configs/MVBLM7.h @@ -267,6 +267,7 @@ #define CONFIG_CMD_PCI #define CONFIG_CMD_I2C #define CONFIG_CMD_FPGA +#define CONFIG_CMD_FPGA_LOADMK #define CONFIG_CMD_USB #define CONFIG_DOS_PARTITION
diff --git a/include/configs/MVSMR.h b/include/configs/MVSMR.h index ad15506..27f730d 100644 --- a/include/configs/MVSMR.h +++ b/include/configs/MVSMR.h @@ -74,6 +74,7 @@ #define CONFIG_CMD_CACHE #define CONFIG_CMD_DHCP #define CONFIG_CMD_FPGA +#define CONFIG_CMD_FPGA_LOADMK #define CONFIG_CMD_I2C #define CONFIG_CMD_MII #define CONFIG_CMD_NET diff --git a/include/configs/alpr.h b/include/configs/alpr.h index 7849b22..2782e55 100644 --- a/include/configs/alpr.h +++ b/include/configs/alpr.h @@ -222,6 +222,7 @@ #define CONFIG_CMD_DHCP #define CONFIG_CMD_EEPROM #define CONFIG_CMD_FPGA +#define CONFIG_CMD_FPGA_LOADMK #define CONFIG_CMD_I2C #undef CONFIG_CMD_LOADB #undef CONFIG_CMD_LOADS diff --git a/include/configs/astro_mcf5373l.h b/include/configs/astro_mcf5373l.h index d875753..fa64a68 100644 --- a/include/configs/astro_mcf5373l.h +++ b/include/configs/astro_mcf5373l.h @@ -88,6 +88,7 @@ #define CONFIG_CMD_LOADS #define CONFIG_CMD_LOADB #define CONFIG_CMD_FPGA +#define CONFIG_CMD_FPGA_LOADMK #define CONFIG_CMDLINE_EDITING
#define CONFIG_SYS_HUSH_PARSER diff --git a/include/configs/balloon3.h b/include/configs/balloon3.h index 5228ba6..2f5a660 100644 --- a/include/configs/balloon3.h +++ b/include/configs/balloon3.h @@ -54,6 +54,7 @@ #undef CONFIG_CMD_IMLS #define CONFIG_CMD_USB #define CONFIG_CMD_FPGA +#define CONFIG_CMD_FPGA_LOADMK #undef CONFIG_LCD
/* diff --git a/include/configs/coreboot.h b/include/configs/coreboot.h index d1d732f..a1a63a0 100644 --- a/include/configs/coreboot.h +++ b/include/configs/coreboot.h @@ -167,6 +167,7 @@ #define CONFIG_CMD_ECHO #undef CONFIG_CMD_FLASH #define CONFIG_CMD_FPGA +#define CONFIG_CMD_FPGA_LOADMK #define CONFIG_CMD_GPIO #define CONFIG_CMD_IMI #undef CONFIG_CMD_IMLS diff --git a/include/configs/grsim.h b/include/configs/grsim.h index 2d977ce..e1fbe79 100644 --- a/include/configs/grsim.h +++ b/include/configs/grsim.h @@ -55,6 +55,7 @@ #define CONFIG_CMD_DIAG #define CONFIG_CMD_ECHO /* echo arguments */ #define CONFIG_CMD_FPGA /* FPGA configuration Support */ +#define CONFIG_CMD_FPGA_LOADMK #define CONFIG_CMD_IRQ #define CONFIG_CMD_ITEST /* Integer (and string) test */ #define CONFIG_CMD_LOADB /* loadb */ diff --git a/include/configs/grsim_leon2.h b/include/configs/grsim_leon2.h index 36ebaf7..fe7b65c 100644 --- a/include/configs/grsim_leon2.h +++ b/include/configs/grsim_leon2.h @@ -53,6 +53,7 @@ #define CONFIG_CMD_DIAG #define CONFIG_CMD_ECHO /* echo arguments */ #define CONFIG_CMD_FPGA /* FPGA configuration Support */ +#define CONFIG_CMD_FPGA_LOADMK #define CONFIG_CMD_IRQ #define CONFIG_CMD_ITEST /* Integer (and string) test */ #define CONFIG_CMD_LOADB /* loadb */ diff --git a/include/configs/iocon.h b/include/configs/iocon.h index b32095c..79c4736 100644 --- a/include/configs/iocon.h +++ b/include/configs/iocon.h @@ -63,6 +63,7 @@ */ #define CONFIG_CMD_CACHE #define CONFIG_CMD_FPGA +#define CONFIG_CMD_FPGA_LOADMK #undef CONFIG_CMD_EEPROM
/* diff --git a/include/configs/mt_ventoux.h b/include/configs/mt_ventoux.h index e7afd07..01e395a 100644 --- a/include/configs/mt_ventoux.h +++ b/include/configs/mt_ventoux.h @@ -49,6 +49,7 @@ * FPGA */ #define CONFIG_CMD_FPGA +#define CONFIG_CMD_FPGA_LOADMK #define CONFIG_FPGA #define CONFIG_FPGA_XILINX #define CONFIG_FPGA_SPARTAN3 diff --git a/include/configs/omap3_mvblx.h b/include/configs/omap3_mvblx.h index 8d11010..a3dcb15 100644 --- a/include/configs/omap3_mvblx.h +++ b/include/configs/omap3_mvblx.h @@ -127,6 +127,7 @@ #define CONFIG_CMD_DHCP #define CONFIG_CMD_PING #define CONFIG_CMD_FPGA +#define CONFIG_CMD_FPGA_LOADMK
#define CONFIG_SYS_I2C #define CONFIG_SYS_OMAP24_I2C_SPEED 100000 diff --git a/include/configs/x600.h b/include/configs/x600.h index 7405419..eae85d6 100644 --- a/include/configs/x600.h +++ b/include/configs/x600.h @@ -107,6 +107,7 @@ #define CONFIG_CMD_DHCP #define CONFIG_CMD_ENV #define CONFIG_CMD_FPGA +#define CONFIG_CMD_FPGA_LOADMK #define CONFIG_CMD_GPIO #define CONFIG_CMD_I2C #define CONFIG_CMD_MEMORY diff --git a/include/configs/zynq-common.h b/include/configs/zynq-common.h index d2149b3..acf1bfd 100644 --- a/include/configs/zynq-common.h +++ b/include/configs/zynq-common.h @@ -214,6 +214,7 @@ #define CONFIG_FPGA_XILINX #define CONFIG_FPGA_ZYNQPL #define CONFIG_CMD_FPGA +#define CONFIG_CMD_FPGA_LOADMK
/* Open Firmware flat tree */ #define CONFIG_OF_LIBFDT -- 1.8.2.3

Clean up partial, full and compressed bitstream handling. U-Boot supports full bitstream loading and partial based on detection which is not 100% correct. Extending fpga_load/fpga_loadbitstream() with one more argument which stores bitstream type.
Signed-off-by: Michal Simek michal.simek@xilinx.com ---
Preparation patch for support partial bitstream loading. --- board/matrix_vision/common/mv_common.c | 2 +- common/cmd_fpga.c | 10 ++++++---- drivers/fpga/fpga.c | 8 +++++--- drivers/fpga/spartan2.c | 3 ++- drivers/fpga/spartan3.c | 3 ++- drivers/fpga/virtex2.c | 3 ++- drivers/fpga/xilinx.c | 10 ++++++---- drivers/fpga/zynqpl.c | 4 ++-- include/fpga.h | 10 ++++++++-- include/xilinx.h | 5 +++-- 10 files changed, 37 insertions(+), 21 deletions(-)
diff --git a/board/matrix_vision/common/mv_common.c b/board/matrix_vision/common/mv_common.c index 70133b5..1be5aba 100644 --- a/board/matrix_vision/common/mv_common.c +++ b/board/matrix_vision/common/mv_common.c @@ -77,7 +77,7 @@ int mv_load_fpga(void) return -1; }
- result = fpga_load(0, fpga_data, data_size); + result = fpga_load(0, fpga_data, data_size, BIT_FULL); if (!result) bootstage_mark(BOOTSTAGE_ID_START);
diff --git a/common/cmd_fpga.c b/common/cmd_fpga.c index 68b5427..4fafed9 100644 --- a/common/cmd_fpga.c +++ b/common/cmd_fpga.c @@ -148,11 +148,11 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) break;
case FPGA_LOAD: - rc = fpga_load(dev, fpga_data, data_size); + rc = fpga_load(dev, fpga_data, data_size, BIT_FULL); break;
case FPGA_LOADB: - rc = fpga_loadbitstream(dev, fpga_data, data_size); + rc = fpga_loadbitstream(dev, fpga_data, data_size, BIT_FULL); break;
#if defined(CONFIG_CMD_FPGA_LOADMK) @@ -182,7 +182,8 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) data = (ulong)image_get_data(hdr); data_size = image_get_data_size(hdr); } - rc = fpga_load(dev, (void *)data, data_size); + rc = fpga_load(dev, (void *)data, data_size, + BIT_FULL); } break; #if defined(CONFIG_FIT) @@ -224,7 +225,8 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) return 1; }
- rc = fpga_load(dev, fit_data, data_size); + rc = fpga_load(dev, fit_data, data_size, + BIT_FULL); } break; #endif diff --git a/drivers/fpga/fpga.c b/drivers/fpga/fpga.c index b940d9b..e770950 100644 --- a/drivers/fpga/fpga.c +++ b/drivers/fpga/fpga.c @@ -173,7 +173,8 @@ int fpga_add(fpga_type devtype, void *desc) /* * Convert bitstream data and load into the fpga */ -int __weak fpga_loadbitstream(int devnum, char *fpgadata, size_t size) +int __weak fpga_loadbitstream(int devnum, char *fpgadata, size_t size, + bitstream_type bstype) { printf("Bitstream support not implemented for this FPGA device\n"); return FPGA_FAIL; @@ -182,7 +183,7 @@ int __weak fpga_loadbitstream(int devnum, char *fpgadata, size_t size) /* * Generic multiplexing code */ -int fpga_load(int devnum, const void *buf, size_t bsize) +int fpga_load(int devnum, const void *buf, size_t bsize, bitstream_type bstype) { int ret_val = FPGA_FAIL; /* assume failure */ const fpga_desc *desc = fpga_validate(devnum, buf, bsize, @@ -192,7 +193,8 @@ int fpga_load(int devnum, const void *buf, size_t bsize) switch (desc->devtype) { case fpga_xilinx: #if defined(CONFIG_FPGA_XILINX) - ret_val = xilinx_load(desc->devdesc, buf, bsize); + ret_val = xilinx_load(desc->devdesc, buf, bsize, + bstype); #else fpga_no_sup((char *)__func__, "Xilinx devices"); #endif diff --git a/drivers/fpga/spartan2.c b/drivers/fpga/spartan2.c index 7054056..859fb3c 100644 --- a/drivers/fpga/spartan2.c +++ b/drivers/fpga/spartan2.c @@ -41,7 +41,8 @@ static int spartan2_ss_dump(xilinx_desc *desc, const void *buf, size_t bsize);
/* ------------------------------------------------------------------------- */ /* Spartan-II Generic Implementation */ -static int spartan2_load(xilinx_desc *desc, const void *buf, size_t bsize) +static int spartan2_load(xilinx_desc *desc, const void *buf, size_t bsize, + bitstream_type bstype) { int ret_val = FPGA_FAIL;
diff --git a/drivers/fpga/spartan3.c b/drivers/fpga/spartan3.c index 5c9412c..b0213e6 100644 --- a/drivers/fpga/spartan3.c +++ b/drivers/fpga/spartan3.c @@ -45,7 +45,8 @@ static int spartan3_ss_dump(xilinx_desc *desc, const void *buf, size_t bsize);
/* ------------------------------------------------------------------------- */ /* Spartan-II Generic Implementation */ -static int spartan3_load(xilinx_desc *desc, const void *buf, size_t bsize) +static int spartan3_load(xilinx_desc *desc, const void *buf, size_t bsize, + bitstream_type bstype) { int ret_val = FPGA_FAIL;
diff --git a/drivers/fpga/virtex2.c b/drivers/fpga/virtex2.c index e092147..0d2d9a4 100644 --- a/drivers/fpga/virtex2.c +++ b/drivers/fpga/virtex2.c @@ -90,7 +90,8 @@ static int virtex2_ssm_dump(xilinx_desc *desc, const void *buf, size_t bsize); static int virtex2_ss_load(xilinx_desc *desc, const void *buf, size_t bsize); static int virtex2_ss_dump(xilinx_desc *desc, const void *buf, size_t bsize);
-static int virtex2_load(xilinx_desc *desc, const void *buf, size_t bsize) +static int virtex2_load(xilinx_desc *desc, const void *buf, size_t bsize, + bitstream_type bstype) { int ret_val = FPGA_FAIL;
diff --git a/drivers/fpga/xilinx.c b/drivers/fpga/xilinx.c index 8837f5c..ab9f517 100644 --- a/drivers/fpga/xilinx.c +++ b/drivers/fpga/xilinx.c @@ -24,7 +24,8 @@ static int xilinx_validate(xilinx_desc *desc, char *fn);
/* ------------------------------------------------------------------------- */
-int fpga_loadbitstream(int devnum, char *fpgadata, size_t size) +int fpga_loadbitstream(int devnum, char *fpgadata, size_t size, + bitstream_type bstype) { unsigned int length; unsigned int swapsize; @@ -127,17 +128,18 @@ int fpga_loadbitstream(int devnum, char *fpgadata, size_t size) dataptr += 4; printf(" bytes in bitstream = %d\n", swapsize);
- return fpga_load(devnum, dataptr, swapsize); + return fpga_load(devnum, dataptr, swapsize, bstype); }
-int xilinx_load(xilinx_desc *desc, const void *buf, size_t bsize) +int xilinx_load(xilinx_desc *desc, const void *buf, size_t bsize, + bitstream_type bstype) { if (!xilinx_validate (desc, (char *)__FUNCTION__)) { printf ("%s: Invalid device descriptor\n", __FUNCTION__); return FPGA_FAIL; }
- return desc->operations->load(desc, buf, bsize); + return desc->operations->load(desc, buf, bsize, bstype); }
int xilinx_dump(xilinx_desc *desc, const void *buf, size_t bsize) diff --git a/drivers/fpga/zynqpl.c b/drivers/fpga/zynqpl.c index c066f21..572c078 100644 --- a/drivers/fpga/zynqpl.c +++ b/drivers/fpga/zynqpl.c @@ -357,8 +357,8 @@ static int zynq_validate_bitstream(xilinx_desc *desc, const void *buf, return 0; }
- -static int zynq_load(xilinx_desc *desc, const void *buf, size_t bsize) +static int zynq_load(xilinx_desc *desc, const void *buf, size_t bsize, + bitstream_type bstype) { unsigned long ts; /* Timestamp */ u32 partialbit = 0; diff --git a/include/fpga.h b/include/fpga.h index 15e603a..a55e49f 100644 --- a/include/fpga.h +++ b/include/fpga.h @@ -36,12 +36,18 @@ typedef struct { /* typedef fpga_desc */ } fpga_desc; /* end, typedef fpga_desc */
+typedef enum { + BIT_FULL = 0, +} bitstream_type; + /* root function definitions */ extern void fpga_init(void); extern int fpga_add(fpga_type devtype, void *desc); extern int fpga_count(void); -extern int fpga_load(int devnum, const void *buf, size_t bsize); -extern int fpga_loadbitstream(int devnum, char *fpgadata, size_t size); +extern int fpga_load(int devnum, const void *buf, size_t bsize, + bitstream_type bstype); +extern int fpga_loadbitstream(int devnum, char *fpgadata, size_t size, + bitstream_type bstype); extern int fpga_dump(int devnum, const void *buf, size_t bsize); extern int fpga_info(int devnum); extern const fpga_desc *const fpga_validate(int devnum, const void *buf, diff --git a/include/xilinx.h b/include/xilinx.h index f06b214..9600432 100644 --- a/include/xilinx.h +++ b/include/xilinx.h @@ -45,14 +45,15 @@ typedef struct { /* typedef xilinx_desc */ } xilinx_desc; /* end, typedef xilinx_desc */
struct xilinx_fpga_op { - int (*load)(xilinx_desc *, const void *, size_t); + int (*load)(xilinx_desc *, const void *, size_t, bitstream_type); int (*dump)(xilinx_desc *, const void *, size_t); int (*info)(xilinx_desc *); };
/* Generic Xilinx Functions *********************************************************************/ -int xilinx_load(xilinx_desc *desc, const void *image, size_t size); +int xilinx_load(xilinx_desc *desc, const void *image, size_t size, + bitstream_type bstype); int xilinx_dump(xilinx_desc *desc, const void *buf, size_t bsize); int xilinx_info(xilinx_desc *desc);
-- 1.8.2.3

Added support to load partial bitstreams. The partial bitstreams can be loaded using the below commands Commands: fpga loadp <dev> <addr> <size> fpga loadbp <dev> <addr> <size> The full bit streams can be loaded using the old commands(fpga load and fpga loadb).
Signed-off-by: Siva Durga Prasad Paladugu sivadur@xilinx.com Signed-off-by: Michal Simek michal.simek@xilinx.com ---
README | 9 +++++++++ common/cmd_fpga.c | 33 +++++++++++++++++++++++++++++++++ include/fpga.h | 1 + 3 files changed, 43 insertions(+)
diff --git a/README b/README index ca33bdc..4f0c4ae 100644 --- a/README +++ b/README @@ -2512,6 +2512,15 @@ CBFS (Coreboot Filesystem) support
Enable support for fpga loadmk command
+ CONFIG_CMD_FPGA_LOADP + + Enable support for fpga loadp command - load partial bitstream + + CONFIG_CMD_FPGA_LOADBP + + Enable support for fpga loadbp command - load partial bitstream + (Xilinx only) + CONFIG_SYS_FPGA_PROG_FEEDBACK
Enable printing of hash marks during FPGA configuration. diff --git a/common/cmd_fpga.c b/common/cmd_fpga.c index 4fafed9..802f3ec 100644 --- a/common/cmd_fpga.c +++ b/common/cmd_fpga.c @@ -23,6 +23,8 @@ static int fpga_get_op(char *opstr); #define FPGA_LOADB 2 #define FPGA_DUMP 3 #define FPGA_LOADMK 4 +#define FPGA_LOADP 5 +#define FPGA_LOADBP 6
/* ------------------------------------------------------------------------- */ /* command form: @@ -121,7 +123,9 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) case FPGA_INFO: break; case FPGA_LOAD: + case FPGA_LOADP: case FPGA_LOADB: + case FPGA_LOADBP: case FPGA_DUMP: if (!fpga_data || !data_size) wrong_parms = 1; @@ -151,10 +155,22 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) rc = fpga_load(dev, fpga_data, data_size, BIT_FULL); break;
+#if defined(CONFIG_CMD_FPGA_LOADP) + case FPGA_LOADP: + rc = fpga_load(dev, fpga_data, data_size, BIT_PARTIAL); + break; +#endif + case FPGA_LOADB: rc = fpga_loadbitstream(dev, fpga_data, data_size, BIT_FULL); break;
+#if defined(CONFIG_CMD_FPGA_LOADBP) + case FPGA_LOADBP: + rc = fpga_loadbitstream(dev, fpga_data, data_size, BIT_PARTIAL); + break; +#endif + #if defined(CONFIG_CMD_FPGA_LOADMK) case FPGA_LOADMK: switch (genimg_get_format(fpga_data)) { @@ -263,6 +279,14 @@ static int fpga_get_op(char *opstr) op = FPGA_LOADB; else if (!strcmp("load", opstr)) op = FPGA_LOAD; +#if defined(CONFIG_CMD_FPGA_LOADP) + else if (!strcmp("loadp", opstr)) + op = FPGA_LOADP; +#endif +#if defined(CONFIG_CMD_FPGA_LOADBP) + else if (!strcmp("loadbp", opstr)) + op = FPGA_LOADBP; +#endif #if defined(CONFIG_CMD_FPGA_LOADMK) else if (!strcmp("loadmk", opstr)) op = FPGA_LOADMK; @@ -283,8 +307,17 @@ U_BOOT_CMD(fpga, 6, 1, do_fpga, " dump\t[dev]\t\t\tLoad device to memory buffer\n" " info\t[dev]\t\t\tlist known device information\n" " load\t[dev] [address] [size]\tLoad device from memory buffer\n" +#if defined(CONFIG_CMD_FPGA_LOADP) + " loadp\t[dev] [address] [size]\t" + "Load device from memory buffer with partial bitstream\n" +#endif " loadb\t[dev] [address] [size]\t" "Load device from bitstream buffer (Xilinx only)\n" +#if defined(CONFIG_CMD_FPGA_LOADBP) + " loadbp\t[dev] [address] [size]\t" + "Load device from bitstream buffer with partial bitstream" + "(Xilinx only)\n" +#endif #if defined(CONFIG_CMD_FPGA_LOADMK) " loadmk [dev] [address]\tLoad device generated with mkimage" #if defined(CONFIG_FIT) diff --git a/include/fpga.h b/include/fpga.h index a55e49f..49efd37 100644 --- a/include/fpga.h +++ b/include/fpga.h @@ -38,6 +38,7 @@ typedef struct { /* typedef fpga_desc */
typedef enum { BIT_FULL = 0, + BIT_PARTIAL, } bitstream_type;
/* root function definitions */ -- 1.8.2.3

Do not do partial bitstream detection based on bitstream size and use bitstream_type argument which is passed from the fpga core.
Signed-off-by: Michal Simek michal.simek@xilinx.com ---
drivers/fpga/zynqpl.c | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-)
diff --git a/drivers/fpga/zynqpl.c b/drivers/fpga/zynqpl.c index 572c078..915f077 100644 --- a/drivers/fpga/zynqpl.c +++ b/drivers/fpga/zynqpl.c @@ -194,7 +194,7 @@ static int zynq_dma_transfer(u32 srcbuf, u32 srclen, u32 dstbuf, u32 dstlen) return FPGA_SUCCESS; }
-static int zynq_dma_xfer_init(u32 partialbit) +static int zynq_dma_xfer_init(bitstream_type bstype) { u32 status, control, isr_status; unsigned long ts; @@ -202,7 +202,7 @@ static int zynq_dma_xfer_init(u32 partialbit) /* Clear loopback bit */ clrbits_le32(&devcfg_base->mctrl, DEVCFG_MCTRL_PCAP_LPBK);
- if (!partialbit) { + if (bstype != BIT_PARTIAL) { zynq_slcr_devcfg_disable();
/* Setting PCFG_PROG_B signal to high */ @@ -322,16 +322,11 @@ static u32 *zynq_align_dma_buffer(u32 *buf, u32 len, u32 swap)
static int zynq_validate_bitstream(xilinx_desc *desc, const void *buf, size_t bsize, u32 blocksize, u32 *swap, - u32 *partialbit) + bitstream_type *bstype) { u32 *buf_start; u32 diff;
- /* Detect if we are going working with partial or full bitstream */ - if (bsize != desc->size) { - printf("%s: Working with partial bitstream\n", __func__); - *partialbit = 1; - } buf_start = check_data((u8 *)buf, blocksize, swap);
if (!buf_start) @@ -351,7 +346,7 @@ static int zynq_validate_bitstream(xilinx_desc *desc, const void *buf, return FPGA_FAIL; }
- if (zynq_dma_xfer_init(*partialbit)) + if (zynq_dma_xfer_init(*bstype)) return FPGA_FAIL;
return 0; @@ -361,7 +356,6 @@ static int zynq_load(xilinx_desc *desc, const void *buf, size_t bsize, bitstream_type bstype) { unsigned long ts; /* Timestamp */ - u32 partialbit = 0; u32 isr_status, swap;
/* @@ -369,7 +363,7 @@ static int zynq_load(xilinx_desc *desc, const void *buf, size_t bsize, * in chunks */ if (zynq_validate_bitstream(desc, buf, bsize, bsize, &swap, - &partialbit)) + &bstype)) return FPGA_FAIL;
buf = zynq_align_dma_buffer((u32 *)buf, bsize, swap); @@ -398,7 +392,7 @@ static int zynq_load(xilinx_desc *desc, const void *buf, size_t bsize,
debug("%s: FPGA config done\n", __func__);
- if (!partialbit) + if (bstype != BIT_PARTIAL) zynq_slcr_devcfg_enable();
return FPGA_SUCCESS; -- 1.8.2.3

Use new fpga commands for loading partial bitstreams.
Signed-off-by: Michal Simek michal.simek@xilinx.com ---
include/configs/zynq-common.h | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/include/configs/zynq-common.h b/include/configs/zynq-common.h index acf1bfd..af420d1 100644 --- a/include/configs/zynq-common.h +++ b/include/configs/zynq-common.h @@ -215,6 +215,8 @@ #define CONFIG_FPGA_ZYNQPL #define CONFIG_CMD_FPGA #define CONFIG_CMD_FPGA_LOADMK +#define CONFIG_CMD_FPGA_LOADP +#define CONFIG_CMD_FPGA_LOADBP
/* Open Firmware flat tree */ #define CONFIG_OF_LIBFDT -- 1.8.2.3
participants (3)
-
Dirk Eibach
-
Michal Simek
-
Michal Simek