tpm: Add reserved memory event log
authorEddie James <eajames@linux.ibm.com>
Thu, 26 Jan 2023 21:08:10 +0000 (15:08 -0600)
committerJarkko Sakkinen <jarkko@kernel.org>
Mon, 13 Feb 2023 08:11:20 +0000 (10:11 +0200)
Some platforms may desire to pass the event log up to Linux in the
form of a reserved memory region. In particular, this is desirable
for embedded systems or baseboard management controllers (BMCs)
booting with U-Boot. IBM OpenBMC BMCs will be the first user.
Add support for the reserved memory in the TPM core to find the
region and map it.

Signed-off-by: Eddie James <eajames@linux.ibm.com>
[jarkko: removed spurious dev_info()'s from tpm_read_log_memory_region()]
Reviewed-by: Jarkko Sakkinen <jarkko@kernel.org>
[yang: return -ENOMEM when devm_memremap() fails]
Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
Signed-off-by: Jarkko Sakkinen <jarkko@kernel.org>
drivers/char/tpm/eventlog/of.c

index 741ab2204b11aa018da2c7bb5d59b75356f64f76..930fe43d5dafa86a2d59dba7284bbcceff9ce304 100644 (file)
 
 #include <linux/device.h>
 #include <linux/slab.h>
+#include <linux/io.h>
+#include <linux/ioport.h>
 #include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/of_reserved_mem.h>
 #include <linux/tpm_eventlog.h>
 
 #include "../tpm.h"
 #include "common.h"
 
+static int tpm_read_log_memory_region(struct tpm_chip *chip)
+{
+       struct device_node *node;
+       struct resource res;
+       int rc;
+
+       node = of_parse_phandle(chip->dev.parent->of_node, "memory-region", 0);
+       if (!node)
+               return -ENODEV;
+
+       rc = of_address_to_resource(node, 0, &res);
+       of_node_put(node);
+       if (rc)
+               return rc;
+
+       chip->log.bios_event_log = devm_memremap(&chip->dev, res.start, resource_size(&res),
+                                                MEMREMAP_WB);
+       if (IS_ERR(chip->log.bios_event_log))
+               return -ENOMEM;
+
+       chip->log.bios_event_log_end = chip->log.bios_event_log + resource_size(&res);
+
+       return chip->flags & TPM_CHIP_FLAG_TPM2 ? EFI_TCG2_EVENT_LOG_FORMAT_TCG_2 :
+               EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2;
+}
+
 int tpm_read_log_of(struct tpm_chip *chip)
 {
        struct device_node *np;
@@ -39,7 +69,7 @@ int tpm_read_log_of(struct tpm_chip *chip)
        sizep = of_get_property(np, "linux,sml-size", NULL);
        basep = of_get_property(np, "linux,sml-base", NULL);
        if (sizep == NULL && basep == NULL)
-               return -ENODEV;
+               return tpm_read_log_memory_region(chip);
        if (sizep == NULL || basep == NULL)
                return -EIO;