diff options
| -rw-r--r-- | drivers/fpga/fpga.c | 4 | ||||
| -rw-r--r-- | drivers/fpga/xilinx.c | 23 | ||||
| -rw-r--r-- | include/fpga.h | 2 | ||||
| -rw-r--r-- | include/xilinx.h | 1 | ||||
| -rw-r--r-- | include/zynqpl.h | 8 | 
5 files changed, 32 insertions, 6 deletions
| diff --git a/drivers/fpga/fpga.c b/drivers/fpga/fpga.c index 244f50324..f70bff6ed 100644 --- a/drivers/fpga/fpga.c +++ b/drivers/fpga/fpga.c @@ -72,8 +72,8 @@ static const fpga_desc *const fpga_get_desc(int devnum)   * fpga_validate   *	generic parameter checking code   */ -static const fpga_desc *const fpga_validate(int devnum, const void *buf, -					 size_t bsize, char *fn) +const fpga_desc *const fpga_validate(int devnum, const void *buf, +				     size_t bsize, char *fn)  {  	const fpga_desc *desc = fpga_get_desc(devnum); diff --git a/drivers/fpga/xilinx.c b/drivers/fpga/xilinx.c index 496aa2f6e..49e943718 100644 --- a/drivers/fpga/xilinx.c +++ b/drivers/fpga/xilinx.c @@ -30,6 +30,7 @@   */  #include <common.h> +#include <fpga.h>  #include <virtex2.h>  #include <spartan2.h>  #include <spartan3.h> @@ -58,8 +59,14 @@ int fpga_loadbitstream(int devnum, char *fpgadata, size_t size)  	char buffer[80];  	unsigned char *dataptr;  	unsigned int i; +	const fpga_desc *desc; +	Xilinx_desc *xdesc;  	dataptr = (unsigned char *)fpgadata; +	/* Find out fpga_description */ +	desc = fpga_validate(devnum, dataptr, 0, (char *)__func__); +	/* Assign xilinx device description */ +	xdesc = desc->devdesc;  	/* skip the first bytes of the bitsteam, their meaning is unknown */  	length = (*dataptr << 8) + *(dataptr + 1); @@ -93,6 +100,20 @@ int fpga_loadbitstream(int devnum, char *fpgadata, size_t size)  	dataptr += 2;  	for (i = 0; i < length; i++)  		buffer[i] = *dataptr++; + +	if (xdesc->name) { +		i = strncmp(buffer, xdesc->name, strlen(xdesc->name)); +		if (i) { +			printf("%s: Wrong bitstream ID for this device\n", +			       __func__); +			printf("%s: Bitstream ID %s, current device ID %d/%s\n", +			       __func__, buffer, devnum, xdesc->name); +			return FPGA_FAIL; +		} +	} else { +		printf("%s: Please fill correct device ID to Xilinx_desc\n", +		       __func__); +	}  	printf("  part number = \"%s\"\n", buffer);  	/* get date (identifier, length, string) */ @@ -306,6 +327,8 @@ int xilinx_info (Xilinx_desc * desc)  		printf ("Device Size:   \t%d bytes\n"  				"Cookie:        \t0x%x (%d)\n",  				desc->size, desc->cookie, desc->cookie); +		if (desc->name) +			printf("Device name:   \t%s\n", desc->name);  		if (desc->iface_fns) {  			printf ("Device Function Table @ 0x%p\n", desc->iface_fns); diff --git a/include/fpga.h b/include/fpga.h index 38f62c0c2..ebefba8d0 100644 --- a/include/fpga.h +++ b/include/fpga.h @@ -71,5 +71,7 @@ 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_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, +					    size_t bsize, char *fn);  #endif	/* _FPGA_H_ */ diff --git a/include/xilinx.h b/include/xilinx.h index 592cbea1f..bcfe76d81 100644 --- a/include/xilinx.h +++ b/include/xilinx.h @@ -81,6 +81,7 @@ typedef struct {		/* typedef Xilinx_desc */  	size_t size;		/* bytes of data part can accept */  	void *iface_fns;	/* interface function table */  	int cookie;		/* implementation specific cookie */ +	char *name;		/* device name in bitstream */  } Xilinx_desc;			/* end, typedef Xilinx_desc */  /* Generic Xilinx Functions diff --git a/include/zynqpl.h b/include/zynqpl.h index bc9b94815..0247ef61c 100644 --- a/include/zynqpl.h +++ b/include/zynqpl.h @@ -45,15 +45,15 @@ extern int zynq_info(Xilinx_desc *desc);  /* Descriptor Macros */  #define XILINX_XC7Z010_DESC(cookie) \ -{ xilinx_zynq, devcfg, XILINX_XC7Z010_SIZE, NULL, cookie } +{ xilinx_zynq, devcfg, XILINX_XC7Z010_SIZE, NULL, cookie, "7z010" }  #define XILINX_XC7Z020_DESC(cookie) \ -{ xilinx_zynq, devcfg, XILINX_XC7Z020_SIZE, NULL, cookie } +{ xilinx_zynq, devcfg, XILINX_XC7Z020_SIZE, NULL, cookie, "7z020" }  #define XILINX_XC7Z030_DESC(cookie) \ -{ xilinx_zynq, devcfg, XILINX_XC7Z030_SIZE, NULL, cookie } +{ xilinx_zynq, devcfg, XILINX_XC7Z030_SIZE, NULL, cookie, "7z030" }  #define XILINX_XC7Z045_DESC(cookie) \ -{ xilinx_zynq, devcfg, XILINX_XC7Z045_SIZE, NULL, cookie } +{ xilinx_zynq, devcfg, XILINX_XC7Z045_SIZE, NULL, cookie, "7z045" }  #endif /* _ZYNQPL_H_ */ |