Message ID | 20250127144941.645544-3-raymond.mao@linaro.org |
---|---|
State | Accepted |
Commit | 8895ff8ae2186b53b4a073966ef16b09c12a69b8 |
Delegated to: | Tom Rini |
Headers | show |
Series | [v7,1/3] bloblist: add api to get blob with size | expand |
On Mon, 27 Jan 2025 at 16:50, Raymond Mao <raymond.mao@linaro.org> wrote: > > Get tpm event log from bloblist instead of FDT when bloblist is > enabled and valid from previous boot stage. > > Signed-off-by: Raymond Mao <raymond.mao@linaro.org> > --- > Changes in v2 > - Remove patch dependency. > - Remove the fallback to FDT when BLOBLIST is selected. > Changes in v3 > - Malloc an 8KB buffer when user eventlog buffer does not exist. > Changes in v4 > - Replace the default eventlog size with TPM2_EVENT_LOG_SIZE. > Changes in v5 > - Replace TPM2_EVENT_LOG_SIZE with CONFIG_TPM2_EVENT_LOG_SIZE. > - Add an inline TODO comment. > Changes in v6 > - Remove the malloc and keep the buffer pointed by "sml" for the fallback > as it is the right place for linux to discover the eventlog. > Changes in v7 > - Remove '#include <malloc.h>'. > - Add mapping for the blob address. > > lib/tpm_tcg2.c | 59 +++++++++++++++++++++++++++++++++----------------- > 1 file changed, 39 insertions(+), 20 deletions(-) > > diff --git a/lib/tpm_tcg2.c b/lib/tpm_tcg2.c > index 4134d93a35..adb32a14f0 100644 > --- a/lib/tpm_tcg2.c > +++ b/lib/tpm_tcg2.c > @@ -19,6 +19,7 @@ > #include <linux/unaligned/generic.h> > #include <linux/unaligned/le_byteshift.h> > #include "tpm-utils.h" > +#include <bloblist.h> > > int tcg2_get_pcr_info(struct udevice *dev, u32 *supported_bank, u32 *active_bank, > u32 *bank_num) > @@ -672,21 +673,42 @@ void tcg2_measurement_term(struct udevice *dev, struct tcg2_event_log *elog, > > __weak int tcg2_platform_get_log(struct udevice *dev, void **addr, u32 *size) > { > - const __be32 *addr_prop; > - const __be32 *size_prop; > + const __be32 *addr_prop = NULL; > + const __be32 *size_prop = NULL; > int asize; > int ssize; > + struct ofnode_phandle_args args; > + phys_addr_t a; > + fdt_size_t s; > > *addr = NULL; > *size = 0; > > - addr_prop = dev_read_prop(dev, "tpm_event_log_addr", &asize); > - if (!addr_prop) > - addr_prop = dev_read_prop(dev, "linux,sml-base", &asize); > + *addr = bloblist_get_blob(BLOBLISTT_TPM_EVLOG, size); > + if (*addr && *size) { > + *addr = map_physmem((uintptr_t)(*addr), *size, MAP_NOCACHE); > + return 0; > + } > > - size_prop = dev_read_prop(dev, "tpm_event_log_size", &ssize); > - if (!size_prop) > + /* > + * TODO: > + * Replace BLOBLIST with a new kconfig for handoff all components > + * (fdt, tpm event log, etc...) from previous boot stage via bloblist > + * mandatorily following Firmware Handoff spec. > + */ > + if (!CONFIG_IS_ENABLED(BLOBLIST)) { > + addr_prop = dev_read_prop(dev, "tpm_event_log_addr", &asize); > + size_prop = dev_read_prop(dev, "tpm_event_log_size", &ssize); > + } > + > + /* > + * If no eventlog was observed, a sml buffer is required for the kernel > + * to discover the eventlog. > + */ > + if (!addr_prop || !size_prop) { > + addr_prop = dev_read_prop(dev, "linux,sml-base", &asize); > size_prop = dev_read_prop(dev, "linux,sml-size", &ssize); > + } > > if (addr_prop && size_prop) { > u64 a = of_read_number(addr_prop, asize / sizeof(__be32)); > @@ -694,22 +716,19 @@ __weak int tcg2_platform_get_log(struct udevice *dev, void **addr, u32 *size) > > *addr = map_physmem(a, s, MAP_NOCACHE); > *size = (u32)s; > - } else { > - struct ofnode_phandle_args args; > - phys_addr_t a; > - fdt_size_t s; > > - if (dev_read_phandle_with_args(dev, "memory-region", NULL, 0, > - 0, &args)) > - return -ENODEV; > + return 0; > + } > > - a = ofnode_get_addr_size(args.node, "reg", &s); > - if (a == FDT_ADDR_T_NONE) > - return -ENOMEM; > + if (dev_read_phandle_with_args(dev, "memory-region", NULL, 0, 0, &args)) > + return -ENODEV; > > - *addr = map_physmem(a, s, MAP_NOCACHE); > - *size = (u32)s; > - } > + a = ofnode_get_addr_size(args.node, "reg", &s); > + if (a == FDT_ADDR_T_NONE) > + return -ENOMEM; > + > + *addr = map_physmem(a, s, MAP_NOCACHE); > + *size = (u32)s; > > return 0; > } > -- > 2.25.1 > Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
diff --git a/lib/tpm_tcg2.c b/lib/tpm_tcg2.c index 4134d93a35..adb32a14f0 100644 --- a/lib/tpm_tcg2.c +++ b/lib/tpm_tcg2.c @@ -19,6 +19,7 @@ #include <linux/unaligned/generic.h> #include <linux/unaligned/le_byteshift.h> #include "tpm-utils.h" +#include <bloblist.h> int tcg2_get_pcr_info(struct udevice *dev, u32 *supported_bank, u32 *active_bank, u32 *bank_num) @@ -672,21 +673,42 @@ void tcg2_measurement_term(struct udevice *dev, struct tcg2_event_log *elog, __weak int tcg2_platform_get_log(struct udevice *dev, void **addr, u32 *size) { - const __be32 *addr_prop; - const __be32 *size_prop; + const __be32 *addr_prop = NULL; + const __be32 *size_prop = NULL; int asize; int ssize; + struct ofnode_phandle_args args; + phys_addr_t a; + fdt_size_t s; *addr = NULL; *size = 0; - addr_prop = dev_read_prop(dev, "tpm_event_log_addr", &asize); - if (!addr_prop) - addr_prop = dev_read_prop(dev, "linux,sml-base", &asize); + *addr = bloblist_get_blob(BLOBLISTT_TPM_EVLOG, size); + if (*addr && *size) { + *addr = map_physmem((uintptr_t)(*addr), *size, MAP_NOCACHE); + return 0; + } - size_prop = dev_read_prop(dev, "tpm_event_log_size", &ssize); - if (!size_prop) + /* + * TODO: + * Replace BLOBLIST with a new kconfig for handoff all components + * (fdt, tpm event log, etc...) from previous boot stage via bloblist + * mandatorily following Firmware Handoff spec. + */ + if (!CONFIG_IS_ENABLED(BLOBLIST)) { + addr_prop = dev_read_prop(dev, "tpm_event_log_addr", &asize); + size_prop = dev_read_prop(dev, "tpm_event_log_size", &ssize); + } + + /* + * If no eventlog was observed, a sml buffer is required for the kernel + * to discover the eventlog. + */ + if (!addr_prop || !size_prop) { + addr_prop = dev_read_prop(dev, "linux,sml-base", &asize); size_prop = dev_read_prop(dev, "linux,sml-size", &ssize); + } if (addr_prop && size_prop) { u64 a = of_read_number(addr_prop, asize / sizeof(__be32)); @@ -694,22 +716,19 @@ __weak int tcg2_platform_get_log(struct udevice *dev, void **addr, u32 *size) *addr = map_physmem(a, s, MAP_NOCACHE); *size = (u32)s; - } else { - struct ofnode_phandle_args args; - phys_addr_t a; - fdt_size_t s; - if (dev_read_phandle_with_args(dev, "memory-region", NULL, 0, - 0, &args)) - return -ENODEV; + return 0; + } - a = ofnode_get_addr_size(args.node, "reg", &s); - if (a == FDT_ADDR_T_NONE) - return -ENOMEM; + if (dev_read_phandle_with_args(dev, "memory-region", NULL, 0, 0, &args)) + return -ENODEV; - *addr = map_physmem(a, s, MAP_NOCACHE); - *size = (u32)s; - } + a = ofnode_get_addr_size(args.node, "reg", &s); + if (a == FDT_ADDR_T_NONE) + return -ENOMEM; + + *addr = map_physmem(a, s, MAP_NOCACHE); + *size = (u32)s; return 0; }
Get tpm event log from bloblist instead of FDT when bloblist is enabled and valid from previous boot stage. Signed-off-by: Raymond Mao <raymond.mao@linaro.org> --- Changes in v2 - Remove patch dependency. - Remove the fallback to FDT when BLOBLIST is selected. Changes in v3 - Malloc an 8KB buffer when user eventlog buffer does not exist. Changes in v4 - Replace the default eventlog size with TPM2_EVENT_LOG_SIZE. Changes in v5 - Replace TPM2_EVENT_LOG_SIZE with CONFIG_TPM2_EVENT_LOG_SIZE. - Add an inline TODO comment. Changes in v6 - Remove the malloc and keep the buffer pointed by "sml" for the fallback as it is the right place for linux to discover the eventlog. Changes in v7 - Remove '#include <malloc.h>'. - Add mapping for the blob address. lib/tpm_tcg2.c | 59 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 39 insertions(+), 20 deletions(-)