[PATCH v7 6/7] fpga: zynqmp: support loading authenticated images
Oleksandr Suvorov
cryosay at gmail.com
Sun May 8 00:19:57 CEST 2022
Hi Michal,
On Tue, May 3, 2022 at 10:56 AM Michal Simek <michal.simek at xilinx.com> wrote:
>
>
>
> On 4/11/22 20:00, Adrian Fiergolski wrote:
> > From: Oleksandr Suvorov <oleksandr.suvorov at foundries.io>
> >
> > Add supporting new compatible string "u-boot,zynqmp-fpga-ddrauth" to
> > handle loading authenticated images (DDR).
> >
> > Based on solution by Jorge Ramirez-Ortiz <jorge at foundries.io>
> > Signed-off-by: Oleksandr Suvorov <oleksandr.suvorov at foundries.io>
> > Co-developed-by: Ricardo Salveti <ricardo at foundries.io>
> > Signed-off-by: Ricardo Salveti <ricardo at foundries.io>
> > Tested-by: Ricardo Salveti <ricardo at foundries.io>
> > Co-developed-by: Adrian Fiergolski <adrian.fiergolski at fastree3d.com>
> > Signed-off-by: Adrian Fiergolski <adrian.fiergolski at fastree3d.com>
> > ---
> > boot/Kconfig | 4 ++--
> > doc/uImage.FIT/source_file_format.txt | 5 ++++-
> > drivers/fpga/zynqmppl.c | 21 +++++++++++++++++++++
> > 3 files changed, 27 insertions(+), 3 deletions(-)
> >
> > diff --git a/boot/Kconfig b/boot/Kconfig
> > index b83a4e8400..f7faafb29f 100644
> > --- a/boot/Kconfig
> > +++ b/boot/Kconfig
> > @@ -209,8 +209,8 @@ config SPL_LOAD_FIT
> > 1. "loadables" images, other than FDTs, which do not have a "load"
> > property will not be loaded. This limitation also applies to FPGA
> > images with the correct "compatible" string.
> > - 2. For FPGA images, only the "compatible" = "u-boot,fpga-legacy"
> > - loading method is supported.
> > + 2. For FPGA images, the supported "compatible" list is in the
> > + doc/uImage.FIT/source_file_format.txt.
> > 3. FDTs are only loaded for images with an "os" property of "u-boot".
> > "linux" images are also supported with Falcon boot mode.
> >
> > diff --git a/doc/uImage.FIT/source_file_format.txt b/doc/uImage.FIT/source_file_format.txt
> > index f93ac6d1c7..461e2af2a8 100644
> > --- a/doc/uImage.FIT/source_file_format.txt
> > +++ b/doc/uImage.FIT/source_file_format.txt
> > @@ -184,7 +184,10 @@ the '/images' node should have the following layout:
> > Mandatory for types: "firmware", and "kernel".
> > - compatible : compatible method for loading image.
> > Mandatory for types: "fpga", and images that do not specify a load address.
> > - To use the generic fpga loading routine, use "u-boot,fpga-legacy".
> > + Supported compatible methods:
> > + "u-boot,fpga-legacy" - the generic fpga loading routine.
> > + "u-boot,zynqmp-fpga-ddrauth" - signed non-encrypted FPGA bitstream for
> > + Xilinx Zynq UltraScale+ (ZymqMP) device.
> >
> > Optional nodes:
> > - hash-1 : Each hash sub-node represents separate hash or checksum
> > diff --git a/drivers/fpga/zynqmppl.c b/drivers/fpga/zynqmppl.c
> > index c7f9f4ae84..0ce641e495 100644
> > --- a/drivers/fpga/zynqmppl.c
> > +++ b/drivers/fpga/zynqmppl.c
> > @@ -9,6 +9,7 @@
> > #include <common.h>
> > #include <compiler.h>
> > #include <cpu_func.h>
> > +#include <fpga.h>
> > #include <log.h>
> > #include <zynqmppl.h>
> > #include <zynqmp_firmware.h>
> > @@ -210,6 +211,26 @@ static int zynqmp_load(xilinx_desc **desc_ptr, const void *buf, size_t bsize,
> > u32 ret_payload[PAYLOAD_ARG_CNT];
> > bool xilfpga_old = false;
> > xilinx_desc *desc = *desc_ptr;
> > + fpga_desc *fdesc = container_of((void *)desc_ptr, fpga_desc, devdesc);
> > +
> > + if (fdesc && fdesc->compatible &&
> > + !strcmp(fdesc->compatible, "u-boot,zynqmp-fpga-ddrauth")) {
>
> I think you should use directly here what you have in 7/7. It means to check
> that it is not fpga-legacy.
Thanks, fixed. The fix will be introduced in the next patchset version.
>
> > + struct fpga_secure_info info = { 0 };
> > +
> > + if (!CONFIG_IS_ENABLED(FPGA_LOAD_SECURE)) {
> > + printf("No support for %s\n", fdesc->compatible);
> > + return FPGA_FAIL;
> > + }
> > +
> > + if (!desc->operations->loads) {
> > + printf("%s: Missing load operation\n", __func__);
> > + return FPGA_FAIL;
> > + }
> > + /* DDR authentication */
> > + info.authflag = 1;
> > + info.encflag = 2;
> > + return desc->operations->loads(desc, buf, bsize, &info);
> > + }
> >
> > if (zynqmp_firmware_version() <= PMUFW_V1_0) {
> > puts("WARN: PMUFW v1.0 or less is detected\n");
>
> Before you start to deal with secure bitstreams you should also likely check
> this PMUFW checking before you call loads.
Michal, this code block (for earlier PMUFW) does:
1. Set a flag ZYNQMP_FPGA_BIT_NS.
According to a description of the commit
19ed4b697b9732e0a5097bd233fba7e24dfe9146, ZYNQMP_FPGA_BIT_NS
bit should be set only for nonsecure bitstream. So not needed for
zynqmp_loads().
2. Prepare a pointer to a bitstream size (bsizeptr) instead of value (bsize).
For secure bitstream, a key address is already used instead.
3. Validate a bitstream data and placement with zynqmp_validate_bitstream().
I've not found enough information about validating non-secure/secure
bitstreams. Could you confirm the function zynqmp_validate_bitstream()
can be used to validate both legacy and secure bitstreams?
Thanks,
Oleksandr.
>
> Thanks,
> Michal
--
Best regards
Oleksandr
Oleksandr Suvorov
cryosay at gmail.com
More information about the U-Boot
mailing list