Add new compatible string u-boot,zynqmp-fpga-ddrauth to handle this
use case.

Signed-off-by: Jorge Ramirez-Ortiz <jo...@foundries.io>
---
 drivers/fpga/xilinx.c   | 29 +++++++++++++++++++++++++----
 drivers/fpga/zynqmppl.c |  4 ++--
 include/xilinx.h        |  2 +-
 3 files changed, 28 insertions(+), 7 deletions(-)

diff --git a/drivers/fpga/xilinx.c b/drivers/fpga/xilinx.c
index cbebefb55f..c8035105e2 100644
--- a/drivers/fpga/xilinx.c
+++ b/drivers/fpga/xilinx.c
@@ -135,23 +135,44 @@ int fpga_loadbitstream(int devnum, char *fpgadata, size_t 
size,
        dataptr += 4;
        printf("  bytes in bitstream = %d\n", swapsize);
 
-       return fpga_load(devnum, dataptr, swapsize, bstype);
+       return fpga_load(devnum, dataptr, swapsize, bstype, NULL);
 }
 
 int xilinx_load(xilinx_desc *desc, const void *buf, size_t bsize,
-               bitstream_type bstype)
+               bitstream_type bstype, const char *compatible)
 {
+       struct fpga_secure_info info = { 0 };
+
        if (!xilinx_validate (desc, (char *)__FUNCTION__)) {
                printf ("%s: Invalid device descriptor\n", __FUNCTION__);
                return FPGA_FAIL;
        }
 
-       if (!desc->operations || !desc->operations->load) {
+       if (!desc->operations) {
                printf("%s: Missing load operation\n", __func__);
                return FPGA_FAIL;
        }
 
-       return desc->operations->load(desc, buf, bsize, bstype);
+       if (!compatible || !strcmp(compatible, "u-boot,fpga-legacy")) {
+               if (!desc->operations->load) {
+                       printf("%s: Missing load operation\n", __func__);
+                       return FPGA_FAIL;
+               }
+               return desc->operations->load(desc, buf, bsize, bstype);
+       }
+
+       if (!strcmp(compatible, "u-boot,zynqmp-fpga-ddrauth")) {
+               if (!desc->operations->loads) {
+                       printf("%s: Missing load operation\n", __func__);
+                       return FPGA_FAIL;
+               }
+               /* DDR authentication */
+               info.authflag = 1;
+               return desc->operations->loads(desc, buf, bsize, &info);
+       }
+
+       printf("%s: compatible support not implemented\n", __func__);
+       return FPGA_FAIL;
 }
 
 #if defined(CONFIG_CMD_FPGA_LOADFS)
diff --git a/drivers/fpga/zynqmppl.c b/drivers/fpga/zynqmppl.c
index 6b394869db..65a9412123 100644
--- a/drivers/fpga/zynqmppl.c
+++ b/drivers/fpga/zynqmppl.c
@@ -245,7 +245,7 @@ static int zynqmp_load(xilinx_desc *desc, const void *buf, 
size_t bsize,
        return ret;
 }
 
-#if defined(CONFIG_CMD_FPGA_LOAD_SECURE) && !defined(CONFIG_SPL_BUILD)
+#if defined(CONFIG_CMD_FPGA_LOAD_SECURE)
 static int zynqmp_loads(xilinx_desc *desc, const void *buf, size_t bsize,
                        struct fpga_secure_info *fpga_sec_info)
 {
@@ -306,7 +306,7 @@ static int zynqmp_pcap_info(xilinx_desc *desc)
 
 struct xilinx_fpga_op zynqmp_op = {
        .load = zynqmp_load,
-#if defined(CONFIG_CMD_FPGA_LOAD_SECURE) && !defined(CONFIG_SPL_BUILD)
+#if defined(CONFIG_CMD_FPGA_LOAD_SECURE)
        .loads = zynqmp_loads,
 #endif
        .info = zynqmp_pcap_info,
diff --git a/include/xilinx.h b/include/xilinx.h
index ab4537becf..ae78009e6b 100644
--- a/include/xilinx.h
+++ b/include/xilinx.h
@@ -59,7 +59,7 @@ struct xilinx_fpga_op {
 /* Generic Xilinx Functions
  *********************************************************************/
 int xilinx_load(xilinx_desc *desc, const void *image, size_t size,
-               bitstream_type bstype);
+               bitstream_type bstype, const char *compatible);
 int xilinx_dump(xilinx_desc *desc, const void *buf, size_t bsize);
 int xilinx_info(xilinx_desc *desc);
 int xilinx_loadfs(xilinx_desc *desc, const void *buf, size_t bsize,
-- 
2.31.1

Reply via email to