fpga: Check device name against bitstream name
Ensure that wrong bitstream won't be loaded to current device. Signed-off-by: Michal Simek <michal.simek@xilinx.com> Reviewed-by: Tom Rini <trini@ti.com>
This commit is contained in:
parent
d5dae85f23
commit
6631db4773
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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_ */
|
||||
|
@ -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
|
||||
|
@ -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_ */
|
||||
|
Loading…
Reference in New Issue
Block a user