mirror of
https://github.com/AsahiLinux/u-boot
synced 2025-02-26 20:37:16 +00:00
dm: tpm: sandbox: Convert TPM driver to driver model
Convert the sandbox TPM driver to use driver model. Add it to the device tree so that it can be found on start-up. Signed-off-by: Simon Glass <sjg@chromium.org> Acked-by: Christophe Ricard <christophe-h.ricard@st.com> Reviewed-by: Heiko Schocher <hs@denx.de>
This commit is contained in:
parent
f8f1fe1d52
commit
21baf15b4e
3 changed files with 50 additions and 12 deletions
|
@ -156,6 +156,10 @@
|
||||||
sides = <4>;
|
sides = <4>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
tpm {
|
||||||
|
compatible = "google,sandbox-tpm";
|
||||||
|
};
|
||||||
|
|
||||||
triangle {
|
triangle {
|
||||||
compatible = "demo-shape";
|
compatible = "demo-shape";
|
||||||
colour = "cyan";
|
colour = "cyan";
|
||||||
|
|
|
@ -31,6 +31,7 @@ CONFIG_CROS_EC_KEYB=y
|
||||||
CONFIG_LED=y
|
CONFIG_LED=y
|
||||||
CONFIG_LED_GPIO=y
|
CONFIG_LED_GPIO=y
|
||||||
CONFIG_SANDBOX_SERIAL=y
|
CONFIG_SANDBOX_SERIAL=y
|
||||||
|
CONFIG_DM_TPM=y
|
||||||
CONFIG_TPM_TIS_SANDBOX=y
|
CONFIG_TPM_TIS_SANDBOX=y
|
||||||
CONFIG_SYS_I2C_SANDBOX=y
|
CONFIG_SYS_I2C_SANDBOX=y
|
||||||
CONFIG_SANDBOX_SPI=y
|
CONFIG_SANDBOX_SPI=y
|
||||||
|
|
|
@ -5,6 +5,8 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
|
#include <dm.h>
|
||||||
|
#include <tpm.h>
|
||||||
#include <asm/state.h>
|
#include <asm/state.h>
|
||||||
#include <asm/unaligned.h>
|
#include <asm/unaligned.h>
|
||||||
#include <linux/crc8.h>
|
#include <linux/crc8.h>
|
||||||
|
@ -56,7 +58,7 @@ enum {
|
||||||
*/
|
*/
|
||||||
static struct tpm_state {
|
static struct tpm_state {
|
||||||
uint8_t nvdata[NV_SEQ_COUNT][NV_DATA_SIZE];
|
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
|
* 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);
|
sprintf(prop_name, "nvdata%d", i);
|
||||||
prop = fdt_getprop(blob, node, prop_name, &len);
|
prop = fdt_getprop(blob, node, prop_name, &len);
|
||||||
if (prop && len == NV_DATA_SIZE)
|
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;
|
return 0;
|
||||||
|
@ -110,7 +112,7 @@ static int sandbox_tpm_write_state(void *blob, int node)
|
||||||
char prop_name[20];
|
char prop_name[20];
|
||||||
|
|
||||||
sprintf(prop_name, "nvdata%d", i);
|
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);
|
NV_DATA_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -135,10 +137,11 @@ static int index_to_seq(uint32_t index)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int tis_sendrecv(const u8 *sendbuf, size_t send_size,
|
static int sandbox_tpm_xfer(struct udevice *dev, const uint8_t *sendbuf,
|
||||||
u8 *recvbuf, size_t *recv_len)
|
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;
|
uint32_t code, index, length, type;
|
||||||
uint8_t *data;
|
uint8_t *data;
|
||||||
int seq;
|
int seq;
|
||||||
|
@ -241,20 +244,50 @@ int tis_sendrecv(const u8 *sendbuf, size_t send_size,
|
||||||
return 0;
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int tis_close(void)
|
static int sandbox_tpm_open(struct udevice *dev)
|
||||||
{
|
{
|
||||||
printf("%s\n", __func__);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int tis_init(void)
|
static int sandbox_tpm_close(struct udevice *dev)
|
||||||
{
|
{
|
||||||
printf("%s\n", __func__);
|
|
||||||
return 0;
|
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),
|
||||||
|
};
|
||||||
|
|
Loading…
Add table
Reference in a new issue