|
@@ -5,6 +5,8 @@
|
|
|
*/
|
|
|
|
|
|
#include <common.h>
|
|
|
+#include <dm.h>
|
|
|
+#include <tpm.h>
|
|
|
#include <asm/state.h>
|
|
|
#include <asm/unaligned.h>
|
|
|
#include <linux/crc8.h>
|
|
@@ -56,7 +58,7 @@ enum {
|
|
|
*/
|
|
|
static struct tpm_state {
|
|
|
uint8_t nvdata[NV_SEQ_COUNT][NV_DATA_SIZE];
|
|
|
-} state;
|
|
|
+} g_state;
|
|
|
|
|
|
/**
|
|
|
* sandbox_tpm_read_state() - read the sandbox EC state from the state file
|
|
@@ -82,7 +84,7 @@ static int sandbox_tpm_read_state(const void *blob, int node)
|
|
|
sprintf(prop_name, "nvdata%d", i);
|
|
|
prop = fdt_getprop(blob, node, prop_name, &len);
|
|
|
if (prop && len == NV_DATA_SIZE)
|
|
|
- memcpy(state.nvdata[i], prop, NV_DATA_SIZE);
|
|
|
+ memcpy(g_state.nvdata[i], prop, NV_DATA_SIZE);
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
@@ -110,7 +112,7 @@ static int sandbox_tpm_write_state(void *blob, int node)
|
|
|
char prop_name[20];
|
|
|
|
|
|
sprintf(prop_name, "nvdata%d", i);
|
|
|
- fdt_setprop(blob, node, prop_name, state.nvdata[i],
|
|
|
+ fdt_setprop(blob, node, prop_name, g_state.nvdata[i],
|
|
|
NV_DATA_SIZE);
|
|
|
}
|
|
|
|
|
@@ -135,10 +137,11 @@ static int index_to_seq(uint32_t index)
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
-int tis_sendrecv(const u8 *sendbuf, size_t send_size,
|
|
|
- u8 *recvbuf, size_t *recv_len)
|
|
|
+static int sandbox_tpm_xfer(struct udevice *dev, const uint8_t *sendbuf,
|
|
|
+ size_t send_size, uint8_t *recvbuf,
|
|
|
+ size_t *recv_len)
|
|
|
{
|
|
|
- struct tpm_state *tpm = &state;
|
|
|
+ struct tpm_state *tpm = dev_get_priv(dev);
|
|
|
uint32_t code, index, length, type;
|
|
|
uint8_t *data;
|
|
|
int seq;
|
|
@@ -241,20 +244,50 @@ int tis_sendrecv(const u8 *sendbuf, size_t send_size,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-int tis_open(void)
|
|
|
+static int sandbox_tpm_get_desc(struct udevice *dev, char *buf, int size)
|
|
|
{
|
|
|
- printf("%s\n", __func__);
|
|
|
+ if (size < 15)
|
|
|
+ return -ENOSPC;
|
|
|
+
|
|
|
+ return snprintf(buf, size, "sandbox TPM");
|
|
|
+}
|
|
|
+
|
|
|
+static int sandbox_tpm_probe(struct udevice *dev)
|
|
|
+{
|
|
|
+ struct tpm_state *tpm = dev_get_priv(dev);
|
|
|
+
|
|
|
+ memcpy(tpm, &g_state, sizeof(*tpm));
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-int tis_close(void)
|
|
|
+static int sandbox_tpm_open(struct udevice *dev)
|
|
|
{
|
|
|
- printf("%s\n", __func__);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-int tis_init(void)
|
|
|
+static int sandbox_tpm_close(struct udevice *dev)
|
|
|
{
|
|
|
- printf("%s\n", __func__);
|
|
|
return 0;
|
|
|
}
|
|
|
+
|
|
|
+static const struct tpm_ops sandbox_tpm_ops = {
|
|
|
+ .open = sandbox_tpm_open,
|
|
|
+ .close = sandbox_tpm_close,
|
|
|
+ .get_desc = sandbox_tpm_get_desc,
|
|
|
+ .xfer = sandbox_tpm_xfer,
|
|
|
+};
|
|
|
+
|
|
|
+static const struct udevice_id sandbox_tpm_ids[] = {
|
|
|
+ { .compatible = "google,sandbox-tpm" },
|
|
|
+ { }
|
|
|
+};
|
|
|
+
|
|
|
+U_BOOT_DRIVER(sandbox_tpm) = {
|
|
|
+ .name = "sandbox_tpm",
|
|
|
+ .id = UCLASS_TPM,
|
|
|
+ .of_match = sandbox_tpm_ids,
|
|
|
+ .ops = &sandbox_tpm_ops,
|
|
|
+ .probe = sandbox_tpm_probe,
|
|
|
+ .priv_auto_alloc_size = sizeof(struct tpm_state),
|
|
|
+};
|