[RFC PATCH 2/2] fpga: xilinx: allow loading authenticated images (DDR)
Jorge Ramirez-Ortiz
jorge at foundries.io
Tue Oct 5 13:13:24 CEST 2021
Add new compatible string u-boot,zynqmp-fpga-ddrauth to handle this
use case.
Signed-off-by: Jorge Ramirez-Ortiz <jorge at 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
More information about the U-Boot
mailing list