static int mmc_load_fpga_image_fat(struct mmc *mmc) { int err; int devnum = 0; const fpga_desc *const desc = fpga_get_desc(devnum); Xilinx_desc *desc_xilinx = desc->devdesc; /* FIXME = standard file size + header desc_xilinx->size + 0x6c */ err = file_fat_read(CONFIG_SPL_FPGA_LOAD_ARGS_NAME, (void *)CONFIG_SPL_FPGA_LOAD_ADDR, 0); if (err <= 0) { #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT printf("spl: error reading image %s, err - %d\n", CONFIG_SPL_FPGA_LOAD_ARGS_NAME, err); #endif return -1; } #ifdef CONFIG_SPL_FPGA_BIT return fpga_loadbitstream(devnum, (char *)CONFIG_SPL_FPGA_LOAD_ADDR, desc_xilinx->size, BIT_FULL); #else return fpga_load(devnum, (const void *)CONFIG_SPL_FPGA_LOAD_ADDR, desc_xilinx->size, BIT_FULL); #endif }
int fpga_is_partial_data(int devnum, size_t img_len) { const fpga_desc * const desc = fpga_get_desc(devnum); xilinx_desc *desc_xilinx = desc->devdesc; /* Check datasize against FPGA size */ if (img_len >= desc_xilinx->size) return 0; /* datasize is smaller, must be partial data */ return 1; }
/* * fpga_validate * generic parameter checking code */ const fpga_desc *const fpga_validate(int devnum, const void *buf, size_t bsize, char *fn) { const fpga_desc *desc = fpga_get_desc(devnum); if (!desc) printf("%s: Invalid device number %d\n", fn, devnum); if (!buf) { printf("%s: Null buffer.\n", fn); return (fpga_desc * const)NULL; } return desc; }
/* fpga_validate * generic parameter checking code */ static __attribute__((__const__)) fpga_desc * __attribute__((__const__)) fpga_validate( int devnum, void *buf, size_t bsize, char *fn ) { fpga_desc * desc = fpga_get_desc( devnum ); if ( !desc ) { printf( "%s: Invalid device number %d\n", fn, devnum ); } if ( !buf ) { printf( "%s: Null buffer.\n", fn ); return (fpga_desc * const)NULL; } return desc; }
/* * fpga_dev_info * generic multiplexing code */ static int fpga_dev_info(int devnum) { int ret_val = FPGA_FAIL; /* assume failure */ const fpga_desc * const desc = fpga_get_desc(devnum); if (desc) { debug("%s: Device Descriptor @ 0x%p\n", __func__, desc->devdesc); switch (desc->devtype) { case fpga_xilinx: #if defined(CONFIG_FPGA_XILINX) printf("Xilinx Device\nDescriptor @ 0x%p\n", desc); ret_val = xilinx_info(desc->devdesc); #else fpga_no_sup((char *)__func__, "Xilinx devices"); #endif break; case fpga_altera: #if defined(CONFIG_FPGA_ALTERA) printf("Altera Device\nDescriptor @ 0x%p\n", desc); ret_val = altera_info(desc->devdesc); #else fpga_no_sup((char *)__func__, "Altera devices"); #endif break; case fpga_lattice: #if defined(CONFIG_FPGA_LATTICE) printf("Lattice Device\nDescriptor @ 0x%p\n", desc); ret_val = lattice_info(desc->devdesc); #else fpga_no_sup((char *)__func__, "Lattice devices"); #endif break; default: printf("%s: Invalid or unsupported device type %d\n", __func__, desc->devtype); } } else { printf("%s: Invalid device number %d\n", __func__, devnum); } return ret_val; }
int boot_get_fpga(int argc, char * const argv[], bootm_headers_t *images, uint8_t arch, const ulong *ld_start, ulong * const ld_len) { ulong tmp_img_addr, img_data, img_len; void *buf; int conf_noffset; int fit_img_result; char *uname, *name; int err; int devnum = 0; /* TODO support multi fpga platforms */ const fpga_desc * const desc = fpga_get_desc(devnum); xilinx_desc *desc_xilinx = desc->devdesc; /* Check to see if the images struct has a FIT configuration */ if (!genimg_has_config(images)) { debug("## FIT configuration was not specified\n"); return 0; } /* * Obtain the os FIT header from the images struct * copy from dataflash if needed */ tmp_img_addr = map_to_sysmem(images->fit_hdr_os); tmp_img_addr = genimg_get_image(tmp_img_addr); buf = map_sysmem(tmp_img_addr, 0); /* * Check image type. For FIT images get FIT node * and attempt to locate a generic binary. */ switch (genimg_get_format(buf)) { case IMAGE_FORMAT_FIT: conf_noffset = fit_conf_get_node(buf, images->fit_uname_cfg); err = fdt_get_string_index(buf, conf_noffset, FIT_FPGA_PROP, 0, (const char **)&uname); if (err < 0) { debug("## FPGA image is not specified\n"); return 0; } fit_img_result = fit_image_load(images, tmp_img_addr, (const char **)&uname, &(images->fit_uname_cfg), arch, IH_TYPE_FPGA, BOOTSTAGE_ID_FPGA_INIT, FIT_LOAD_OPTIONAL_NON_ZERO, &img_data, &img_len); debug("FPGA image (%s) loaded to 0x%lx/size 0x%lx\n", uname, img_data, img_len); if (fit_img_result < 0) { /* Something went wrong! */ return fit_img_result; } if (img_len >= desc_xilinx->size) { name = "full"; err = fpga_loadbitstream(devnum, (char *)img_data, img_len, BIT_FULL); if (err) err = fpga_load(devnum, (const void *)img_data, img_len, BIT_FULL); } else { name = "partial"; err = fpga_loadbitstream(devnum, (char *)img_data, img_len, BIT_PARTIAL); if (err) err = fpga_load(devnum, (const void *)img_data, img_len, BIT_PARTIAL); } printf(" Programming %s bitstream... ", name); if (err) printf("failed\n"); else printf("OK\n"); break; default: printf("The given image format is not supported (corrupt?)\n"); return 1; } return 0; }