mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-10 23:24:38 +00:00
cmd: fpga: Move fpga_loadbitstream to fpga.c
In bitstream decoding you can directly check device which you want to load and in fpga.c are fpga_validate and fpga_dev_info functions which should be used for it. Signed-off-by: Michal Simek <michal.simek@xilinx.com> Reviewed-by: Tom Rini <trini@ti.com>
This commit is contained in:
parent
fc598412ce
commit
52c2064476
4 changed files with 96 additions and 94 deletions
|
@ -44,100 +44,6 @@ static int fpga_get_op(char *opstr);
|
|||
#define FPGA_DUMP 3
|
||||
#define FPGA_LOADMK 4
|
||||
|
||||
/* Convert bitstream data and load into the fpga */
|
||||
int fpga_loadbitstream(unsigned long dev, char *fpgadata, size_t size)
|
||||
{
|
||||
#if defined(CONFIG_FPGA_XILINX)
|
||||
unsigned int length;
|
||||
unsigned int swapsize;
|
||||
char buffer[80];
|
||||
unsigned char *dataptr;
|
||||
unsigned int i;
|
||||
int rc;
|
||||
|
||||
dataptr = (unsigned char *)fpgadata;
|
||||
|
||||
/* skip the first bytes of the bitsteam, their meaning is unknown */
|
||||
length = (*dataptr << 8) + *(dataptr + 1);
|
||||
dataptr += 2;
|
||||
dataptr += length;
|
||||
|
||||
/* get design name (identifier, length, string) */
|
||||
length = (*dataptr << 8) + *(dataptr + 1);
|
||||
dataptr += 2;
|
||||
if (*dataptr++ != 0x61) {
|
||||
debug("%s: Design name id not recognized in bitstream\n",
|
||||
__func__);
|
||||
return FPGA_FAIL;
|
||||
}
|
||||
|
||||
length = (*dataptr << 8) + *(dataptr + 1);
|
||||
dataptr += 2;
|
||||
for (i = 0; i < length; i++)
|
||||
buffer[i] = *dataptr++;
|
||||
|
||||
printf(" design filename = \"%s\"\n", buffer);
|
||||
|
||||
/* get part number (identifier, length, string) */
|
||||
if (*dataptr++ != 0x62) {
|
||||
printf("%s: Part number id not recognized in bitstream\n",
|
||||
__func__);
|
||||
return FPGA_FAIL;
|
||||
}
|
||||
|
||||
length = (*dataptr << 8) + *(dataptr + 1);
|
||||
dataptr += 2;
|
||||
for (i = 0; i < length; i++)
|
||||
buffer[i] = *dataptr++;
|
||||
printf(" part number = \"%s\"\n", buffer);
|
||||
|
||||
/* get date (identifier, length, string) */
|
||||
if (*dataptr++ != 0x63) {
|
||||
printf("%s: Date identifier not recognized in bitstream\n",
|
||||
__func__);
|
||||
return FPGA_FAIL;
|
||||
}
|
||||
|
||||
length = (*dataptr << 8) + *(dataptr+1);
|
||||
dataptr += 2;
|
||||
for (i = 0; i < length; i++)
|
||||
buffer[i] = *dataptr++;
|
||||
printf(" date = \"%s\"\n", buffer);
|
||||
|
||||
/* get time (identifier, length, string) */
|
||||
if (*dataptr++ != 0x64) {
|
||||
printf("%s: Time identifier not recognized in bitstream\n",
|
||||
__func__);
|
||||
return FPGA_FAIL;
|
||||
}
|
||||
|
||||
length = (*dataptr << 8) + *(dataptr+1);
|
||||
dataptr += 2;
|
||||
for (i = 0; i < length; i++)
|
||||
buffer[i] = *dataptr++;
|
||||
printf(" time = \"%s\"\n", buffer);
|
||||
|
||||
/* get fpga data length (identifier, length) */
|
||||
if (*dataptr++ != 0x65) {
|
||||
printf("%s: Data length id not recognized in bitstream\n",
|
||||
__func__);
|
||||
return FPGA_FAIL;
|
||||
}
|
||||
swapsize = ((unsigned int) *dataptr << 24) +
|
||||
((unsigned int) *(dataptr + 1) << 16) +
|
||||
((unsigned int) *(dataptr + 2) << 8) +
|
||||
((unsigned int) *(dataptr + 3));
|
||||
dataptr += 4;
|
||||
printf(" bytes in bitstream = %d\n", swapsize);
|
||||
|
||||
rc = fpga_load(dev, dataptr, swapsize);
|
||||
return rc;
|
||||
#else
|
||||
printf("Bitstream support only for Xilinx devices\n");
|
||||
return FPGA_FAIL;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
/* command form:
|
||||
* fpga <op> <device number> <data addr> <datasize>
|
||||
|
|
|
@ -187,6 +187,15 @@ int fpga_add(fpga_type devtype, void *desc)
|
|||
return devnum;
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert bitstream data and load into the fpga
|
||||
*/
|
||||
int __weak fpga_loadbitstream(unsigned long dev, char *fpgadata, size_t size)
|
||||
{
|
||||
printf("Bitstream support not implemented for this FPGA device\n");
|
||||
return FPGA_FAIL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Generic multiplexing code
|
||||
*/
|
||||
|
|
|
@ -48,6 +48,92 @@ static int xilinx_validate (Xilinx_desc * desc, char *fn);
|
|||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
int fpga_loadbitstream(unsigned long dev, char *fpgadata, size_t size)
|
||||
{
|
||||
unsigned int length;
|
||||
unsigned int swapsize;
|
||||
char buffer[80];
|
||||
unsigned char *dataptr;
|
||||
unsigned int i;
|
||||
|
||||
dataptr = (unsigned char *)fpgadata;
|
||||
|
||||
/* skip the first bytes of the bitsteam, their meaning is unknown */
|
||||
length = (*dataptr << 8) + *(dataptr + 1);
|
||||
dataptr += 2;
|
||||
dataptr += length;
|
||||
|
||||
/* get design name (identifier, length, string) */
|
||||
length = (*dataptr << 8) + *(dataptr + 1);
|
||||
dataptr += 2;
|
||||
if (*dataptr++ != 0x61) {
|
||||
debug("%s: Design name id not recognized in bitstream\n",
|
||||
__func__);
|
||||
return FPGA_FAIL;
|
||||
}
|
||||
|
||||
length = (*dataptr << 8) + *(dataptr + 1);
|
||||
dataptr += 2;
|
||||
for (i = 0; i < length; i++)
|
||||
buffer[i] = *dataptr++;
|
||||
|
||||
printf(" design filename = \"%s\"\n", buffer);
|
||||
|
||||
/* get part number (identifier, length, string) */
|
||||
if (*dataptr++ != 0x62) {
|
||||
printf("%s: Part number id not recognized in bitstream\n",
|
||||
__func__);
|
||||
return FPGA_FAIL;
|
||||
}
|
||||
|
||||
length = (*dataptr << 8) + *(dataptr + 1);
|
||||
dataptr += 2;
|
||||
for (i = 0; i < length; i++)
|
||||
buffer[i] = *dataptr++;
|
||||
printf(" part number = \"%s\"\n", buffer);
|
||||
|
||||
/* get date (identifier, length, string) */
|
||||
if (*dataptr++ != 0x63) {
|
||||
printf("%s: Date identifier not recognized in bitstream\n",
|
||||
__func__);
|
||||
return FPGA_FAIL;
|
||||
}
|
||||
|
||||
length = (*dataptr << 8) + *(dataptr+1);
|
||||
dataptr += 2;
|
||||
for (i = 0; i < length; i++)
|
||||
buffer[i] = *dataptr++;
|
||||
printf(" date = \"%s\"\n", buffer);
|
||||
|
||||
/* get time (identifier, length, string) */
|
||||
if (*dataptr++ != 0x64) {
|
||||
printf("%s: Time identifier not recognized in bitstream\n",
|
||||
__func__);
|
||||
return FPGA_FAIL;
|
||||
}
|
||||
|
||||
length = (*dataptr << 8) + *(dataptr+1);
|
||||
dataptr += 2;
|
||||
for (i = 0; i < length; i++)
|
||||
buffer[i] = *dataptr++;
|
||||
printf(" time = \"%s\"\n", buffer);
|
||||
|
||||
/* get fpga data length (identifier, length) */
|
||||
if (*dataptr++ != 0x65) {
|
||||
printf("%s: Data length id not recognized in bitstream\n",
|
||||
__func__);
|
||||
return FPGA_FAIL;
|
||||
}
|
||||
swapsize = ((unsigned int) *dataptr << 24) +
|
||||
((unsigned int) *(dataptr + 1) << 16) +
|
||||
((unsigned int) *(dataptr + 2) << 8) +
|
||||
((unsigned int) *(dataptr + 3));
|
||||
dataptr += 4;
|
||||
printf(" bytes in bitstream = %d\n", swapsize);
|
||||
|
||||
return fpga_load(dev, dataptr, swapsize);
|
||||
}
|
||||
|
||||
int xilinx_load(Xilinx_desc *desc, const void *buf, size_t bsize)
|
||||
{
|
||||
int ret_val = FPGA_FAIL; /* assume a failure */
|
||||
|
|
|
@ -68,6 +68,7 @@ extern void fpga_init(void);
|
|||
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);
|
||||
extern int fpga_loadbitstream(unsigned long dev, char *fpgadata, size_t size);
|
||||
extern int fpga_dump(int devnum, const void *buf, size_t bsize);
|
||||
extern int fpga_info(int devnum);
|
||||
|
||||
|
|
Loading…
Reference in a new issue