| Index: drivers/tpm/slb9635_i2c/tpm_proto.c
|
| diff --git a/drivers/misc/infineon_i2ctpm.c b/drivers/tpm/slb9635_i2c/tpm_proto.c
|
| similarity index 88%
|
| rename from drivers/misc/infineon_i2ctpm.c
|
| rename to drivers/tpm/slb9635_i2c/tpm_proto.c
|
| index 61d663f93e0615aa9efb28057acba742e72364e2..dc485a9ed15a52a9313e9f202785901d05202639 100644
|
| --- a/drivers/misc/infineon_i2ctpm.c
|
| +++ b/drivers/tpm/slb9635_i2c/tpm_proto.c
|
| @@ -7,17 +7,17 @@
|
| #include <common.h>
|
| #include <i2c.h>
|
|
|
| -#define INFINEON_TPM_CHIP (CONFIG_INFINEON_TPM_CHIP_ADDRESS)
|
|
|
| /* infineon prototype i2c tpm's internal registers
|
| */
|
| +#define INFINEON_TPM_CHIP (0x1A)
|
| #define REG_RDATA (0xA4)
|
| #define REG_WDATA (0xA5)
|
| #define REG_STAT (0xA7)
|
| /* i2c timeout value and polling period
|
| */
|
| -#define I2CBUSY_WAIT_US (1000ul)
|
| -#define TIMEOUT_REG_US (1000000ul)
|
| +#define I2CBUSY_WAIT_MS (1ul)
|
| +#define TIMEOUT_REG_MS (1000ul)
|
|
|
| /* error code follows u-boot standard
|
| * 0 : success
|
| @@ -41,8 +41,8 @@ enum {
|
| * prototype i2c tpm chip, spec is not as clear as lpc tpm chip. just use
|
| * the maximum wait time as the timeout value.
|
| */
|
| -#define TIMEOUT_READ_US (3000000ul)
|
| -#define TIMEOUT_WRITE_US (1000000ul)
|
| +#define TIMEOUT_READ_MS (3000ul)
|
| +#define TIMEOUT_WRITE_MS (1000ul)
|
|
|
| /* tpm stat register bits
|
| */
|
| @@ -224,8 +224,8 @@ static int tpm_i2c_reg(uint8_t *reg)
|
| ulong stime = get_timer(0);
|
| while (i2c_write_data((uchar)INFINEON_TPM_CHIP, reg, 1)) {
|
| /* i2c busy, wait 1ms */
|
| - udelay(I2CBUSY_WAIT_US);
|
| - if (get_timer(stime) > TIMEOUT_REG_US)
|
| + udelay(I2CBUSY_WAIT_MS * 1000);
|
| + if (get_timer(stime) > TIMEOUT_REG_MS)
|
| return E_TIMEOUT;
|
| }
|
| return 0;
|
| @@ -335,7 +335,7 @@ static int tpm_prepare_read(ulong timeout_us)
|
|
|
| /* TPM API
|
| */
|
| -int tpm_status(int *ready_write, int *ready_read, size_t *p_len)
|
| +int tpm_status_v03(int *ready_write, int *ready_read, size_t *p_len)
|
| {
|
| t_inf_stat_reg reg;
|
|
|
| @@ -349,7 +349,7 @@ int tpm_status(int *ready_write, int *ready_read, size_t *p_len)
|
| if ((reg.status ^ reg.len_h ^ reg.len_l) != reg.checksum)
|
| return E_CHECKSUM;
|
| /* data available
|
| - */
|
| + */
|
| if (ready_read)
|
| *ready_read = (reg.status & TPM_RECEIVE_DATA_AVAILABLE) ? 1 : 0;
|
| /* data length
|
| @@ -368,7 +368,7 @@ int tpm_status(int *ready_write, int *ready_read, size_t *p_len)
|
| }
|
|
|
|
|
| -int tpm_init(void)
|
| +int tpm_init_v03(void)
|
| {
|
| int ready_write = 0, ready_read = 0;
|
| size_t read_len = 0;
|
| @@ -378,11 +378,11 @@ int tpm_init(void)
|
| #endif
|
| ret_code = i2c_probe(INFINEON_TPM_CHIP);
|
| #ifdef VBOOT_DEBUG
|
| - printf("probe : %d\n", ret_code);
|
| + printf("v03 probe : %s\n", ret_code ? "N/A" : "found");
|
| #endif /* VBOOT_DEBUG */
|
| if (ret_code)
|
| return ret_code;
|
| - ret_code = tpm_status(&ready_write, &ready_read, &read_len);
|
| + ret_code = tpm_status_v03(&ready_write, &ready_read, &read_len);
|
| #ifdef VBOOT_DEBUG
|
| printf("status : %d\n\tw[%c] r[%c : %u]\n", ret_code,
|
| ready_write ? 'y' : 'n',
|
| @@ -390,27 +390,38 @@ int tpm_init(void)
|
| #endif /* VBOOT_DEBUG */
|
| if (ret_code)
|
| return ret_code;
|
| - TPM_CHECK(tpm_prepare_write(TIMEOUT_WRITE_US));
|
| - return 0;
|
| -}
|
| -
|
| -int tpm_send(const uint8_t *pdata, size_t length)
|
| -{
|
| - TPM_CHECK(tpm_prepare_write(TIMEOUT_WRITE_US));
|
| - TPM_CHECK(tpm_i2c_write_data(pdata, length));
|
| + TPM_CHECK(tpm_prepare_write(TIMEOUT_WRITE_MS));
|
| return 0;
|
| }
|
|
|
| -int tpm_receive(uint8_t *pdata, size_t max_length)
|
| +int tpm_sendrecv_v03(const uint8_t *sendbuf, size_t buf_size, uint8_t *recvbuf,
|
| + size_t *recv_len)
|
| {
|
| int ready_write = 0, ready_read = 0;
|
| size_t read_length = 0;
|
| - TPM_CHECK(tpm_prepare_read(TIMEOUT_READ_US));
|
| - TPM_CHECK(tpm_status(&ready_write, &ready_read, &read_length));
|
| + TPM_CHECK(tpm_prepare_write(TIMEOUT_WRITE_MS));
|
| + TPM_CHECK(tpm_i2c_write_data(sendbuf, buf_size));
|
| + TPM_CHECK(tpm_prepare_read(TIMEOUT_READ_MS));
|
| + TPM_CHECK(tpm_status_v03(&ready_write, &ready_read, &read_length));
|
| if (read_length == 0)
|
| return E_GENERAL;
|
| - if (max_length < read_length)
|
| - return E_SIZE;
|
| - TPM_CHECK(tpm_i2c_read_data(pdata, read_length, NULL));
|
| + if (recv_len) {
|
| + /* *recv_len sets the maximum data can be feched
|
| + * if *recv_len == 0, means the buffer is large enough to read any tpm
|
| + * response
|
| + */
|
| + if (*recv_len != 0 && *recv_len < read_length)
|
| + return E_SIZE;
|
| + }
|
| + if (recvbuf) {
|
| + TPM_CHECK(tpm_i2c_read_data(recvbuf, read_length, NULL));
|
| + /* update recv_len only on success */
|
| + if (recv_len)
|
| + *recv_len = read_length;
|
| + } else {
|
| + /* discard data in read buffer */
|
| + TPM_CHECK(tpm_prepare_write(TIMEOUT_WRITE_MS));
|
| + }
|
| return 0;
|
| }
|
| +
|
|
|