coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
tis.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <console/console.h>
4 #include <security/tpm/tis.h>
5 #include <acpi/acpigen.h>
6 #include <device/device.h>
8 
9 #include "tpm.h"
10 #include "chip.h"
11 
12 static unsigned int tpm_is_open;
13 
14 static const struct {
17  const char *device_name;
18 } dev_map[] = {
19  {0x1ae0, 0x0028, "CR50"},
20  {0xa13a, 0x8086, "Intel iTPM"}
21 };
22 
23 static const char *tis_get_dev_name(struct tpm2_info *info)
24 {
25  int i;
26 
27  for (i = 0; i < ARRAY_SIZE(dev_map); i++)
28  if ((dev_map[i].vid == info->vendor_id) && (dev_map[i].did == info->device_id))
29  return dev_map[i].device_name;
30  return "Unknown";
31 }
32 
33 int tis_open(void)
34 {
35  if (tpm_is_open) {
36  printk(BIOS_ERR, "%s called twice.\n", __func__);
37  return -1;
38  }
39 
40  if (CONFIG(HAVE_INTEL_PTT)) {
41  if (!ptt_active()) {
42  printk(BIOS_ERR, "%s: Intel PTT is not active.\n", __func__);
43  return -1;
44  }
45  printk(BIOS_DEBUG, "%s: Intel PTT is active.\n", __func__);
46  }
47 
48  return 0;
49 }
50 
51 int tis_close(void)
52 {
53  if (tpm_is_open) {
54 
55  /*
56  * Do we need to do something here, like waiting for a
57  * transaction to stop?
58  */
59  tpm_is_open = 0;
60  }
61 
62  return 0;
63 }
64 
65 int tis_init(void)
66 {
67  struct tpm2_info info;
68 
69  // Wake TPM up (if necessary)
70  if (tpm2_init() != 0)
71  return -1;
72 
74 
75  printk(BIOS_INFO, "Initialized TPM device %s revision %d\n", tis_get_dev_name(&info),
76  info.revision);
77 
78  return 0;
79 }
80 
81 int tis_sendrecv(const uint8_t *sendbuf, size_t sbuf_size, uint8_t *recvbuf, size_t *rbuf_len)
82 {
83  int len = tpm2_process_command(sendbuf, sbuf_size, recvbuf, *rbuf_len);
84 
85  if (len == 0)
86  return -1;
87 
88  *rbuf_len = len;
89 
90  return 0;
91 }
92 
93 static void crb_tpm_fill_ssdt(const struct device *dev)
94 {
95  const char *path = acpi_device_path(dev);
96  if (!path) {
97  path = "\\_SB_.TPM";
98  printk(BIOS_DEBUG, "Using default TPM2 ACPI path: '%s'\n", path);
99  }
100 
101  /* Device */
102  acpigen_write_device(path);
103 
104  acpigen_write_name_string("_HID", "MSFT0101");
105  acpigen_write_name_string("_CID", "MSFT0101");
106 
108 
110 
111  /* Resources */
112  acpigen_write_name("_CRS");
115 
117 
118  acpigen_pop_len(); /* Device */
119 }
120 
121 static const char *crb_tpm_acpi_name(const struct device *dev)
122 {
123  return "TPM";
124 }
125 
126 static struct device_operations __unused crb_ops = {
128  .set_resources = noop_set_resources,
129 #if CONFIG(HAVE_ACPI_TABLES)
130  .acpi_name = crb_tpm_acpi_name,
131  .acpi_fill_ssdt = crb_tpm_fill_ssdt,
132 #endif
133 
134 };
135 
136 static void enable_dev(struct device *dev)
137 {
138 #if !DEVTREE_EARLY
139  dev->ops = &crb_ops;
140 #endif
141 }
142 
144  CHIP_NAME("CRB TPM")
145  .enable_dev = enable_dev
146 };
void acpi_device_write_uid(const struct device *dev)
Definition: device.c:203
const char * acpi_device_path(const struct device *dev)
Definition: device.c:144
void acpigen_pop_len(void)
Definition: acpigen.c:37
void acpigen_write_resourcetemplate_footer(void)
Definition: acpigen.c:1165
void acpigen_write_STA(uint8_t status)
Definition: acpigen.c:783
void acpigen_write_resourcetemplate_header(void)
Definition: acpigen.c:1147
void acpigen_write_mem32fixed(int readwrite, u32 base, u32 size)
Definition: acpigen.c:1071
void acpigen_write_device(const char *name)
Definition: acpigen.c:769
void acpigen_write_name(const char *name)
Definition: acpigen.c:320
void acpigen_write_name_string(const char *name, const char *string)
Definition: acpigen.c:176
#define ARRAY_SIZE(a)
Definition: helpers.h:12
#define printk(level,...)
Definition: stdlib.h:16
static const char * tis_get_dev_name(struct tpm2_info *info)
Definition: tis.c:23
static void crb_tpm_fill_ssdt(const struct device *dev)
Definition: tis.c:93
int tis_sendrecv(const uint8_t *sendbuf, size_t sbuf_size, uint8_t *recvbuf, size_t *rbuf_len)
Definition: tis.c:81
static void enable_dev(struct device *dev)
Definition: tis.c:136
const char * device_name
Definition: tis.c:17
struct chip_operations drivers_crb_ops
Definition: tis.c:143
static const char * crb_tpm_acpi_name(const struct device *dev)
Definition: tis.c:121
uint16_t vid
Definition: tis.c:15
static struct device_operations __unused crb_ops
Definition: tis.c:126
int tis_close(void)
Definition: tis.c:51
uint16_t did
Definition: tis.c:16
int tis_open(void)
Definition: tis.c:33
int tis_init(void)
Definition: tis.c:65
static unsigned int tpm_is_open
Definition: tis.c:12
static const struct @26 dev_map[]
int tpm2_init(void)
Definition: tpm.c:175
size_t tpm2_process_command(const void *tpm2_command, size_t command_size, void *tpm2_response, size_t max_response)
Definition: tpm.c:195
void tpm2_get_info(struct tpm2_info *tpm2_info)
Definition: tpm.c:266
#define TPM_CRB_BASE_ADDRESS
Definition: tpm.h:6
static struct smmstore_params_info info
Definition: ramstage.c:12
@ CONFIG
Definition: dsi_common.h:201
#define ACPI_STATUS_DEVICE_ALL_ON
Definition: acpigen.h:20
#define __unused
Definition: helpers.h:38
#define CHIP_NAME(X)
Definition: device.h:32
static void noop_read_resources(struct device *dev)
Standard device operations function pointers shims.
Definition: device.h:73
static void noop_set_resources(struct device *dev)
Definition: device.h:74
#define BIOS_INFO
BIOS_INFO - Expected events.
Definition: loglevel.h:113
#define BIOS_DEBUG
BIOS_DEBUG - Verbose output.
Definition: loglevel.h:128
#define BIOS_ERR
BIOS_ERR - System in incomplete state.
Definition: loglevel.h:72
bool ptt_active(void)
Definition: ptt.c:28
unsigned short uint16_t
Definition: stdint.h:11
unsigned char uint8_t
Definition: stdint.h:8
void(* read_resources)(struct device *dev)
Definition: device.h:39
Definition: device.h:107
struct device_operations * ops
Definition: device.h:143
Definition: tpm.h:54