fpga: Add support to load partial bitstreams

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>
diff --git a/README b/README
index d362880..13cdac4 100644
--- a/README
+++ b/README
@@ -2554,6 +2554,15 @@
 
 		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 @@
 #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 @@
 	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 @@
 		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 @@
 		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 @@
 	   "  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 enum {
 	BIT_FULL = 0,
+	BIT_PARTIAL,
 } bitstream_type;
 
 /* root function definitions */