mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-03-28 01:51:33 +00:00
tpm: tpm_tis_i2c: Merge struct tpm_dev into tpm_chip
There are too many structures storing the same sort of information. Move the fields from struct tpm_dev into struct tpm_chip and remove the former struct. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Heiko Schocher <hs@denx.de>
This commit is contained in:
parent
7c73537e8e
commit
13932b09bb
2 changed files with 25 additions and 44 deletions
|
@ -34,9 +34,6 @@
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
/* Max buffer size supported by our tpm */
|
|
||||||
#define TPM_DEV_BUFSIZE 1260
|
|
||||||
|
|
||||||
/* Max number of iterations after i2c NAK */
|
/* Max number of iterations after i2c NAK */
|
||||||
#define MAX_COUNT 3
|
#define MAX_COUNT 3
|
||||||
|
|
||||||
|
@ -78,12 +75,6 @@ enum tis_defaults {
|
||||||
#define TPM_TIS_I2C_DID_VID_9635 0x000b15d1L
|
#define TPM_TIS_I2C_DID_VID_9635 0x000b15d1L
|
||||||
#define TPM_TIS_I2C_DID_VID_9645 0x001a15d1L
|
#define TPM_TIS_I2C_DID_VID_9645 0x001a15d1L
|
||||||
|
|
||||||
enum i2c_chip_type {
|
|
||||||
SLB9635,
|
|
||||||
SLB9645,
|
|
||||||
UNKNOWN,
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char * const chip_name[] = {
|
static const char * const chip_name[] = {
|
||||||
[SLB9635] = "slb9635tt",
|
[SLB9635] = "slb9635tt",
|
||||||
[SLB9645] = "slb9645tt",
|
[SLB9645] = "slb9645tt",
|
||||||
|
@ -390,18 +381,8 @@ struct tpm {
|
||||||
char inited;
|
char inited;
|
||||||
} tpm;
|
} tpm;
|
||||||
|
|
||||||
/* Global structure for tpm chip data */
|
|
||||||
static struct tpm_chip g_chip;
|
static struct tpm_chip g_chip;
|
||||||
|
|
||||||
/* Structure to store I2C TPM specific stuff */
|
|
||||||
struct tpm_dev {
|
|
||||||
struct udevice *dev;
|
|
||||||
u8 buf[TPM_DEV_BUFSIZE + sizeof(u8)]; /* Max buffer size + addr */
|
|
||||||
enum i2c_chip_type chip_type;
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct tpm_dev tpm_dev;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* iic_tpm_read() - read from TPM register
|
* iic_tpm_read() - read from TPM register
|
||||||
* @addr: register address to read from
|
* @addr: register address to read from
|
||||||
|
@ -422,10 +403,10 @@ static int iic_tpm_read(u8 addr, u8 *buffer, size_t len)
|
||||||
int count;
|
int count;
|
||||||
uint32_t addrbuf = addr;
|
uint32_t addrbuf = addr;
|
||||||
|
|
||||||
if ((tpm_dev.chip_type == SLB9635) || (tpm_dev.chip_type == UNKNOWN)) {
|
if ((g_chip.chip_type == SLB9635) || (g_chip.chip_type == UNKNOWN)) {
|
||||||
/* slb9635 protocol should work in both cases */
|
/* slb9635 protocol should work in both cases */
|
||||||
for (count = 0; count < MAX_COUNT; count++) {
|
for (count = 0; count < MAX_COUNT; count++) {
|
||||||
rc = dm_i2c_write(tpm_dev.dev, 0, (uchar *)&addrbuf, 1);
|
rc = dm_i2c_write(g_chip.dev, 0, (uchar *)&addrbuf, 1);
|
||||||
if (rc == 0)
|
if (rc == 0)
|
||||||
break; /* Success, break to skip sleep */
|
break; /* Success, break to skip sleep */
|
||||||
udelay(SLEEP_DURATION);
|
udelay(SLEEP_DURATION);
|
||||||
|
@ -439,7 +420,7 @@ static int iic_tpm_read(u8 addr, u8 *buffer, size_t len)
|
||||||
*/
|
*/
|
||||||
for (count = 0; count < MAX_COUNT; count++) {
|
for (count = 0; count < MAX_COUNT; count++) {
|
||||||
udelay(SLEEP_DURATION);
|
udelay(SLEEP_DURATION);
|
||||||
rc = dm_i2c_read(tpm_dev.dev, 0, buffer, len);
|
rc = dm_i2c_read(g_chip.dev, 0, buffer, len);
|
||||||
if (rc == 0)
|
if (rc == 0)
|
||||||
break; /* success, break to skip sleep */
|
break; /* success, break to skip sleep */
|
||||||
}
|
}
|
||||||
|
@ -452,7 +433,7 @@ static int iic_tpm_read(u8 addr, u8 *buffer, size_t len)
|
||||||
* be safe on the safe side.
|
* be safe on the safe side.
|
||||||
*/
|
*/
|
||||||
for (count = 0; count < MAX_COUNT; count++) {
|
for (count = 0; count < MAX_COUNT; count++) {
|
||||||
rc = dm_i2c_read(tpm_dev.dev, addr, buffer, len);
|
rc = dm_i2c_read(g_chip.dev, addr, buffer, len);
|
||||||
if (rc == 0)
|
if (rc == 0)
|
||||||
break; /* break here to skip sleep */
|
break; /* break here to skip sleep */
|
||||||
udelay(SLEEP_DURATION);
|
udelay(SLEEP_DURATION);
|
||||||
|
@ -474,7 +455,7 @@ static int iic_tpm_write_generic(u8 addr, u8 *buffer, size_t len,
|
||||||
int count;
|
int count;
|
||||||
|
|
||||||
for (count = 0; count < max_count; count++) {
|
for (count = 0; count < max_count; count++) {
|
||||||
rc = dm_i2c_write(tpm_dev.dev, addr, buffer, len);
|
rc = dm_i2c_write(g_chip.dev, addr, buffer, len);
|
||||||
if (rc == 0)
|
if (rc == 0)
|
||||||
break; /* Success, break to skip sleep */
|
break; /* Success, break to skip sleep */
|
||||||
udelay(sleep_time);
|
udelay(sleep_time);
|
||||||
|
@ -809,7 +790,7 @@ out_err:
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static enum i2c_chip_type tpm_vendor_chip_type(void)
|
static enum i2c_chip_type tpm_tis_i2c_chip_type(void)
|
||||||
{
|
{
|
||||||
#if CONFIG_IS_ENABLED(OF_CONTROL)
|
#if CONFIG_IS_ENABLED(OF_CONTROL)
|
||||||
const void *blob = gd->fdt_blob;
|
const void *blob = gd->fdt_blob;
|
||||||
|
@ -823,14 +804,14 @@ static enum i2c_chip_type tpm_vendor_chip_type(void)
|
||||||
return UNKNOWN;
|
return UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
int tpm_vendor_init(struct udevice *dev)
|
static int tpm_tis_i2c_init(struct udevice *dev)
|
||||||
{
|
{
|
||||||
struct tpm_chip *chip = &g_chip;
|
struct tpm_chip *chip = &g_chip;
|
||||||
u32 vendor;
|
u32 vendor;
|
||||||
u32 expected_did_vid;
|
u32 expected_did_vid;
|
||||||
|
|
||||||
tpm_dev.dev = dev;
|
g_chip.dev = dev;
|
||||||
tpm_dev.chip_type = tpm_vendor_chip_type();
|
g_chip.chip_type = tpm_tis_i2c_chip_type();
|
||||||
chip->is_open = 1;
|
chip->is_open = 1;
|
||||||
|
|
||||||
/* Disable interrupts (not supported) */
|
/* Disable interrupts (not supported) */
|
||||||
|
@ -854,7 +835,7 @@ int tpm_vendor_init(struct udevice *dev)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tpm_dev.chip_type == SLB9635) {
|
if (g_chip.chip_type == SLB9635) {
|
||||||
vendor = be32_to_cpu(vendor);
|
vendor = be32_to_cpu(vendor);
|
||||||
expected_did_vid = TPM_TIS_I2C_DID_VID_9635;
|
expected_did_vid = TPM_TIS_I2C_DID_VID_9635;
|
||||||
} else {
|
} else {
|
||||||
|
@ -862,13 +843,13 @@ int tpm_vendor_init(struct udevice *dev)
|
||||||
expected_did_vid = TPM_TIS_I2C_DID_VID_9645;
|
expected_did_vid = TPM_TIS_I2C_DID_VID_9645;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tpm_dev.chip_type != UNKNOWN && vendor != expected_did_vid) {
|
if (g_chip.chip_type != UNKNOWN && vendor != expected_did_vid) {
|
||||||
error("Vendor id did not match! ID was %08x\n", vendor);
|
error("Vendor id did not match! ID was %08x\n", vendor);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
debug("1.2 TPM (chip type %s device-id 0x%X)\n",
|
debug("1.2 TPM (chip type %s device-id 0x%X)\n",
|
||||||
chip_name[tpm_dev.chip_type], vendor >> 16);
|
chip_name[g_chip.chip_type], vendor >> 16);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* A timeout query to TPM can be placed here.
|
* A timeout query to TPM can be placed here.
|
||||||
|
@ -878,11 +859,6 @@ int tpm_vendor_init(struct udevice *dev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void tpm_vendor_cleanup(struct tpm_chip *chip)
|
|
||||||
{
|
|
||||||
release_locality(chip, chip->locality, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Returns max number of milliseconds to wait */
|
/* Returns max number of milliseconds to wait */
|
||||||
static unsigned long tpm_calc_ordinal_duration(struct tpm_chip *chip,
|
static unsigned long tpm_calc_ordinal_duration(struct tpm_chip *chip,
|
||||||
u32 ordinal)
|
u32 ordinal)
|
||||||
|
@ -980,7 +956,7 @@ static int tpm_open_dev(struct udevice *dev)
|
||||||
debug("%s: start\n", __func__);
|
debug("%s: start\n", __func__);
|
||||||
if (g_chip.is_open)
|
if (g_chip.is_open)
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
rc = tpm_vendor_init(dev);
|
rc = tpm_tis_i2c_init(dev);
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
g_chip.is_open = 0;
|
g_chip.is_open = 0;
|
||||||
return rc;
|
return rc;
|
||||||
|
@ -989,7 +965,7 @@ static int tpm_open_dev(struct udevice *dev)
|
||||||
static void tpm_close(void)
|
static void tpm_close(void)
|
||||||
{
|
{
|
||||||
if (g_chip.is_open) {
|
if (g_chip.is_open) {
|
||||||
tpm_vendor_cleanup(&g_chip);
|
release_locality(&g_chip, g_chip.locality, 1);
|
||||||
g_chip.is_open = 0;
|
g_chip.is_open = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,7 +33,14 @@ enum tpm_timeout {
|
||||||
#define TPM_RSP_SIZE_BYTE 2
|
#define TPM_RSP_SIZE_BYTE 2
|
||||||
#define TPM_RSP_RC_BYTE 6
|
#define TPM_RSP_RC_BYTE 6
|
||||||
|
|
||||||
struct tpm_chip;
|
/* Max buffer size supported by our tpm */
|
||||||
|
#define TPM_DEV_BUFSIZE 1260
|
||||||
|
|
||||||
|
enum i2c_chip_type {
|
||||||
|
SLB9635,
|
||||||
|
SLB9645,
|
||||||
|
UNKNOWN,
|
||||||
|
};
|
||||||
|
|
||||||
struct tpm_chip {
|
struct tpm_chip {
|
||||||
int is_open;
|
int is_open;
|
||||||
|
@ -44,6 +51,9 @@ struct tpm_chip {
|
||||||
int locality;
|
int locality;
|
||||||
unsigned long timeout_a, timeout_b, timeout_c, timeout_d; /* msec */
|
unsigned long timeout_a, timeout_b, timeout_c, timeout_d; /* msec */
|
||||||
unsigned long duration[3]; /* msec */
|
unsigned long duration[3]; /* msec */
|
||||||
|
struct udevice *dev;
|
||||||
|
u8 buf[TPM_DEV_BUFSIZE + sizeof(u8)]; /* Max buffer size + addr */
|
||||||
|
enum i2c_chip_type chip_type;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct tpm_input_header {
|
struct tpm_input_header {
|
||||||
|
@ -102,9 +112,4 @@ struct tpm_cmd_t {
|
||||||
union tpm_cmd_params params;
|
union tpm_cmd_params params;
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
struct udevice;
|
|
||||||
int tpm_vendor_init(struct udevice *dev);
|
|
||||||
|
|
||||||
void tpm_vendor_cleanup(struct tpm_chip *chip);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Reference in a new issue