From 6631db4773cd735688bf3332173a49271df23385 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Fri, 26 Apr 2013 15:04:48 +0200 Subject: [PATCH] fpga: Check device name against bitstream name Ensure that wrong bitstream won't be loaded to current device. Signed-off-by: Michal Simek Reviewed-by: Tom Rini --- drivers/fpga/fpga.c | 4 ++-- drivers/fpga/xilinx.c | 23 +++++++++++++++++++++++ include/fpga.h | 2 ++ include/xilinx.h | 1 + include/zynqpl.h | 8 ++++---- 5 files changed, 32 insertions(+), 6 deletions(-) diff --git a/drivers/fpga/fpga.c b/drivers/fpga/fpga.c index 244f503..f70bff6 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 496aa2f..49e9437 100644 --- a/drivers/fpga/xilinx.c +++ b/drivers/fpga/xilinx.c @@ -30,6 +30,7 @@ */ #include +#include #include #include #include @@ -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 38f62c0..ebefba8 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 592cbea..bcfe76d 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 bc9b948..0247ef6 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_ */