summaryrefslogtreecommitdiff
path: root/src/drivers/i2c/tpm
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers/i2c/tpm')
-rw-r--r--src/drivers/i2c/tpm/cr50.c28
1 files changed, 23 insertions, 5 deletions
diff --git a/src/drivers/i2c/tpm/cr50.c b/src/drivers/i2c/tpm/cr50.c
index 415285297d..f8548a77da 100644
--- a/src/drivers/i2c/tpm/cr50.c
+++ b/src/drivers/i2c/tpm/cr50.c
@@ -17,14 +17,15 @@
#include <commonlib/endian.h>
#include <commonlib/helpers.h>
-#include <string.h>
-#include <types.h>
-#include <delay.h>
#include <console/console.h>
+#include <delay.h>
#include <device/i2c_simple.h>
+#include <drivers/tpm/cr50.h>
#include <endian.h>
-#include <timer.h>
#include <security/tpm/tis.h>
+#include <string.h>
+#include <types.h>
+#include <timer.h>
#include "tpm.h"
@@ -126,7 +127,7 @@ static int cr50_i2c_read(uint8_t addr, uint8_t *buffer, size_t len)
*
* Returns -1 on error, 0 on success.
*/
-static int cr50_i2c_write(uint8_t addr, uint8_t *buffer, size_t len)
+static int cr50_i2c_write(uint8_t addr, const uint8_t *buffer, size_t len)
{
if (tpm_dev.addr == 0)
return -1;
@@ -473,6 +474,7 @@ static int cr50_i2c_probe(struct tpm_chip *chip, uint32_t *did_vid)
int tpm_vendor_init(struct tpm_chip *chip, unsigned int bus, uint32_t dev_addr)
{
+ struct cr50_firmware_version ver;
uint32_t did_vid = 0;
if (dev_addr == 0) {
@@ -498,6 +500,12 @@ int tpm_vendor_init(struct tpm_chip *chip, unsigned int bus, uint32_t dev_addr)
printk(BIOS_DEBUG, "cr50 TPM 2.0 (i2c %u:0x%02x id 0x%x)\n",
bus, dev_addr, did_vid >> 16);
+ if (tpm_first_access_this_boot()) {
+ /* This is called for the side-effect of printing the version string. */
+ cr50_get_firmware_version(&ver);
+ cr50_set_board_cfg();
+ }
+
chip->is_open = 1;
return 0;
}
@@ -505,3 +513,13 @@ int tpm_vendor_init(struct tpm_chip *chip, unsigned int bus, uint32_t dev_addr)
void tpm_vendor_cleanup(struct tpm_chip *chip)
{
}
+
+cb_err_t tis_vendor_write(unsigned int addr, const void *buffer, size_t bytes)
+{
+ return cr50_i2c_write(addr & 0xff, buffer, bytes) ? CB_ERR : CB_SUCCESS;
+}
+
+cb_err_t tis_vendor_read(unsigned int addr, void *buffer, size_t bytes)
+{
+ return cr50_i2c_read(addr & 0xff, buffer, bytes) ? CB_ERR : CB_SUCCESS;
+}