<p>Philipp Deppenwiese has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/29194">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">security/tpm: Add generalized ACPI table generation<br><br>* Move ACPI table generation from TPM bus drivers<br> to security/tpm/acpi<br>* Update TPPI interface implementation<br><br>Change-Id: I2afdf4872566353284ab7734205a3bea738a6e0e<br>Signed-off-by: Philipp Deppenwiese <zaolin@das-labor.org><br>---<br>M src/drivers/i2c/tpm/Makefile.inc<br>D src/drivers/i2c/tpm/chip.c<br>M src/drivers/pc80/tpm/tis.c<br>M src/drivers/spi/acpi/acpi.c<br>M src/security/tpm/Makefile.inc<br>5 files changed, 11 insertions(+), 480 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/94/29194/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/drivers/i2c/tpm/Makefile.inc b/src/drivers/i2c/tpm/Makefile.inc</span><br><span>index e24a66d..3c91bc0 100644</span><br><span>--- a/src/drivers/i2c/tpm/Makefile.inc</span><br><span>+++ b/src/drivers/i2c/tpm/Makefile.inc</span><br><span>@@ -18,4 +18,4 @@</span><br><span> verstage-$(CONFIG_MAINBOARD_HAS_I2C_TPM_CR50) += cr50.c</span><br><span> bootblock-$(CONFIG_MAINBOARD_HAS_I2C_TPM_CR50) += cr50.c</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-ramstage-$(CONFIG_DRIVER_I2C_TPM_ACPI) += chip.c</span><br><span style="color: hsl(120, 100%, 40%);">+ramstage-$(CONFIG_DRIVER_I2C_TPM_ACPI) += acpi.c</span><br><span>diff --git a/src/drivers/i2c/tpm/chip.c b/src/drivers/i2c/tpm/chip.c</span><br><span>deleted file mode 100644</span><br><span>index 3dbe811..0000000</span><br><span>--- a/src/drivers/i2c/tpm/chip.c</span><br><span>+++ /dev/null</span><br><span>@@ -1,99 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/*</span><br><span style="color: hsl(0, 100%, 40%);">- * This file is part of the coreboot project.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * Copyright 2016 Google Inc.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(0, 100%, 40%);">- * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(0, 100%, 40%);">- * the Free Software Foundation; version 2 of the License.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(0, 100%, 40%);">- * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(0, 100%, 40%);">- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span><br><span style="color: hsl(0, 100%, 40%);">- * GNU General Public License for more details.</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <arch/acpi_device.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <arch/acpigen.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <console/console.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <device/i2c_simple.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <device/device.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <device/path.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdint.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <string.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include "tpm.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "chip.h"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void i2c_tpm_fill_ssdt(struct device *dev)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct drivers_i2c_tpm_config *config = dev->chip_info;</span><br><span style="color: hsl(0, 100%, 40%);">- const char *scope = acpi_device_scope(dev);</span><br><span style="color: hsl(0, 100%, 40%);">- struct acpi_i2c i2c = {</span><br><span style="color: hsl(0, 100%, 40%);">- .address = dev->path.i2c.device,</span><br><span style="color: hsl(0, 100%, 40%);">- .mode_10bit = dev->path.i2c.mode_10bit,</span><br><span style="color: hsl(0, 100%, 40%);">- .speed = config->speed ? : I2C_SPEED_FAST,</span><br><span style="color: hsl(0, 100%, 40%);">- .resource = scope,</span><br><span style="color: hsl(0, 100%, 40%);">- };</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (!dev->enabled || !scope)</span><br><span style="color: hsl(0, 100%, 40%);">- return;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (!config->hid) {</span><br><span style="color: hsl(0, 100%, 40%);">- printk(BIOS_ERR, "%s: ERROR: HID required\n", dev_path(dev));</span><br><span style="color: hsl(0, 100%, 40%);">- return;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Device */</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_scope(scope);</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_device(acpi_device_name(dev));</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_name_string("_HID", config->hid);</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_name_integer("_UID", config->uid);</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_name_string("_DDN", dev->chip_ops->name);</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_STA(acpi_device_status(dev));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Resources */</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_name("_CRS");</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_resourcetemplate_header();</span><br><span style="color: hsl(0, 100%, 40%);">- acpi_device_write_i2c(&i2c);</span><br><span style="color: hsl(0, 100%, 40%);">- if (config->irq_gpio.pin_count)</span><br><span style="color: hsl(0, 100%, 40%);">- acpi_device_write_gpio(&config->irq_gpio);</span><br><span style="color: hsl(0, 100%, 40%);">- else</span><br><span style="color: hsl(0, 100%, 40%);">- acpi_device_write_interrupt(&config->irq);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_resourcetemplate_footer();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_pop_len(); /* Device */</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_pop_len(); /* Scope */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- printk(BIOS_INFO, "%s: %s at %s\n", acpi_device_path(dev),</span><br><span style="color: hsl(0, 100%, 40%);">- dev->chip_ops->name, dev_path(dev));</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static const char *i2c_tpm_acpi_name(const struct device *dev)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- return "TPMI";</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static struct device_operations i2c_tpm_ops = {</span><br><span style="color: hsl(0, 100%, 40%);">- .read_resources = DEVICE_NOOP,</span><br><span style="color: hsl(0, 100%, 40%);">- .set_resources = DEVICE_NOOP,</span><br><span style="color: hsl(0, 100%, 40%);">- .enable_resources = DEVICE_NOOP,</span><br><span style="color: hsl(0, 100%, 40%);">- .acpi_name = &i2c_tpm_acpi_name,</span><br><span style="color: hsl(0, 100%, 40%);">- .acpi_fill_ssdt_generator = &i2c_tpm_fill_ssdt,</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void i2c_tpm_enable(struct device *dev)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct drivers_i2c_tpm_config *config = dev->chip_info;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- dev->ops = &i2c_tpm_ops;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (config && config->desc) {</span><br><span style="color: hsl(0, 100%, 40%);">- dev->name = config->desc;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct chip_operations drivers_i2c_tpm_ops = {</span><br><span style="color: hsl(0, 100%, 40%);">- CHIP_NAME("I2C TPM")</span><br><span style="color: hsl(0, 100%, 40%);">- .enable_dev = &i2c_tpm_enable</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span>diff --git a/src/drivers/pc80/tpm/tis.c b/src/drivers/pc80/tpm/tis.c</span><br><span>index 8c01ac3..7df9785 100644</span><br><span>--- a/src/drivers/pc80/tpm/tis.c</span><br><span>+++ b/src/drivers/pc80/tpm/tis.c</span><br><span>@@ -27,15 +27,13 @@</span><br><span> #include <string.h></span><br><span> #include <delay.h></span><br><span> #include <arch/io.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <arch/acpi.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <arch/acpigen.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <arch/acpi_device.h></span><br><span> #include <device/device.h></span><br><span> #include <console/console.h></span><br><span> #include <security/tpm/tis.h></span><br><span> #include <arch/early_variables.h></span><br><span> #include <device/pnp.h></span><br><span> #include "chip.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include <security/tpm/acpi.h></span><br><span> </span><br><span> #define PREFIX "lpc_tpm: "</span><br><span> /* TCG Physical Presence Interface */</span><br><span>@@ -782,207 +780,11 @@</span><br><span> }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#if IS_ENABLED(CONFIG_HAVE_ACPI_TABLES)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void tpm_ppi_func0_cb(void *arg)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- /* Functions 1-8. */</span><br><span style="color: hsl(0, 100%, 40%);">- u8 buf[] = {0xff, 0x01};</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_return_byte_buffer(buf, 2);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void tpm_ppi_func1_cb(void *arg)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- if (IS_ENABLED(CONFIG_TPM2))</span><br><span style="color: hsl(0, 100%, 40%);">- /* Interface version: 2.0 */</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_return_string("2.0");</span><br><span style="color: hsl(0, 100%, 40%);">- else</span><br><span style="color: hsl(0, 100%, 40%);">- /* Interface version: 1.2 */</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_return_string("1.2");</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void tpm_ppi_func2_cb(void *arg)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- /* Submit operations: drop on the floor and return success. */</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_return_byte(0);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void tpm_ppi_func3_cb(void *arg)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- /* Pending operation: none. */</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_emit_byte(RETURN_OP);</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_package(2);</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_byte(0);</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_byte(0);</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_pop_len();</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-static void tpm_ppi_func4_cb(void *arg)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- /* Pre-OS transition method: reboot. */</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_return_byte(2);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-static void tpm_ppi_func5_cb(void *arg)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- /* Operation response: no operation executed. */</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_emit_byte(RETURN_OP);</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_package(3);</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_byte(0);</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_byte(0);</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_byte(0);</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_pop_len();</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-static void tpm_ppi_func6_cb(void *arg)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- /*</span><br><span style="color: hsl(0, 100%, 40%);">- * Set preferred user language: deprecated and must return 3 aka</span><br><span style="color: hsl(0, 100%, 40%);">- * "not implemented".</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_return_byte(3);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-static void tpm_ppi_func7_cb(void *arg)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- /* Submit operations: deny. */</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_return_byte(3);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-static void tpm_ppi_func8_cb(void *arg)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- /* All actions are forbidden. */</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_return_byte(1);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-static void (*tpm_ppi_callbacks[])(void *) = {</span><br><span style="color: hsl(0, 100%, 40%);">- tpm_ppi_func0_cb,</span><br><span style="color: hsl(0, 100%, 40%);">- tpm_ppi_func1_cb,</span><br><span style="color: hsl(0, 100%, 40%);">- tpm_ppi_func2_cb,</span><br><span style="color: hsl(0, 100%, 40%);">- tpm_ppi_func3_cb,</span><br><span style="color: hsl(0, 100%, 40%);">- tpm_ppi_func4_cb,</span><br><span style="color: hsl(0, 100%, 40%);">- tpm_ppi_func5_cb,</span><br><span style="color: hsl(0, 100%, 40%);">- tpm_ppi_func6_cb,</span><br><span style="color: hsl(0, 100%, 40%);">- tpm_ppi_func7_cb,</span><br><span style="color: hsl(0, 100%, 40%);">- tpm_ppi_func8_cb,</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void tpm_mci_func0_cb(void *arg)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- /* Function 1. */</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_return_singleton_buffer(0x3);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-static void tpm_mci_func1_cb(void *arg)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- /* Just return success. */</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_return_byte(0);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void (*tpm_mci_callbacks[])(void *) = {</span><br><span style="color: hsl(0, 100%, 40%);">- tpm_mci_func0_cb,</span><br><span style="color: hsl(0, 100%, 40%);">- tpm_mci_func1_cb,</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void lpc_tpm_fill_ssdt(struct device *dev)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- const char *path = acpi_device_path(dev->bus->dev);</span><br><span style="color: hsl(0, 100%, 40%);">- u32 arg;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (!path) {</span><br><span style="color: hsl(0, 100%, 40%);">- path = "\\_SB_.PCI0.LPCB";</span><br><span style="color: hsl(0, 100%, 40%);">- printk(BIOS_DEBUG, "Using default TPM ACPI path: '%s'\n", path);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Device */</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_scope(path);</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_device(acpi_device_name(dev));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_name("_HID");</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_emit_eisaid("PNP0C31");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_name("_CID");</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_emit_eisaid("PNP0C31");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_name_integer("_UID", 1);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- u32 did_vid = tpm_read_did_vid(0);</span><br><span style="color: hsl(0, 100%, 40%);">- if (did_vid > 0 && did_vid < 0xffffffff)</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_STA(ACPI_STATUS_DEVICE_ALL_ON);</span><br><span style="color: hsl(0, 100%, 40%);">- else</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_STA(ACPI_STATUS_DEVICE_ALL_OFF);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- u16 port = dev->path.pnp.port;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Resources */</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_name("_CRS");</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_resourcetemplate_header();</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_mem32fixed(1, CONFIG_TPM_TIS_BASE_ADDRESS, 0x5000);</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_io16(port, port, 1, 2, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (CONFIG_TPM_PIRQ) {</span><br><span style="color: hsl(0, 100%, 40%);">- /*</span><br><span style="color: hsl(0, 100%, 40%);">- * PIRQ: Update interrupt vector with configured PIRQ</span><br><span style="color: hsl(0, 100%, 40%);">- * Active-Low Level-Triggered Shared</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">- struct acpi_irq tpm_irq_a = ACPI_IRQ_LEVEL_LOW(CONFIG_TPM_PIRQ);</span><br><span style="color: hsl(0, 100%, 40%);">- acpi_device_write_interrupt(&tpm_irq_a);</span><br><span style="color: hsl(0, 100%, 40%);">- } else if (tpm_read_int_vector(0) > 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- u8 int_vec = tpm_read_int_vector(0);</span><br><span style="color: hsl(0, 100%, 40%);">- u8 int_pol = tpm_read_int_polarity(0);</span><br><span style="color: hsl(0, 100%, 40%);">- struct acpi_irq tpm_irq = ACPI_IRQ_LEVEL_LOW(int_vec);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (int_pol & 1)</span><br><span style="color: hsl(0, 100%, 40%);">- tpm_irq.polarity = ACPI_IRQ_ACTIVE_LOW;</span><br><span style="color: hsl(0, 100%, 40%);">- else</span><br><span style="color: hsl(0, 100%, 40%);">- tpm_irq.polarity = ACPI_IRQ_ACTIVE_HIGH;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (int_pol & 2)</span><br><span style="color: hsl(0, 100%, 40%);">- tpm_irq.mode = ACPI_IRQ_EDGE_TRIGGERED;</span><br><span style="color: hsl(0, 100%, 40%);">- else</span><br><span style="color: hsl(0, 100%, 40%);">- tpm_irq.mode = ACPI_IRQ_LEVEL_TRIGGERED;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- acpi_device_write_interrupt(&tpm_irq);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_resourcetemplate_footer();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (!IS_ENABLED(CONFIG_CHROMEOS)) {</span><br><span style="color: hsl(0, 100%, 40%);">- /*</span><br><span style="color: hsl(0, 100%, 40%);">- * _DSM method</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">- struct dsm_uuid ids[] = {</span><br><span style="color: hsl(0, 100%, 40%);">- /* Physical presence interface.</span><br><span style="color: hsl(0, 100%, 40%);">- * This is used to submit commands like "Clear TPM" to</span><br><span style="color: hsl(0, 100%, 40%);">- * be run at next reboot provided that user confirms</span><br><span style="color: hsl(0, 100%, 40%);">- * them. Spec allows user to cancel all commands and/or</span><br><span style="color: hsl(0, 100%, 40%);">- * configure BIOS to reject commands. So we pretend that</span><br><span style="color: hsl(0, 100%, 40%);">- * user did just this: cancelled everything. If user</span><br><span style="color: hsl(0, 100%, 40%);">- * really wants to clear TPM the only option now is to</span><br><span style="color: hsl(0, 100%, 40%);">- * do it manually in payload.</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">- DSM_UUID(TPM_PPI_UUID, &tpm_ppi_callbacks[0],</span><br><span style="color: hsl(0, 100%, 40%);">- ARRAY_SIZE(tpm_ppi_callbacks), (void *) &arg),</span><br><span style="color: hsl(0, 100%, 40%);">- /* Memory clearing on boot: just a dummy. */</span><br><span style="color: hsl(0, 100%, 40%);">- DSM_UUID(TPM_MCI_UUID, &tpm_mci_callbacks[0],</span><br><span style="color: hsl(0, 100%, 40%);">- ARRAY_SIZE(tpm_mci_callbacks), (void *) &arg),</span><br><span style="color: hsl(0, 100%, 40%);">- };</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_dsm_uuid_arr(ids, ARRAY_SIZE(ids));</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_pop_len(); /* Device */</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_pop_len(); /* Scope */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- printk(BIOS_INFO, "%s.%s: %s %s\n", path, acpi_device_name(dev),</span><br><span style="color: hsl(0, 100%, 40%);">- dev->chip_ops->name, dev_path(dev));</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static const char *lpc_tpm_acpi_name(const struct device *dev)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- return "TPM";</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static struct device_operations lpc_tpm_ops = {</span><br><span> .read_resources = &lpc_tpm_read_resources,</span><br><span> .set_resources = &lpc_tpm_set_resources,</span><br><span style="color: hsl(0, 100%, 40%);">-#if IS_ENABLED(CONFIG_HAVE_ACPI_TABLES)</span><br><span style="color: hsl(0, 100%, 40%);">- .acpi_name = &lpc_tpm_acpi_name,</span><br><span style="color: hsl(0, 100%, 40%);">- .acpi_fill_ssdt_generator = &lpc_tpm_fill_ssdt,</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(120, 100%, 40%);">+ .acpi_name = &tpm_acpi_name,</span><br><span style="color: hsl(120, 100%, 40%);">+ .acpi_fill_ssdt_generator = &tpm_ssdt_generator,</span><br><span> };</span><br><span> </span><br><span> static struct pnp_info pnp_dev_info[] = {</span><br><span>diff --git a/src/drivers/spi/acpi/acpi.c b/src/drivers/spi/acpi/acpi.c</span><br><span>index cf75f9e..e1940c8 100644</span><br><span>--- a/src/drivers/spi/acpi/acpi.c</span><br><span>+++ b/src/drivers/spi/acpi/acpi.c</span><br><span>@@ -23,190 +23,14 @@</span><br><span> #include <stdint.h></span><br><span> #include <string.h></span><br><span> #include "chip.h"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int spi_acpi_get_bus(const struct device *dev)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct device *spi_dev;</span><br><span style="color: hsl(0, 100%, 40%);">- struct device_operations *ops;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (!dev->bus || !dev->bus->dev)</span><br><span style="color: hsl(0, 100%, 40%);">- return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- spi_dev = dev->bus->dev;</span><br><span style="color: hsl(0, 100%, 40%);">- ops = spi_dev->ops;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (ops && ops->ops_spi_bus &&</span><br><span style="color: hsl(0, 100%, 40%);">- ops->ops_spi_bus->dev_to_bus)</span><br><span style="color: hsl(0, 100%, 40%);">- return ops->ops_spi_bus->dev_to_bus(spi_dev);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static bool spi_acpi_add_gpios_to_crs(struct drivers_spi_acpi_config *config)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- /*</span><br><span style="color: hsl(0, 100%, 40%);">- * Return false if:</span><br><span style="color: hsl(0, 100%, 40%);">- * 1. Request to explicitly disable export of GPIOs in CRS, or</span><br><span style="color: hsl(0, 100%, 40%);">- * 2. Both reset and enable GPIOs are not provided.</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">- if (config->disable_gpio_export_in_crs ||</span><br><span style="color: hsl(0, 100%, 40%);">- ((config->reset_gpio.pin_count == 0) &&</span><br><span style="color: hsl(0, 100%, 40%);">- (config->enable_gpio.pin_count == 0)))</span><br><span style="color: hsl(0, 100%, 40%);">- return false;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return true;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int spi_acpi_write_gpio(struct acpi_gpio *gpio, int *curr_index)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- int ret = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (gpio->pin_count == 0)</span><br><span style="color: hsl(0, 100%, 40%);">- return ret;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- acpi_device_write_gpio(gpio);</span><br><span style="color: hsl(0, 100%, 40%);">- ret = *curr_index;</span><br><span style="color: hsl(0, 100%, 40%);">- (*curr_index)++;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return ret;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void spi_acpi_fill_ssdt_generator(struct device *dev)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct drivers_spi_acpi_config *config = dev->chip_info;</span><br><span style="color: hsl(0, 100%, 40%);">- const char *scope = acpi_device_scope(dev);</span><br><span style="color: hsl(0, 100%, 40%);">- const char *path = acpi_device_path(dev);</span><br><span style="color: hsl(0, 100%, 40%);">- struct acpi_spi spi = {</span><br><span style="color: hsl(0, 100%, 40%);">- .device_select = dev->path.spi.cs,</span><br><span style="color: hsl(0, 100%, 40%);">- .speed = config->speed ? : 1 * MHz,</span><br><span style="color: hsl(0, 100%, 40%);">- .resource = scope,</span><br><span style="color: hsl(0, 100%, 40%);">- .device_select_polarity = SPI_POLARITY_LOW,</span><br><span style="color: hsl(0, 100%, 40%);">- .wire_mode = SPI_4_WIRE_MODE,</span><br><span style="color: hsl(0, 100%, 40%);">- .data_bit_length = 8,</span><br><span style="color: hsl(0, 100%, 40%);">- .clock_phase = SPI_CLOCK_PHASE_FIRST,</span><br><span style="color: hsl(0, 100%, 40%);">- .clock_polarity = SPI_POLARITY_LOW,</span><br><span style="color: hsl(0, 100%, 40%);">- };</span><br><span style="color: hsl(0, 100%, 40%);">- int curr_index = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- int irq_gpio_index = -1;</span><br><span style="color: hsl(0, 100%, 40%);">- int reset_gpio_index = -1;</span><br><span style="color: hsl(0, 100%, 40%);">- int enable_gpio_index = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (!dev->enabled || !scope)</span><br><span style="color: hsl(0, 100%, 40%);">- return;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (spi_acpi_get_bus(dev) == -1) {</span><br><span style="color: hsl(0, 100%, 40%);">- printk(BIOS_ERR, "%s: ERROR: Cannot get bus for device.\n",</span><br><span style="color: hsl(0, 100%, 40%);">- dev_path(dev));</span><br><span style="color: hsl(0, 100%, 40%);">- return;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (!config->hid) {</span><br><span style="color: hsl(0, 100%, 40%);">- printk(BIOS_ERR, "%s: ERROR: HID required.\n", dev_path(dev));</span><br><span style="color: hsl(0, 100%, 40%);">- return;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Device */</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_scope(scope);</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_device(acpi_device_name(dev));</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_name_string("_HID", config->hid);</span><br><span style="color: hsl(0, 100%, 40%);">- if (config->cid)</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_name_string("_CID", config->cid);</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_name_integer("_UID", config->uid);</span><br><span style="color: hsl(0, 100%, 40%);">- if (config->desc)</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_name_string("_DDN", config->desc);</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_STA(acpi_device_status(dev));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Resources */</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_name("_CRS");</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_resourcetemplate_header();</span><br><span style="color: hsl(0, 100%, 40%);">- acpi_device_write_spi(&spi);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Use either Interrupt() or GpioInt() */</span><br><span style="color: hsl(0, 100%, 40%);">- if (config->irq_gpio.pin_count)</span><br><span style="color: hsl(0, 100%, 40%);">- irq_gpio_index = spi_acpi_write_gpio(&config->irq_gpio,</span><br><span style="color: hsl(0, 100%, 40%);">- &curr_index);</span><br><span style="color: hsl(0, 100%, 40%);">- else</span><br><span style="color: hsl(0, 100%, 40%);">- acpi_device_write_interrupt(&config->irq);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Add enable/reset GPIOs if needed */</span><br><span style="color: hsl(0, 100%, 40%);">- if (spi_acpi_add_gpios_to_crs(config)) {</span><br><span style="color: hsl(0, 100%, 40%);">- reset_gpio_index = spi_acpi_write_gpio(&config->reset_gpio,</span><br><span style="color: hsl(0, 100%, 40%);">- &curr_index);</span><br><span style="color: hsl(0, 100%, 40%);">- enable_gpio_index = spi_acpi_write_gpio(&config->enable_gpio,</span><br><span style="color: hsl(0, 100%, 40%);">- &curr_index);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_resourcetemplate_footer();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Wake capabilities */</span><br><span style="color: hsl(0, 100%, 40%);">- if (config->wake) {</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_name_integer("_S0W", 4);</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_write_PRW(config->wake, 3);</span><br><span style="color: hsl(0, 100%, 40%);">- };</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Write device properties if needed */</span><br><span style="color: hsl(0, 100%, 40%);">- if (config->compat_string || irq_gpio_index >= 0 ||</span><br><span style="color: hsl(0, 100%, 40%);">- reset_gpio_index >= 0 || enable_gpio_index >= 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- struct acpi_dp *dsd = acpi_dp_new_table("_DSD");</span><br><span style="color: hsl(0, 100%, 40%);">- if (config->compat_string)</span><br><span style="color: hsl(0, 100%, 40%);">- acpi_dp_add_string(dsd, "compatible",</span><br><span style="color: hsl(0, 100%, 40%);">- config->compat_string);</span><br><span style="color: hsl(0, 100%, 40%);">- if (irq_gpio_index >= 0)</span><br><span style="color: hsl(0, 100%, 40%);">- acpi_dp_add_gpio(dsd, "irq-gpios", path,</span><br><span style="color: hsl(0, 100%, 40%);">- irq_gpio_index, 0,</span><br><span style="color: hsl(0, 100%, 40%);">- config->irq_gpio.polarity);</span><br><span style="color: hsl(0, 100%, 40%);">- if (reset_gpio_index >= 0)</span><br><span style="color: hsl(0, 100%, 40%);">- acpi_dp_add_gpio(dsd, "reset-gpios", path,</span><br><span style="color: hsl(0, 100%, 40%);">- reset_gpio_index, 0,</span><br><span style="color: hsl(0, 100%, 40%);">- config->reset_gpio.polarity);</span><br><span style="color: hsl(0, 100%, 40%);">- if (enable_gpio_index >= 0)</span><br><span style="color: hsl(0, 100%, 40%);">- acpi_dp_add_gpio(dsd, "enable-gpios", path,</span><br><span style="color: hsl(0, 100%, 40%);">- enable_gpio_index, 0,</span><br><span style="color: hsl(0, 100%, 40%);">- config->enable_gpio.polarity);</span><br><span style="color: hsl(0, 100%, 40%);">- acpi_dp_write(dsd);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Power Resource */</span><br><span style="color: hsl(0, 100%, 40%);">- if (config->has_power_resource) {</span><br><span style="color: hsl(0, 100%, 40%);">- const struct acpi_power_res_params power_res_params = {</span><br><span style="color: hsl(0, 100%, 40%);">- &config->reset_gpio,</span><br><span style="color: hsl(0, 100%, 40%);">- config->reset_delay_ms,</span><br><span style="color: hsl(0, 100%, 40%);">- config->reset_off_delay_ms,</span><br><span style="color: hsl(0, 100%, 40%);">- &config->enable_gpio,</span><br><span style="color: hsl(0, 100%, 40%);">- config->enable_delay_ms,</span><br><span style="color: hsl(0, 100%, 40%);">- config->enable_off_delay_ms,</span><br><span style="color: hsl(0, 100%, 40%);">- &config->stop_gpio,</span><br><span style="color: hsl(0, 100%, 40%);">- config->stop_delay_ms,</span><br><span style="color: hsl(0, 100%, 40%);">- config->stop_off_delay_ms</span><br><span style="color: hsl(0, 100%, 40%);">- };</span><br><span style="color: hsl(0, 100%, 40%);">- acpi_device_add_power_res(&power_res_params);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_pop_len(); /* Device */</span><br><span style="color: hsl(0, 100%, 40%);">- acpigen_pop_len(); /* Scope */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- printk(BIOS_INFO, "%s: %s at %s\n", path,</span><br><span style="color: hsl(0, 100%, 40%);">- config->desc ? : dev->chip_ops->name, dev_path(dev));</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static const char *spi_acpi_name(const struct device *dev)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct drivers_spi_acpi_config *config = dev->chip_info;</span><br><span style="color: hsl(0, 100%, 40%);">- static char name[5];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (config->name)</span><br><span style="color: hsl(0, 100%, 40%);">- return config->name;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- snprintf(name, sizeof(name), "S%03.3X", spi_acpi_get_bus(dev));</span><br><span style="color: hsl(0, 100%, 40%);">- name[4] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">- return name;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(120, 100%, 40%);">+#include <security/tpm/acpi.h></span><br><span> </span><br><span> static struct device_operations spi_acpi_ops = {</span><br><span> .read_resources = DEVICE_NOOP,</span><br><span> .set_resources = DEVICE_NOOP,</span><br><span> .enable_resources = DEVICE_NOOP,</span><br><span style="color: hsl(0, 100%, 40%);">- .acpi_name = &spi_acpi_name,</span><br><span style="color: hsl(0, 100%, 40%);">- .acpi_fill_ssdt_generator = &spi_acpi_fill_ssdt_generator,</span><br><span style="color: hsl(120, 100%, 40%);">+ .acpi_name = &tpm_acpi_name,</span><br><span style="color: hsl(120, 100%, 40%);">+ .acpi_fill_ssdt_generator = &tpm_ssdt_generator,</span><br><span> };</span><br><span> </span><br><span> static void spi_acpi_enable(struct device *dev)</span><br><span>diff --git a/src/security/tpm/Makefile.inc b/src/security/tpm/Makefile.inc</span><br><span>index 34ead8f..cf65aa2 100644</span><br><span>--- a/src/security/tpm/Makefile.inc</span><br><span>+++ b/src/security/tpm/Makefile.inc</span><br><span>@@ -18,6 +18,8 @@</span><br><span> verstage-$(CONFIG_VBOOT) += tspi/tspi.c tspi/log.c</span><br><span> postcar-$(CONFIG_VBOOT) += tspi/tspi.c tspi/log.c</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ramstage-$(CONFIG_HAVE_ACPI_TABLES) += acpi/acpi.c</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> endif # CONFIG_TPM1</span><br><span> </span><br><span> ifeq ($(CONFIG_TPM2),y)</span><br><span>@@ -42,4 +44,6 @@</span><br><span> verstage-$(CONFIG_VBOOT) += tspi/tspi.c tspi/log.c</span><br><span> postcar-$(CONFIG_VBOOT) += tspi/tspi.c tspi/log.c</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ramstage-$(CONFIG_HAVE_ACPI_TABLES) += acpi/acpi.c</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> endif # CONFIG_TPM2</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/29194">change 29194</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://review.coreboot.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://review.coreboot.org/29194"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: coreboot </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I2afdf4872566353284ab7734205a3bea738a6e0e </div>
<div style="display:none"> Gerrit-Change-Number: 29194 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Philipp Deppenwiese <zaolin.daisuki@gmail.com> </div>