Merge branch 'x86-topology-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[muen/linux.git] / drivers / char / tpm / eventlog / efi.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Copyright (C) 2017 Google
4  *
5  * Authors:
6  *      Thiebaud Weksteen <tweek@google.com>
7  */
8
9 #include <linux/efi.h>
10 #include <linux/tpm_eventlog.h>
11
12 #include "../tpm.h"
13 #include "common.h"
14
15 /* read binary bios log from EFI configuration table */
16 int tpm_read_log_efi(struct tpm_chip *chip)
17 {
18
19         struct linux_efi_tpm_eventlog *log_tbl;
20         struct tpm_bios_log *log;
21         u32 log_size;
22         u8 tpm_log_version;
23
24         if (!(chip->flags & TPM_CHIP_FLAG_TPM2))
25                 return -ENODEV;
26
27         if (efi.tpm_log == EFI_INVALID_TABLE_ADDR)
28                 return -ENODEV;
29
30         log = &chip->log;
31
32         log_tbl = memremap(efi.tpm_log, sizeof(*log_tbl), MEMREMAP_WB);
33         if (!log_tbl) {
34                 pr_err("Could not map UEFI TPM log table !\n");
35                 return -ENOMEM;
36         }
37
38         log_size = log_tbl->size;
39         memunmap(log_tbl);
40
41         log_tbl = memremap(efi.tpm_log, sizeof(*log_tbl) + log_size,
42                            MEMREMAP_WB);
43         if (!log_tbl) {
44                 pr_err("Could not map UEFI TPM log table payload!\n");
45                 return -ENOMEM;
46         }
47
48         /* malloc EventLog space */
49         log->bios_event_log = kmemdup(log_tbl->log, log_size, GFP_KERNEL);
50         if (!log->bios_event_log)
51                 goto err_memunmap;
52         log->bios_event_log_end = log->bios_event_log + log_size;
53
54         tpm_log_version = log_tbl->version;
55         memunmap(log_tbl);
56         return tpm_log_version;
57
58 err_memunmap:
59         memunmap(log_tbl);
60         return -ENOMEM;
61 }