Hi Michal, On Mon, Nov 1, 2021 at 2:05 PM Michal Simek <michal.si...@xilinx.com> wrote: > > > > On 11/1/21 11:47, Oleksandr Suvorov wrote: > > Introduce a function which passes an fpga compatible string from > > FIT images to FPGA drivers. This lets the different implementations > > decide how to handle it. > > > > Some code of Jorge Ramirez-Ortiz <jo...@foundries.io> is reused. > > > > Signed-off-by: Oleksandr Suvorov <oleksandr.suvo...@foundries.io> > > --- > > > > (no changes since v1) > > > > common/spl/spl_fit.c | 6 ++---- > > drivers/fpga/fpga.c | 26 ++++++++++++++++++++++++-- > > include/fpga.h | 4 ++++ > > 3 files changed, 30 insertions(+), 6 deletions(-) > > > > diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c > > index 5fe0273d66..bd29e8c59d 100644 > > --- a/common/spl/spl_fit.c > > +++ b/common/spl/spl_fit.c > > @@ -580,11 +580,9 @@ static int spl_fit_upload_fpga(struct spl_fit_info > > *ctx, int node, > > compatible = fdt_getprop(ctx->fit, node, "compatible", NULL); > > if (!compatible) > > warn_deprecated("'fpga' image without 'compatible' property"); > > - else if (strcmp(compatible, "u-boot,fpga-legacy")) > > - printf("Ignoring compatible = %s property\n", compatible); > > > > - ret = fpga_load(0, (void *)fpga_image->load_addr, fpga_image->size, > > - BIT_FULL); > > + ret = fit_fpga_load(0, (void *)fpga_image->load_addr, > > fpga_image->size, > > + BIT_FULL, compatible); > > if (ret) { > > printf("%s: Cannot load the image to the FPGA\n", __func__); > > return ret; > > diff --git a/drivers/fpga/fpga.c b/drivers/fpga/fpga.c > > index 3b0a44b242..e4b5dd392e 100644 > > --- a/drivers/fpga/fpga.c > > +++ b/drivers/fpga/fpga.c > > @@ -249,15 +249,31 @@ int fpga_loads(int devnum, const void *buf, size_t > > size, > > } > > #endif > > > > +int fit_fpga_load(int devnum, const void *buf, size_t bsize, > > + bitstream_type bstype, const char *compatible) > > +{ > > + fpga_desc *desc = (fpga_desc *) fpga_validate(devnum, buf, bsize, > > + (char *)__func__); > > + > > nit: Better to separate it: > > fpga_desc *desc; > > desc = (fpga_desc *) fpga_validate(devnum, buf, bsize, (char *)__func__); > if (!desc) > ... > > > > + if (!desc) > > + return FPGA_FAIL; > > + /* > > + * Store the compatible string to proceed it in underlying > > + * functions > > + */ > > + desc->compatible = (char *)compatible; > > + > > + return fpga_load(devnum, buf, bsize, bstype); > > +} > > /* > > - * Generic multiplexing code > > + * Generic multiplexing code: > > + * Each architecture must handle the mandatory FPGA DT compatible property. > > */ > > int fpga_load(int devnum, const void *buf, size_t bsize, bitstream_type > > bstype) > > { > > int ret_val = FPGA_FAIL; /* assume failure */ > > const fpga_desc *desc = fpga_validate(devnum, buf, bsize, > > (char *)__func__); > > - > > this should break the rule that you should separate variable > declaration/definitions from the actual code. Do it via two steps as is > described above. > > And in this content it is separate change. > > > if (desc) { > > switch (desc->devtype) { > > case fpga_xilinx: > > @@ -270,6 +286,9 @@ int fpga_load(int devnum, const void *buf, size_t > > bsize, bitstream_type bstype) > > break; > > case fpga_altera: > > #if defined(CONFIG_FPGA_ALTERA) > > + if (strcmp(desc->compatible, "u-boot,fpga-legacy")) > > strncmp please
Thank you for such a detailed review. I will take into account all your comments in the next version of the patch. > > > + printf("Ignoring compatible = %s property\n", > > + desc->compatible); > > ret_val = altera_load(desc->devdesc, buf, bsize); > > #else > > fpga_no_sup((char *)__func__, "Altera devices"); > > @@ -277,6 +296,9 @@ int fpga_load(int devnum, const void *buf, size_t > > bsize, bitstream_type bstype) > > break; > > case fpga_lattice: > > #if defined(CONFIG_FPGA_LATTICE) > > + if (strcmp(desc->compatible, "u-boot,fpga-legacy")) > > + printf("Ignoring compatible = %s property\n", > > + desc->compatible); > > ret_val = lattice_load(desc->devdesc, buf, bsize); > > #else > > fpga_no_sup((char *)__func__, "Lattice devices"); > > diff --git a/include/fpga.h b/include/fpga.h > > index ec5144334d..2891f32106 100644 > > --- a/include/fpga.h > > +++ b/include/fpga.h > > @@ -35,6 +35,7 @@ typedef enum { /* typedef fpga_type > > */ > > typedef struct { /* typedef fpga_desc */ > > fpga_type devtype; /* switch value to select sub-functions */ > > void *devdesc; /* real device descriptor */ > > + char *compatible; /* device compatible string */ > > } fpga_desc; /* end, typedef fpga_desc */ > > > > typedef struct { /* typedef fpga_desc */ > > @@ -63,6 +64,9 @@ int fpga_add(fpga_type devtype, void *desc); > > int fpga_count(void); > > const fpga_desc *const fpga_get_desc(int devnum); > > int fpga_is_partial_data(int devnum, size_t img_len); > > +/* the DT compatible property must be handled by the different FPGA archs > > */ > > +int fit_fpga_load(int devnum, const void *buf, size_t bsize, > > + bitstream_type bstype, const char *compatible); > > int fpga_load(int devnum, const void *buf, size_t bsize, > > bitstream_type bstype); > > int fpga_fsload(int devnum, const void *buf, size_t size, > > > > M -- Best regards, Oleksandr Suvorov Software Engineer T: +380 63 8489656 E: oleksandr.suvo...@foundries.io W: www.foundries.io