Skip to contentSkip to conversation

fpga: Added support to load bit stream from SD/MMC

RFC PATCH Superseded Michal Simek 3 participants 4 messages May 2, 2014 – May 15, 2014

Subsystems (2)

v1 of 2 Superseded Latest is v2 →

lore
Share & tools
lore
#0 lore raw

RFC PATCH 1/1 fpga: Added support to load bit stream from SD/MMC

From: Siva Durga Prasad Paladugu <[email protected]>

Added support to load a bitstream image in chunks by reading it in chunks from SD/MMC.
Command format:
loadfs [dev] [address] [image size] [blocksize] <interface>

       [<dev[:part]>] <filename>

Example: fpga loadfs 0 1000000 3dbafc 4000 mmc 0 fpga.bin

---

We have tested just FAT case but I am sending this as RFC to give some inputs from you.
The reason for this command is that when u-boot running from OCM on zynq there is just 192kB for u-boot itself and there must be an option to load bitstream to PL because there full DDR controller.
Bitstreams are bigger and bigger and reading it with chunks is only one way how to do it.
This is also necessary to do it for u-boot SPL when we add fpga support there.

The question is if this is the way how to extend fpga command because loadfs should be fpga subcommand.

This patch is based on this branch.
http://git.denx.de/?p=u-boot/u-boot-microblaze.git;a=shortlog;h=refs/heads/xnext/zynq

Thanks for your comments,
Michal

---
 common/cmd_fpga.c             | 41 +++++++++++++++++++++
 drivers/fpga/fpga.c           | 28 ++++++++++++++
 drivers/fpga/xilinx.c         | 16 ++++++++
 drivers/fpga/zynqpl.c         | 85 +++++++++++++++++++++++++++++++++++++++++++
 include/configs/zynq-common.h |  1 +
 include/fpga.h                |  9 +++++
 include/xilinx.h              |  3 ++
 7 files changed, 183 insertions(+)
common/cmd_fpga.c +41 -0
index 802f3ec..3add0c3 100644
@@ -11,6 +11,7 @@
 #include <common.h>
 #include <command.h>
 #include <fpga.h>
+#include <fs.h>
 #include <malloc.h>
 
 /* Local functions */
@@ -25,6 +26,7 @@ static int fpga_get_op(char *opstr);
 #define FPGA_LOADMK 4
 #define FPGA_LOADP  5
 #define FPGA_LOADBP 6
+#define FPGA_LOADFS 7
 
 /* ------------------------------------------------------------------------- */
 /* command form:
@@ -47,6 +49,11 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
 	const char *fit_uname = NULL;
 	ulong fit_addr;
 #endif
+#if defined(CONFIG_CMD_FPGA_LOADFS)
+	fpga_fs_info fpga_fsinfo;
+
+	fpga_fsinfo.fstype = FS_TYPE_FAT;
+#endif
 
 	if (devstr)
 		dev = (int) simple_strtoul(devstr, NULL, 16);
@@ -54,6 +61,14 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
 		fpga_data = (void *)simple_strtoul(datastr, NULL, 16);
 
 	switch (argc) {
+#if defined(CONFIG_CMD_FPGA_LOADFS)
+	case 9:
+		fpga_fsinfo.blocksize = (unsigned int)
+					     simple_strtoul(argv[5], NULL, 16);
+		fpga_fsinfo.interface = argv[6];
+		fpga_fsinfo.dev_part = argv[7];
+		fpga_fsinfo.filename = argv[8];
+#endif
 	case 5:		/* fpga <op> <dev> <data> <datasize> */
 		data_size = simple_strtoul(argv[4], NULL, 16);
 
@@ -122,6 +137,13 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
 	case FPGA_NONE:
 	case FPGA_INFO:
 		break;
+#if defined(CONFIG_CMD_FPGA_LOADFS)
+	case FPGA_LOADFS:
+		/* Blocksize can be zero */
+		if (!fpga_fsinfo.interface || !fpga_fsinfo.dev_part ||
+		    !fpga_fsinfo.filename || fpga_fsinfo.fstype == FS_TYPE_ANY)
+			wrong_parms = 1;
+#endif
 	case FPGA_LOAD:
 	case FPGA_LOADP:
 	case FPGA_LOADB:
@@ -171,6 +193,12 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
 		break;
 #endif
 
+#if defined(CONFIG_CMD_FPGA_LOADFS)
+	case FPGA_LOADFS:
+		rc = fpga_fsload(dev, fpga_data, data_size, &fpga_fsinfo);
+		break;
+#endif
+
 #if defined(CONFIG_CMD_FPGA_LOADMK)
 	case FPGA_LOADMK:
 		switch (genimg_get_format(fpga_data)) {
@@ -287,6 +315,10 @@ static int fpga_get_op(char *opstr)
 	else if (!strcmp("loadbp", opstr))
 		op = FPGA_LOADBP;
 #endif
+#if defined(CONFIG_CMD_FPGA_LOADFS)
+	else if (!strcmp("loadfs", opstr))
+		op = FPGA_LOADFS;
+#endif
 #if defined(CONFIG_CMD_FPGA_LOADMK)
 	else if (!strcmp("loadmk", opstr))
 		op = FPGA_LOADMK;
@@ -300,7 +332,11 @@ static int fpga_get_op(char *opstr)
 	return op;
 }
 
+#if defined(CONFIG_CMD_FPGA_LOADFS)
+U_BOOT_CMD(fpga, 9, 1, do_fpga,
+#else
 U_BOOT_CMD(fpga, 6, 1, do_fpga,
+#endif
 	   "loadable FPGA image support",
 	   "[operation type] [device number] [image address] [image size]\n"
 	   "fpga operations:\n"
@@ -318,6 +354,11 @@ U_BOOT_CMD(fpga, 6, 1, do_fpga,
 	   "Load device from bitstream buffer with partial bitstream"
 	   "(Xilinx only)\n"
 #endif
+#if defined(CONFIG_CMD_FPGA_LOADFS)
+	   "Load device from filesystem (FAT by default) (Xilinx only)\n"
+	   "  loadfs [dev] [address] [image size] [blocksize] <interface>\n"
+	   "        [<dev[:part]>] <filename>\n"
+#endif
 #if defined(CONFIG_CMD_FPGA_LOADMK)
 	   "  loadmk [dev] [address]\tLoad device generated with mkimage"
 #if defined(CONFIG_FIT)
drivers/fpga/fpga.c +28 -0
index e770950..37946d5 100644
@@ -180,6 +180,34 @@ int __weak fpga_loadbitstream(int devnum, char *fpgadata, size_t size,
 	return FPGA_FAIL;
 }
 
+#if defined(CONFIG_CMD_FPGA_LOADFS)
+int fpga_fsload(int devnum, const void *buf, size_t size,
+		 fpga_fs_info *fpga_fsinfo)
+{
+	int ret_val = FPGA_FAIL;           /* assume failure */
+	const fpga_desc *desc = fpga_validate(devnum, buf, size,
+					      (char *)__func__);
+
+	if (desc) {
+		switch (desc->devtype) {
+		case fpga_xilinx:
+#if defined(CONFIG_FPGA_XILINX)
+			ret_val = xilinx_loadfs(desc->devdesc, buf, size,
+						fpga_fsinfo);
+#else
+			fpga_no_sup((char *)__func__, "Xilinx devices");
+#endif
+			break;
+		default:
+			printf("%s: Invalid or unsupported device type %d\n",
+			       __func__, desc->devtype);
+		}
+	}
+
+	return ret_val;
+}
+#endif
+
 /*
  * Generic multiplexing code
  */
drivers/fpga/xilinx.c +16 -0
index ab9f517..3795c1a 100644
@@ -142,6 +142,22 @@ int xilinx_load(xilinx_desc *desc, const void *buf, size_t bsize,
 	return desc->operations->load(desc, buf, bsize, bstype);
 }
 
+#if defined(CONFIG_CMD_FPGA_LOADFS)
+int xilinx_loadfs(xilinx_desc *desc, const void *buf, size_t bsize,
+		   fpga_fs_info *fpga_fsinfo)
+{
+	if (!xilinx_validate(desc, (char *)__func__)) {
+		printf("%s: Invalid device descriptor\n", __func__);
+		return FPGA_FAIL;
+	}
+
+	if (!desc->operations->loadfs)
+		return FPGA_FAIL;
+
+	return desc->operations->loadfs(desc, buf, bsize, fpga_fsinfo);
+}
+#endif
+
 int xilinx_dump(xilinx_desc *desc, const void *buf, size_t bsize)
 {
 	if (!xilinx_validate (desc, (char *)__FUNCTION__)) {
drivers/fpga/zynqpl.c +85 -0

103 lines not on this page · raw message

include/configs/zynq-common.h +1 -0
index af420d1..8e0f935 100644
@@ -217,6 +217,7 @@
 #define CONFIG_CMD_FPGA_LOADMK
 #define CONFIG_CMD_FPGA_LOADP
 #define CONFIG_CMD_FPGA_LOADBP
+#define CONFIG_CMD_FPGA_LOADFS
 
 /* Open Firmware flat tree */
 #define CONFIG_OF_LIBFDT
include/fpga.h +9 -0
index 49efd37..914024c 100644
@@ -35,6 +35,13 @@ typedef struct {		/* typedef fpga_desc */
 	void *devdesc;		/* real device descriptor */
 } fpga_desc;			/* end, typedef fpga_desc */
 
+typedef struct {                /* typedef fpga_desc */
+	unsigned int blocksize;
+	char *interface;
+	char *dev_part;
+	char *filename;
+	int fstype;
+} fpga_fs_info;
 
 typedef enum {
 	BIT_FULL = 0,
@@ -47,6 +54,8 @@ 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,
 		     bitstream_type bstype);
+extern int fpga_fsload(int devnum, const void *buf, size_t size,
+		       fpga_fs_info *fpga_fsinfo);
 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);
include/xilinx.h +3 -0
index 9600432..774487e 100644
@@ -46,6 +46,7 @@ typedef struct {		/* typedef xilinx_desc */
 
 struct xilinx_fpga_op {
 	int (*load)(xilinx_desc *, const void *, size_t, bitstream_type);
+	int (*loadfs)(xilinx_desc *, const void *, size_t, fpga_fs_info *);
 	int (*dump)(xilinx_desc *, const void *, size_t);
 	int (*info)(xilinx_desc *);
 };
@@ -56,6 +57,8 @@ 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);
+int xilinx_loadfs(xilinx_desc *desc, const void *buf, size_t bsize,
+		  fpga_fs_info *fpga_fsinfo);
 
 /* Board specific implementation specific function types
  *********************************************************************/

--
1.8.2.3

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: not available
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20140502/b5d1fcc7/attachment.pgp>

#1 lore raw

RFC PATCH 1/1 fpga: Added support to load bit stream from SD/MMC

Hi Tom,

Quoted 33 lines · Michal Simek

From: Siva Durga Prasad Paladugu <[email protected]>

Added support to load a bitstream image in chunks by reading it in chunks from SD/MMC.
Command format:
loadfs [dev] [address] [image size] [blocksize] <interface>

       [<dev[:part]>] <filename>

Example: fpga loadfs 0 1000000 3dbafc 4000 mmc 0 fpga.bin

---

We have tested just FAT case but I am sending this as RFC to give some inputs from you.
The reason for this command is that when u-boot running from OCM on zynq there is just 192kB for u-boot itself and there must be an option to load bitstream to PL because there full DDR controller.
Bitstreams are bigger and bigger and reading it with chunks is only one way how to do it.
This is also necessary to do it for u-boot SPL when we add fpga support there.

The question is if this is the way how to extend fpga command because loadfs should be fpga subcommand.

This patch is based on this branch.
http://git.denx.de/?p=u-boot/u-boot-microblaze.git;a=shortlog;h=refs/heads/xnext/zynq

Thanks for your comments,
Michal

Quoted 9 lines
---
 common/cmd_fpga.c             | 41 +++++++++++++++++++++
 drivers/fpga/fpga.c           | 28 ++++++++++++++
 drivers/fpga/xilinx.c         | 16 ++++++++
 drivers/fpga/zynqpl.c         | 85 +++++++++++++++++++++++++++++++++++++++++++
 include/configs/zynq-common.h |  1 +
 include/fpga.h                |  9 +++++
 include/xilinx.h              |  3 ++
 7 files changed, 183 insertions(+)

Are you OK with this patch?
I would expect that you will have some comments regarding this because it is command extension.
If you are OK with this I will add it to my next fpga pull request with partial bitstream support.

Thanks,
Michal

Signature · 14 lines
Michal Simek, Ing. (M.Eng), OpenPGP -> KeyID: FE3D1F91
w: www.monstr.eu p: +42-0-721842854
Maintainer of Linux kernel - Microblaze cpu - http://www.monstr.eu/fdt/
Maintainer of Linux kernel - Xilinx Zynq ARM architecture
Microblaze U-BOOT custodian and responsible for u-boot arm zynq platform


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 263 bytes
Desc: OpenPGP digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20140514/fc2412dd/attachment.pgp>
#2 lore raw

RFC PATCH 1/1 fpga: Added support to load bit stream from SD/MMC

Quoted 46 lines · Michal Simek

Hi Tom,

Quoted 33 lines · Michal Simek

From: Siva Durga Prasad Paladugu <[email protected]>

Added support to load a bitstream image in chunks by reading it in chunks from SD/MMC.
Command format:
loadfs [dev] [address] [image size] [blocksize] <interface>

       [<dev[:part]>] <filename>

Example: fpga loadfs 0 1000000 3dbafc 4000 mmc 0 fpga.bin

---

We have tested just FAT case but I am sending this as RFC to give some inputs from you.
The reason for this command is that when u-boot running from OCM on zynq there is just 192kB for u-boot itself and there must be an option to load bitstream to PL because there full DDR controller.
Bitstreams are bigger and bigger and reading it with chunks is only one way how to do it.
This is also necessary to do it for u-boot SPL when we add fpga support there.

The question is if this is the way how to extend fpga command because loadfs should be fpga subcommand.

This patch is based on this branch.
http://git.denx.de/?p=u-boot/u-boot-microblaze.git;a=shortlog;h=refs/heads/xnext/zynq

Thanks for your comments,
Michal

Quoted 9 lines
---
 common/cmd_fpga.c             | 41 +++++++++++++++++++++
 drivers/fpga/fpga.c           | 28 ++++++++++++++
 drivers/fpga/xilinx.c         | 16 ++++++++
 drivers/fpga/zynqpl.c         | 85 +++++++++++++++++++++++++++++++++++++++++++
 include/configs/zynq-common.h |  1 +
 include/fpga.h                |  9 +++++
 include/xilinx.h              |  3 ++
 7 files changed, 183 insertions(+)
Quoted 5 lines

Are you OK with this patch?
I would expect that you will have some comments regarding this because it is command extension.
If you are OK with this I will add it to my next fpga pull request with partial bitstream support.

It's a new subcommand, seems like a fine idea. Can we leverage FS_TYPE_ANY so it's not limited to FAT?

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20140514/d52ee678/attachment.pgp>
#3 lore raw

RFC PATCH 1/1 fpga: Added support to load bit stream from SD/MMC

Quoted 47 lines · Tom Rini
Quoted 46 lines · Michal Simek

Hi Tom,

Quoted 42 lines · Michal Simek

From: Siva Durga Prasad Paladugu <[email protected]>

Added support to load a bitstream image in chunks by reading it in chunks from SD/MMC.
Command format:
loadfs [dev] [address] [image size] [blocksize] <interface>

       [<dev[:part]>] <filename>

Example: fpga loadfs 0 1000000 3dbafc 4000 mmc 0 fpga.bin

---

We have tested just FAT case but I am sending this as RFC to give some inputs from you.
The reason for this command is that when u-boot running from OCM on zynq there is just 192kB for u-boot itself and there must be an option to load bitstream to PL because there full DDR controller.
Bitstreams are bigger and bigger and reading it with chunks is only one way how to do it.
This is also necessary to do it for u-boot SPL when we add fpga support there.

The question is if this is the way how to extend fpga command because loadfs should be fpga subcommand.

This patch is based on this branch.
http://git.denx.de/?p=u-boot/u-boot-microblaze.git;a=shortlog;h=refs/heads/xnext/zynq

Thanks for your comments,
Michal

---
 common/cmd_fpga.c             | 41 +++++++++++++++++++++
 drivers/fpga/fpga.c           | 28 ++++++++++++++
 drivers/fpga/xilinx.c         | 16 ++++++++
 drivers/fpga/zynqpl.c         | 85 +++++++++++++++++++++++++++++++++++++++++++
 include/configs/zynq-common.h |  1 +
 include/fpga.h                |  9 +++++
 include/xilinx.h              |  3 ++
 7 files changed, 183 insertions(+)
Quoted 9 lines
Quoted 5 lines

Are you OK with this patch?
I would expect that you will have some comments regarding this because it is command extension.
If you are OK with this I will add it to my next fpga pull request with partial bitstream support.

It's a new subcommand, seems like a fine idea. Can we leverage FS_TYPE_ANY so it's not limited to FAT?

Ok. Fixed. I don't know how to use sandbox fs but I have tried it on EXT4. It ended in error message from ext4 but first reading was fine that's why there shouldn't be any problem in flow.

Here is v2.
http://lists.denx.de/pipermail/u-boot/2014-May/179570.html

Thanks,
Michal

Signature · 14 lines
Michal Simek, Ing. (M.Eng), OpenPGP -> KeyID: FE3D1F91
w: www.monstr.eu p: +42-0-721842854
Maintainer of Linux kernel - Microblaze cpu - http://www.monstr.eu/fdt/
Maintainer of Linux kernel - Xilinx Zynq ARM architecture
Microblaze U-BOOT custodian and responsible for u-boot arm zynq platform


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 263 bytes
Desc: OpenPGP digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20140515/bc3b4765/attachment.pgp>