[coreboot-gerrit] Patch set updated for coreboot: drivers/i2c/tpm: Add support for generating ACPI table

Duncan Laurie (dlaurie@chromium.org) gerrit at coreboot.org
Fri Sep 2 20:08:18 CEST 2016


Duncan Laurie (dlaurie at chromium.org) just uploaded a new patch set to gerrit, which you can find at https://review.coreboot.org/16397

-gerrit

commit 1abccb9566a1a958df52ee85a99b08ff79473960
Author: Duncan Laurie <dlaurie at chromium.org>
Date:   Thu Sep 1 15:56:44 2016 -0700

    drivers/i2c/tpm: Add support for generating ACPI table
    
    Add code to generate an ACPI descriptor for an I2C TPM based
    on the device as described in devicetree.cb.
    
    This currently requires the devicetree to provide the HID,
    since we don't currently talk to the TPM in ramstage and I
    didn't want to add yet another init path for it here.
    
    This was tested on a reef board to ensure that the device
    is described properly in the SSDT.
    
    Change-Id: I43d7f6192f48e99a4074baa4e52f0a9ee554a250
    Signed-off-by: Duncan Laurie <dlaurie at chromium.org>
---
 src/drivers/i2c/tpm/Kconfig      |  5 +++
 src/drivers/i2c/tpm/Makefile.inc |  2 +
 src/drivers/i2c/tpm/chip.c       | 89 ++++++++++++++++++++++++++++++++++++++++
 src/drivers/i2c/tpm/chip.h       | 10 +++++
 4 files changed, 106 insertions(+)

diff --git a/src/drivers/i2c/tpm/Kconfig b/src/drivers/i2c/tpm/Kconfig
index 594ffd5..903fc3b 100644
--- a/src/drivers/i2c/tpm/Kconfig
+++ b/src/drivers/i2c/tpm/Kconfig
@@ -11,3 +11,8 @@ config DRIVER_TPM_I2C_ADDR
 	hex "I2C TPM chip address"
 	default 2 # FIXME, workaround for Kconfig BS
 	depends on I2C_TPM
+
+config DRIVER_I2C_TPM_ACPI
+	bool "Generate I2C TPM ACPI device"
+	default y if ARCH_X86 && I2C_TPM
+	default n
diff --git a/src/drivers/i2c/tpm/Makefile.inc b/src/drivers/i2c/tpm/Makefile.inc
index 4f5913f..0efe34a 100644
--- a/src/drivers/i2c/tpm/Makefile.inc
+++ b/src/drivers/i2c/tpm/Makefile.inc
@@ -2,3 +2,5 @@ ramstage-$(CONFIG_I2C_TPM) += tis.c tpm.c
 romstage-$(CONFIG_I2C_TPM) += tis.c tpm.c
 verstage-$(CONFIG_I2C_TPM) += tis.c tpm.c
 bootblock-$(CONFIG_I2C_TPM) += tis.c tpm.c
+
+ramstage-$(CONFIG_DRIVERS_I2C_TPM_ACPI) += chip.c
diff --git a/src/drivers/i2c/tpm/chip.c b/src/drivers/i2c/tpm/chip.c
new file mode 100644
index 0000000..1781e99
--- /dev/null
+++ b/src/drivers/i2c/tpm/chip.c
@@ -0,0 +1,89 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright 2016 Google Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <arch/acpi_device.h>
+#include <arch/acpigen.h>
+#include <console/console.h>
+#include <device/i2c.h>
+#include <device/device.h>
+#include <device/path.h>
+#include <stdint.h>
+#include <string.h>
+#include "tpm.h"
+#include "chip.h"
+
+static void i2c_tpm_fill_ssdt(struct device *dev)
+{
+	struct drivers_i2c_tpm_config *config = dev->chip_info;
+	const char *scope = acpi_device_scope(dev);
+	struct acpi_i2c i2c = {
+		.address = dev->path.i2c.device,
+		.mode_10bit = dev->path.i2c.mode_10bit,
+		.speed = config->speed ? : I2C_SPEED_FAST,
+		.resource = scope,
+	};
+
+	if (!dev->enabled || !scope)
+		return;
+
+	if (!config->hid) {
+		printk(BIOS_ERR, "%s: ERROR: HID required\n", dev_path(dev));
+		return;
+	}
+
+	/* Device */
+	acpigen_write_scope(scope);
+	acpigen_write_device(acpi_device_name(dev));
+	acpigen_write_name_string("_HID", config->hid);
+	acpigen_write_name_integer("_UID", config->uid);
+	acpigen_write_name_string("_DDN", dev->chip_ops->name);
+	acpigen_write_STA(ACPI_STATUS_DEVICE_ALL_ON);
+
+	/* Resources */
+	acpigen_write_name("_CRS");
+	acpigen_write_resourcetemplate_header();
+	acpi_device_write_i2c(&i2c);
+	acpi_device_write_interrupt(&config->irq);
+	acpigen_write_resourcetemplate_footer();
+
+	acpigen_pop_len(); /* Device */
+	acpigen_pop_len(); /* Scope */
+
+	printk(BIOS_INFO, "%s: %s at %s\n", acpi_device_path(dev),
+	       dev->chip_ops->name, dev_path(dev));
+}
+
+static const char *i2c_tpm_acpi_name(struct device *dev)
+{
+	return "TPMI";
+}
+
+static struct device_operations i2c_tpm_ops = {
+	.read_resources		  = DEVICE_NOOP,
+	.set_resources		  = DEVICE_NOOP,
+	.enable_resources	  = DEVICE_NOOP,
+	.acpi_name		  = &i2c_tpm_acpi_name,
+	.acpi_fill_ssdt_generator = &i2c_tpm_fill_ssdt,
+};
+
+static void i2c_tpm_enable(struct device *dev)
+{
+	dev->ops = &i2c_tpm_ops;
+}
+
+struct chip_operations drivers_i2c_tpm_ops = {
+	CHIP_NAME("I2C TPM")
+	.enable_dev = &i2c_tpm_enable
+};
diff --git a/src/drivers/i2c/tpm/chip.h b/src/drivers/i2c/tpm/chip.h
new file mode 100644
index 0000000..14103c7
--- /dev/null
+++ b/src/drivers/i2c/tpm/chip.h
@@ -0,0 +1,10 @@
+#include <arch/acpi_device.h>
+#include <device/i2c.h>
+
+struct drivers_i2c_tpm_config {
+	const char *hid;	/* ACPI _HID (required) */
+	const char *desc;	/* Device Description */
+	unsigned uid;		/* ACPI _UID */
+	enum i2c_speed speed;	/* Bus speed in Hz, default is I2C_SPEED_FAST */
+	struct acpi_irq irq;	/* Interrupt */
+};



More information about the coreboot-gerrit mailing list