
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