[PATCH 1/1] firmware: provide space for firmware fixups
Anup Patel
Anup.Patel at wdc.com
Thu Oct 1 08:08:24 EDT 2020
> -----Original Message-----
> From: Heinrich Schuchardt <xypron.glpk at gmx.de>
> Sent: 01 October 2020 16:55
> To: Anup Patel <Anup.Patel at wdc.com>; Atish Patra
> <Atish.Patra at wdc.com>
> Cc: OpenSBI List <opensbi at lists.infradead.org>; Atish Patra
> <atishp at atishpatra.org>
> Subject: Re: [PATCH 1/1] firmware: provide space for firmware fixups
>
> On 01.10.20 12:56, Anup Patel wrote:
> >
> >
> >> -----Original Message-----
> >> From: opensbi <opensbi-bounces at lists.infradead.org> On Behalf Of
> >> Heinrich Schuchardt
> >> Sent: 01 October 2020 15:59
> >> To: Atish Patra <Atish.Patra at wdc.com>
> >> Cc: Heinrich Schuchardt <xypron.glpk at gmx.de>; OpenSBI List
> >> <opensbi at lists.infradead.org>; Atish Patra <atishp at atishpatra.org>
> >> Subject: [PATCH 1/1] firmware: provide space for firmware fixups
> >>
> >> We expand the provided device tree by up to 1056 bytes in fixup
> operations.
> >> This space must be allocated in the firmware binary.
> >>
> >> An alternative approach would be to allocate RAM for a copy of the
> >> device tree but we do not have library functions for dynamic memory
> allocation yet.
> >>
> >> Without this patch devicetree fixups lead to memory corruption.
> >>
> >> Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
> >> ---
> >> firmware/fw_payload.S | 2 ++
> >> scripts/d2c.sh | 3 +++
> >> 2 files changed, 5 insertions(+)
> >>
> >> diff --git a/firmware/fw_payload.S b/firmware/fw_payload.S index
> >> 9805d8c..fdd082f 100644
> >> --- a/firmware/fw_payload.S
> >> +++ b/firmware/fw_payload.S
> >> @@ -108,6 +108,8 @@ fw_options:
> >> .globl fdt_bin
> >> fdt_bin:
> >> .incbin FW_PAYLOAD_FDT_PATH
> >> + /* space for device tree updates */
> >> + . = . + 0x420;
> >> #endif
> >
> > We should not add arbitrary padding like this. Instead we should have
> > separate FW_PAYLOAD_FDT_PADDING options for config.mk.
> >
> >>
> >> .section .payload, "ax", %progbits
> >> diff --git a/scripts/d2c.sh b/scripts/d2c.sh index 821a995..1c53a71
> >> 100755
> >> --- a/scripts/d2c.sh
> >> +++ b/scripts/d2c.sh
> >> @@ -62,6 +62,9 @@ printf "const char __attribute__((aligned(%s)))
> >> %s_start[] = {\n" "${OUTPUT_C_AL
> >>
> >> od -v -t x1 -An ${INPUT_PATH} | awk '{for (i=1; i<=NF; i++) printf "
> >> 0x%s,", $i; printf "\n"; }'
> >>
> >> +# Add 1056 bytes for device tree fixups echo dummy | awk '{for (j=1;
> >> +j<=0x42; j++) {for (i=1; i<=0x10; i++) printf " 0x00,"; printf "\n"}; }'
> >> +
> >
> > Here again, we should not have arbitrary padding. Instead:
> > 1) Add optional parameter to d2c.sh for amount of padding required
> > 2) In platform/kendryte/k210/objects.mk, add line "platform-padding-
> k210.o = 1056"
>
> This numbers 1024 and 32 is defined by lib/utils/fdt/fdt_fixup.c. I understand
> why defining constants makes sense. These constants may be used on
> platform level but should not be defined there but in an include or common
> Makefile.
The FDT fixups will keep changing over-time so common makefile variable
for amount of padding in lib/utils/fdt/objects.mk is fine.
>
> > 3) Extend "compile_d2c" and make rule to convert .dtb to .c file in
> > toplevel Makfile
> >
> >> printf "};\n"
> >>
> >> printf "const unsigned long %s_size = sizeof(%s_start);\n"
> >> "${OUTPUT_C_PREFIX}" "${OUTPUT_C_PREFIX}"
>
> We already have firmware/fw_payload.S including
> FW_PAYLOAD_FDT_PATH.
> Shouldn't we unify the way device trees are included in the firmware. We
> could define a new variable defined by FW_PAYLOAD_FDT_PATH with a
> fallback to a platform device tree.
FW_PAYLOAD_FDT_PATH has limitations. The d2c.sh approach is more
flexible and allows having multiple built-in DTBs whereas we can only include
one DTB with FW_PAYLOAD_FDT_PATH. Also, the FW_PAYLOAD_FDT_PATH
works only for FW_PAYLOAD and does not work for other firmwares whereas
d2c.sh based built-in DTBs work for all OpenSBI firmwares.
I certainly agree that we should have unified way of built-in DTBs.
I prefer removing FW_PAYLOAD_FDT_PATH but first we have to figure-out
how we can link external DTB to generic platform firmwares in absence of
FW_PAYLOAD_FDT_PATH.
>
> This sort of patch should go in first before addressing the fixup issue.
Agree.
>
> Best regards
>
> Heinrich
>
> >> --
> >> 2.28.0
> >>
> >>
> >> --
> >> opensbi mailing list
> >> opensbi at lists.infradead.org
> >> http://lists.infradead.org/mailman/listinfo/opensbi
> >
> > Overall, this needs to be broken down into more patches:
> > 1) Patch for adding FW_PAYLOAD_FDT_PADDING option
> > 2) Patch for documenting FW_PAYLOAD_FDT_PADDING
> > 3) Patch for optional padding parameter to d2c.sh
> > 4) Patch to extend "compile_d2c" and make rule in top-level makefile
> > 5) Patch to update platform/kendryte/k210/objects.mk
> >
> > Regards,
> > Anup
> >
Regards,
Anup
More information about the opensbi
mailing list