Fix sound on sandbox

Convert TPM fully to DM
 Tidy up sandbox I2C emulation
 Add a 'make qcheck' target for faster testing
 A few other misc things
 (dropped the final patch which breaks clang for some reason)
 -----BEGIN PGP SIGNATURE-----
 
 iQEzBAABCgAdFiEEslwAIq+Gp8wWVbYnfxc6PpAIreYFAlwBjx8ACgkQfxc6PpAI
 rebWEAf+PMc/M3X6cCKm+8P9xTNFv0gv234HVke1eTDG3eyZB6WQnJn5CS0LwyPj
 JUfwk4xK0Sqev/sQ6RuzmxmPAgla6UrEFB355tiZRBtFsMgf8bfevOqbxVqMbZl/
 bOe4YsFJ3sAgQDuhi2C5xzm2speGtaB8Qy8s1Zlv2sx3zEnLgRqVgeEVHzulZsk3
 gAlWKN3ys6EueYnOladjrrvrfOX8SQKYbThI+ACy7suZbtasGRITwP/4fQoXtmOl
 39e9WsiW6DBRW1sxNxpixrOS5trgWjOOFiKlY3GNWP+N34+9vYASwuBWwRWqfgXo
 cmelT6AcGiPUbHyr4k0CJHKCJlSbaQ==
 =p83K
 -----END PGP SIGNATURE-----

Merge tag 'pull-30nov18' of git://git.denx.de/u-boot-dm

Fix sound on sandbox
Convert TPM fully to DM
Tidy up sandbox I2C emulation
Add a 'make qcheck' target for faster testing
A few other misc things
(dropped the final patch which breaks clang for some reason)
This commit is contained in:
Tom Rini 2018-11-30 17:09:50 -05:00
commit 172e3c1190
71 changed files with 1292 additions and 687 deletions

View File

@ -443,7 +443,7 @@ defaultenv_h := include/generated/defaultenv_autogenerated.h
no-dot-config-targets := clean clobber mrproper distclean \ no-dot-config-targets := clean clobber mrproper distclean \
help %docs check% coccicheck \ help %docs check% coccicheck \
ubootversion backup tests ubootversion backup tests check qcheck
config-targets := 0 config-targets := 0
mixed-targets := 0 mixed-targets := 0
@ -1727,6 +1727,7 @@ help:
@echo 'Test targets:' @echo 'Test targets:'
@echo '' @echo ''
@echo ' check - Run all automated tests that use sandbox' @echo ' check - Run all automated tests that use sandbox'
@echo ' qcheck - Run quick automated tests that use sandbox'
@echo '' @echo ''
@echo 'Other generic targets:' @echo 'Other generic targets:'
@echo ' all - Build all necessary images depending on configuration' @echo ' all - Build all necessary images depending on configuration'
@ -1769,6 +1770,9 @@ help:
tests check: tests check:
$(srctree)/test/run $(srctree)/test/run
qcheck:
$(srctree)/test/run quick
# Documentation targets # Documentation targets
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
DOC_TARGETS := xmldocs latexdocs pdfdocs htmldocs epubdocs cleandocs \ DOC_TARGETS := xmldocs latexdocs pdfdocs htmldocs epubdocs cleandocs \

View File

@ -735,9 +735,10 @@ int os_find_u_boot(char *fname, int maxlen)
} }
/* Look for 'u-boot' in the parent directory of spl/ */ /* Look for 'u-boot' in the parent directory of spl/ */
p = strstr(fname, "/spl/"); p = strstr(fname, "spl/");
if (p) { if (p) {
strcpy(p, p + 4); /* Remove the "spl" characters */
memmove(p, p + 4, strlen(p + 4) + 1);
fd = os_open(fname, O_RDONLY); fd = os_open(fname, O_RDONLY);
if (fd >= 0) { if (fd >= 0) {
close(fd); close(fd);

View File

@ -9,6 +9,10 @@
#include <sound.h> #include <sound.h>
#include <asm/state.h> #include <asm/state.h>
enum {
SAMPLE_RATE = 22050,
};
static struct sdl_info { static struct sdl_info {
SDL_Surface *screen; SDL_Surface *screen;
int width; int width;
@ -18,6 +22,7 @@ static struct sdl_info {
uint frequency; uint frequency;
uint audio_pos; uint audio_pos;
uint audio_size; uint audio_size;
uint sample_rate;
uint8_t *audio_data; uint8_t *audio_data;
bool audio_active; bool audio_active;
bool inited; bool inited;
@ -263,27 +268,8 @@ int sandbox_sdl_sound_init(void)
if (sdl.audio_active) if (sdl.audio_active)
return 0; return 0;
/*
* At present all sandbox sounds crash. This is probably due to
* symbol name conflicts with U-Boot. We can remove the malloc()
* probles with:
*
* #define USE_DL_PREFIX
*
* and get this:
*
* Assertion 'e->pollfd->fd == e->fd' failed at pulse/mainloop.c:676,
* function dispatch_pollfds(). Aborting.
*
* The right solution is probably to make U-Boot's names private or
* link os.c and sdl.c against their libraries before liking with
* U-Boot. TBD. For now sound is disabled.
*/
printf("(Warning: sandbox sound disabled)\n");
return 0;
/* Set the audio format */ /* Set the audio format */
wanted.freq = 22050; wanted.freq = SAMPLE_RATE;
wanted.format = AUDIO_S16; wanted.format = AUDIO_S16;
wanted.channels = 1; /* 1 = mono, 2 = stereo */ wanted.channels = 1; /* 1 = mono, 2 = stereo */
wanted.samples = 1024; /* Good low-latency value for callback */ wanted.samples = 1024; /* Good low-latency value for callback */
@ -309,6 +295,7 @@ int sandbox_sdl_sound_init(void)
goto err; goto err;
} }
sdl.audio_active = true; sdl.audio_active = true;
sdl.sample_rate = wanted.freq;
return 0; return 0;
@ -322,7 +309,8 @@ int sandbox_sdl_sound_start(uint frequency)
if (!sdl.audio_active) if (!sdl.audio_active)
return -1; return -1;
sdl.frequency = frequency; sdl.frequency = frequency;
sound_create_square_wave((unsigned short *)sdl.audio_data, sound_create_square_wave(sdl.sample_rate,
(unsigned short *)sdl.audio_data,
sdl.audio_size, frequency); sdl.audio_size, frequency);
sdl.audio_pos = 0; sdl.audio_pos = 0;
SDL_PauseAudio(0); SDL_PauseAudio(0);

View File

@ -95,19 +95,11 @@
eeprom@2c { eeprom@2c {
reg = <0x2c>; reg = <0x2c>;
compatible = "i2c-eeprom"; compatible = "i2c-eeprom";
emul {
compatible = "sandbox,i2c-eeprom";
sandbox,filename = "i2c.bin";
sandbox,size = <128>;
};
}; };
rtc_0: rtc@43 { rtc_0: rtc@43 {
reg = <0x43>; reg = <0x43>;
compatible = "sandbox-rtc"; compatible = "sandbox-rtc";
emul {
compatible = "sandbox,i2c-rtc";
};
}; };
sandbox_pmic: sandbox_pmic { sandbox_pmic: sandbox_pmic {
reg = <0x40>; reg = <0x40>;
@ -116,6 +108,23 @@
mc34708: pmic@41 { mc34708: pmic@41 {
reg = <0x41>; reg = <0x41>;
}; };
i2c_emul: emul {
#address-cells = <1>;
#size-cells = <0>;
reg = <0xff>;
compatible = "sandbox,i2c-emul-parent";
emul-eeprom {
reg = <0x2c>;
compatible = "sandbox,i2c-eeprom";
sandbox,filename = "i2c.bin";
sandbox,size = <256>;
};
emul0 {
reg = <0x43>;
compatible = "sandbox,i2c-rtc";
};
};
}; };
lcd { lcd {

View File

@ -90,19 +90,11 @@
eeprom@2c { eeprom@2c {
reg = <0x2c>; reg = <0x2c>;
compatible = "i2c-eeprom"; compatible = "i2c-eeprom";
emul {
compatible = "sandbox,i2c-eeprom";
sandbox,filename = "i2c.bin";
sandbox,size = <128>;
};
}; };
rtc_0: rtc@43 { rtc_0: rtc@43 {
reg = <0x43>; reg = <0x43>;
compatible = "sandbox-rtc"; compatible = "sandbox-rtc";
emul {
compatible = "sandbox,i2c-rtc";
};
}; };
sandbox_pmic: sandbox_pmic { sandbox_pmic: sandbox_pmic {
reg = <0x40>; reg = <0x40>;
@ -111,6 +103,19 @@
mc34708: pmic@41 { mc34708: pmic@41 {
reg = <0x41>; reg = <0x41>;
}; };
i2c_emul: emul {
reg = <0xff>;
compatible = "sandbox,i2c-emul-parent";
emul-eeprom {
compatible = "sandbox,i2c-eeprom";
sandbox,filename = "i2c.bin";
sandbox,size = <256>;
};
emul0 {
compatible = "sandbox,i2c-rtc";
};
};
}; };
lcd { lcd {

View File

@ -11,40 +11,6 @@
&sandbox_pmic { &sandbox_pmic {
compatible = "sandbox,pmic"; compatible = "sandbox,pmic";
pmic_emul {
compatible = "sandbox,i2c-pmic";
/*
* Default PMICs register values are set by macro
* VAL2REG(min, step, value) [uV/uA]
* VAL2OMREG(mode id)
* reg-defaults - byte array
*/
reg-defaults = /bits/ 8 <
/* BUCK1 */
VAL2REG(800000, 25000, 1000000)
VAL2REG(150000, 25000, 150000)
VAL2OMREG(BUCK_OM_OFF)
/* BUCK2 */
VAL2REG(750000, 50000, 3000000)
VAL2REG(150000, 25000, 150000)
VAL2OMREG(0)
/* LDO1 */
VAL2REG(800000, 25000, 1600000)
VAL2REG(100000, 50000, 150000)
VAL2OMREG(LDO_OM_OFF)
/* LDO2 */
VAL2REG(750000, 50000, 3000000)
VAL2REG(150000, 25000, 150000)
VAL2OMREG(0)
/* reg[12:15] - not used */
0x00
0x00
0x00
0x00
>;
};
buck1 { buck1 {
regulator-name = "SUPPLY_1.2V"; regulator-name = "SUPPLY_1.2V";
regulator-min-microvolt = <1200000>; regulator-min-microvolt = <1200000>;
@ -84,10 +50,45 @@
&mc34708 { &mc34708 {
compatible = "fsl,mc34708"; compatible = "fsl,mc34708";
};
pmic_emul { &i2c_emul {
emul_pmic0: pmic-emul0 {
compatible = "sandbox,i2c-pmic"; compatible = "sandbox,i2c-pmic";
/*
* Default PMICs register values are set by macro
* VAL2REG(min, step, value) [uV/uA]
* VAL2OMREG(mode id)
* reg-defaults - byte array
*/
reg-defaults = /bits/ 8 <
/* BUCK1 */
VAL2REG(800000, 25000, 1000000)
VAL2REG(150000, 25000, 150000)
VAL2OMREG(BUCK_OM_OFF)
/* BUCK2 */
VAL2REG(750000, 50000, 3000000)
VAL2REG(150000, 25000, 150000)
VAL2OMREG(0)
/* LDO1 */
VAL2REG(800000, 25000, 1600000)
VAL2REG(100000, 50000, 150000)
VAL2OMREG(LDO_OM_OFF)
/* LDO2 */
VAL2REG(750000, 50000, 3000000)
VAL2REG(150000, 25000, 150000)
VAL2OMREG(0)
/* reg[12:15] - not used */
0x00
0x00
0x00
0x00
>;
};
emul_pmic1: pmic-emul1 {
compatible = "sandbox,i2c-pmic";
reg-defaults = /bits/ 8 < reg-defaults = /bits/ 8 <
0x00 0x80 0x08 0xff 0xff 0xff 0x2e 0x01 0x08 0x00 0x80 0x08 0xff 0xff 0xff 0x2e 0x01 0x08
0x40 0x80 0x81 0x5f 0xff 0xfb 0x1e 0x80 0x18 0x40 0x80 0x81 0x5f 0xff 0xfb 0x1e 0x80 0x18

View File

@ -266,35 +266,45 @@
eeprom@2c { eeprom@2c {
reg = <0x2c>; reg = <0x2c>;
compatible = "i2c-eeprom"; compatible = "i2c-eeprom";
emul { sandbox,emul = <&emul_eeprom>;
compatible = "sandbox,i2c-eeprom";
sandbox,filename = "i2c.bin";
sandbox,size = <256>;
};
}; };
rtc_0: rtc@43 { rtc_0: rtc@43 {
reg = <0x43>; reg = <0x43>;
compatible = "sandbox-rtc"; compatible = "sandbox-rtc";
emul { sandbox,emul = <&emul0>;
compatible = "sandbox,i2c-rtc";
};
}; };
rtc_1: rtc@61 { rtc_1: rtc@61 {
reg = <0x61>; reg = <0x61>;
compatible = "sandbox-rtc"; compatible = "sandbox-rtc";
emul { sandbox,emul = <&emul1>;
};
i2c_emul: emul {
reg = <0xff>;
compatible = "sandbox,i2c-emul-parent";
emul_eeprom: emul-eeprom {
compatible = "sandbox,i2c-eeprom";
sandbox,filename = "i2c.bin";
sandbox,size = <256>;
};
emul0: emul0 {
compatible = "sandbox,i2c-rtc";
};
emul1: emull {
compatible = "sandbox,i2c-rtc"; compatible = "sandbox,i2c-rtc";
}; };
}; };
sandbox_pmic: sandbox_pmic { sandbox_pmic: sandbox_pmic {
reg = <0x40>; reg = <0x40>;
sandbox,emul = <&emul_pmic0>;
}; };
mc34708: pmic@41 { mc34708: pmic@41 {
reg = <0x41>; reg = <0x41>;
sandbox,emul = <&emul_pmic1>;
}; };
}; };

View File

@ -34,6 +34,19 @@ DECLARE_GLOBAL_DATA_PTR;
#define DB_GP_88F68XX_GPP_POL_LOW 0x0 #define DB_GP_88F68XX_GPP_POL_LOW 0x0
#define DB_GP_88F68XX_GPP_POL_MID 0x0 #define DB_GP_88F68XX_GPP_POL_MID 0x0
static int get_tpm(struct udevice **devp)
{
int rc;
rc = uclass_first_device_err(UCLASS_TPM, devp);
if (rc) {
printf("Could not find TPM (ret=%d)\n", rc);
return CMD_RET_FAILURE;
}
return 0;
}
/* /*
* Define the DDR layout / topology here in the board file. This will * Define the DDR layout / topology here in the board file. This will
* be used by the DDR3 init code in the SPL U-Boot version to configure * be used by the DDR3 init code in the SPL U-Boot version to configure
@ -266,18 +279,22 @@ int board_fix_fdt(void *rw_fdt_blob)
int last_stage_init(void) int last_stage_init(void)
{ {
struct udevice *tpm;
int ret;
#ifndef CONFIG_SPL_BUILD #ifndef CONFIG_SPL_BUILD
ccdc_eth_init(); ccdc_eth_init();
#endif #endif
if (tpm_init() || tpm_startup(TPM_ST_CLEAR) || ret = get_tpm(&tpm);
tpm_continue_self_test()) { if (ret || tpm_init(tpm) || tpm_startup(tpm, TPM_ST_CLEAR) ||
tpm_continue_self_test(tpm)) {
return 1; return 1;
} }
mdelay(37); mdelay(37);
flush_keys(); flush_keys(tpm);
load_and_run_keyprog(); load_and_run_keyprog(tpm);
return 0; return 0;
} }

View File

@ -93,19 +93,20 @@ static const uint8_t vendor[] = "Guntermann & Drunck";
/** /**
* @brief get the size of a given (TPM) NV area * @brief get the size of a given (TPM) NV area
* @param tpm TPM device
* @param index NV index of the area to get size for * @param index NV index of the area to get size for
* @param size pointer to the size * @param size pointer to the size
* @return 0 on success, != 0 on error * @return 0 on success, != 0 on error
*/ */
static int get_tpm_nv_size(uint32_t index, uint32_t *size) static int get_tpm_nv_size(struct udevice *tpm, uint32_t index, uint32_t *size)
{ {
uint32_t err; uint32_t err;
uint8_t info[72]; uint8_t info[72];
uint8_t *ptr; uint8_t *ptr;
uint16_t v16; uint16_t v16;
err = tpm_get_capability(TPM_CAP_NV_INDEX, index, err = tpm_get_capability(tpm, TPM_CAP_NV_INDEX, index,
info, sizeof(info)); info, sizeof(info));
if (err) { if (err) {
printf("tpm_get_capability(CAP_NV_INDEX, %08x) failed: %u\n", printf("tpm_get_capability(CAP_NV_INDEX, %08x) failed: %u\n",
index, err); index, err);
@ -128,13 +129,14 @@ static int get_tpm_nv_size(uint32_t index, uint32_t *size)
/** /**
* @brief search for a key by usage auth and pub key hash. * @brief search for a key by usage auth and pub key hash.
* @param tpm TPM device
* @param auth usage auth of the key to search for * @param auth usage auth of the key to search for
* @param pubkey_digest (SHA1) hash of the pub key structure of the key * @param pubkey_digest (SHA1) hash of the pub key structure of the key
* @param[out] handle the handle of the key iff found * @param[out] handle the handle of the key iff found
* @return 0 if key was found in TPM; != 0 if not. * @return 0 if key was found in TPM; != 0 if not.
*/ */
static int find_key(const uint8_t auth[20], const uint8_t pubkey_digest[20], static int find_key(struct udevice *tpm, const uint8_t auth[20],
uint32_t *handle) const uint8_t pubkey_digest[20], uint32_t *handle)
{ {
uint16_t key_count; uint16_t key_count;
uint32_t key_handles[10]; uint32_t key_handles[10];
@ -146,7 +148,8 @@ static int find_key(const uint8_t auth[20], const uint8_t pubkey_digest[20],
unsigned int i; unsigned int i;
/* fetch list of already loaded keys in the TPM */ /* fetch list of already loaded keys in the TPM */
err = tpm_get_capability(TPM_CAP_HANDLE, TPM_RT_KEY, buf, sizeof(buf)); err = tpm_get_capability(tpm, TPM_CAP_HANDLE, TPM_RT_KEY, buf,
sizeof(buf));
if (err) if (err)
return -1; return -1;
key_count = get_unaligned_be16(buf); key_count = get_unaligned_be16(buf);
@ -157,7 +160,8 @@ static int find_key(const uint8_t auth[20], const uint8_t pubkey_digest[20],
/* now search a(/ the) key which we can access with the given auth */ /* now search a(/ the) key which we can access with the given auth */
for (i = 0; i < key_count; ++i) { for (i = 0; i < key_count; ++i) {
buf_len = sizeof(buf); buf_len = sizeof(buf);
err = tpm_get_pub_key_oiap(key_handles[i], auth, buf, &buf_len); err = tpm_get_pub_key_oiap(tpm, key_handles[i], auth, buf,
&buf_len);
if (err && err != TPM_AUTHFAIL) if (err && err != TPM_AUTHFAIL)
return -1; return -1;
if (err) if (err)
@ -173,20 +177,21 @@ static int find_key(const uint8_t auth[20], const uint8_t pubkey_digest[20],
/** /**
* @brief read CCDM common data from TPM NV * @brief read CCDM common data from TPM NV
* @param tpm TPM device
* @return 0 if CCDM common data was found and read, !=0 if something failed. * @return 0 if CCDM common data was found and read, !=0 if something failed.
*/ */
static int read_common_data(void) static int read_common_data(struct udevice *tpm)
{ {
uint32_t size = 0; uint32_t size = 0;
uint32_t err; uint32_t err;
uint8_t buf[256]; uint8_t buf[256];
sha1_context ctx; sha1_context ctx;
if (get_tpm_nv_size(NV_COMMON_DATA_INDEX, &size) || if (get_tpm_nv_size(tpm, NV_COMMON_DATA_INDEX, &size) ||
size < NV_COMMON_DATA_MIN_SIZE) size < NV_COMMON_DATA_MIN_SIZE)
return 1; return 1;
err = tpm_nv_read_value(NV_COMMON_DATA_INDEX, err = tpm_nv_read_value(tpm, NV_COMMON_DATA_INDEX,
buf, min(sizeof(buf), size)); buf, min(sizeof(buf), size));
if (err) { if (err) {
printf("tpm_nv_read_value() failed: %u\n", err); printf("tpm_nv_read_value() failed: %u\n", err);
return 1; return 1;
@ -235,6 +240,7 @@ static struct h_reg *get_hreg(uint8_t spec)
/** /**
* @brief get pointer of a hash register by specification and usage. * @brief get pointer of a hash register by specification and usage.
* @param tpm TPM device
* @param spec specification of a hash register * @param spec specification of a hash register
* @param mode access mode (read or write or read/write) * @param mode access mode (read or write or read/write)
* @return pointer to hash register if found and valid; NULL else. * @return pointer to hash register if found and valid; NULL else.
@ -244,7 +250,8 @@ static struct h_reg *get_hreg(uint8_t spec)
* The value of automatic registers (PCR register and fixed registers) is * The value of automatic registers (PCR register and fixed registers) is
* loaded or computed on read access. * loaded or computed on read access.
*/ */
static struct h_reg *access_hreg(uint8_t spec, enum access_mode mode) static struct h_reg *access_hreg(struct udevice *tpm, uint8_t spec,
enum access_mode mode)
{ {
struct h_reg *result; struct h_reg *result;
@ -261,13 +268,13 @@ static struct h_reg *access_hreg(uint8_t spec, enum access_mode mode)
if (mode & HREG_RD) { if (mode & HREG_RD) {
if (!result->valid) { if (!result->valid) {
if (IS_PCR_HREG(spec)) { if (IS_PCR_HREG(spec)) {
hre_tpm_err = tpm_pcr_read(HREG_IDX(spec), hre_tpm_err = tpm_pcr_read(tpm, HREG_IDX(spec),
result->digest, 20); result->digest, 20);
result->valid = (hre_tpm_err == TPM_SUCCESS); result->valid = (hre_tpm_err == TPM_SUCCESS);
} else if (IS_FIX_HREG(spec)) { } else if (IS_FIX_HREG(spec)) {
switch (HREG_IDX(spec)) { switch (HREG_IDX(spec)) {
case FIX_HREG_DEVICE_ID_HASH: case FIX_HREG_DEVICE_ID_HASH:
read_common_data(); read_common_data(tpm);
break; break;
case FIX_HREG_VENDOR: case FIX_HREG_VENDOR:
memcpy(result->digest, vendor, 20); memcpy(result->digest, vendor, 20);
@ -337,18 +344,19 @@ static void *compute_extend(void *_dst, const void *_src, size_t n)
return _dst; return _dst;
} }
static int hre_op_loadkey(struct h_reg *src_reg, struct h_reg *dst_reg, static int hre_op_loadkey(struct udevice *tpm, struct h_reg *src_reg,
const void *key, size_t key_size) struct h_reg *dst_reg, const void *key,
size_t key_size)
{ {
uint32_t parent_handle; uint32_t parent_handle;
uint32_t key_handle; uint32_t key_handle;
if (!src_reg || !dst_reg || !src_reg->valid || !dst_reg->valid) if (!src_reg || !dst_reg || !src_reg->valid || !dst_reg->valid)
return -1; return -1;
if (find_key(src_reg->digest, dst_reg->digest, &parent_handle)) if (find_key(tpm, src_reg->digest, dst_reg->digest, &parent_handle))
return -1; return -1;
hre_tpm_err = tpm_load_key2_oiap(parent_handle, key, key_size, hre_tpm_err = tpm_load_key2_oiap(tpm, parent_handle, key, key_size,
src_reg->digest, &key_handle); src_reg->digest, &key_handle);
if (hre_tpm_err) { if (hre_tpm_err) {
hre_err = HRE_E_TPM_FAILURE; hre_err = HRE_E_TPM_FAILURE;
return -1; return -1;
@ -359,11 +367,13 @@ static int hre_op_loadkey(struct h_reg *src_reg, struct h_reg *dst_reg,
/** /**
* @brief executes the next opcode on the hash register engine. * @brief executes the next opcode on the hash register engine.
* @param tpm TPM device
* @param[in,out] ip pointer to the opcode (instruction pointer) * @param[in,out] ip pointer to the opcode (instruction pointer)
* @param[in,out] code_size (remaining) size of the code * @param[in,out] code_size (remaining) size of the code
* @return new instruction pointer on success, NULL on error. * @return new instruction pointer on success, NULL on error.
*/ */
static const uint8_t *hre_execute_op(const uint8_t **ip, size_t *code_size) static const uint8_t *hre_execute_op(struct udevice *tpm, const uint8_t **ip,
size_t *code_size)
{ {
bool dst_modified = false; bool dst_modified = false;
uint32_t ins; uint32_t ins;
@ -394,10 +404,11 @@ static const uint8_t *hre_execute_op(const uint8_t **ip, size_t *code_size)
if ((opcode & 0x80) && (data_size + 4) > *code_size) if ((opcode & 0x80) && (data_size + 4) > *code_size)
return NULL; return NULL;
src_reg = access_hreg(src_spec, HREG_RD); src_reg = access_hreg(tpm, src_spec, HREG_RD);
if (hre_err || hre_tpm_err) if (hre_err || hre_tpm_err)
return NULL; return NULL;
dst_reg = access_hreg(dst_spec, (opcode & 0x40) ? HREG_RDWR : HREG_WR); dst_reg = access_hreg(tpm, dst_spec,
(opcode & 0x40) ? HREG_RDWR : HREG_WR);
if (hre_err || hre_tpm_err) if (hre_err || hre_tpm_err)
return NULL; return NULL;
@ -453,7 +464,7 @@ do_bin_func:
dst_modified = true; dst_modified = true;
break; break;
case HRE_LOADKEY: case HRE_LOADKEY:
if (hre_op_loadkey(src_reg, dst_reg, data, data_size)) if (hre_op_loadkey(tpm, src_reg, dst_reg, data, data_size))
return NULL; return NULL;
break; break;
default: default:
@ -461,8 +472,8 @@ do_bin_func:
} }
if (dst_reg && dst_modified && IS_PCR_HREG(dst_spec)) { if (dst_reg && dst_modified && IS_PCR_HREG(dst_spec)) {
hre_tpm_err = tpm_extend(HREG_IDX(dst_spec), dst_reg->digest, hre_tpm_err = tpm_extend(tpm, HREG_IDX(dst_spec),
dst_reg->digest); dst_reg->digest, dst_reg->digest);
if (hre_tpm_err) { if (hre_tpm_err) {
hre_err = HRE_E_TPM_FAILURE; hre_err = HRE_E_TPM_FAILURE;
return NULL; return NULL;
@ -481,11 +492,12 @@ end:
/** /**
* @brief runs a program on the hash register engine. * @brief runs a program on the hash register engine.
* @param tpm TPM device
* @param code pointer to the (HRE) code. * @param code pointer to the (HRE) code.
* @param code_size size of the code (in bytes). * @param code_size size of the code (in bytes).
* @return 0 on success, != 0 on failure. * @return 0 on success, != 0 on failure.
*/ */
int hre_run_program(const uint8_t *code, size_t code_size) int hre_run_program(struct udevice *tpm, const uint8_t *code, size_t code_size)
{ {
size_t code_left; size_t code_left;
const uint8_t *ip = code; const uint8_t *ip = code;
@ -494,7 +506,7 @@ int hre_run_program(const uint8_t *code, size_t code_size)
hre_tpm_err = 0; hre_tpm_err = 0;
hre_err = HRE_E_OK; hre_err = HRE_E_OK;
while (code_left > 0) while (code_left > 0)
if (!hre_execute_op(&ip, &code_left)) if (!hre_execute_op(tpm, &ip, &code_left))
return -1; return -1;
return hre_err; return hre_err;

View File

@ -32,6 +32,6 @@ enum {
}; };
int hre_verify_program(struct key_program *prg); int hre_verify_program(struct key_program *prg);
int hre_run_program(const uint8_t *code, size_t code_size); int hre_run_program(struct udevice *tpm, const uint8_t *code, size_t code_size);
#endif /* __HRE_H */ #endif /* __HRE_H */

View File

@ -12,7 +12,7 @@
#include "hre.h" #include "hre.h"
int flush_keys(void) int flush_keys(struct udevice *tpm)
{ {
u16 key_count; u16 key_count;
u8 buf[288]; u8 buf[288];
@ -21,13 +21,15 @@ int flush_keys(void)
uint i; uint i;
/* fetch list of already loaded keys in the TPM */ /* fetch list of already loaded keys in the TPM */
err = tpm_get_capability(TPM_CAP_HANDLE, TPM_RT_KEY, buf, sizeof(buf)); err = tpm_get_capability(tpm, TPM_CAP_HANDLE, TPM_RT_KEY, buf,
sizeof(buf));
if (err) if (err)
return -1; return -1;
key_count = get_unaligned_be16(buf); key_count = get_unaligned_be16(buf);
ptr = buf + 2; ptr = buf + 2;
for (i = 0; i < key_count; ++i, ptr += 4) { for (i = 0; i < key_count; ++i, ptr += 4) {
err = tpm_flush_specific(get_unaligned_be32(ptr), TPM_RT_KEY); err = tpm_flush_specific(tpm, get_unaligned_be32(ptr),
TPM_RT_KEY);
if (err && err != TPM_KEY_OWNER_CONTROL) if (err && err != TPM_KEY_OWNER_CONTROL)
return err; return err;
} }
@ -121,7 +123,7 @@ struct key_program *parse_and_check_keyprog(u8 *progdata)
return result; return result;
} }
int load_and_run_keyprog(void) int load_and_run_keyprog(struct udevice *tpm)
{ {
char *cmd = NULL; char *cmd = NULL;
u8 *binprog = NULL; u8 *binprog = NULL;
@ -144,7 +146,7 @@ int load_and_run_keyprog(void)
if (!prog) if (!prog)
return 1; return 1;
if (hre_run_program(prog->code, prog->code_size)) { if (hre_run_program(tpm, prog->code, prog->code_size)) {
free(prog); free(prog);
return 1; return 1;
} }

View File

@ -7,7 +7,7 @@
#ifndef __KEYPROGRAM_H #ifndef __KEYPROGRAM_H
#define __KEYPROGRAM_H #define __KEYPROGRAM_H
int load_and_run_keyprog(void); int load_and_run_keyprog(struct udevice *tpm);
int flush_keys(void); int flush_keys(struct udevice *tpm);
#endif /* __KEYPROGRAM_H */ #endif /* __KEYPROGRAM_H */

View File

@ -11,6 +11,7 @@
#endif #endif
#include <common.h> #include <common.h>
#include <dm.h>
#include <malloc.h> #include <malloc.h>
#include <fs.h> #include <fs.h>
#include <i2c.h> #include <i2c.h>
@ -141,6 +142,19 @@ static int hre_err = HRE_E_OK;
#define IS_VAR_HREG(spec) (((spec) & 0x38) == 0x10) #define IS_VAR_HREG(spec) (((spec) & 0x38) == 0x10)
#define HREG_IDX(spec) ((spec) & (IS_PCR_HREG(spec) ? 0x1f : 0x7)) #define HREG_IDX(spec) ((spec) & (IS_PCR_HREG(spec) ? 0x1f : 0x7))
static int get_tpm(struct udevice **devp)
{
int rc;
rc = uclass_first_device_err(UCLASS_TPM, devp);
if (rc) {
printf("Could not find TPM (ret=%d)\n", rc);
return CMD_RET_FAILURE;
}
return 0;
}
static const uint8_t vendor[] = "Guntermann & Drunck"; static const uint8_t vendor[] = "Guntermann & Drunck";
/** /**
@ -245,15 +259,15 @@ static u8 *get_image_location(void)
* @param size pointer to the size * @param size pointer to the size
* @return 0 on success, != 0 on error * @return 0 on success, != 0 on error
*/ */
static int get_tpm_nv_size(uint32_t index, uint32_t *size) static int get_tpm_nv_size(struct udevice *tpm, uint32_t index, uint32_t *size)
{ {
uint32_t err; uint32_t err;
uint8_t info[72]; uint8_t info[72];
uint8_t *ptr; uint8_t *ptr;
uint16_t v16; uint16_t v16;
err = tpm_get_capability(TPM_CAP_NV_INDEX, index, err = tpm_get_capability(tpm, TPM_CAP_NV_INDEX, index,
info, sizeof(info)); info, sizeof(info));
if (err) { if (err) {
printf("tpm_get_capability(CAP_NV_INDEX, %08x) failed: %u\n", printf("tpm_get_capability(CAP_NV_INDEX, %08x) failed: %u\n",
index, err); index, err);
@ -281,8 +295,8 @@ static int get_tpm_nv_size(uint32_t index, uint32_t *size)
* @param[out] handle the handle of the key iff found * @param[out] handle the handle of the key iff found
* @return 0 if key was found in TPM; != 0 if not. * @return 0 if key was found in TPM; != 0 if not.
*/ */
static int find_key(const uint8_t auth[20], const uint8_t pubkey_digest[20], static int find_key(struct udevice *tpm, const uint8_t auth[20],
uint32_t *handle) const uint8_t pubkey_digest[20], uint32_t *handle)
{ {
uint16_t key_count; uint16_t key_count;
uint32_t key_handles[10]; uint32_t key_handles[10];
@ -294,7 +308,8 @@ static int find_key(const uint8_t auth[20], const uint8_t pubkey_digest[20],
unsigned int i; unsigned int i;
/* fetch list of already loaded keys in the TPM */ /* fetch list of already loaded keys in the TPM */
err = tpm_get_capability(TPM_CAP_HANDLE, TPM_RT_KEY, buf, sizeof(buf)); err = tpm_get_capability(tpm, TPM_CAP_HANDLE, TPM_RT_KEY, buf,
sizeof(buf));
if (err) if (err)
return -1; return -1;
key_count = get_unaligned_be16(buf); key_count = get_unaligned_be16(buf);
@ -305,7 +320,8 @@ static int find_key(const uint8_t auth[20], const uint8_t pubkey_digest[20],
/* now search a(/ the) key which we can access with the given auth */ /* now search a(/ the) key which we can access with the given auth */
for (i = 0; i < key_count; ++i) { for (i = 0; i < key_count; ++i) {
buf_len = sizeof(buf); buf_len = sizeof(buf);
err = tpm_get_pub_key_oiap(key_handles[i], auth, buf, &buf_len); err = tpm_get_pub_key_oiap(tpm, key_handles[i], auth, buf,
&buf_len);
if (err && err != TPM_AUTHFAIL) if (err && err != TPM_AUTHFAIL)
return -1; return -1;
if (err) if (err)
@ -323,18 +339,18 @@ static int find_key(const uint8_t auth[20], const uint8_t pubkey_digest[20],
* @brief read CCDM common data from TPM NV * @brief read CCDM common data from TPM NV
* @return 0 if CCDM common data was found and read, !=0 if something failed. * @return 0 if CCDM common data was found and read, !=0 if something failed.
*/ */
static int read_common_data(void) static int read_common_data(struct udevice *tpm)
{ {
uint32_t size; uint32_t size;
uint32_t err; uint32_t err;
uint8_t buf[256]; uint8_t buf[256];
sha1_context ctx; sha1_context ctx;
if (get_tpm_nv_size(NV_COMMON_DATA_INDEX, &size) || if (get_tpm_nv_size(tpm, NV_COMMON_DATA_INDEX, &size) ||
size < NV_COMMON_DATA_MIN_SIZE) size < NV_COMMON_DATA_MIN_SIZE)
return 1; return 1;
err = tpm_nv_read_value(NV_COMMON_DATA_INDEX, err = tpm_nv_read_value(tpm, NV_COMMON_DATA_INDEX,
buf, min(sizeof(buf), size)); buf, min(sizeof(buf), size));
if (err) { if (err) {
printf("tpm_nv_read_value() failed: %u\n", err); printf("tpm_nv_read_value() failed: %u\n", err);
return 1; return 1;
@ -467,7 +483,8 @@ static struct h_reg *get_hreg(uint8_t spec)
* The value of automatic registers (PCR register and fixed registers) is * The value of automatic registers (PCR register and fixed registers) is
* loaded or computed on read access. * loaded or computed on read access.
*/ */
static struct h_reg *access_hreg(uint8_t spec, enum access_mode mode) static struct h_reg *access_hreg(struct udevice *tpm, uint8_t spec,
enum access_mode mode)
{ {
struct h_reg *result; struct h_reg *result;
@ -484,13 +501,13 @@ static struct h_reg *access_hreg(uint8_t spec, enum access_mode mode)
if (mode & HREG_RD) { if (mode & HREG_RD) {
if (!result->valid) { if (!result->valid) {
if (IS_PCR_HREG(spec)) { if (IS_PCR_HREG(spec)) {
hre_tpm_err = tpm_pcr_read(HREG_IDX(spec), hre_tpm_err = tpm_pcr_read(tpm, HREG_IDX(spec),
result->digest, 20); result->digest, 20);
result->valid = (hre_tpm_err == TPM_SUCCESS); result->valid = (hre_tpm_err == TPM_SUCCESS);
} else if (IS_FIX_HREG(spec)) { } else if (IS_FIX_HREG(spec)) {
switch (HREG_IDX(spec)) { switch (HREG_IDX(spec)) {
case FIX_HREG_DEVICE_ID_HASH: case FIX_HREG_DEVICE_ID_HASH:
read_common_data(); read_common_data(tpm);
break; break;
case FIX_HREG_SELF_HASH: case FIX_HREG_SELF_HASH:
ccdm_compute_self_hash(); ccdm_compute_self_hash();
@ -566,18 +583,19 @@ static void *compute_extend(void *_dst, const void *_src, size_t n)
return _dst; return _dst;
} }
static int hre_op_loadkey(struct h_reg *src_reg, struct h_reg *dst_reg, static int hre_op_loadkey(struct udevice *tpm, struct h_reg *src_reg,
const void *key, size_t key_size) struct h_reg *dst_reg, const void *key,
size_t key_size)
{ {
uint32_t parent_handle; uint32_t parent_handle;
uint32_t key_handle; uint32_t key_handle;
if (!src_reg || !dst_reg || !src_reg->valid || !dst_reg->valid) if (!src_reg || !dst_reg || !src_reg->valid || !dst_reg->valid)
return -1; return -1;
if (find_key(src_reg->digest, dst_reg->digest, &parent_handle)) if (find_key(tpm, src_reg->digest, dst_reg->digest, &parent_handle))
return -1; return -1;
hre_tpm_err = tpm_load_key2_oiap(parent_handle, key, key_size, hre_tpm_err = tpm_load_key2_oiap(tpm, parent_handle, key, key_size,
src_reg->digest, &key_handle); src_reg->digest, &key_handle);
if (hre_tpm_err) { if (hre_tpm_err) {
hre_err = HRE_E_TPM_FAILURE; hre_err = HRE_E_TPM_FAILURE;
return -1; return -1;
@ -593,7 +611,8 @@ static int hre_op_loadkey(struct h_reg *src_reg, struct h_reg *dst_reg,
* @param[in,out] code_size (remaining) size of the code * @param[in,out] code_size (remaining) size of the code
* @return new instruction pointer on success, NULL on error. * @return new instruction pointer on success, NULL on error.
*/ */
static const uint8_t *hre_execute_op(const uint8_t **ip, size_t *code_size) static const uint8_t *hre_execute_op(struct udevice *tpm, const uint8_t **ip,
size_t *code_size)
{ {
bool dst_modified = false; bool dst_modified = false;
uint32_t ins; uint32_t ins;
@ -624,10 +643,11 @@ static const uint8_t *hre_execute_op(const uint8_t **ip, size_t *code_size)
if ((opcode & 0x80) && (data_size + 4) > *code_size) if ((opcode & 0x80) && (data_size + 4) > *code_size)
return NULL; return NULL;
src_reg = access_hreg(src_spec, HREG_RD); src_reg = access_hreg(tpm, src_spec, HREG_RD);
if (hre_err || hre_tpm_err) if (hre_err || hre_tpm_err)
return NULL; return NULL;
dst_reg = access_hreg(dst_spec, (opcode & 0x40) ? HREG_RDWR : HREG_WR); dst_reg = access_hreg(tpm, dst_spec,
(opcode & 0x40) ? HREG_RDWR : HREG_WR);
if (hre_err || hre_tpm_err) if (hre_err || hre_tpm_err)
return NULL; return NULL;
@ -683,7 +703,7 @@ do_bin_func:
dst_modified = true; dst_modified = true;
break; break;
case HRE_LOADKEY: case HRE_LOADKEY:
if (hre_op_loadkey(src_reg, dst_reg, data, data_size)) if (hre_op_loadkey(tpm, src_reg, dst_reg, data, data_size))
return NULL; return NULL;
break; break;
default: default:
@ -691,8 +711,8 @@ do_bin_func:
} }
if (dst_reg && dst_modified && IS_PCR_HREG(dst_spec)) { if (dst_reg && dst_modified && IS_PCR_HREG(dst_spec)) {
hre_tpm_err = tpm_extend(HREG_IDX(dst_spec), dst_reg->digest, hre_tpm_err = tpm_extend(tpm, HREG_IDX(dst_spec),
dst_reg->digest); dst_reg->digest, dst_reg->digest);
if (hre_tpm_err) { if (hre_tpm_err) {
hre_err = HRE_E_TPM_FAILURE; hre_err = HRE_E_TPM_FAILURE;
return NULL; return NULL;
@ -715,7 +735,8 @@ end:
* @param code_size size of the code (in bytes). * @param code_size size of the code (in bytes).
* @return 0 on success, != 0 on failure. * @return 0 on success, != 0 on failure.
*/ */
static int hre_run_program(const uint8_t *code, size_t code_size) static int hre_run_program(struct udevice *tpm, const uint8_t *code,
size_t code_size)
{ {
size_t code_left; size_t code_left;
const uint8_t *ip = code; const uint8_t *ip = code;
@ -724,7 +745,7 @@ static int hre_run_program(const uint8_t *code, size_t code_size)
hre_tpm_err = 0; hre_tpm_err = 0;
hre_err = HRE_E_OK; hre_err = HRE_E_OK;
while (code_left > 0) while (code_left > 0)
if (!hre_execute_op(&ip, &code_left)) if (!hre_execute_op(tpm, &ip, &code_left))
return -1; return -1;
return hre_err; return hre_err;
@ -929,26 +950,27 @@ static const uint8_t prg_stage1_prepare[] = {
0x81, 0x2e, 0x30, 0x00, /* opcode: LOAD PCR3, f3 */ 0x81, 0x2e, 0x30, 0x00, /* opcode: LOAD PCR3, f3 */
}; };
static int first_stage_actions(void) static int first_stage_actions(struct udevice *tpm)
{ {
int result = 0; int result = 0;
struct key_program *sd_prg = NULL; struct key_program *sd_prg = NULL;
puts("CCDM S1: start actions\n"); puts("CCDM S1: start actions\n");
#ifndef CCDM_SECOND_STAGE #ifndef CCDM_SECOND_STAGE
if (tpm_continue_self_test()) if (tpm_continue_self_test(tpm))
goto failure; goto failure;
#else #else
tpm_continue_self_test(); tpm_continue_self_test(tpm);
#endif #endif
mdelay(37); mdelay(37);
if (hre_run_program(prg_stage1_prepare, sizeof(prg_stage1_prepare))) if (hre_run_program(tpm, prg_stage1_prepare,
sizeof(prg_stage1_prepare)))
goto failure; goto failure;
sd_prg = load_sd_key_program(); sd_prg = load_sd_key_program();
if (sd_prg) { if (sd_prg) {
if (hre_run_program(sd_prg->code, sd_prg->code_size)) if (hre_run_program(tpm, sd_prg->code, sd_prg->code_size))
goto failure; goto failure;
puts("SD code run successfully\n"); puts("SD code run successfully\n");
} else { } else {
@ -969,19 +991,22 @@ end:
#ifdef CCDM_FIRST_STAGE #ifdef CCDM_FIRST_STAGE
static int first_stage_init(void) static int first_stage_init(void)
{ {
int res = 0; struct udevice *tpm;
int ret;
puts("CCDM S1\n"); puts("CCDM S1\n");
if (tpm_init() || tpm_startup(TPM_ST_CLEAR)) ret = get_tpm(&tpm);
if (ret || tpm_init(tpm) || tpm_startup(tpm, TPM_ST_CLEAR))
return 1; return 1;
res = first_stage_actions(); ret = first_stage_actions(tpm);
#ifndef CCDM_SECOND_STAGE #ifndef CCDM_SECOND_STAGE
if (!res) { if (!ret) {
if (bl2_entry) if (bl2_entry)
(*bl2_entry)(); (*bl2_entry)();
res = 1; ret = 1;
} }
#endif #endif
return res; return ret;
} }
#endif #endif
@ -1021,24 +1046,28 @@ static int second_stage_init(void)
char *mac_path = NULL; char *mac_path = NULL;
ulong image_addr; ulong image_addr;
loff_t image_size; loff_t image_size;
struct udevice *tpm;
uint32_t err; uint32_t err;
int ret;
printf("CCDM S2\n"); printf("CCDM S2\n");
if (tpm_init()) ret = get_tpm(&tpm);
if (ret || tpm_init(tpm))
return 1; return 1;
err = tpm_startup(TPM_ST_CLEAR); err = tpm_startup(tpm, TPM_ST_CLEAR);
if (err != TPM_INVALID_POSTINIT) if (err != TPM_INVALID_POSTINIT)
did_first_stage_run = false; did_first_stage_run = false;
#ifdef CCDM_AUTO_FIRST_STAGE #ifdef CCDM_AUTO_FIRST_STAGE
if (!did_first_stage_run && first_stage_actions()) if (!did_first_stage_run && first_stage_actions(tpm))
goto failure; goto failure;
#else #else
if (!did_first_stage_run) if (!did_first_stage_run)
goto failure; goto failure;
#endif #endif
if (hre_run_program(prg_stage2_prepare, sizeof(prg_stage2_prepare))) if (hre_run_program(tpm, prg_stage2_prepare,
sizeof(prg_stage2_prepare)))
goto failure; goto failure;
/* run "prepboot" from env to get "mmcdev" set */ /* run "prepboot" from env to get "mmcdev" set */
@ -1083,12 +1112,12 @@ static int second_stage_init(void)
} }
puts("CCDM image OK\n"); puts("CCDM image OK\n");
hre_run_program(prg_stage2_success, sizeof(prg_stage2_success)); hre_run_program(tpm, prg_stage2_success, sizeof(prg_stage2_success));
goto end; goto end;
failure: failure:
result = 1; result = 1;
hre_run_program(prg_stage_fail, sizeof(prg_stage_fail)); hre_run_program(tpm, prg_stage_fail, sizeof(prg_stage_fail));
end: end:
if (hmac_blob) if (hmac_blob)
free(hmac_blob); free(hmac_blob);

View File

@ -73,6 +73,40 @@ static int fdt_value_env_set(const void *nodep, int len, const char *var)
return 0; return 0;
} }
static const char * const fdt_member_table[] = {
"magic",
"totalsize",
"off_dt_struct",
"off_dt_strings",
"off_mem_rsvmap",
"version",
"last_comp_version",
"boot_cpuid_phys",
"size_dt_strings",
"size_dt_struct",
};
static int fdt_get_header_value(int argc, char * const argv[])
{
fdt32_t *fdtp = (fdt32_t *)working_fdt;
ulong val;
int i;
if (argv[2][0] != 'g')
return CMD_RET_FAILURE;
for (i = 0; i < ARRAY_SIZE(fdt_member_table); i++) {
if (strcmp(fdt_member_table[i], argv[4]))
continue;
val = fdt32_to_cpu(fdtp[i]);
env_set_hex(argv[3], val);
return CMD_RET_SUCCESS;
}
return CMD_RET_FAILURE;
}
/* /*
* Flattened Device Tree command, see the help for parameter definitions. * Flattened Device Tree command, see the help for parameter definitions.
*/ */
@ -491,6 +525,9 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
* Display header info * Display header info
*/ */
} else if (argv[1][0] == 'h') { } else if (argv[1][0] == 'h') {
if (argc == 5)
return fdt_get_header_value(argc, argv);
u32 version = fdt_version(working_fdt); u32 version = fdt_version(working_fdt);
printf("magic:\t\t\t0x%x\n", fdt_magic(working_fdt)); printf("magic:\t\t\t0x%x\n", fdt_magic(working_fdt));
printf("totalsize:\t\t0x%x (%d)\n", fdt_totalsize(working_fdt), printf("totalsize:\t\t0x%x (%d)\n", fdt_totalsize(working_fdt),
@ -1090,7 +1127,8 @@ static char fdt_help_text[] =
"fdt set <path> <prop> [<val>] - Set <property> [to <val>]\n" "fdt set <path> <prop> [<val>] - Set <property> [to <val>]\n"
"fdt mknode <path> <node> - Create a new node after <path>\n" "fdt mknode <path> <node> - Create a new node after <path>\n"
"fdt rm <path> [<prop>] - Delete the node or <property>\n" "fdt rm <path> [<prop>] - Delete the node or <property>\n"
"fdt header - Display header info\n" "fdt header [get <var> <member>] - Display header info\n"
" get - get header member <member> and store it in <var>\n"
"fdt bootcpu <id> - Set boot cpuid\n" "fdt bootcpu <id> - Set boot cpuid\n"
"fdt memory <addr> <size> - Add/Update memory node\n" "fdt memory <addr> <size> - Add/Update memory node\n"
"fdt rsvmem print - Show current mem reserves\n" "fdt rsvmem print - Show current mem reserves\n"

View File

@ -264,10 +264,16 @@ int do_tpm_info(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
int do_tpm_init(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) int do_tpm_init(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{ {
struct udevice *dev;
int rc;
if (argc != 1) if (argc != 1)
return CMD_RET_USAGE; return CMD_RET_USAGE;
rc = get_tpm(&dev);
if (rc)
return rc;
return report_return_code(tpm_init()); return report_return_code(tpm_init(dev));
} }
int do_tpm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) int do_tpm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])

View File

@ -14,7 +14,12 @@ static int do_tpm_startup(cmd_tbl_t *cmdtp, int flag, int argc,
char * const argv[]) char * const argv[])
{ {
enum tpm_startup_type mode; enum tpm_startup_type mode;
struct udevice *dev;
int rc;
rc = get_tpm(&dev);
if (rc)
return rc;
if (argc != 2) if (argc != 2)
return CMD_RET_USAGE; return CMD_RET_USAGE;
if (!strcasecmp("TPM_ST_CLEAR", argv[1])) { if (!strcasecmp("TPM_ST_CLEAR", argv[1])) {
@ -28,13 +33,19 @@ static int do_tpm_startup(cmd_tbl_t *cmdtp, int flag, int argc,
return CMD_RET_FAILURE; return CMD_RET_FAILURE;
} }
return report_return_code(tpm_startup(mode)); return report_return_code(tpm_startup(dev, mode));
} }
static int do_tpm_nv_define_space(cmd_tbl_t *cmdtp, int flag, int argc, static int do_tpm_nv_define_space(cmd_tbl_t *cmdtp, int flag, int argc,
char * const argv[]) char * const argv[])
{ {
u32 index, perm, size; u32 index, perm, size;
struct udevice *dev;
int rc;
rc = get_tpm(&dev);
if (rc)
return rc;
if (argc != 4) if (argc != 4)
return CMD_RET_USAGE; return CMD_RET_USAGE;
@ -42,22 +53,27 @@ static int do_tpm_nv_define_space(cmd_tbl_t *cmdtp, int flag, int argc,
perm = simple_strtoul(argv[2], NULL, 0); perm = simple_strtoul(argv[2], NULL, 0);
size = simple_strtoul(argv[3], NULL, 0); size = simple_strtoul(argv[3], NULL, 0);
return report_return_code(tpm_nv_define_space(index, perm, size)); return report_return_code(tpm_nv_define_space(dev, index, perm, size));
} }
static int do_tpm_nv_read_value(cmd_tbl_t *cmdtp, int flag, int argc, static int do_tpm_nv_read_value(cmd_tbl_t *cmdtp, int flag, int argc,
char * const argv[]) char * const argv[])
{ {
u32 index, count, rc; u32 index, count, rc;
struct udevice *dev;
void *data; void *data;
rc = get_tpm(&dev);
if (rc)
return rc;
if (argc != 4) if (argc != 4)
return CMD_RET_USAGE; return CMD_RET_USAGE;
index = simple_strtoul(argv[1], NULL, 0); index = simple_strtoul(argv[1], NULL, 0);
data = (void *)simple_strtoul(argv[2], NULL, 0); data = (void *)simple_strtoul(argv[2], NULL, 0);
count = simple_strtoul(argv[3], NULL, 0); count = simple_strtoul(argv[3], NULL, 0);
rc = tpm_nv_read_value(index, data, count); rc = tpm_nv_read_value(dev, index, data, count);
if (!rc) { if (!rc) {
puts("area content:\n"); puts("area content:\n");
print_byte_string(data, count); print_byte_string(data, count);
@ -69,10 +85,15 @@ static int do_tpm_nv_read_value(cmd_tbl_t *cmdtp, int flag, int argc,
static int do_tpm_nv_write_value(cmd_tbl_t *cmdtp, int flag, int argc, static int do_tpm_nv_write_value(cmd_tbl_t *cmdtp, int flag, int argc,
char * const argv[]) char * const argv[])
{ {
struct udevice *dev;
u32 index, rc; u32 index, rc;
size_t count; size_t count;
void *data; void *data;
rc = get_tpm(&dev);
if (rc)
return rc;
if (argc != 3) if (argc != 3)
return CMD_RET_USAGE; return CMD_RET_USAGE;
index = simple_strtoul(argv[1], NULL, 0); index = simple_strtoul(argv[1], NULL, 0);
@ -82,7 +103,7 @@ static int do_tpm_nv_write_value(cmd_tbl_t *cmdtp, int flag, int argc,
return CMD_RET_FAILURE; return CMD_RET_FAILURE;
} }
rc = tpm_nv_write_value(index, data, count); rc = tpm_nv_write_value(dev, index, data, count);
free(data); free(data);
return report_return_code(rc); return report_return_code(rc);
@ -91,8 +112,13 @@ static int do_tpm_nv_write_value(cmd_tbl_t *cmdtp, int flag, int argc,
static int do_tpm_extend(cmd_tbl_t *cmdtp, int flag, int argc, static int do_tpm_extend(cmd_tbl_t *cmdtp, int flag, int argc,
char * const argv[]) char * const argv[])
{ {
u32 index, rc;
u8 in_digest[20], out_digest[20]; u8 in_digest[20], out_digest[20];
struct udevice *dev;
u32 index, rc;
rc = get_tpm(&dev);
if (rc)
return rc;
if (argc != 3) if (argc != 3)
return CMD_RET_USAGE; return CMD_RET_USAGE;
@ -102,7 +128,7 @@ static int do_tpm_extend(cmd_tbl_t *cmdtp, int flag, int argc,
return CMD_RET_FAILURE; return CMD_RET_FAILURE;
} }
rc = tpm_extend(index, in_digest, out_digest); rc = tpm_extend(dev, index, in_digest, out_digest);
if (!rc) { if (!rc) {
puts("PCR value after execution of the command:\n"); puts("PCR value after execution of the command:\n");
print_byte_string(out_digest, sizeof(out_digest)); print_byte_string(out_digest, sizeof(out_digest));
@ -115,15 +141,20 @@ static int do_tpm_pcr_read(cmd_tbl_t *cmdtp, int flag, int argc,
char * const argv[]) char * const argv[])
{ {
u32 index, count, rc; u32 index, count, rc;
struct udevice *dev;
void *data; void *data;
rc = get_tpm(&dev);
if (rc)
return rc;
if (argc != 4) if (argc != 4)
return CMD_RET_USAGE; return CMD_RET_USAGE;
index = simple_strtoul(argv[1], NULL, 0); index = simple_strtoul(argv[1], NULL, 0);
data = (void *)simple_strtoul(argv[2], NULL, 0); data = (void *)simple_strtoul(argv[2], NULL, 0);
count = simple_strtoul(argv[3], NULL, 0); count = simple_strtoul(argv[3], NULL, 0);
rc = tpm_pcr_read(index, data, count); rc = tpm_pcr_read(dev, index, data, count);
if (!rc) { if (!rc) {
puts("Named PCR content:\n"); puts("Named PCR content:\n");
print_byte_string(data, count); print_byte_string(data, count);
@ -135,27 +166,38 @@ static int do_tpm_pcr_read(cmd_tbl_t *cmdtp, int flag, int argc,
static int do_tpm_tsc_physical_presence(cmd_tbl_t *cmdtp, int flag, int argc, static int do_tpm_tsc_physical_presence(cmd_tbl_t *cmdtp, int flag, int argc,
char * const argv[]) char * const argv[])
{ {
struct udevice *dev;
u16 presence; u16 presence;
int rc;
rc = get_tpm(&dev);
if (rc)
return rc;
if (argc != 2) if (argc != 2)
return CMD_RET_USAGE; return CMD_RET_USAGE;
presence = (u16)simple_strtoul(argv[1], NULL, 0); presence = (u16)simple_strtoul(argv[1], NULL, 0);
return report_return_code(tpm_tsc_physical_presence(presence)); return report_return_code(tpm_tsc_physical_presence(dev, presence));
} }
static int do_tpm_read_pubek(cmd_tbl_t *cmdtp, int flag, int argc, static int do_tpm_read_pubek(cmd_tbl_t *cmdtp, int flag, int argc,
char * const argv[]) char * const argv[])
{ {
struct udevice *dev;
u32 count, rc; u32 count, rc;
void *data; void *data;
rc = get_tpm(&dev);
if (rc)
return rc;
if (argc != 3) if (argc != 3)
return CMD_RET_USAGE; return CMD_RET_USAGE;
data = (void *)simple_strtoul(argv[1], NULL, 0); data = (void *)simple_strtoul(argv[1], NULL, 0);
count = simple_strtoul(argv[2], NULL, 0); count = simple_strtoul(argv[2], NULL, 0);
rc = tpm_read_pubek(data, count); rc = tpm_read_pubek(dev, data, count);
if (!rc) { if (!rc) {
puts("pubek value:\n"); puts("pubek value:\n");
print_byte_string(data, count); print_byte_string(data, count);
@ -167,13 +209,19 @@ static int do_tpm_read_pubek(cmd_tbl_t *cmdtp, int flag, int argc,
static int do_tpm_physical_set_deactivated(cmd_tbl_t *cmdtp, int flag, int argc, static int do_tpm_physical_set_deactivated(cmd_tbl_t *cmdtp, int flag, int argc,
char * const argv[]) char * const argv[])
{ {
struct udevice *dev;
u8 state; u8 state;
int rc;
rc = get_tpm(&dev);
if (rc)
return rc;
if (argc != 2) if (argc != 2)
return CMD_RET_USAGE; return CMD_RET_USAGE;
state = (u8)simple_strtoul(argv[1], NULL, 0); state = (u8)simple_strtoul(argv[1], NULL, 0);
return report_return_code(tpm_physical_set_deactivated(state)); return report_return_code(tpm_physical_set_deactivated(dev, state));
} }
static int do_tpm_get_capability(cmd_tbl_t *cmdtp, int flag, int argc, static int do_tpm_get_capability(cmd_tbl_t *cmdtp, int flag, int argc,
@ -182,6 +230,11 @@ static int do_tpm_get_capability(cmd_tbl_t *cmdtp, int flag, int argc,
u32 cap_area, sub_cap, rc; u32 cap_area, sub_cap, rc;
void *cap; void *cap;
size_t count; size_t count;
struct udevice *dev;
rc = get_tpm(&dev);
if (rc)
return rc;
if (argc != 5) if (argc != 5)
return CMD_RET_USAGE; return CMD_RET_USAGE;
@ -190,7 +243,7 @@ static int do_tpm_get_capability(cmd_tbl_t *cmdtp, int flag, int argc,
cap = (void *)simple_strtoul(argv[3], NULL, 0); cap = (void *)simple_strtoul(argv[3], NULL, 0);
count = simple_strtoul(argv[4], NULL, 0); count = simple_strtoul(argv[4], NULL, 0);
rc = tpm_get_capability(cap_area, sub_cap, cap, count); rc = tpm_get_capability(dev, cap_area, sub_cap, cap, count);
if (!rc) { if (!rc) {
puts("capability information:\n"); puts("capability information:\n");
print_byte_string(cap, count); print_byte_string(cap, count);
@ -232,6 +285,12 @@ static int do_tpm_nv_define(cmd_tbl_t *cmdtp, int flag, int argc,
char * const argv[]) char * const argv[])
{ {
u32 index, perm, size; u32 index, perm, size;
struct udevice *dev;
int rc;
rc = get_tpm(&dev);
if (rc)
return rc;
if (argc != 4) if (argc != 4)
return CMD_RET_USAGE; return CMD_RET_USAGE;
@ -243,14 +302,20 @@ static int do_tpm_nv_define(cmd_tbl_t *cmdtp, int flag, int argc,
index = simple_strtoul(argv[2], NULL, 0); index = simple_strtoul(argv[2], NULL, 0);
perm = simple_strtoul(argv[3], NULL, 0); perm = simple_strtoul(argv[3], NULL, 0);
return report_return_code(tpm_nv_define_space(index, perm, size)); return report_return_code(tpm_nv_define_space(dev, index, perm, size));
} }
static int do_tpm_nv_read(cmd_tbl_t *cmdtp, int flag, int argc, static int do_tpm_nv_read(cmd_tbl_t *cmdtp, int flag, int argc,
char * const argv[]) char * const argv[])
{ {
u32 index, count, err; u32 index, count, err;
struct udevice *dev;
void *data; void *data;
int rc;
rc = get_tpm(&dev);
if (rc)
return rc;
if (argc < 3) if (argc < 3)
return CMD_RET_USAGE; return CMD_RET_USAGE;
@ -263,7 +328,7 @@ static int do_tpm_nv_read(cmd_tbl_t *cmdtp, int flag, int argc,
return CMD_RET_USAGE; return CMD_RET_USAGE;
} }
err = tpm_nv_read_value(index, data, count); err = tpm_nv_read_value(dev, index, data, count);
if (!err) { if (!err) {
if (type_string_write_vars(argv[1], data, argv + 3)) { if (type_string_write_vars(argv[1], data, argv + 3)) {
printf("Couldn't write to variables\n"); printf("Couldn't write to variables\n");
@ -279,7 +344,13 @@ static int do_tpm_nv_write(cmd_tbl_t *cmdtp, int flag, int argc,
char * const argv[]) char * const argv[])
{ {
u32 index, count, err; u32 index, count, err;
struct udevice *dev;
void *data; void *data;
int rc;
rc = get_tpm(&dev);
if (rc)
return rc;
if (argc < 3) if (argc < 3)
return CMD_RET_USAGE; return CMD_RET_USAGE;
@ -297,7 +368,7 @@ static int do_tpm_nv_write(cmd_tbl_t *cmdtp, int flag, int argc,
return CMD_RET_USAGE; return CMD_RET_USAGE;
} }
err = tpm_nv_write_value(index, data, count); err = tpm_nv_write_value(dev, index, data, count);
free(data); free(data);
return report_return_code(err); return report_return_code(err);
@ -309,8 +380,14 @@ static int do_tpm_oiap(cmd_tbl_t *cmdtp, int flag, int argc,
char * const argv[]) char * const argv[])
{ {
u32 auth_handle, err; u32 auth_handle, err;
struct udevice *dev;
int rc;
err = tpm_oiap(&auth_handle); rc = get_tpm(&dev);
if (rc)
return rc;
err = tpm_oiap(dev, &auth_handle);
return report_return_code(err); return report_return_code(err);
} }
@ -324,6 +401,11 @@ static int do_tpm_load_key_by_sha1(cmd_tbl_t *cmdtp, int flag, int argc, char *
u8 usage_auth[DIGEST_LENGTH]; u8 usage_auth[DIGEST_LENGTH];
u8 parent_hash[DIGEST_LENGTH]; u8 parent_hash[DIGEST_LENGTH];
void *key; void *key;
struct udevice *dev;
rc = get_tpm(&dev);
if (rc)
return rc;
if (argc < 5) if (argc < 5)
return CMD_RET_USAGE; return CMD_RET_USAGE;
@ -360,6 +442,12 @@ static int do_tpm_load_key2_oiap(cmd_tbl_t *cmdtp, int flag, int argc,
u32 parent_handle, key_len, key_handle, err; u32 parent_handle, key_len, key_handle, err;
u8 usage_auth[DIGEST_LENGTH]; u8 usage_auth[DIGEST_LENGTH];
void *key; void *key;
struct udevice *dev;
int rc;
rc = get_tpm(&dev);
if (rc)
return rc;
if (argc < 5) if (argc < 5)
return CMD_RET_USAGE; return CMD_RET_USAGE;
@ -371,7 +459,7 @@ static int do_tpm_load_key2_oiap(cmd_tbl_t *cmdtp, int flag, int argc,
return CMD_RET_FAILURE; return CMD_RET_FAILURE;
parse_byte_string(argv[4], usage_auth, NULL); parse_byte_string(argv[4], usage_auth, NULL);
err = tpm_load_key2_oiap(parent_handle, key, key_len, usage_auth, err = tpm_load_key2_oiap(dev, parent_handle, key, key_len, usage_auth,
&key_handle); &key_handle);
if (!err) if (!err)
printf("Key handle is 0x%x\n", key_handle); printf("Key handle is 0x%x\n", key_handle);
@ -386,6 +474,12 @@ static int do_tpm_get_pub_key_oiap(cmd_tbl_t *cmdtp, int flag, int argc,
u8 usage_auth[DIGEST_LENGTH]; u8 usage_auth[DIGEST_LENGTH];
u8 pub_key_buffer[TPM_PUBKEY_MAX_LENGTH]; u8 pub_key_buffer[TPM_PUBKEY_MAX_LENGTH];
size_t pub_key_len = sizeof(pub_key_buffer); size_t pub_key_len = sizeof(pub_key_buffer);
struct udevice *dev;
int rc;
rc = get_tpm(&dev);
if (rc)
return rc;
if (argc < 3) if (argc < 3)
return CMD_RET_USAGE; return CMD_RET_USAGE;
@ -395,7 +489,7 @@ static int do_tpm_get_pub_key_oiap(cmd_tbl_t *cmdtp, int flag, int argc,
return CMD_RET_FAILURE; return CMD_RET_FAILURE;
parse_byte_string(argv[2], usage_auth, NULL); parse_byte_string(argv[2], usage_auth, NULL);
err = tpm_get_pub_key_oiap(key_handle, usage_auth, pub_key_buffer, err = tpm_get_pub_key_oiap(dev, key_handle, usage_auth, pub_key_buffer,
&pub_key_len); &pub_key_len);
if (!err) { if (!err) {
printf("dump of received pub key structure:\n"); printf("dump of received pub key structure:\n");
@ -412,7 +506,13 @@ TPM_COMMAND_NO_ARG(tpm_end_oiap)
static int do_tpm_flush(cmd_tbl_t *cmdtp, int flag, int argc, static int do_tpm_flush(cmd_tbl_t *cmdtp, int flag, int argc,
char * const argv[]) char * const argv[])
{ {
struct udevice *dev;
int type = 0; int type = 0;
int rc;
rc = get_tpm(&dev);
if (rc)
return rc;
if (argc != 3) if (argc != 3)
return CMD_RET_USAGE; return CMD_RET_USAGE;
@ -451,7 +551,7 @@ static int do_tpm_flush(cmd_tbl_t *cmdtp, int flag, int argc,
uint i; uint i;
/* fetch list of already loaded resources in the TPM */ /* fetch list of already loaded resources in the TPM */
err = tpm_get_capability(TPM_CAP_HANDLE, type, buf, err = tpm_get_capability(dev, TPM_CAP_HANDLE, type, buf,
sizeof(buf)); sizeof(buf));
if (err) { if (err) {
printf("tpm_get_capability returned error %d.\n", err); printf("tpm_get_capability returned error %d.\n", err);
@ -460,7 +560,7 @@ static int do_tpm_flush(cmd_tbl_t *cmdtp, int flag, int argc,
res_count = get_unaligned_be16(buf); res_count = get_unaligned_be16(buf);
ptr = buf + 2; ptr = buf + 2;
for (i = 0; i < res_count; ++i, ptr += 4) for (i = 0; i < res_count; ++i, ptr += 4)
tpm_flush_specific(get_unaligned_be32(ptr), type); tpm_flush_specific(dev, get_unaligned_be32(ptr), type);
} else { } else {
u32 handle = simple_strtoul(argv[2], NULL, 0); u32 handle = simple_strtoul(argv[2], NULL, 0);
@ -468,7 +568,7 @@ static int do_tpm_flush(cmd_tbl_t *cmdtp, int flag, int argc,
printf("Illegal resource handle %s\n", argv[2]); printf("Illegal resource handle %s\n", argv[2]);
return -1; return -1;
} }
tpm_flush_specific(cpu_to_be32(handle), type); tpm_flush_specific(dev, cpu_to_be32(handle), type);
} }
return 0; return 0;

View File

@ -16,7 +16,12 @@ static int do_tpm2_startup(cmd_tbl_t *cmdtp, int flag, int argc,
char * const argv[]) char * const argv[])
{ {
enum tpm2_startup_types mode; enum tpm2_startup_types mode;
struct udevice *dev;
int ret;
ret = get_tpm(&dev);
if (ret)
return ret;
if (argc != 2) if (argc != 2)
return CMD_RET_USAGE; return CMD_RET_USAGE;
@ -29,14 +34,19 @@ static int do_tpm2_startup(cmd_tbl_t *cmdtp, int flag, int argc,
return CMD_RET_FAILURE; return CMD_RET_FAILURE;
} }
return report_return_code(tpm2_startup(mode)); return report_return_code(tpm2_startup(dev, mode));
} }
static int do_tpm2_self_test(cmd_tbl_t *cmdtp, int flag, int argc, static int do_tpm2_self_test(cmd_tbl_t *cmdtp, int flag, int argc,
char * const argv[]) char * const argv[])
{ {
enum tpm2_yes_no full_test; enum tpm2_yes_no full_test;
struct udevice *dev;
int ret;
ret = get_tpm(&dev);
if (ret)
return ret;
if (argc != 2) if (argc != 2)
return CMD_RET_USAGE; return CMD_RET_USAGE;
@ -49,7 +59,7 @@ static int do_tpm2_self_test(cmd_tbl_t *cmdtp, int flag, int argc,
return CMD_RET_FAILURE; return CMD_RET_FAILURE;
} }
return report_return_code(tpm2_self_test(full_test)); return report_return_code(tpm2_self_test(dev, full_test));
} }
static int do_tpm2_clear(cmd_tbl_t *cmdtp, int flag, int argc, static int do_tpm2_clear(cmd_tbl_t *cmdtp, int flag, int argc,
@ -58,6 +68,12 @@ static int do_tpm2_clear(cmd_tbl_t *cmdtp, int flag, int argc,
u32 handle = 0; u32 handle = 0;
const char *pw = (argc < 3) ? NULL : argv[2]; const char *pw = (argc < 3) ? NULL : argv[2];
const ssize_t pw_sz = pw ? strlen(pw) : 0; const ssize_t pw_sz = pw ? strlen(pw) : 0;
struct udevice *dev;
int ret;
ret = get_tpm(&dev);
if (ret)
return ret;
if (argc < 2 || argc > 3) if (argc < 2 || argc > 3)
return CMD_RET_USAGE; return CMD_RET_USAGE;
@ -72,7 +88,7 @@ static int do_tpm2_clear(cmd_tbl_t *cmdtp, int flag, int argc,
else else
return CMD_RET_USAGE; return CMD_RET_USAGE;
return report_return_code(tpm2_clear(handle, pw, pw_sz)); return report_return_code(tpm2_clear(dev, handle, pw, pw_sz));
} }
static int do_tpm2_pcr_extend(cmd_tbl_t *cmdtp, int flag, int argc, static int do_tpm2_pcr_extend(cmd_tbl_t *cmdtp, int flag, int argc,
@ -88,7 +104,7 @@ static int do_tpm2_pcr_extend(cmd_tbl_t *cmdtp, int flag, int argc,
if (argc != 3) if (argc != 3)
return CMD_RET_USAGE; return CMD_RET_USAGE;
ret = uclass_first_device_err(UCLASS_TPM, &dev); ret = get_tpm(&dev);
if (ret) if (ret)
return ret; return ret;
@ -99,7 +115,7 @@ static int do_tpm2_pcr_extend(cmd_tbl_t *cmdtp, int flag, int argc,
if (index >= priv->pcr_count) if (index >= priv->pcr_count)
return -EINVAL; return -EINVAL;
rc = tpm2_pcr_extend(index, digest); rc = tpm2_pcr_extend(dev, index, digest);
unmap_sysmem(digest); unmap_sysmem(digest);
@ -119,7 +135,7 @@ static int do_tpm_pcr_read(cmd_tbl_t *cmdtp, int flag, int argc,
if (argc != 3) if (argc != 3)
return CMD_RET_USAGE; return CMD_RET_USAGE;
ret = uclass_first_device_err(UCLASS_TPM, &dev); ret = get_tpm(&dev);
if (ret) if (ret)
return ret; return ret;
@ -133,7 +149,7 @@ static int do_tpm_pcr_read(cmd_tbl_t *cmdtp, int flag, int argc,
data = map_sysmem(simple_strtoul(argv[2], NULL, 0), 0); data = map_sysmem(simple_strtoul(argv[2], NULL, 0), 0);
rc = tpm2_pcr_read(index, priv->pcr_select_min, data, &updates); rc = tpm2_pcr_read(dev, index, priv->pcr_select_min, data, &updates);
if (!rc) { if (!rc) {
printf("PCR #%u content (%d known updates):\n", index, updates); printf("PCR #%u content (%d known updates):\n", index, updates);
print_byte_string(data, TPM2_DIGEST_LEN); print_byte_string(data, TPM2_DIGEST_LEN);
@ -151,6 +167,12 @@ static int do_tpm_get_capability(cmd_tbl_t *cmdtp, int flag, int argc,
u8 *data; u8 *data;
size_t count; size_t count;
int i, j; int i, j;
struct udevice *dev;
int ret;
ret = get_tpm(&dev);
if (ret)
return ret;
if (argc != 5) if (argc != 5)
return CMD_RET_USAGE; return CMD_RET_USAGE;
@ -160,7 +182,7 @@ static int do_tpm_get_capability(cmd_tbl_t *cmdtp, int flag, int argc,
data = map_sysmem(simple_strtoul(argv[3], NULL, 0), 0); data = map_sysmem(simple_strtoul(argv[3], NULL, 0), 0);
count = simple_strtoul(argv[4], NULL, 0); count = simple_strtoul(argv[4], NULL, 0);
rc = tpm2_get_capability(capability, property, data, count); rc = tpm2_get_capability(dev, capability, property, data, count);
if (rc) if (rc)
goto unmap_data; goto unmap_data;
@ -186,6 +208,12 @@ static int do_tpm_dam_reset(cmd_tbl_t *cmdtp, int flag, int argc,
{ {
const char *pw = (argc < 2) ? NULL : argv[1]; const char *pw = (argc < 2) ? NULL : argv[1];
const ssize_t pw_sz = pw ? strlen(pw) : 0; const ssize_t pw_sz = pw ? strlen(pw) : 0;
struct udevice *dev;
int ret;
ret = get_tpm(&dev);
if (ret)
return ret;
if (argc > 2) if (argc > 2)
return CMD_RET_USAGE; return CMD_RET_USAGE;
@ -193,7 +221,7 @@ static int do_tpm_dam_reset(cmd_tbl_t *cmdtp, int flag, int argc,
if (pw_sz > TPM2_DIGEST_LEN) if (pw_sz > TPM2_DIGEST_LEN)
return -EINVAL; return -EINVAL;
return report_return_code(tpm2_dam_reset(pw, pw_sz)); return report_return_code(tpm2_dam_reset(dev, pw, pw_sz));
} }
static int do_tpm_dam_parameters(cmd_tbl_t *cmdtp, int flag, int argc, static int do_tpm_dam_parameters(cmd_tbl_t *cmdtp, int flag, int argc,
@ -208,6 +236,12 @@ static int do_tpm_dam_parameters(cmd_tbl_t *cmdtp, int flag, int argc,
unsigned long int max_tries; unsigned long int max_tries;
unsigned long int recovery_time; unsigned long int recovery_time;
unsigned long int lockout_recovery; unsigned long int lockout_recovery;
struct udevice *dev;
int ret;
ret = get_tpm(&dev);
if (ret)
return ret;
if (argc < 4 || argc > 5) if (argc < 4 || argc > 5)
return CMD_RET_USAGE; return CMD_RET_USAGE;
@ -229,7 +263,7 @@ static int do_tpm_dam_parameters(cmd_tbl_t *cmdtp, int flag, int argc,
log(LOGC_NONE, LOGL_INFO, "- recoveryTime: %lu\n", recovery_time); log(LOGC_NONE, LOGL_INFO, "- recoveryTime: %lu\n", recovery_time);
log(LOGC_NONE, LOGL_INFO, "- lockoutRecovery: %lu\n", lockout_recovery); log(LOGC_NONE, LOGL_INFO, "- lockoutRecovery: %lu\n", lockout_recovery);
return report_return_code(tpm2_dam_parameters(pw, pw_sz, max_tries, return report_return_code(tpm2_dam_parameters(dev, pw, pw_sz, max_tries,
recovery_time, recovery_time,
lockout_recovery)); lockout_recovery));
} }
@ -242,6 +276,12 @@ static int do_tpm_change_auth(cmd_tbl_t *cmdtp, int flag, int argc,
const char *oldpw = (argc == 3) ? NULL : argv[3]; const char *oldpw = (argc == 3) ? NULL : argv[3];
const ssize_t newpw_sz = strlen(newpw); const ssize_t newpw_sz = strlen(newpw);
const ssize_t oldpw_sz = oldpw ? strlen(oldpw) : 0; const ssize_t oldpw_sz = oldpw ? strlen(oldpw) : 0;
struct udevice *dev;
int ret;
ret = get_tpm(&dev);
if (ret)
return ret;
if (argc < 3 || argc > 4) if (argc < 3 || argc > 4)
return CMD_RET_USAGE; return CMD_RET_USAGE;
@ -260,7 +300,7 @@ static int do_tpm_change_auth(cmd_tbl_t *cmdtp, int flag, int argc,
else else
return CMD_RET_USAGE; return CMD_RET_USAGE;
return report_return_code(tpm2_change_auth(handle, newpw, newpw_sz, return report_return_code(tpm2_change_auth(dev, handle, newpw, newpw_sz,
oldpw, oldpw_sz)); oldpw, oldpw_sz));
} }
@ -271,6 +311,12 @@ static int do_tpm_pcr_setauthpolicy(cmd_tbl_t *cmdtp, int flag, int argc,
char *key = argv[2]; char *key = argv[2];
const char *pw = (argc < 4) ? NULL : argv[3]; const char *pw = (argc < 4) ? NULL : argv[3];
const ssize_t pw_sz = pw ? strlen(pw) : 0; const ssize_t pw_sz = pw ? strlen(pw) : 0;
struct udevice *dev;
int ret;
ret = get_tpm(&dev);
if (ret)
return ret;
if (strlen(key) != TPM2_DIGEST_LEN) if (strlen(key) != TPM2_DIGEST_LEN)
return -EINVAL; return -EINVAL;
@ -278,7 +324,7 @@ static int do_tpm_pcr_setauthpolicy(cmd_tbl_t *cmdtp, int flag, int argc,
if (argc < 3 || argc > 4) if (argc < 3 || argc > 4)
return CMD_RET_USAGE; return CMD_RET_USAGE;
return report_return_code(tpm2_pcr_setauthpolicy(pw, pw_sz, index, return report_return_code(tpm2_pcr_setauthpolicy(dev, pw, pw_sz, index,
key)); key));
} }
@ -290,6 +336,12 @@ static int do_tpm_pcr_setauthvalue(cmd_tbl_t *cmdtp, int flag,
const ssize_t key_sz = strlen(key); const ssize_t key_sz = strlen(key);
const char *pw = (argc < 4) ? NULL : argv[3]; const char *pw = (argc < 4) ? NULL : argv[3];
const ssize_t pw_sz = pw ? strlen(pw) : 0; const ssize_t pw_sz = pw ? strlen(pw) : 0;
struct udevice *dev;
int ret;
ret = get_tpm(&dev);
if (ret)
return ret;
if (strlen(key) != TPM2_DIGEST_LEN) if (strlen(key) != TPM2_DIGEST_LEN)
return -EINVAL; return -EINVAL;
@ -297,7 +349,7 @@ static int do_tpm_pcr_setauthvalue(cmd_tbl_t *cmdtp, int flag,
if (argc < 3 || argc > 4) if (argc < 3 || argc > 4)
return CMD_RET_USAGE; return CMD_RET_USAGE;
return report_return_code(tpm2_pcr_setauthvalue(pw, pw_sz, index, return report_return_code(tpm2_pcr_setauthvalue(dev, pw, pw_sz, index,
key, key_sz)); key, key_sz));
} }

View File

@ -7,6 +7,7 @@
#include <command.h> #include <command.h>
#include <environment.h> #include <environment.h>
#include <tpm-v1.h> #include <tpm-v1.h>
#include "tpm-user-utils.h"
/* Prints error and returns on failure */ /* Prints error and returns on failure */
#define TPM_CHECK(tpm_command) do { \ #define TPM_CHECK(tpm_command) do { \
@ -28,26 +29,26 @@
#define PHYS_PRESENCE 4 #define PHYS_PRESENCE 4
#define PRESENCE 8 #define PRESENCE 8
static uint32_t TlclStartupIfNeeded(void) static uint32_t TlclStartupIfNeeded(struct udevice *dev)
{ {
uint32_t result = tpm_startup(TPM_ST_CLEAR); uint32_t result = tpm_startup(dev, TPM_ST_CLEAR);
return result == TPM_INVALID_POSTINIT ? TPM_SUCCESS : result; return result == TPM_INVALID_POSTINIT ? TPM_SUCCESS : result;
} }
static int test_timer(void) static int test_timer(struct udevice *dev)
{ {
printf("get_timer(0) = %lu\n", get_timer(0)); printf("get_timer(0) = %lu\n", get_timer(0));
return 0; return 0;
} }
static uint32_t tpm_get_flags(uint8_t *disable, uint8_t *deactivated, static uint32_t tpm_get_flags(struct udevice *dev, uint8_t *disable,
uint8_t *nvlocked) uint8_t *deactivated, uint8_t *nvlocked)
{ {
struct tpm_permanent_flags pflags; struct tpm_permanent_flags pflags;
uint32_t result; uint32_t result;
result = tpm_get_permanent_flags(&pflags); result = tpm_get_permanent_flags(dev, &pflags);
if (result) if (result)
return result; return result;
if (disable) if (disable)
@ -62,79 +63,79 @@ static uint32_t tpm_get_flags(uint8_t *disable, uint8_t *deactivated,
return 0; return 0;
} }
static uint32_t tpm_nv_write_value_lock(uint32_t index) static uint32_t tpm_nv_write_value_lock(struct udevice *dev, uint32_t index)
{ {
debug("TPM: Write lock 0x%x\n", index); debug("TPM: Write lock 0x%x\n", index);
return tpm_nv_write_value(index, NULL, 0); return tpm_nv_write_value(dev, index, NULL, 0);
} }
static int tpm_is_owned(void) static int tpm_is_owned(struct udevice *dev)
{ {
uint8_t response[TPM_PUBEK_SIZE]; uint8_t response[TPM_PUBEK_SIZE];
uint32_t result; uint32_t result;
result = tpm_read_pubek(response, sizeof(response)); result = tpm_read_pubek(dev, response, sizeof(response));
return result != TPM_SUCCESS; return result != TPM_SUCCESS;
} }
static int test_early_extend(void) static int test_early_extend(struct udevice *dev)
{ {
uint8_t value_in[20]; uint8_t value_in[20];
uint8_t value_out[20]; uint8_t value_out[20];
printf("Testing earlyextend ..."); printf("Testing earlyextend ...");
tpm_init(); tpm_init(dev);
TPM_CHECK(tpm_startup(TPM_ST_CLEAR)); TPM_CHECK(tpm_startup(dev, TPM_ST_CLEAR));
TPM_CHECK(tpm_continue_self_test()); TPM_CHECK(tpm_continue_self_test(dev));
TPM_CHECK(tpm_extend(1, value_in, value_out)); TPM_CHECK(tpm_extend(dev, 1, value_in, value_out));
printf("done\n"); printf("done\n");
return 0; return 0;
} }
static int test_early_nvram(void) static int test_early_nvram(struct udevice *dev)
{ {
uint32_t x; uint32_t x;
printf("Testing earlynvram ..."); printf("Testing earlynvram ...");
tpm_init(); tpm_init(dev);
TPM_CHECK(tpm_startup(TPM_ST_CLEAR)); TPM_CHECK(tpm_startup(dev, TPM_ST_CLEAR));
TPM_CHECK(tpm_continue_self_test()); TPM_CHECK(tpm_continue_self_test(dev));
TPM_CHECK(tpm_tsc_physical_presence(PRESENCE)); TPM_CHECK(tpm_tsc_physical_presence(dev, PRESENCE));
TPM_CHECK(tpm_nv_read_value(INDEX0, (uint8_t *)&x, sizeof(x))); TPM_CHECK(tpm_nv_read_value(dev, INDEX0, (uint8_t *)&x, sizeof(x)));
printf("done\n"); printf("done\n");
return 0; return 0;
} }
static int test_early_nvram2(void) static int test_early_nvram2(struct udevice *dev)
{ {
uint32_t x; uint32_t x;
printf("Testing earlynvram2 ..."); printf("Testing earlynvram2 ...");
tpm_init(); tpm_init(dev);
TPM_CHECK(tpm_startup(TPM_ST_CLEAR)); TPM_CHECK(tpm_startup(dev, TPM_ST_CLEAR));
TPM_CHECK(tpm_continue_self_test()); TPM_CHECK(tpm_continue_self_test(dev));
TPM_CHECK(tpm_tsc_physical_presence(PRESENCE)); TPM_CHECK(tpm_tsc_physical_presence(dev, PRESENCE));
TPM_CHECK(tpm_nv_write_value(INDEX0, (uint8_t *)&x, sizeof(x))); TPM_CHECK(tpm_nv_write_value(dev, INDEX0, (uint8_t *)&x, sizeof(x)));
printf("done\n"); printf("done\n");
return 0; return 0;
} }
static int test_enable(void) static int test_enable(struct udevice *dev)
{ {
uint8_t disable = 0, deactivated = 0; uint8_t disable = 0, deactivated = 0;
printf("Testing enable ...\n"); printf("Testing enable ...\n");
tpm_init(); tpm_init(dev);
TPM_CHECK(TlclStartupIfNeeded()); TPM_CHECK(TlclStartupIfNeeded(dev));
TPM_CHECK(tpm_self_test_full()); TPM_CHECK(tpm_self_test_full(dev));
TPM_CHECK(tpm_tsc_physical_presence(PRESENCE)); TPM_CHECK(tpm_tsc_physical_presence(dev, PRESENCE));
TPM_CHECK(tpm_get_flags(&disable, &deactivated, NULL)); TPM_CHECK(tpm_get_flags(dev, &disable, &deactivated, NULL));
printf("\tdisable is %d, deactivated is %d\n", disable, deactivated); printf("\tdisable is %d, deactivated is %d\n", disable, deactivated);
TPM_CHECK(tpm_physical_enable()); TPM_CHECK(tpm_physical_enable(dev));
TPM_CHECK(tpm_physical_set_deactivated(0)); TPM_CHECK(tpm_physical_set_deactivated(dev, 0));
TPM_CHECK(tpm_get_flags(&disable, &deactivated, NULL)); TPM_CHECK(tpm_get_flags(dev, &disable, &deactivated, NULL));
printf("\tdisable is %d, deactivated is %d\n", disable, deactivated); printf("\tdisable is %d, deactivated is %d\n", disable, deactivated);
if (disable == 1 || deactivated == 1) if (disable == 1 || deactivated == 1)
printf("\tfailed to enable or activate\n"); printf("\tfailed to enable or activate\n");
@ -147,27 +148,27 @@ static int test_enable(void)
reset_cpu(0); \ reset_cpu(0); \
} while (0) } while (0)
static int test_fast_enable(void) static int test_fast_enable(struct udevice *dev)
{ {
uint8_t disable = 0, deactivated = 0; uint8_t disable = 0, deactivated = 0;
int i; int i;
printf("Testing fastenable ...\n"); printf("Testing fastenable ...\n");
tpm_init(); tpm_init(dev);
TPM_CHECK(TlclStartupIfNeeded()); TPM_CHECK(TlclStartupIfNeeded(dev));
TPM_CHECK(tpm_self_test_full()); TPM_CHECK(tpm_self_test_full(dev));
TPM_CHECK(tpm_tsc_physical_presence(PRESENCE)); TPM_CHECK(tpm_tsc_physical_presence(dev, PRESENCE));
TPM_CHECK(tpm_get_flags(&disable, &deactivated, NULL)); TPM_CHECK(tpm_get_flags(dev, &disable, &deactivated, NULL));
printf("\tdisable is %d, deactivated is %d\n", disable, deactivated); printf("\tdisable is %d, deactivated is %d\n", disable, deactivated);
for (i = 0; i < 2; i++) { for (i = 0; i < 2; i++) {
TPM_CHECK(tpm_force_clear()); TPM_CHECK(tpm_force_clear(dev));
TPM_CHECK(tpm_get_flags(&disable, &deactivated, NULL)); TPM_CHECK(tpm_get_flags(dev, &disable, &deactivated, NULL));
printf("\tdisable is %d, deactivated is %d\n", disable, printf("\tdisable is %d, deactivated is %d\n", disable,
deactivated); deactivated);
assert(disable == 1 && deactivated == 1); assert(disable == 1 && deactivated == 1);
TPM_CHECK(tpm_physical_enable()); TPM_CHECK(tpm_physical_enable(dev));
TPM_CHECK(tpm_physical_set_deactivated(0)); TPM_CHECK(tpm_physical_set_deactivated(dev, 0));
TPM_CHECK(tpm_get_flags(&disable, &deactivated, NULL)); TPM_CHECK(tpm_get_flags(dev, &disable, &deactivated, NULL));
printf("\tdisable is %d, deactivated is %d\n", disable, printf("\tdisable is %d, deactivated is %d\n", disable,
deactivated); deactivated);
assert(disable == 0 && deactivated == 0); assert(disable == 0 && deactivated == 0);
@ -176,105 +177,109 @@ static int test_fast_enable(void)
return 0; return 0;
} }
static int test_global_lock(void) static int test_global_lock(struct udevice *dev)
{ {
uint32_t zero = 0; uint32_t zero = 0;
uint32_t result; uint32_t result;
uint32_t x; uint32_t x;
printf("Testing globallock ...\n"); printf("Testing globallock ...\n");
tpm_init(); tpm_init(dev);
TPM_CHECK(TlclStartupIfNeeded()); TPM_CHECK(TlclStartupIfNeeded(dev));
TPM_CHECK(tpm_self_test_full()); TPM_CHECK(tpm_self_test_full(dev));
TPM_CHECK(tpm_tsc_physical_presence(PRESENCE)); TPM_CHECK(tpm_tsc_physical_presence(dev, PRESENCE));
TPM_CHECK(tpm_nv_read_value(INDEX0, (uint8_t *)&x, sizeof(x))); TPM_CHECK(tpm_nv_read_value(dev, INDEX0, (uint8_t *)&x, sizeof(x)));
TPM_CHECK(tpm_nv_write_value(INDEX0, (uint8_t *)&zero, TPM_CHECK(tpm_nv_write_value(dev, INDEX0, (uint8_t *)&zero,
sizeof(uint32_t))); sizeof(uint32_t)));
TPM_CHECK(tpm_nv_read_value(INDEX1, (uint8_t *)&x, sizeof(x))); TPM_CHECK(tpm_nv_read_value(dev, INDEX1, (uint8_t *)&x, sizeof(x)));
TPM_CHECK(tpm_nv_write_value(INDEX1, (uint8_t *)&zero, TPM_CHECK(tpm_nv_write_value(dev, INDEX1, (uint8_t *)&zero,
sizeof(uint32_t))); sizeof(uint32_t)));
TPM_CHECK(tpm_set_global_lock()); TPM_CHECK(tpm_set_global_lock(dev));
/* Verifies that write to index0 fails */ /* Verifies that write to index0 fails */
x = 1; x = 1;
result = tpm_nv_write_value(INDEX0, (uint8_t *)&x, sizeof(x)); result = tpm_nv_write_value(dev, INDEX0, (uint8_t *)&x, sizeof(x));
assert(result == TPM_AREA_LOCKED); assert(result == TPM_AREA_LOCKED);
TPM_CHECK(tpm_nv_read_value(INDEX0, (uint8_t *)&x, sizeof(x))); TPM_CHECK(tpm_nv_read_value(dev, INDEX0, (uint8_t *)&x, sizeof(x)));
assert(x == 0); assert(x == 0);
/* Verifies that write to index1 is still possible */ /* Verifies that write to index1 is still possible */
x = 2; x = 2;
TPM_CHECK(tpm_nv_write_value(INDEX1, (uint8_t *)&x, sizeof(x))); TPM_CHECK(tpm_nv_write_value(dev, INDEX1, (uint8_t *)&x, sizeof(x)));
TPM_CHECK(tpm_nv_read_value(INDEX1, (uint8_t *)&x, sizeof(x))); TPM_CHECK(tpm_nv_read_value(dev, INDEX1, (uint8_t *)&x, sizeof(x)));
assert(x == 2); assert(x == 2);
/* Turns off PP */ /* Turns off PP */
tpm_tsc_physical_presence(PHYS_PRESENCE); tpm_tsc_physical_presence(dev, PHYS_PRESENCE);
/* Verifies that write to index1 fails */ /* Verifies that write to index1 fails */
x = 3; x = 3;
result = tpm_nv_write_value(INDEX1, (uint8_t *)&x, sizeof(x)); result = tpm_nv_write_value(dev, INDEX1, (uint8_t *)&x, sizeof(x));
assert(result == TPM_BAD_PRESENCE); assert(result == TPM_BAD_PRESENCE);
TPM_CHECK(tpm_nv_read_value(INDEX1, (uint8_t *)&x, sizeof(x))); TPM_CHECK(tpm_nv_read_value(dev, INDEX1, (uint8_t *)&x, sizeof(x)));
assert(x == 2); assert(x == 2);
printf("\tdone\n"); printf("\tdone\n");
return 0; return 0;
} }
static int test_lock(void) static int test_lock(struct udevice *dev)
{ {
printf("Testing lock ...\n"); printf("Testing lock ...\n");
tpm_init(); tpm_init(dev);
tpm_startup(TPM_ST_CLEAR); tpm_startup(dev, TPM_ST_CLEAR);
tpm_self_test_full(); tpm_self_test_full(dev);
tpm_tsc_physical_presence(PRESENCE); tpm_tsc_physical_presence(dev, PRESENCE);
tpm_nv_write_value_lock(INDEX0); tpm_nv_write_value_lock(dev, INDEX0);
printf("\tLocked 0x%x\n", INDEX0); printf("\tLocked 0x%x\n", INDEX0);
printf("\tdone\n"); printf("\tdone\n");
return 0; return 0;
} }
static void initialise_spaces(void) static void initialise_spaces(struct udevice *dev)
{ {
uint32_t zero = 0; uint32_t zero = 0;
uint32_t perm = TPM_NV_PER_WRITE_STCLEAR | TPM_NV_PER_PPWRITE; uint32_t perm = TPM_NV_PER_WRITE_STCLEAR | TPM_NV_PER_PPWRITE;
printf("\tInitialising spaces\n"); printf("\tInitialising spaces\n");
tpm_nv_set_locked(); /* useful only the first time */ tpm_nv_set_locked(dev); /* useful only the first time */
tpm_nv_define_space(INDEX0, perm, 4); tpm_nv_define_space(dev, INDEX0, perm, 4);
tpm_nv_write_value(INDEX0, (uint8_t *)&zero, 4); tpm_nv_write_value(dev, INDEX0, (uint8_t *)&zero, 4);
tpm_nv_define_space(INDEX1, perm, 4); tpm_nv_define_space(dev, INDEX1, perm, 4);
tpm_nv_write_value(INDEX1, (uint8_t *)&zero, 4); tpm_nv_write_value(dev, INDEX1, (uint8_t *)&zero, 4);
tpm_nv_define_space(INDEX2, perm, 4); tpm_nv_define_space(dev, INDEX2, perm, 4);
tpm_nv_write_value(INDEX2, (uint8_t *)&zero, 4); tpm_nv_write_value(dev, INDEX2, (uint8_t *)&zero, 4);
tpm_nv_define_space(INDEX3, perm, 4); tpm_nv_define_space(dev, INDEX3, perm, 4);
tpm_nv_write_value(INDEX3, (uint8_t *)&zero, 4); tpm_nv_write_value(dev, INDEX3, (uint8_t *)&zero, 4);
perm = TPM_NV_PER_READ_STCLEAR | TPM_NV_PER_WRITE_STCLEAR | perm = TPM_NV_PER_READ_STCLEAR | TPM_NV_PER_WRITE_STCLEAR |
TPM_NV_PER_PPWRITE; TPM_NV_PER_PPWRITE;
tpm_nv_define_space(INDEX_INITIALISED, perm, 1); tpm_nv_define_space(dev, INDEX_INITIALISED, perm, 1);
} }
static int test_readonly(void) static int test_readonly(struct udevice *dev)
{ {
uint8_t c; uint8_t c;
uint32_t index_0, index_1, index_2, index_3; uint32_t index_0, index_1, index_2, index_3;
int read0, read1, read2, read3; int read0, read1, read2, read3;
printf("Testing readonly ...\n"); printf("Testing readonly ...\n");
tpm_init(); tpm_init(dev);
tpm_startup(TPM_ST_CLEAR); tpm_startup(dev, TPM_ST_CLEAR);
tpm_self_test_full(); tpm_self_test_full(dev);
tpm_tsc_physical_presence(PRESENCE); tpm_tsc_physical_presence(dev, PRESENCE);
/* /*
* Checks if initialisation has completed by trying to read-lock a * Checks if initialisation has completed by trying to read-lock a
* space that's created at the end of initialisation * space that's created at the end of initialisation
*/ */
if (tpm_nv_read_value(INDEX_INITIALISED, &c, 0) == TPM_BADINDEX) { if (tpm_nv_read_value(dev, INDEX_INITIALISED, &c, 0) == TPM_BADINDEX) {
/* The initialisation did not complete */ /* The initialisation did not complete */
initialise_spaces(); initialise_spaces(dev);
} }
/* Checks if spaces are OK or messed up */ /* Checks if spaces are OK or messed up */
read0 = tpm_nv_read_value(INDEX0, (uint8_t *)&index_0, sizeof(index_0)); read0 = tpm_nv_read_value(dev, INDEX0, (uint8_t *)&index_0,
read1 = tpm_nv_read_value(INDEX1, (uint8_t *)&index_1, sizeof(index_1)); sizeof(index_0));
read2 = tpm_nv_read_value(INDEX2, (uint8_t *)&index_2, sizeof(index_2)); read1 = tpm_nv_read_value(dev, INDEX1, (uint8_t *)&index_1,
read3 = tpm_nv_read_value(INDEX3, (uint8_t *)&index_3, sizeof(index_3)); sizeof(index_1));
read2 = tpm_nv_read_value(dev, INDEX2, (uint8_t *)&index_2,
sizeof(index_2));
read3 = tpm_nv_read_value(dev, INDEX3, (uint8_t *)&index_3,
sizeof(index_3));
if (read0 || read1 || read2 || read3) { if (read0 || read1 || read2 || read3) {
printf("Invalid contents\n"); printf("Invalid contents\n");
return 0; return 0;
@ -285,12 +290,14 @@ static int test_readonly(void)
* I really wish I could use the imperative. * I really wish I could use the imperative.
*/ */
index_0 += 1; index_0 += 1;
if (tpm_nv_write_value(INDEX0, (uint8_t *)&index_0, sizeof(index_0) != if (tpm_nv_write_value(dev, INDEX0, (uint8_t *)&index_0,
sizeof(index_0) !=
TPM_SUCCESS)) { TPM_SUCCESS)) {
pr_err("\tcould not write index 0\n"); pr_err("\tcould not write index 0\n");
} }
tpm_nv_write_value_lock(INDEX0); tpm_nv_write_value_lock(dev, INDEX0);
if (tpm_nv_write_value(INDEX0, (uint8_t *)&index_0, sizeof(index_0)) == if (tpm_nv_write_value(dev, INDEX0, (uint8_t *)&index_0,
sizeof(index_0)) ==
TPM_SUCCESS) TPM_SUCCESS)
pr_err("\tindex 0 is not locked\n"); pr_err("\tindex 0 is not locked\n");
@ -298,49 +305,49 @@ static int test_readonly(void)
return 0; return 0;
} }
static int test_redefine_unowned(void) static int test_redefine_unowned(struct udevice *dev)
{ {
uint32_t perm; uint32_t perm;
uint32_t result; uint32_t result;
uint32_t x; uint32_t x;
printf("Testing redefine_unowned ..."); printf("Testing redefine_unowned ...");
tpm_init(); tpm_init(dev);
TPM_CHECK(TlclStartupIfNeeded()); TPM_CHECK(TlclStartupIfNeeded(dev));
TPM_CHECK(tpm_self_test_full()); TPM_CHECK(tpm_self_test_full(dev));
TPM_CHECK(tpm_tsc_physical_presence(PRESENCE)); TPM_CHECK(tpm_tsc_physical_presence(dev, PRESENCE));
assert(!tpm_is_owned()); assert(!tpm_is_owned(dev));
/* Ensures spaces exist. */ /* Ensures spaces exist. */
TPM_CHECK(tpm_nv_read_value(INDEX0, (uint8_t *)&x, sizeof(x))); TPM_CHECK(tpm_nv_read_value(dev, INDEX0, (uint8_t *)&x, sizeof(x)));
TPM_CHECK(tpm_nv_read_value(INDEX1, (uint8_t *)&x, sizeof(x))); TPM_CHECK(tpm_nv_read_value(dev, INDEX1, (uint8_t *)&x, sizeof(x)));
/* Redefines spaces a couple of times. */ /* Redefines spaces a couple of times. */
perm = TPM_NV_PER_PPWRITE | TPM_NV_PER_GLOBALLOCK; perm = TPM_NV_PER_PPWRITE | TPM_NV_PER_GLOBALLOCK;
TPM_CHECK(tpm_nv_define_space(INDEX0, perm, 2 * sizeof(uint32_t))); TPM_CHECK(tpm_nv_define_space(dev, INDEX0, perm, 2 * sizeof(uint32_t)));
TPM_CHECK(tpm_nv_define_space(INDEX0, perm, sizeof(uint32_t))); TPM_CHECK(tpm_nv_define_space(dev, INDEX0, perm, sizeof(uint32_t)));
perm = TPM_NV_PER_PPWRITE; perm = TPM_NV_PER_PPWRITE;
TPM_CHECK(tpm_nv_define_space(INDEX1, perm, 2 * sizeof(uint32_t))); TPM_CHECK(tpm_nv_define_space(dev, INDEX1, perm, 2 * sizeof(uint32_t)));
TPM_CHECK(tpm_nv_define_space(INDEX1, perm, sizeof(uint32_t))); TPM_CHECK(tpm_nv_define_space(dev, INDEX1, perm, sizeof(uint32_t)));
/* Sets the global lock */ /* Sets the global lock */
tpm_set_global_lock(); tpm_set_global_lock(dev);
/* Verifies that index0 cannot be redefined */ /* Verifies that index0 cannot be redefined */
result = tpm_nv_define_space(INDEX0, perm, sizeof(uint32_t)); result = tpm_nv_define_space(dev, INDEX0, perm, sizeof(uint32_t));
assert(result == TPM_AREA_LOCKED); assert(result == TPM_AREA_LOCKED);
/* Checks that index1 can */ /* Checks that index1 can */
TPM_CHECK(tpm_nv_define_space(INDEX1, perm, 2 * sizeof(uint32_t))); TPM_CHECK(tpm_nv_define_space(dev, INDEX1, perm, 2 * sizeof(uint32_t)));
TPM_CHECK(tpm_nv_define_space(INDEX1, perm, sizeof(uint32_t))); TPM_CHECK(tpm_nv_define_space(dev, INDEX1, perm, sizeof(uint32_t)));
/* Turns off PP */ /* Turns off PP */
tpm_tsc_physical_presence(PHYS_PRESENCE); tpm_tsc_physical_presence(dev, PHYS_PRESENCE);
/* Verifies that neither index0 nor index1 can be redefined */ /* Verifies that neither index0 nor index1 can be redefined */
result = tpm_nv_define_space(INDEX0, perm, sizeof(uint32_t)); result = tpm_nv_define_space(dev, INDEX0, perm, sizeof(uint32_t));
assert(result == TPM_BAD_PRESENCE); assert(result == TPM_BAD_PRESENCE);
result = tpm_nv_define_space(INDEX1, perm, sizeof(uint32_t)); result = tpm_nv_define_space(dev, INDEX1, perm, sizeof(uint32_t));
assert(result == TPM_BAD_PRESENCE); assert(result == TPM_BAD_PRESENCE);
printf("done\n"); printf("done\n");
@ -350,38 +357,39 @@ static int test_redefine_unowned(void)
#define PERMPPGL (TPM_NV_PER_PPWRITE | TPM_NV_PER_GLOBALLOCK) #define PERMPPGL (TPM_NV_PER_PPWRITE | TPM_NV_PER_GLOBALLOCK)
#define PERMPP TPM_NV_PER_PPWRITE #define PERMPP TPM_NV_PER_PPWRITE
static int test_space_perm(void) static int test_space_perm(struct udevice *dev)
{ {
uint32_t perm; uint32_t perm;
printf("Testing spaceperm ..."); printf("Testing spaceperm ...");
tpm_init(); tpm_init(dev);
TPM_CHECK(TlclStartupIfNeeded()); TPM_CHECK(TlclStartupIfNeeded(dev));
TPM_CHECK(tpm_continue_self_test()); TPM_CHECK(tpm_continue_self_test(dev));
TPM_CHECK(tpm_tsc_physical_presence(PRESENCE)); TPM_CHECK(tpm_tsc_physical_presence(dev, PRESENCE));
TPM_CHECK(tpm_get_permissions(INDEX0, &perm)); TPM_CHECK(tpm_get_permissions(dev, INDEX0, &perm));
assert((perm & PERMPPGL) == PERMPPGL); assert((perm & PERMPPGL) == PERMPPGL);
TPM_CHECK(tpm_get_permissions(INDEX1, &perm)); TPM_CHECK(tpm_get_permissions(dev, INDEX1, &perm));
assert((perm & PERMPP) == PERMPP); assert((perm & PERMPP) == PERMPP);
printf("done\n"); printf("done\n");
return 0; return 0;
} }
static int test_startup(void) static int test_startup(struct udevice *dev)
{ {
uint32_t result; uint32_t result;
printf("Testing startup ...\n"); printf("Testing startup ...\n");
tpm_init(); tpm_init(dev);
result = tpm_startup(TPM_ST_CLEAR); result = tpm_startup(dev, TPM_ST_CLEAR);
if (result != 0 && result != TPM_INVALID_POSTINIT) if (result != 0 && result != TPM_INVALID_POSTINIT)
printf("\ttpm startup failed with 0x%x\n", result); printf("\ttpm startup failed with 0x%x\n", result);
result = tpm_get_flags(NULL, NULL, NULL); result = tpm_get_flags(dev, NULL, NULL, NULL);
if (result != 0) if (result != 0)
printf("\ttpm getflags failed with 0x%x\n", result); printf("\ttpm getflags failed with 0x%x\n", result);
printf("\texecuting SelfTestFull\n"); printf("\texecuting SelfTestFull\n");
tpm_self_test_full(); tpm_self_test_full(dev);
result = tpm_get_flags(NULL, NULL, NULL); result = tpm_get_flags(dev, NULL, NULL, NULL);
if (result != 0) if (result != 0)
printf("\ttpm getflags failed with 0x%x\n", result); printf("\ttpm getflags failed with 0x%x\n", result);
printf("\tdone\n"); printf("\tdone\n");
@ -410,45 +418,48 @@ static int test_startup(void)
} while (0) } while (0)
static int test_timing(void) static int test_timing(struct udevice *dev)
{ {
uint32_t x;
uint8_t in[20], out[20]; uint8_t in[20], out[20];
uint32_t x;
printf("Testing timing ..."); printf("Testing timing ...");
tpm_init(); tpm_init(dev);
TTPM_CHECK(TlclStartupIfNeeded(), 50); TTPM_CHECK(TlclStartupIfNeeded(dev), 50);
TTPM_CHECK(tpm_continue_self_test(), 100); TTPM_CHECK(tpm_continue_self_test(dev), 100);
TTPM_CHECK(tpm_self_test_full(), 1000); TTPM_CHECK(tpm_self_test_full(dev), 1000);
TTPM_CHECK(tpm_tsc_physical_presence(PRESENCE), 100); TTPM_CHECK(tpm_tsc_physical_presence(dev, PRESENCE), 100);
TTPM_CHECK(tpm_nv_write_value(INDEX0, (uint8_t *)&x, sizeof(x)), 100); TTPM_CHECK(tpm_nv_write_value(dev, INDEX0, (uint8_t *)&x, sizeof(x)),
TTPM_CHECK(tpm_nv_read_value(INDEX0, (uint8_t *)&x, sizeof(x)), 100); 100);
TTPM_CHECK(tpm_extend(0, in, out), 200); TTPM_CHECK(tpm_nv_read_value(dev, INDEX0, (uint8_t *)&x, sizeof(x)),
TTPM_CHECK(tpm_set_global_lock(), 50); 100);
TTPM_CHECK(tpm_tsc_physical_presence(PHYS_PRESENCE), 100); TTPM_CHECK(tpm_extend(dev, 0, in, out), 200);
TTPM_CHECK(tpm_set_global_lock(dev), 50);
TTPM_CHECK(tpm_tsc_physical_presence(dev, PHYS_PRESENCE), 100);
printf("done\n"); printf("done\n");
return 0; return 0;
} }
#define TPM_MAX_NV_WRITES_NOOWNER 64 #define TPM_MAX_NV_WRITES_NOOWNER 64
static int test_write_limit(void) static int test_write_limit(struct udevice *dev)
{ {
printf("Testing writelimit ...\n");
int i;
uint32_t result; uint32_t result;
int i;
tpm_init(); printf("Testing writelimit ...\n");
TPM_CHECK(TlclStartupIfNeeded()); tpm_init(dev);
TPM_CHECK(tpm_self_test_full()); TPM_CHECK(TlclStartupIfNeeded(dev));
TPM_CHECK(tpm_tsc_physical_presence(PRESENCE)); TPM_CHECK(tpm_self_test_full(dev));
TPM_CHECK(tpm_force_clear()); TPM_CHECK(tpm_tsc_physical_presence(dev, PRESENCE));
TPM_CHECK(tpm_physical_enable()); TPM_CHECK(tpm_force_clear(dev));
TPM_CHECK(tpm_physical_set_deactivated(0)); TPM_CHECK(tpm_physical_enable(dev));
TPM_CHECK(tpm_physical_set_deactivated(dev, 0));
for (i = 0; i < TPM_MAX_NV_WRITES_NOOWNER + 2; i++) { for (i = 0; i < TPM_MAX_NV_WRITES_NOOWNER + 2; i++) {
printf("\twriting %d\n", i); printf("\twriting %d\n", i);
result = tpm_nv_write_value(INDEX0, (uint8_t *)&i, sizeof(i)); result = tpm_nv_write_value(dev, INDEX0, (uint8_t *)&i,
sizeof(i));
switch (result) { switch (result) {
case TPM_SUCCESS: case TPM_SUCCESS:
break; break;
@ -461,12 +472,12 @@ static int test_write_limit(void)
} }
/* Reset write count */ /* Reset write count */
TPM_CHECK(tpm_force_clear()); TPM_CHECK(tpm_force_clear(dev));
TPM_CHECK(tpm_physical_enable()); TPM_CHECK(tpm_physical_enable(dev));
TPM_CHECK(tpm_physical_set_deactivated(0)); TPM_CHECK(tpm_physical_set_deactivated(dev, 0));
/* Try writing again. */ /* Try writing again. */
TPM_CHECK(tpm_nv_write_value(INDEX0, (uint8_t *)&i, sizeof(i))); TPM_CHECK(tpm_nv_write_value(dev, INDEX0, (uint8_t *)&i, sizeof(i)));
printf("\tdone\n"); printf("\tdone\n");
return 0; return 0;
} }
@ -475,7 +486,13 @@ static int test_write_limit(void)
int do_test_##XFUNC(cmd_tbl_t *cmd_tbl, int flag, int argc, \ int do_test_##XFUNC(cmd_tbl_t *cmd_tbl, int flag, int argc, \
char * const argv[]) \ char * const argv[]) \
{ \ { \
return test_##XFUNC(); \ struct udevice *dev; \
int ret; \
\
ret = get_tpm(&dev); \
if (ret) \
return ret; \
return test_##XFUNC(dev); \
} }
#define VOIDENT(XNAME) \ #define VOIDENT(XNAME) \

View File

@ -5,6 +5,8 @@
* Copyright (c) 2014 Google, Inc * Copyright (c) 2014 Google, Inc
*/ */
#define LOG_CATEGORY LOGC_ALLOC
#include <common.h> #include <common.h>
#include <malloc.h> #include <malloc.h>
#include <mapmem.h> #include <mapmem.h>
@ -12,40 +14,47 @@
DECLARE_GLOBAL_DATA_PTR; DECLARE_GLOBAL_DATA_PTR;
void *malloc_simple(size_t bytes) static void *alloc_simple(size_t bytes, int align)
{
ulong new_ptr;
void *ptr;
new_ptr = gd->malloc_ptr + bytes;
debug("%s: size=%zx, ptr=%lx, limit=%lx: ", __func__, bytes, new_ptr,
gd->malloc_limit);
if (new_ptr > gd->malloc_limit) {
debug("space exhausted\n");
return NULL;
}
ptr = map_sysmem(gd->malloc_base + gd->malloc_ptr, bytes);
gd->malloc_ptr = ALIGN(new_ptr, sizeof(new_ptr));
debug("%lx\n", (ulong)ptr);
return ptr;
}
void *memalign_simple(size_t align, size_t bytes)
{ {
ulong addr, new_ptr; ulong addr, new_ptr;
void *ptr; void *ptr;
addr = ALIGN(gd->malloc_base + gd->malloc_ptr, align); addr = ALIGN(gd->malloc_base + gd->malloc_ptr, align);
new_ptr = addr + bytes - gd->malloc_base; new_ptr = addr + bytes - gd->malloc_base;
log_debug("size=%zx, ptr=%lx, limit=%lx: ", bytes, new_ptr,
gd->malloc_limit);
if (new_ptr > gd->malloc_limit) { if (new_ptr > gd->malloc_limit) {
debug("space exhausted\n"); log_err("alloc space exhausted\n");
return NULL; return NULL;
} }
ptr = map_sysmem(addr, bytes); ptr = map_sysmem(addr, bytes);
gd->malloc_ptr = ALIGN(new_ptr, sizeof(new_ptr)); gd->malloc_ptr = ALIGN(new_ptr, sizeof(new_ptr));
debug("%lx\n", (ulong)ptr);
return ptr;
}
void *malloc_simple(size_t bytes)
{
void *ptr;
ptr = alloc_simple(bytes, 1);
if (!ptr)
return ptr;
log_debug("%lx\n", (ulong)ptr);
return ptr;
}
void *memalign_simple(size_t align, size_t bytes)
{
void *ptr;
ptr = alloc_simple(bytes, align);
if (!ptr)
return ptr;
log_debug("aligned to %lx\n", (ulong)ptr);
return ptr; return ptr;
} }
@ -57,9 +66,16 @@ void *calloc(size_t nmemb, size_t elem_size)
void *ptr; void *ptr;
ptr = malloc(size); ptr = malloc(size);
if (ptr) if (!ptr)
memset(ptr, '\0', size); return ptr;
memset(ptr, '\0', size);
return ptr; return ptr;
} }
#endif #endif
void malloc_simple_info(void)
{
log_info("malloc_simple: %lx bytes used, %lx remain\n", gd->malloc_ptr,
CONFIG_VAL(SYS_MALLOC_F_LEN) - gd->malloc_ptr);
}

View File

@ -699,6 +699,40 @@ int device_find_first_inactive_child(struct udevice *parent,
return -ENODEV; return -ENODEV;
} }
int device_find_first_child_by_uclass(struct udevice *parent,
enum uclass_id uclass_id,
struct udevice **devp)
{
struct udevice *dev;
*devp = NULL;
list_for_each_entry(dev, &parent->child_head, sibling_node) {
if (device_get_uclass_id(dev) == uclass_id) {
*devp = dev;
return 0;
}
}
return -ENODEV;
}
int device_find_child_by_name(struct udevice *parent, const char *name,
struct udevice **devp)
{
struct udevice *dev;
*devp = NULL;
list_for_each_entry(dev, &parent->child_head, sibling_node) {
if (!strcmp(dev->name, name)) {
*devp = dev;
return 0;
}
}
return -ENODEV;
}
struct udevice *dev_get_parent(const struct udevice *child) struct udevice *dev_get_parent(const struct udevice *child)
{ {
return child->parent; return child->parent;

View File

@ -253,15 +253,15 @@ int ofnode_read_size(ofnode node, const char *propname)
fdt_addr_t ofnode_get_addr_index(ofnode node, int index) fdt_addr_t ofnode_get_addr_index(ofnode node, int index)
{ {
int na, ns;
fdt_size_t size;
if (ofnode_is_np(node)) { if (ofnode_is_np(node)) {
const __be32 *prop_val; const __be32 *prop_val;
uint flags; uint flags;
u64 size;
int na;
int ns;
prop_val = of_get_address(ofnode_to_np(node), index, &size, prop_val = of_get_address(ofnode_to_np(node), index,
&flags); (u64 *)&size, &flags);
if (!prop_val) if (!prop_val)
return FDT_ADDR_T_NONE; return FDT_ADDR_T_NONE;
@ -274,8 +274,11 @@ fdt_addr_t ofnode_get_addr_index(ofnode node, int index)
return of_read_number(prop_val, na); return of_read_number(prop_val, na);
} }
} else { } else {
return fdt_get_base_address(gd->fdt_blob, na = ofnode_read_simple_addr_cells(ofnode_get_parent(node));
ofnode_to_offset(node)); ns = ofnode_read_simple_size_cells(ofnode_get_parent(node));
return fdtdec_get_addr_size_fixed(gd->fdt_blob,
ofnode_to_offset(node), "reg",
index, na, ns, &size, true);
} }
return FDT_ADDR_T_NONE; return FDT_ADDR_T_NONE;

View File

@ -354,10 +354,8 @@ done:
} }
#if CONFIG_IS_ENABLED(OF_CONTROL) #if CONFIG_IS_ENABLED(OF_CONTROL)
static int uclass_find_device_by_phandle(enum uclass_id id, int uclass_find_device_by_phandle(enum uclass_id id, struct udevice *parent,
struct udevice *parent, const char *name, struct udevice **devp)
const char *name,
struct udevice **devp)
{ {
struct udevice *dev; struct udevice *dev;
struct uclass *uc; struct uclass *uc;

View File

@ -6,8 +6,85 @@
#include <common.h> #include <common.h>
#include <dm.h> #include <dm.h>
#include <i2c.h> #include <i2c.h>
#include <dm/device-internal.h>
#include <dm/uclass-internal.h>
/*
* i2c emulation works using an 'emul' node at the bus level. Each device in
* that node is in the UCLASS_I2C_EMUL uclass, and emulates one i2c device. A
* pointer to the device it emulates is in the 'dev' property of the emul device
* uclass platdata (struct i2c_emul_platdata), put there by i2c_emul_find().
* When sandbox wants an emulator for a device, it calls i2c_emul_find() which
* searches for the emulator with the correct address. To find the device for an
* emulator, call i2c_emul_get_device().
*
* The 'emul' node is in the UCLASS_I2C_EMUL_PARENT uclass. We use a separate
* uclass so avoid having strange devices on the I2C bus.
*/
/**
* struct i2c_emul_uc_platdata - information about the emulator for this device
*
* This is used by devices in UCLASS_I2C_EMUL to record information about the
* device being emulated. It is accessible with dev_get_uclass_platdata()
*
* @dev: Device being emulated
*/
struct i2c_emul_uc_platdata {
struct udevice *dev;
};
struct udevice *i2c_emul_get_device(struct udevice *emul)
{
struct i2c_emul_uc_platdata *uc_plat = dev_get_uclass_platdata(emul);
return uc_plat->dev;
}
int i2c_emul_find(struct udevice *dev, struct udevice **emulp)
{
struct i2c_emul_uc_platdata *uc_plat;
struct udevice *emul;
int ret;
ret = uclass_find_device_by_phandle(UCLASS_I2C_EMUL, dev,
"sandbox,emul", &emul);
if (ret) {
log_err("No emulators for device '%s'\n", dev->name);
return ret;
}
uc_plat = dev_get_uclass_platdata(emul);
uc_plat->dev = dev;
*emulp = emul;
return device_probe(emul);
}
UCLASS_DRIVER(i2c_emul) = { UCLASS_DRIVER(i2c_emul) = {
.id = UCLASS_I2C_EMUL, .id = UCLASS_I2C_EMUL,
.name = "i2c_emul", .name = "i2c_emul",
.per_device_platdata_auto_alloc_size =
sizeof(struct i2c_emul_uc_platdata),
};
/*
* This uclass is a child of the i2c bus. Its platdata is not defined here so
* is defined by its parent, UCLASS_I2C, which uses struct dm_i2c_chip. See
* per_child_platdata_auto_alloc_size in UCLASS_DRIVER(i2c).
*/
UCLASS_DRIVER(i2c_emul_parent) = {
.id = UCLASS_I2C_EMUL_PARENT,
.name = "i2c_emul_parent",
.post_bind = dm_scan_fdt_dev,
};
static const struct udevice_id i2c_emul_parent_ids[] = {
{ .compatible = "sandbox,i2c-emul-parent" },
{ }
};
U_BOOT_DRIVER(i2c_emul_parent_drv) = {
.name = "i2c_emul_parent_drv",
.id = UCLASS_I2C_EMUL_PARENT,
.of_match = i2c_emul_parent_ids,
}; };

View File

@ -21,33 +21,15 @@ static int get_emul(struct udevice *dev, struct udevice **devp,
struct dm_i2c_ops **opsp) struct dm_i2c_ops **opsp)
{ {
struct dm_i2c_chip *plat; struct dm_i2c_chip *plat;
struct udevice *child;
int ret; int ret;
*devp = NULL; *devp = NULL;
*opsp = NULL; *opsp = NULL;
plat = dev_get_parent_platdata(dev); plat = dev_get_parent_platdata(dev);
if (!plat->emul) { if (!plat->emul) {
ret = dm_scan_fdt_dev(dev); ret = i2c_emul_find(dev, &plat->emul);
if (ret) if (ret)
return ret; return ret;
for (device_find_first_child(dev, &child); child;
device_find_next_child(&child)) {
if (device_get_uclass_id(child) != UCLASS_I2C_EMUL)
continue;
ret = device_probe(child);
if (ret)
return ret;
break;
}
if (child)
plat->emul = child;
else
return -ENODEV;
} }
*devp = plat->emul; *devp = plat->emul;
*opsp = i2c_get_ops(plat->emul); *opsp = i2c_get_ops(plat->emul);

View File

@ -50,7 +50,7 @@ static int act8846_bind(struct udevice *dev)
regulators_node = dev_read_subnode(dev, "regulators"); regulators_node = dev_read_subnode(dev, "regulators");
if (!ofnode_valid(regulators_node)) { if (!ofnode_valid(regulators_node)) {
debug("%s: %s regulators subnode not found!", __func__, debug("%s: %s regulators subnode not found!\n", __func__,
dev->name); dev->name);
return -ENXIO; return -ENXIO;
} }

View File

@ -45,14 +45,14 @@ static int as3722_read_id(struct udevice *dev, uint *idp, uint *revisionp)
ret = pmic_reg_read(dev, AS3722_ASIC_ID1); ret = pmic_reg_read(dev, AS3722_ASIC_ID1);
if (ret < 0) { if (ret < 0) {
pr_err("failed to read ID1 register: %d", ret); pr_err("failed to read ID1 register: %d\n", ret);
return ret; return ret;
} }
*idp = ret; *idp = ret;
ret = pmic_reg_read(dev, AS3722_ASIC_ID2); ret = pmic_reg_read(dev, AS3722_ASIC_ID2);
if (ret < 0) { if (ret < 0) {
pr_err("failed to read ID2 register: %d", ret); pr_err("failed to read ID2 register: %d\n", ret);
return ret; return ret;
} }
*revisionp = ret; *revisionp = ret;
@ -70,7 +70,7 @@ int as3722_sd_set_voltage(struct udevice *dev, unsigned int sd, u8 value)
ret = pmic_reg_write(dev, AS3722_SD_VOLTAGE(sd), value); ret = pmic_reg_write(dev, AS3722_SD_VOLTAGE(sd), value);
if (ret < 0) { if (ret < 0) {
pr_err("failed to write SD%u voltage register: %d", sd, ret); pr_err("failed to write SD%u voltage register: %d\n", sd, ret);
return ret; return ret;
} }
@ -86,8 +86,8 @@ int as3722_ldo_set_voltage(struct udevice *dev, unsigned int ldo, u8 value)
ret = pmic_reg_write(dev, AS3722_LDO_VOLTAGE(ldo), value); ret = pmic_reg_write(dev, AS3722_LDO_VOLTAGE(ldo), value);
if (ret < 0) { if (ret < 0) {
pr_err("failed to write LDO%u voltage register: %d", ldo, pr_err("failed to write LDO%u voltage register: %d\n", ldo,
ret); ret);
return ret; return ret;
} }
@ -101,12 +101,12 @@ static int as3722_probe(struct udevice *dev)
ret = as3722_read_id(dev, &id, &revision); ret = as3722_read_id(dev, &id, &revision);
if (ret < 0) { if (ret < 0) {
pr_err("failed to read ID: %d", ret); pr_err("failed to read ID: %d\n", ret);
return ret; return ret;
} }
if (id != AS3722_DEVICE_ID) { if (id != AS3722_DEVICE_ID) {
pr_err("unknown device"); pr_err("unknown device\n");
return -ENOENT; return -ENOENT;
} }

View File

@ -25,7 +25,7 @@ int as3722_gpio_configure(struct udevice *pmic, unsigned int gpio,
err = pmic_reg_write(pmic, AS3722_GPIO_CONTROL(gpio), value); err = pmic_reg_write(pmic, AS3722_GPIO_CONTROL(gpio), value);
if (err) { if (err) {
pr_err("failed to configure GPIO#%u: %d", gpio, err); pr_err("failed to configure GPIO#%u: %d\n", gpio, err);
return err; return err;
} }
@ -45,7 +45,7 @@ static int as3722_gpio_set_value(struct udevice *dev, unsigned int gpio,
err = pmic_reg_read(pmic, AS3722_GPIO_SIGNAL_OUT); err = pmic_reg_read(pmic, AS3722_GPIO_SIGNAL_OUT);
if (err < 0) { if (err < 0) {
pr_err("failed to read GPIO signal out register: %d", err); pr_err("failed to read GPIO signal out register: %d\n", err);
return err; return err;
} }
value = err; value = err;
@ -60,7 +60,7 @@ static int as3722_gpio_set_value(struct udevice *dev, unsigned int gpio,
err = pmic_reg_write(pmic, AS3722_GPIO_SIGNAL_OUT, value); err = pmic_reg_write(pmic, AS3722_GPIO_SIGNAL_OUT, value);
if (err) { if (err) {
pr_err("failed to set GPIO#%u %s: %d", gpio, l, err); pr_err("failed to set GPIO#%u %s: %d\n", gpio, l, err);
return err; return err;
} }
@ -83,13 +83,14 @@ int as3722_gpio_direction_output(struct udevice *dev, unsigned int gpio,
err = pmic_reg_write(pmic, AS3722_GPIO_CONTROL(gpio), value); err = pmic_reg_write(pmic, AS3722_GPIO_CONTROL(gpio), value);
if (err) { if (err) {
pr_err("failed to configure GPIO#%u as output: %d", gpio, err); pr_err("failed to configure GPIO#%u as output: %d\n", gpio,
err);
return err; return err;
} }
err = as3722_gpio_set_value(pmic, gpio, value); err = as3722_gpio_set_value(pmic, gpio, value);
if (err < 0) { if (err < 0) {
pr_err("failed to set GPIO#%u high: %d", gpio, err); pr_err("failed to set GPIO#%u high: %d\n", gpio, err);
return err; return err;
} }

View File

@ -104,7 +104,7 @@ static int sandbox_i2c_pmic_xfer(struct udevice *emul, struct i2c_msg *msg,
static int sandbox_i2c_pmic_ofdata_to_platdata(struct udevice *emul) static int sandbox_i2c_pmic_ofdata_to_platdata(struct udevice *emul)
{ {
struct sandbox_i2c_pmic_plat_data *plat = dev_get_platdata(emul); struct sandbox_i2c_pmic_plat_data *plat = dev_get_platdata(emul);
struct udevice *pmic_dev = dev_get_parent(emul); struct udevice *pmic_dev = i2c_emul_get_device(emul);
struct uc_pmic_priv *priv = dev_get_uclass_priv(pmic_dev); struct uc_pmic_priv *priv = dev_get_uclass_priv(pmic_dev);
const u8 *reg_defaults; const u8 *reg_defaults;

View File

@ -24,7 +24,7 @@ static int lp873x_write(struct udevice *dev, uint reg, const uint8_t *buff,
int len) int len)
{ {
if (dm_i2c_write(dev, reg, buff, len)) { if (dm_i2c_write(dev, reg, buff, len)) {
pr_err("write error to device: %p register: %#x!", dev, reg); pr_err("write error to device: %p register: %#x!\n", dev, reg);
return -EIO; return -EIO;
} }
@ -34,7 +34,7 @@ static int lp873x_write(struct udevice *dev, uint reg, const uint8_t *buff,
static int lp873x_read(struct udevice *dev, uint reg, uint8_t *buff, int len) static int lp873x_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
{ {
if (dm_i2c_read(dev, reg, buff, len)) { if (dm_i2c_read(dev, reg, buff, len)) {
pr_err("read error from device: %p register: %#x!", dev, reg); pr_err("read error from device: %p register: %#x!\n", dev, reg);
return -EIO; return -EIO;
} }
@ -48,7 +48,7 @@ static int lp873x_bind(struct udevice *dev)
regulators_node = dev_read_subnode(dev, "regulators"); regulators_node = dev_read_subnode(dev, "regulators");
if (!ofnode_valid(regulators_node)) { if (!ofnode_valid(regulators_node)) {
debug("%s: %s regulators subnode not found!", __func__, debug("%s: %s regulators subnode not found!\n", __func__,
dev->name); dev->name);
return -ENXIO; return -ENXIO;
} }

View File

@ -26,7 +26,7 @@ static int lp87565_write(struct udevice *dev, uint reg, const uint8_t *buff,
ret = dm_i2c_write(dev, reg, buff, len); ret = dm_i2c_write(dev, reg, buff, len);
if (ret) if (ret)
pr_err("write error to device: %p register: %#x!", dev, reg); pr_err("write error to device: %p register: %#x!\n", dev, reg);
return ret; return ret;
} }
@ -37,7 +37,7 @@ static int lp87565_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
ret = dm_i2c_read(dev, reg, buff, len); ret = dm_i2c_read(dev, reg, buff, len);
if (ret) if (ret)
pr_err("read error from device: %p register: %#x!", dev, reg); pr_err("read error from device: %p register: %#x!\n", dev, reg);
return ret; return ret;
} }
@ -49,7 +49,7 @@ static int lp87565_bind(struct udevice *dev)
regulators_node = dev_read_subnode(dev, "regulators"); regulators_node = dev_read_subnode(dev, "regulators");
if (!ofnode_valid(regulators_node)) { if (!ofnode_valid(regulators_node)) {
debug("%s: %s regulators subnode not found!", __func__, debug("%s: %s regulators subnode not found!\n", __func__,
dev->name); dev->name);
return -ENXIO; return -ENXIO;
} }

View File

@ -28,7 +28,7 @@ static int max77686_write(struct udevice *dev, uint reg, const uint8_t *buff,
int len) int len)
{ {
if (dm_i2c_write(dev, reg, buff, len)) { if (dm_i2c_write(dev, reg, buff, len)) {
pr_err("write error to device: %p register: %#x!", dev, reg); pr_err("write error to device: %p register: %#x!\n", dev, reg);
return -EIO; return -EIO;
} }
@ -38,7 +38,7 @@ static int max77686_write(struct udevice *dev, uint reg, const uint8_t *buff,
static int max77686_read(struct udevice *dev, uint reg, uint8_t *buff, int len) static int max77686_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
{ {
if (dm_i2c_read(dev, reg, buff, len)) { if (dm_i2c_read(dev, reg, buff, len)) {
pr_err("read error from device: %p register: %#x!", dev, reg); pr_err("read error from device: %p register: %#x!\n", dev, reg);
return -EIO; return -EIO;
} }
@ -52,8 +52,8 @@ static int max77686_bind(struct udevice *dev)
regulators_node = dev_read_subnode(dev, "voltage-regulators"); regulators_node = dev_read_subnode(dev, "voltage-regulators");
if (!ofnode_valid(regulators_node)) { if (!ofnode_valid(regulators_node)) {
debug("%s: %s regulators subnode not found!", __func__, debug("%s: %s regulators subnode not found!\n", __func__,
dev->name); dev->name);
return -ENXIO; return -ENXIO;
} }

View File

@ -23,7 +23,7 @@ static int max8997_write(struct udevice *dev, uint reg, const uint8_t *buff,
ret = dm_i2c_write(dev, reg, buff, len); ret = dm_i2c_write(dev, reg, buff, len);
if (ret) if (ret)
pr_err("write error to device: %p register: %#x!", dev, reg); pr_err("write error to device: %p register: %#x!\n", dev, reg);
return ret; return ret;
} }
@ -34,7 +34,7 @@ static int max8997_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
ret = dm_i2c_read(dev, reg, buff, len); ret = dm_i2c_read(dev, reg, buff, len);
if (ret) if (ret)
pr_err("read error from device: %p register: %#x!", dev, reg); pr_err("read error from device: %p register: %#x!\n", dev, reg);
return ret; return ret;
} }

View File

@ -23,7 +23,7 @@ static int max8998_write(struct udevice *dev, uint reg, const uint8_t *buff,
ret = dm_i2c_write(dev, reg, buff, len); ret = dm_i2c_write(dev, reg, buff, len);
if (ret) if (ret)
pr_err("write error to device: %p register: %#x!", dev, reg); pr_err("write error to device: %p register: %#x!\n", dev, reg);
return ret; return ret;
} }
@ -34,7 +34,7 @@ static int max8998_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
ret = dm_i2c_read(dev, reg, buff, len); ret = dm_i2c_read(dev, reg, buff, len);
if (ret) if (ret)
pr_err("read error from device: %p register: %#x!", dev, reg); pr_err("read error from device: %p register: %#x!\n", dev, reg);
return ret; return ret;
} }

View File

@ -38,7 +38,7 @@ static int mc34708_write(struct udevice *dev, uint reg, const u8 *buff,
ret = dm_i2c_write(dev, reg, buf, len); ret = dm_i2c_write(dev, reg, buf, len);
if (ret) if (ret)
printf("write error to device: %p register: %#x!", dev, reg); printf("write error to device: %p register: %#x!\n", dev, reg);
return ret; return ret;
} }
@ -53,7 +53,7 @@ static int mc34708_read(struct udevice *dev, uint reg, u8 *buff, int len)
ret = dm_i2c_read(dev, reg, buf, len); ret = dm_i2c_read(dev, reg, buf, len);
if (ret) if (ret)
printf("read error from device: %p register: %#x!", dev, reg); printf("read error from device: %p register: %#x!\n", dev, reg);
buff[0] = buf[2]; buff[0] = buf[2];
buff[1] = buf[1]; buff[1] = buf[1];

View File

@ -24,7 +24,7 @@ static int palmas_write(struct udevice *dev, uint reg, const uint8_t *buff,
int len) int len)
{ {
if (dm_i2c_write(dev, reg, buff, len)) { if (dm_i2c_write(dev, reg, buff, len)) {
pr_err("write error to device: %p register: %#x!", dev, reg); pr_err("write error to device: %p register: %#x!\n", dev, reg);
return -EIO; return -EIO;
} }
@ -34,7 +34,7 @@ static int palmas_write(struct udevice *dev, uint reg, const uint8_t *buff,
static int palmas_read(struct udevice *dev, uint reg, uint8_t *buff, int len) static int palmas_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
{ {
if (dm_i2c_read(dev, reg, buff, len)) { if (dm_i2c_read(dev, reg, buff, len)) {
pr_err("read error from device: %p register: %#x!", dev, reg); pr_err("read error from device: %p register: %#x!\n", dev, reg);
return -EIO; return -EIO;
} }
@ -60,14 +60,14 @@ static int palmas_bind(struct udevice *dev)
} }
if (!ofnode_valid(pmic_node)) { if (!ofnode_valid(pmic_node)) {
debug("%s: %s pmic subnode not found!", __func__, dev->name); debug("%s: %s pmic subnode not found!\n", __func__, dev->name);
return -ENXIO; return -ENXIO;
} }
regulators_node = ofnode_find_subnode(pmic_node, "regulators"); regulators_node = ofnode_find_subnode(pmic_node, "regulators");
if (!ofnode_valid(regulators_node)) { if (!ofnode_valid(regulators_node)) {
debug("%s: %s reg subnode not found!", __func__, dev->name); debug("%s: %s reg subnode not found!\n", __func__, dev->name);
return -ENXIO; return -ENXIO;
} }

View File

@ -31,7 +31,7 @@ static int pfuze100_write(struct udevice *dev, uint reg, const uint8_t *buff,
int len) int len)
{ {
if (dm_i2c_write(dev, reg, buff, len)) { if (dm_i2c_write(dev, reg, buff, len)) {
pr_err("write error to device: %p register: %#x!", dev, reg); pr_err("write error to device: %p register: %#x!\n", dev, reg);
return -EIO; return -EIO;
} }
@ -41,7 +41,7 @@ static int pfuze100_write(struct udevice *dev, uint reg, const uint8_t *buff,
static int pfuze100_read(struct udevice *dev, uint reg, uint8_t *buff, int len) static int pfuze100_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
{ {
if (dm_i2c_read(dev, reg, buff, len)) { if (dm_i2c_read(dev, reg, buff, len)) {
pr_err("read error from device: %p register: %#x!", dev, reg); pr_err("read error from device: %p register: %#x!\n", dev, reg);
return -EIO; return -EIO;
} }
@ -55,7 +55,7 @@ static int pfuze100_bind(struct udevice *dev)
regulators_node = dev_read_subnode(dev, "regulators"); regulators_node = dev_read_subnode(dev, "regulators");
if (!ofnode_valid(regulators_node)) { if (!ofnode_valid(regulators_node)) {
debug("%s: %s regulators subnode not found!", __func__, debug("%s: %s regulators subnode not found!\n", __func__,
dev->name); dev->name);
return -ENXIO; return -ENXIO;
} }

View File

@ -29,7 +29,7 @@ static int rk8xx_write(struct udevice *dev, uint reg, const uint8_t *buff,
ret = dm_i2c_write(dev, reg, buff, len); ret = dm_i2c_write(dev, reg, buff, len);
if (ret) { if (ret) {
debug("write error to device: %p register: %#x!", dev, reg); debug("write error to device: %p register: %#x!\n", dev, reg);
return ret; return ret;
} }
@ -42,7 +42,7 @@ static int rk8xx_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
ret = dm_i2c_read(dev, reg, buff, len); ret = dm_i2c_read(dev, reg, buff, len);
if (ret) { if (ret) {
debug("read error from device: %p register: %#x!", dev, reg); debug("read error from device: %p register: %#x!\n", dev, reg);
return ret; return ret;
} }
@ -57,7 +57,7 @@ static int rk8xx_bind(struct udevice *dev)
regulators_node = dev_read_subnode(dev, "regulators"); regulators_node = dev_read_subnode(dev, "regulators");
if (!ofnode_valid(regulators_node)) { if (!ofnode_valid(regulators_node)) {
debug("%s: %s regulators subnode not found!", __func__, debug("%s: %s regulators subnode not found!\n", __func__,
dev->name); dev->name);
return -ENXIO; return -ENXIO;
} }

View File

@ -24,7 +24,7 @@ static int rn5t567_write(struct udevice *dev, uint reg, const uint8_t *buff,
ret = dm_i2c_write(dev, reg, buff, len); ret = dm_i2c_write(dev, reg, buff, len);
if (ret) { if (ret) {
debug("write error to device: %p register: %#x!", dev, reg); debug("write error to device: %p register: %#x!\n", dev, reg);
return ret; return ret;
} }
@ -37,7 +37,7 @@ static int rn5t567_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
ret = dm_i2c_read(dev, reg, buff, len); ret = dm_i2c_read(dev, reg, buff, len);
if (ret) { if (ret) {
debug("read error from device: %p register: %#x!", dev, reg); debug("read error from device: %p register: %#x!\n", dev, reg);
return ret; return ret;
} }

View File

@ -30,7 +30,7 @@ static int s2mps11_write(struct udevice *dev, uint reg, const uint8_t *buff,
ret = dm_i2c_write(dev, reg, buff, len); ret = dm_i2c_write(dev, reg, buff, len);
if (ret) if (ret)
pr_err("write error to device: %p register: %#x!", dev, reg); pr_err("write error to device: %p register: %#x!\n", dev, reg);
return ret; return ret;
} }
@ -41,7 +41,7 @@ static int s2mps11_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
ret = dm_i2c_read(dev, reg, buff, len); ret = dm_i2c_read(dev, reg, buff, len);
if (ret) if (ret)
pr_err("read error from device: %p register: %#x!", dev, reg); pr_err("read error from device: %p register: %#x!\n", dev, reg);
return ret; return ret;
} }
@ -53,8 +53,8 @@ static int s2mps11_probe(struct udevice *dev)
regulators_node = dev_read_subnode(dev, "voltage-regulators"); regulators_node = dev_read_subnode(dev, "voltage-regulators");
if (!ofnode_valid(regulators_node)) { if (!ofnode_valid(regulators_node)) {
debug("%s: %s regulators subnode not found!", __func__, debug("%s: %s regulators subnode not found!\n", __func__,
dev->name); dev->name);
return -ENXIO; return -ENXIO;
} }

View File

@ -27,7 +27,7 @@ static int s5m8767_write(struct udevice *dev, uint reg, const uint8_t *buff,
int len) int len)
{ {
if (dm_i2c_write(dev, reg, buff, len)) { if (dm_i2c_write(dev, reg, buff, len)) {
pr_err("write error to device: %p register: %#x!", dev, reg); pr_err("write error to device: %p register: %#x!\n", dev, reg);
return -EIO; return -EIO;
} }
@ -37,7 +37,7 @@ static int s5m8767_write(struct udevice *dev, uint reg, const uint8_t *buff,
static int s5m8767_read(struct udevice *dev, uint reg, uint8_t *buff, int len) static int s5m8767_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
{ {
if (dm_i2c_read(dev, reg, buff, len)) { if (dm_i2c_read(dev, reg, buff, len)) {
pr_err("read error from device: %p register: %#x!", dev, reg); pr_err("read error from device: %p register: %#x!\n", dev, reg);
return -EIO; return -EIO;
} }
@ -56,7 +56,7 @@ static int s5m8767_bind(struct udevice *dev)
node = dev_read_subnode(dev, "regulators"); node = dev_read_subnode(dev, "regulators");
if (!ofnode_valid(node)) { if (!ofnode_valid(node)) {
debug("%s: %s regulators subnode not found!", __func__, debug("%s: %s regulators subnode not found!\n", __func__,
dev->name); dev->name);
return -ENXIO; return -ENXIO;
} }

View File

@ -28,7 +28,7 @@ static int sandbox_pmic_write(struct udevice *dev, uint reg,
const uint8_t *buff, int len) const uint8_t *buff, int len)
{ {
if (dm_i2c_write(dev, reg, buff, len)) { if (dm_i2c_write(dev, reg, buff, len)) {
pr_err("write error to device: %p register: %#x!", dev, reg); pr_err("write error to device: %p register: %#x!\n", dev, reg);
return -EIO; return -EIO;
} }
@ -39,7 +39,7 @@ static int sandbox_pmic_read(struct udevice *dev, uint reg,
uint8_t *buff, int len) uint8_t *buff, int len)
{ {
if (dm_i2c_read(dev, reg, buff, len)) { if (dm_i2c_read(dev, reg, buff, len)) {
pr_err("read error from device: %p register: %#x!", dev, reg); pr_err("read error from device: %p register: %#x!\n", dev, reg);
return -EIO; return -EIO;
} }

View File

@ -61,7 +61,7 @@ static int stpmu1_bind(struct udevice *dev)
regulators_node = dev_read_subnode(dev, "regulators"); regulators_node = dev_read_subnode(dev, "regulators");
if (!ofnode_valid(regulators_node)) { if (!ofnode_valid(regulators_node)) {
dev_dbg(dev, "regulators subnode not found!"); dev_dbg(dev, "regulators subnode not found!\n");
return -ENXIO; return -ENXIO;
} }
dev_dbg(dev, "found regulators subnode\n"); dev_dbg(dev, "found regulators subnode\n");

View File

@ -26,7 +26,7 @@ static int tps65090_write(struct udevice *dev, uint reg, const uint8_t *buff,
int len) int len)
{ {
if (dm_i2c_write(dev, reg, buff, len)) { if (dm_i2c_write(dev, reg, buff, len)) {
pr_err("write error to device: %p register: %#x!", dev, reg); pr_err("write error to device: %p register: %#x!\n", dev, reg);
return -EIO; return -EIO;
} }
@ -39,8 +39,8 @@ static int tps65090_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
ret = dm_i2c_read(dev, reg, buff, len); ret = dm_i2c_read(dev, reg, buff, len);
if (ret) { if (ret) {
pr_err("read error %d from device: %p register: %#x!", ret, dev, pr_err("read error %d from device: %p register: %#x!\n", ret,
reg); dev, reg);
return -EIO; return -EIO;
} }
@ -54,7 +54,7 @@ static int tps65090_bind(struct udevice *dev)
regulators_node = dev_read_subnode(dev, "regulators"); regulators_node = dev_read_subnode(dev, "regulators");
if (!ofnode_valid(regulators_node)) { if (!ofnode_valid(regulators_node)) {
debug("%s: %s regulators subnode not found!", __func__, debug("%s: %s regulators subnode not found!\n", __func__,
dev->name); dev->name);
return -ENXIO; return -ENXIO;
} }

View File

@ -122,4 +122,5 @@ int rtc_write32(struct udevice *dev, unsigned int reg, u32 value)
UCLASS_DRIVER(rtc) = { UCLASS_DRIVER(rtc) = {
.name = "rtc", .name = "rtc",
.id = UCLASS_RTC, .id = UCLASS_RTC,
.post_bind = dm_scan_fdt_dev,
}; };

View File

@ -185,7 +185,8 @@ int sound_play(uint32_t msec, uint32_t frequency)
return -1; return -1;
} }
sound_create_square_wave((unsigned short *)data, sound_create_square_wave(g_i2stx_pri.samplingrate,
(unsigned short *)data,
data_size / sizeof(unsigned short), data_size / sizeof(unsigned short),
frequency); frequency);

View File

@ -7,11 +7,11 @@
#include <common.h> #include <common.h>
#include <sound.h> #include <sound.h>
void sound_create_square_wave(unsigned short *data, int size, uint32_t freq) void sound_create_square_wave(uint sample_rate, unsigned short *data, int size,
uint freq)
{ {
const int sample = 48000;
const unsigned short amplitude = 16000; /* between 1 and 32767 */ const unsigned short amplitude = 16000; /* between 1 and 32767 */
const int period = freq ? sample / freq : 0; const int period = freq ? sample_rate / freq : 0;
const int half = period / 2; const int half = period / 2;
assert(freq); assert(freq);
@ -25,12 +25,10 @@ void sound_create_square_wave(unsigned short *data, int size, uint32_t freq)
for (i = 0; size && i < half; i++) { for (i = 0; size && i < half; i++) {
size -= 2; size -= 2;
*data++ = amplitude; *data++ = amplitude;
*data++ = amplitude;
} }
for (i = 0; size && i < period - half; i++) { for (i = 0; size && i < period - half; i++) {
size -= 2; size -= 2;
*data++ = -amplitude; *data++ = -amplitude;
*data++ = -amplitude;
} }
} }
} }

View File

@ -388,31 +388,6 @@ static int tis_readresponse(struct udevice *dev, u8 *buffer, size_t len)
return offset; return offset;
} }
static int tpm_tis_lpc_open(struct udevice *dev)
{
struct tpm_tis_lpc_priv *priv = dev_get_priv(dev);
struct tpm_locality *regs = priv->regs;
u8 locality = 0; /* we use locality zero for everything. */
int ret;
/* now request access to locality. */
tpm_write_word(priv, TIS_ACCESS_REQUEST_USE, &regs[locality].access);
/* did we get a lock? */
ret = tis_wait_reg(priv, &regs[locality].access,
TIS_ACCESS_ACTIVE_LOCALITY,
TIS_ACCESS_ACTIVE_LOCALITY);
if (ret == -ETIMEDOUT) {
printf("%s:%d - failed to lock locality %d\n",
__FILE__, __LINE__, locality);
return ret;
}
tpm_write_word(priv, TIS_STS_COMMAND_READY,
&regs[locality].tpm_status);
return 0;
}
static int tpm_tis_lpc_close(struct udevice *dev) static int tpm_tis_lpc_close(struct udevice *dev)
{ {
struct tpm_tis_lpc_priv *priv = dev_get_priv(dev); struct tpm_tis_lpc_priv *priv = dev_get_priv(dev);
@ -434,6 +409,38 @@ static int tpm_tis_lpc_close(struct udevice *dev)
return 0; return 0;
} }
static int tpm_tis_lpc_open(struct udevice *dev)
{
struct tpm_tis_lpc_priv *priv = dev_get_priv(dev);
struct tpm_locality *regs = priv->regs;
u8 locality = 0; /* we use locality zero for everything. */
int ret;
ret = tpm_tis_lpc_close(dev);
if (ret) {
printf("%s: Failed to close TPM\n", __func__);
return ret;
}
/* now request access to locality. */
tpm_write_word(priv, TIS_ACCESS_REQUEST_USE, &regs[locality].access);
/* did we get a lock? */
ret = tis_wait_reg(priv, &regs[locality].access,
TIS_ACCESS_ACTIVE_LOCALITY,
TIS_ACCESS_ACTIVE_LOCALITY);
if (ret == -ETIMEDOUT) {
printf("%s:%d - failed to lock locality %d\n",
__FILE__, __LINE__, locality);
return ret;
}
tpm_write_word(priv, TIS_STS_COMMAND_READY,
&regs[locality].tpm_status);
return 0;
}
static int tpm_tis_get_desc(struct udevice *dev, char *buf, int size) static int tpm_tis_get_desc(struct udevice *dev, char *buf, int size)
{ {
ulong chip_type = dev_get_driver_data(dev); ulong chip_type = dev_get_driver_data(dev);

View File

@ -525,6 +525,8 @@ int device_find_next_child(struct udevice **devp);
* This is used to locate an existing child of a device which is of a given * This is used to locate an existing child of a device which is of a given
* uclass. * uclass.
* *
* The device is NOT probed
*
* @parent: Parent device to search * @parent: Parent device to search
* @uclass_id: Uclass to look for * @uclass_id: Uclass to look for
* @devp: Returns device found, if any * @devp: Returns device found, if any
@ -534,6 +536,29 @@ int device_find_first_inactive_child(struct udevice *parent,
enum uclass_id uclass_id, enum uclass_id uclass_id,
struct udevice **devp); struct udevice **devp);
/**
* device_find_first_child_by_uclass() - Find the first child of a device in uc
*
* @parent: Parent device to search
* @uclass_id: Uclass to look for
* @devp: Returns first child device in that uclass, if any
* @return 0 if found, else -ENODEV
*/
int device_find_first_child_by_uclass(struct udevice *parent,
enum uclass_id uclass_id,
struct udevice **devp);
/**
* device_find_child_by_name() - Find a child by device name
*
* @parent: Parent device to search
* @name: Name to look for
* @devp: Returns device found, if any
* @return 0 if found, else -ENODEV
*/
int device_find_child_by_name(struct udevice *parent, const char *name,
struct udevice **devp);
/** /**
* device_has_children() - check if a device has any children * device_has_children() - check if a device has any children
* *

View File

@ -333,7 +333,7 @@ ofnode ofnode_get_parent(ofnode node);
* ofnode_get_name() - get the name of a node * ofnode_get_name() - get the name of a node
* *
* @node: valid node to look up * @node: valid node to look up
* @return name or node * @return name of node
*/ */
const char *ofnode_get_name(ofnode node); const char *ofnode_get_name(ofnode node);

View File

@ -21,10 +21,10 @@ enum uclass_id {
UCLASS_TEST_DUMMY, UCLASS_TEST_DUMMY,
UCLASS_SPI_EMUL, /* sandbox SPI device emulator */ UCLASS_SPI_EMUL, /* sandbox SPI device emulator */
UCLASS_I2C_EMUL, /* sandbox I2C device emulator */ UCLASS_I2C_EMUL, /* sandbox I2C device emulator */
UCLASS_I2C_EMUL_PARENT, /* parent for I2C device emulators */
UCLASS_PCI_EMUL, /* sandbox PCI device emulator */ UCLASS_PCI_EMUL, /* sandbox PCI device emulator */
UCLASS_USB_EMUL, /* sandbox USB bus device emulator */ UCLASS_USB_EMUL, /* sandbox USB bus device emulator */
UCLASS_AXI_EMUL, /* sandbox AXI bus device emulator */ UCLASS_AXI_EMUL, /* sandbox AXI bus device emulator */
UCLASS_SIMPLE_BUS, /* bus with child devices */
/* U-Boot uclasses start here - in alphabetical order */ /* U-Boot uclasses start here - in alphabetical order */
UCLASS_ADC, /* Analog-to-digital converter */ UCLASS_ADC, /* Analog-to-digital converter */
@ -78,6 +78,7 @@ enum uclass_id {
UCLASS_RTC, /* Real time clock device */ UCLASS_RTC, /* Real time clock device */
UCLASS_SCSI, /* SCSI device */ UCLASS_SCSI, /* SCSI device */
UCLASS_SERIAL, /* Serial UART */ UCLASS_SERIAL, /* Serial UART */
UCLASS_SIMPLE_BUS, /* Bus with child devices */
UCLASS_SMEM, /* Shared memory interface */ UCLASS_SMEM, /* Shared memory interface */
UCLASS_SPI, /* SPI bus */ UCLASS_SPI, /* SPI bus */
UCLASS_SPMI, /* System Power Management Interface bus */ UCLASS_SPMI, /* System Power Management Interface bus */

View File

@ -142,6 +142,23 @@ int uclass_find_device_by_of_offset(enum uclass_id id, int node,
int uclass_find_device_by_ofnode(enum uclass_id id, ofnode node, int uclass_find_device_by_ofnode(enum uclass_id id, ofnode node,
struct udevice **devp); struct udevice **devp);
/**
* uclass_find_device_by_phandle() - Find a uclass device by phandle
*
* This searches the devices in the uclass for one with the given phandle.
*
* The device is NOT probed, it is merely returned.
*
* @id: ID to look up
* @parent: Parent device containing the phandle pointer
* @name: Name of property in the parent device node
* @devp: Returns pointer to device (there is only one for each node)
* @return 0 if OK, -ENOENT if there is no @name present in the node, other
* -ve on error
*/
int uclass_find_device_by_phandle(enum uclass_id id, struct udevice *parent,
const char *name, struct udevice **devp);
/** /**
* uclass_bind_device() - Associate device with a uclass * uclass_bind_device() - Associate device with a uclass
* *

View File

@ -536,6 +536,27 @@ int i2c_chip_ofdata_to_platdata(struct udevice *dev, struct dm_i2c_chip *chip);
*/ */
void i2c_dump_msgs(struct i2c_msg *msg, int nmsgs); void i2c_dump_msgs(struct i2c_msg *msg, int nmsgs);
/**
* i2c_emul_find() - Find an emulator for an i2c sandbox device
*
* This looks at the device's 'emul' phandle
*
* @dev: Device to find an emulator for
* @emulp: Returns the associated emulator, if found *
* @return 0 if OK, -ENOENT or -ENODEV if not found
*/
int i2c_emul_find(struct udevice *dev, struct udevice **emulp);
/**
* i2c_emul_get_device() - Find the device being emulated
*
* Given an emulator this returns the associated device
*
* @emul: Emulator for the device
* @return device that @emul is emulating
*/
struct udevice *i2c_emul_get_device(struct udevice *emul);
#ifndef CONFIG_DM_I2C #ifndef CONFIG_DM_I2C
/* /*

View File

@ -114,7 +114,7 @@ int _log(enum log_category_t cat, enum log_level_t level, const char *file,
/* Emit a log record if the level is less that the maximum */ /* Emit a log record if the level is less that the maximum */
#define log(_cat, _level, _fmt, _args...) ({ \ #define log(_cat, _level, _fmt, _args...) ({ \
int _l = _level; \ int _l = _level; \
if (_l <= _LOG_MAX_LEVEL) \ if (CONFIG_IS_ENABLED(LOG) && _l <= _LOG_MAX_LEVEL) \
_log((enum log_category_t)(_cat), _l, __FILE__, __LINE__, \ _log((enum log_category_t)(_cat), _l, __FILE__, __LINE__, \
__func__, \ __func__, \
pr_fmt(_fmt), ##_args); \ pr_fmt(_fmt), ##_args); \

View File

@ -880,6 +880,7 @@ static inline void free(void *ptr) {}
void *calloc(size_t nmemb, size_t size); void *calloc(size_t nmemb, size_t size);
void *memalign_simple(size_t alignment, size_t bytes); void *memalign_simple(size_t alignment, size_t bytes);
void *realloc_simple(void *ptr, size_t size); void *realloc_simple(void *ptr, size_t size);
void malloc_simple_info(void);
#else #else
# ifdef USE_DL_PREFIX # ifdef USE_DL_PREFIX

View File

@ -31,11 +31,13 @@ struct sound_codec_info {
/* /*
* Generates square wave sound data for 1 second * Generates square wave sound data for 1 second
* *
* @param sample_rate Sample rate in Hz
* @param data data buffer pointer * @param data data buffer pointer
* @param size size of the buffer * @param size size of the buffer
* @param freq frequency of the wave * @param freq frequency of the wave
*/ */
void sound_create_square_wave(unsigned short *data, int size, uint32_t freq); void sound_create_square_wave(uint sample_rate, unsigned short *data, int size,
uint freq);
/* /*
* Initialises audio sub system * Initialises audio sub system

View File

@ -26,6 +26,8 @@ enum tpm_duration {
/* Max buffer size supported by our tpm */ /* Max buffer size supported by our tpm */
#define TPM_DEV_BUFSIZE 1260 #define TPM_DEV_BUFSIZE 1260
#define TPM_PCR_MINIMUM_DIGEST_SIZE 20
/** /**
* enum tpm_version - The version of the TPM stack to be used * enum tpm_version - The version of the TPM stack to be used
* @TPM_V1: Use TPM v1.x stack * @TPM_V1: Use TPM v1.x stack
@ -174,11 +176,39 @@ struct tpm_ops {
int do_##cmd(cmd_tbl_t *cmdtp, int flag, \ int do_##cmd(cmd_tbl_t *cmdtp, int flag, \
int argc, char * const argv[]) \ int argc, char * const argv[]) \
{ \ { \
struct udevice *dev; \
int rc; \
\
rc = get_tpm(&dev); \
if (rc) \
return rc; \
if (argc != 1) \ if (argc != 1) \
return CMD_RET_USAGE; \ return CMD_RET_USAGE; \
return report_return_code(cmd()); \ return report_return_code(cmd(dev)); \
} }
/**
* tpm_open() - Request access to locality 0 for the caller
*
* After all commands have been completed the caller is supposed to
* call tpm_close().
*
* @dev - TPM device
* Returns 0 on success, -ve on failure.
*/
int tpm_open(struct udevice *dev);
/**
* tpm_close() - Close the current session
*
* Releasing the locked locality. Returns 0 on success, -ve 1 on
* failure (in case lock removal did not succeed).
*
* @dev - TPM device
* Returns 0 on success, -ve on failure.
*/
int tpm_close(struct udevice *dev);
/** /**
* tpm_get_desc() - Get a text description of the TPM * tpm_get_desc() - Get a text description of the TPM
* *
@ -202,6 +232,7 @@ int tpm_get_desc(struct udevice *dev, char *buf, int size);
* Note that the outgoing data is inspected to determine command type * Note that the outgoing data is inspected to determine command type
* (ordinal) and a timeout is used for that command type. * (ordinal) and a timeout is used for that command type.
* *
* @dev - TPM device
* @sendbuf - buffer of the data to send * @sendbuf - buffer of the data to send
* @send_size size of the data to send * @send_size size of the data to send
* @recvbuf - memory to save the response to * @recvbuf - memory to save the response to
@ -216,9 +247,10 @@ int tpm_xfer(struct udevice *dev, const u8 *sendbuf, size_t send_size,
/** /**
* Initialize TPM device. It must be called before any TPM commands. * Initialize TPM device. It must be called before any TPM commands.
* *
* @dev - TPM device
* @return 0 on success, non-0 on error. * @return 0 on success, non-0 on error.
*/ */
int tpm_init(void); int tpm_init(struct udevice *dev);
/** /**
* Retrieve the array containing all the v1 (resp. v2) commands. * Retrieve the array containing all the v1 (resp. v2) commands.

View File

@ -282,64 +282,72 @@ struct __packed tpm_nv_data_public {
/** /**
* Issue a TPM_Startup command. * Issue a TPM_Startup command.
* *
* @param dev TPM device
* @param mode TPM startup mode * @param mode TPM startup mode
* @return return code of the operation * @return return code of the operation
*/ */
u32 tpm_startup(enum tpm_startup_type mode); u32 tpm_startup(struct udevice *dev, enum tpm_startup_type mode);
/** /**
* Issue a TPM_SelfTestFull command. * Issue a TPM_SelfTestFull command.
* *
* @param dev TPM device
* @return return code of the operation * @return return code of the operation
*/ */
u32 tpm_self_test_full(void); u32 tpm_self_test_full(struct udevice *dev);
/** /**
* Issue a TPM_ContinueSelfTest command. * Issue a TPM_ContinueSelfTest command.
* *
* @param dev TPM device
* @return return code of the operation * @return return code of the operation
*/ */
u32 tpm_continue_self_test(void); u32 tpm_continue_self_test(struct udevice *dev);
/** /**
* Issue a TPM_NV_DefineSpace command. The implementation is limited * Issue a TPM_NV_DefineSpace command. The implementation is limited
* to specify TPM_NV_ATTRIBUTES and size of the area. The area index * to specify TPM_NV_ATTRIBUTES and size of the area. The area index
* could be one of the special value listed in enum tpm_nv_index. * could be one of the special value listed in enum tpm_nv_index.
* *
* @param dev TPM device
* @param index index of the area * @param index index of the area
* @param perm TPM_NV_ATTRIBUTES of the area * @param perm TPM_NV_ATTRIBUTES of the area
* @param size size of the area * @param size size of the area
* @return return code of the operation * @return return code of the operation
*/ */
u32 tpm_nv_define_space(u32 index, u32 perm, u32 size); u32 tpm_nv_define_space(struct udevice *dev, u32 index, u32 perm, u32 size);
/** /**
* Issue a TPM_NV_ReadValue command. This implementation is limited * Issue a TPM_NV_ReadValue command. This implementation is limited
* to read the area from offset 0. The area index could be one of * to read the area from offset 0. The area index could be one of
* the special value listed in enum tpm_nv_index. * the special value listed in enum tpm_nv_index.
* *
* @param dev TPM device
* @param index index of the area * @param index index of the area
* @param data output buffer of the area contents * @param data output buffer of the area contents
* @param count size of output buffer * @param count size of output buffer
* @return return code of the operation * @return return code of the operation
*/ */
u32 tpm_nv_read_value(u32 index, void *data, u32 count); u32 tpm_nv_read_value(struct udevice *dev, u32 index, void *data, u32 count);
/** /**
* Issue a TPM_NV_WriteValue command. This implementation is limited * Issue a TPM_NV_WriteValue command. This implementation is limited
* to write the area from offset 0. The area index could be one of * to write the area from offset 0. The area index could be one of
* the special value listed in enum tpm_nv_index. * the special value listed in enum tpm_nv_index.
* *
* @param dev TPM device
* @param index index of the area * @param index index of the area
* @param data input buffer to be wrote to the area * @param data input buffer to be wrote to the area
* @param length length of data bytes of input buffer * @param length length of data bytes of input buffer
* @return return code of the operation * @return return code of the operation
*/ */
u32 tpm_nv_write_value(u32 index, const void *data, u32 length); u32 tpm_nv_write_value(struct udevice *dev, u32 index, const void *data,
u32 length);
/** /**
* Issue a TPM_Extend command. * Issue a TPM_Extend command.
* *
* @param dev TPM device
* @param index index of the PCR * @param index index of the PCR
* @param in_digest 160-bit value representing the event to be * @param in_digest 160-bit value representing the event to be
* recorded * recorded
@ -347,69 +355,78 @@ u32 tpm_nv_write_value(u32 index, const void *data, u32 length);
* command * command
* @return return code of the operation * @return return code of the operation
*/ */
u32 tpm_extend(u32 index, const void *in_digest, void *out_digest); u32 tpm_extend(struct udevice *dev, u32 index, const void *in_digest,
void *out_digest);
/** /**
* Issue a TPM_PCRRead command. * Issue a TPM_PCRRead command.
* *
* @param dev TPM device
* @param index index of the PCR * @param index index of the PCR
* @param data output buffer for contents of the named PCR * @param data output buffer for contents of the named PCR
* @param count size of output buffer * @param count size of output buffer
* @return return code of the operation * @return return code of the operation
*/ */
u32 tpm_pcr_read(u32 index, void *data, size_t count); u32 tpm_pcr_read(struct udevice *dev, u32 index, void *data, size_t count);
/** /**
* Issue a TSC_PhysicalPresence command. TPM physical presence flag * Issue a TSC_PhysicalPresence command. TPM physical presence flag
* is bit-wise OR'ed of flags listed in enum tpm_physical_presence. * is bit-wise OR'ed of flags listed in enum tpm_physical_presence.
* *
* @param dev TPM device
* @param presence TPM physical presence flag * @param presence TPM physical presence flag
* @return return code of the operation * @return return code of the operation
*/ */
u32 tpm_tsc_physical_presence(u16 presence); u32 tpm_tsc_physical_presence(struct udevice *dev, u16 presence);
/** /**
* Issue a TPM_ReadPubek command. * Issue a TPM_ReadPubek command.
* *
* @param dev TPM device
* @param data output buffer for the public endorsement key * @param data output buffer for the public endorsement key
* @param count size of output buffer * @param count size of output buffer
* @return return code of the operation * @return return code of the operation
*/ */
u32 tpm_read_pubek(void *data, size_t count); u32 tpm_read_pubek(struct udevice *dev, void *data, size_t count);
/** /**
* Issue a TPM_ForceClear command. * Issue a TPM_ForceClear command.
* *
* @param dev TPM device
* @return return code of the operation * @return return code of the operation
*/ */
u32 tpm_force_clear(void); u32 tpm_force_clear(struct udevice *dev);
/** /**
* Issue a TPM_PhysicalEnable command. * Issue a TPM_PhysicalEnable command.
* *
* @param dev TPM device
* @return return code of the operation * @return return code of the operation
*/ */
u32 tpm_physical_enable(void); u32 tpm_physical_enable(struct udevice *dev);
/** /**
* Issue a TPM_PhysicalDisable command. * Issue a TPM_PhysicalDisable command.
* *
* @param dev TPM device
* @return return code of the operation * @return return code of the operation
*/ */
u32 tpm_physical_disable(void); u32 tpm_physical_disable(struct udevice *dev);
/** /**
* Issue a TPM_PhysicalSetDeactivated command. * Issue a TPM_PhysicalSetDeactivated command.
* *
* @param dev TPM device
* @param state boolean state of the deactivated flag * @param state boolean state of the deactivated flag
* @return return code of the operation * @return return code of the operation
*/ */
u32 tpm_physical_set_deactivated(u8 state); u32 tpm_physical_set_deactivated(struct udevice *dev, u8 state);
/** /**
* Issue a TPM_GetCapability command. This implementation is limited * Issue a TPM_GetCapability command. This implementation is limited
* to query sub_cap index that is 4-byte wide. * to query sub_cap index that is 4-byte wide.
* *
* @param dev TPM device
* @param cap_area partition of capabilities * @param cap_area partition of capabilities
* @param sub_cap further definition of capability, which is * @param sub_cap further definition of capability, which is
* limited to be 4-byte wide * limited to be 4-byte wide
@ -417,15 +434,17 @@ u32 tpm_physical_set_deactivated(u8 state);
* @param count size of output buffer * @param count size of output buffer
* @return return code of the operation * @return return code of the operation
*/ */
u32 tpm_get_capability(u32 cap_area, u32 sub_cap, void *cap, size_t count); u32 tpm_get_capability(struct udevice *dev, u32 cap_area, u32 sub_cap,
void *cap, size_t count);
/** /**
* Issue a TPM_FlushSpecific command for a AUTH resource. * Issue a TPM_FlushSpecific command for a AUTH resource.
* *
* @param dev TPM device
* @param auth_handle handle of the auth session * @param auth_handle handle of the auth session
* @return return code of the operation * @return return code of the operation
*/ */
u32 tpm_terminate_auth_session(u32 auth_handle); u32 tpm_terminate_auth_session(struct udevice *dev, u32 auth_handle);
/** /**
* Issue a TPM_OIAP command to setup an object independent authorization * Issue a TPM_OIAP command to setup an object independent authorization
@ -434,22 +453,25 @@ u32 tpm_terminate_auth_session(u32 auth_handle);
* If there was already an OIAP session active it is terminated and a new * If there was already an OIAP session active it is terminated and a new
* session is set up. * session is set up.
* *
* @param dev TPM device
* @param auth_handle pointer to the (new) auth handle or NULL. * @param auth_handle pointer to the (new) auth handle or NULL.
* @return return code of the operation * @return return code of the operation
*/ */
u32 tpm_oiap(u32 *auth_handle); u32 tpm_oiap(struct udevice *dev, u32 *auth_handle);
/** /**
* Ends an active OIAP session. * Ends an active OIAP session.
* *
* @param dev TPM device
* @return return code of the operation * @return return code of the operation
*/ */
u32 tpm_end_oiap(void); u32 tpm_end_oiap(struct udevice *dev);
/** /**
* Issue a TPM_LoadKey2 (Auth1) command using an OIAP session for authenticating * Issue a TPM_LoadKey2 (Auth1) command using an OIAP session for authenticating
* the usage of the parent key. * the usage of the parent key.
* *
* @param dev TPM device
* @param parent_handle handle of the parent key. * @param parent_handle handle of the parent key.
* @param key pointer to the key structure (TPM_KEY or TPM_KEY12). * @param key pointer to the key structure (TPM_KEY or TPM_KEY12).
* @param key_length size of the key structure * @param key_length size of the key structure
@ -457,13 +479,15 @@ u32 tpm_end_oiap(void);
* @param key_handle pointer to the key handle * @param key_handle pointer to the key handle
* @return return code of the operation * @return return code of the operation
*/ */
u32 tpm_load_key2_oiap(u32 parent_handle, const void *key, size_t key_length, u32 tpm_load_key2_oiap(struct udevice *dev, u32 parent_handle, const void *key,
const void *parent_key_usage_auth, u32 *key_handle); size_t key_length, const void *parent_key_usage_auth,
u32 *key_handle);
/** /**
* Issue a TPM_GetPubKey (Auth1) command using an OIAP session for * Issue a TPM_GetPubKey (Auth1) command using an OIAP session for
* authenticating the usage of the key. * authenticating the usage of the key.
* *
* @param dev TPM device
* @param key_handle handle of the key * @param key_handle handle of the key
* @param usage_auth usage auth for the key * @param usage_auth usage auth for the key
* @param pubkey pointer to the pub key buffer; may be NULL if the pubkey * @param pubkey pointer to the pub key buffer; may be NULL if the pubkey
@ -473,45 +497,51 @@ u32 tpm_load_key2_oiap(u32 parent_handle, const void *key, size_t key_length,
* of the stored TPM_PUBKEY structure (iff pubkey != NULL). * of the stored TPM_PUBKEY structure (iff pubkey != NULL).
* @return return code of the operation * @return return code of the operation
*/ */
u32 tpm_get_pub_key_oiap(u32 key_handle, const void *usage_auth, void *pubkey, u32 tpm_get_pub_key_oiap(struct udevice *dev, u32 key_handle,
const void *usage_auth, void *pubkey,
size_t *pubkey_len); size_t *pubkey_len);
/** /**
* Get the TPM permanent flags value * Get the TPM permanent flags value
* *
* @param dev TPM device
* @param pflags Place to put permanent flags * @param pflags Place to put permanent flags
* @return return code of the operation * @return return code of the operation
*/ */
u32 tpm_get_permanent_flags(struct tpm_permanent_flags *pflags); u32 tpm_get_permanent_flags(struct udevice *dev,
struct tpm_permanent_flags *pflags);
/** /**
* Get the TPM permissions * Get the TPM permissions
* *
* @param dev TPM device
* @param perm Returns permissions value * @param perm Returns permissions value
* @return return code of the operation * @return return code of the operation
*/ */
u32 tpm_get_permissions(u32 index, u32 *perm); u32 tpm_get_permissions(struct udevice *dev, u32 index, u32 *perm);
/** /**
* Flush a resource with a given handle and type from the TPM * Flush a resource with a given handle and type from the TPM
* *
* @param dev TPM device
* @param key_handle handle of the resource * @param key_handle handle of the resource
* @param resource_type type of the resource * @param resource_type type of the resource
* @return return code of the operation * @return return code of the operation
*/ */
u32 tpm_flush_specific(u32 key_handle, u32 resource_type); u32 tpm_flush_specific(struct udevice *dev, u32 key_handle, u32 resource_type);
#ifdef CONFIG_TPM_LOAD_KEY_BY_SHA1 #ifdef CONFIG_TPM_LOAD_KEY_BY_SHA1
/** /**
* Search for a key by usage AuthData and the hash of the parent's pub key. * Search for a key by usage AuthData and the hash of the parent's pub key.
* *
* @param dev TPM device
* @param auth Usage auth of the key to search for * @param auth Usage auth of the key to search for
* @param pubkey_digest SHA1 hash of the pub key structure of the key * @param pubkey_digest SHA1 hash of the pub key structure of the key
* @param[out] handle The handle of the key (Non-null iff found) * @param[out] handle The handle of the key (Non-null iff found)
* @return 0 if key was found in TPM; != 0 if not. * @return 0 if key was found in TPM; != 0 if not.
*/ */
u32 tpm_find_key_sha1(const u8 auth[20], const u8 pubkey_digest[20], u32 tpm_find_key_sha1(struct udevice *dev, const u8 auth[20],
u32 *handle); const u8 pubkey_digest[20], u32 *handle);
#endif /* CONFIG_TPM_LOAD_KEY_BY_SHA1 */ #endif /* CONFIG_TPM_LOAD_KEY_BY_SHA1 */
/** /**
@ -519,38 +549,43 @@ u32 tpm_find_key_sha1(const u8 auth[20], const u8 pubkey_digest[20],
* that the TPM may legally return fewer bytes than requested by retrying * that the TPM may legally return fewer bytes than requested by retrying
* until @p count bytes have been received. * until @p count bytes have been received.
* *
* @param dev TPM device
* @param data output buffer for the random bytes * @param data output buffer for the random bytes
* @param count size of output buffer * @param count size of output buffer
* @return return code of the operation * @return return code of the operation
*/ */
u32 tpm_get_random(void *data, u32 count); u32 tpm_get_random(struct udevice *dev, void *data, u32 count);
/** /**
* tpm_finalise_physical_presence() - Finalise physical presence * tpm_finalise_physical_presence() - Finalise physical presence
* *
* @param dev TPM device
* @return return code of the operation (0 = success) * @return return code of the operation (0 = success)
*/ */
u32 tpm_finalise_physical_presence(void); u32 tpm_finalise_physical_presence(struct udevice *dev);
/** /**
* tpm_nv_set_locked() - lock the non-volatile space * tpm_nv_set_locked() - lock the non-volatile space
* *
* @param dev TPM device
* @return return code of the operation (0 = success) * @return return code of the operation (0 = success)
*/ */
u32 tpm_nv_set_locked(void); u32 tpm_nv_set_locked(struct udevice *dev);
/** /**
* tpm_set_global_lock() - set the global lock * tpm_set_global_lock() - set the global lock
* *
* @param dev TPM device
* @return return code of the operation (0 = success) * @return return code of the operation (0 = success)
*/ */
u32 tpm_set_global_lock(void); u32 tpm_set_global_lock(struct udevice *dev);
/** /**
* tpm_resume() - start up the TPM from resume (after suspend) * tpm_resume() - start up the TPM from resume (after suspend)
* *
* @param dev TPM device
* @return return code of the operation (0 = success) * @return return code of the operation (0 = success)
*/ */
u32 tpm_resume(void); u32 tpm_resume(struct udevice *dev);
#endif /* __TPM_V1_H */ #endif /* __TPM_V1_H */

View File

@ -131,45 +131,51 @@ enum tpm2_algorithms {
/** /**
* Issue a TPM2_Startup command. * Issue a TPM2_Startup command.
* *
* @dev TPM device
* @mode TPM startup mode * @mode TPM startup mode
* *
* @return code of the operation * @return code of the operation
*/ */
u32 tpm2_startup(enum tpm2_startup_types mode); u32 tpm2_startup(struct udevice *dev, enum tpm2_startup_types mode);
/** /**
* Issue a TPM2_SelfTest command. * Issue a TPM2_SelfTest command.
* *
* @dev TPM device
* @full_test Asking to perform all tests or only the untested ones * @full_test Asking to perform all tests or only the untested ones
* *
* @return code of the operation * @return code of the operation
*/ */
u32 tpm2_self_test(enum tpm2_yes_no full_test); u32 tpm2_self_test(struct udevice *dev, enum tpm2_yes_no full_test);
/** /**
* Issue a TPM2_Clear command. * Issue a TPM2_Clear command.
* *
* @dev TPM device
* @handle Handle * @handle Handle
* @pw Password * @pw Password
* @pw_sz Length of the password * @pw_sz Length of the password
* *
* @return code of the operation * @return code of the operation
*/ */
u32 tpm2_clear(u32 handle, const char *pw, const ssize_t pw_sz); u32 tpm2_clear(struct udevice *dev, u32 handle, const char *pw,
const ssize_t pw_sz);
/** /**
* Issue a TPM2_PCR_Extend command. * Issue a TPM2_PCR_Extend command.
* *
* @dev TPM device
* @index Index of the PCR * @index Index of the PCR
* @digest Value representing the event to be recorded * @digest Value representing the event to be recorded
* *
* @return code of the operation * @return code of the operation
*/ */
u32 tpm2_pcr_extend(u32 index, const uint8_t *digest); u32 tpm2_pcr_extend(struct udevice *dev, u32 index, const uint8_t *digest);
/** /**
* Issue a TPM2_PCR_Read command. * Issue a TPM2_PCR_Read command.
* *
* @dev TPM device
* @idx Index of the PCR * @idx Index of the PCR
* @idx_min_sz Minimum size in bytes of the pcrSelect array * @idx_min_sz Minimum size in bytes of the pcrSelect array
* @data Output buffer for contents of the named PCR * @data Output buffer for contents of the named PCR
@ -177,13 +183,14 @@ u32 tpm2_pcr_extend(u32 index, const uint8_t *digest);
* *
* @return code of the operation * @return code of the operation
*/ */
u32 tpm2_pcr_read(u32 idx, unsigned int idx_min_sz, void *data, u32 tpm2_pcr_read(struct udevice *dev, u32 idx, unsigned int idx_min_sz,
unsigned int *updates); void *data, unsigned int *updates);
/** /**
* Issue a TPM2_GetCapability command. This implementation is limited * Issue a TPM2_GetCapability command. This implementation is limited
* to query property index that is 4-byte wide. * to query property index that is 4-byte wide.
* *
* @dev TPM device
* @capability Partition of capabilities * @capability Partition of capabilities
* @property Further definition of capability, limited to be 4 bytes wide * @property Further definition of capability, limited to be 4 bytes wide
* @buf Output buffer for capability information * @buf Output buffer for capability information
@ -191,22 +198,24 @@ u32 tpm2_pcr_read(u32 idx, unsigned int idx_min_sz, void *data,
* *
* @return code of the operation * @return code of the operation
*/ */
u32 tpm2_get_capability(u32 capability, u32 property, void *buf, u32 tpm2_get_capability(struct udevice *dev, u32 capability, u32 property,
size_t prop_count); void *buf, size_t prop_count);
/** /**
* Issue a TPM2_DictionaryAttackLockReset command. * Issue a TPM2_DictionaryAttackLockReset command.
* *
* @dev TPM device
* @pw Password * @pw Password
* @pw_sz Length of the password * @pw_sz Length of the password
* *
* @return code of the operation * @return code of the operation
*/ */
u32 tpm2_dam_reset(const char *pw, const ssize_t pw_sz); u32 tpm2_dam_reset(struct udevice *dev, const char *pw, const ssize_t pw_sz);
/** /**
* Issue a TPM2_DictionaryAttackParameters command. * Issue a TPM2_DictionaryAttackParameters command.
* *
* @dev TPM device
* @pw Password * @pw Password
* @pw_sz Length of the password * @pw_sz Length of the password
* @max_tries Count of authorizations before lockout * @max_tries Count of authorizations before lockout
@ -215,13 +224,15 @@ u32 tpm2_dam_reset(const char *pw, const ssize_t pw_sz);
* *
* @return code of the operation * @return code of the operation
*/ */
u32 tpm2_dam_parameters(const char *pw, const ssize_t pw_sz, u32 tpm2_dam_parameters(struct udevice *dev, const char *pw,
unsigned int max_tries, unsigned int recovery_time, const ssize_t pw_sz, unsigned int max_tries,
unsigned int recovery_time,
unsigned int lockout_recovery); unsigned int lockout_recovery);
/** /**
* Issue a TPM2_HierarchyChangeAuth command. * Issue a TPM2_HierarchyChangeAuth command.
* *
* @dev TPM device
* @handle Handle * @handle Handle
* @newpw New password * @newpw New password
* @newpw_sz Length of the new password * @newpw_sz Length of the new password
@ -230,12 +241,14 @@ u32 tpm2_dam_parameters(const char *pw, const ssize_t pw_sz,
* *
* @return code of the operation * @return code of the operation
*/ */
int tpm2_change_auth(u32 handle, const char *newpw, const ssize_t newpw_sz, int tpm2_change_auth(struct udevice *dev, u32 handle, const char *newpw,
const char *oldpw, const ssize_t oldpw_sz); const ssize_t newpw_sz, const char *oldpw,
const ssize_t oldpw_sz);
/** /**
* Issue a TPM_PCR_SetAuthPolicy command. * Issue a TPM_PCR_SetAuthPolicy command.
* *
* @dev TPM device
* @pw Platform password * @pw Platform password
* @pw_sz Length of the password * @pw_sz Length of the password
* @index Index of the PCR * @index Index of the PCR
@ -243,12 +256,13 @@ int tpm2_change_auth(u32 handle, const char *newpw, const ssize_t newpw_sz,
* *
* @return code of the operation * @return code of the operation
*/ */
u32 tpm2_pcr_setauthpolicy(const char *pw, const ssize_t pw_sz, u32 index, u32 tpm2_pcr_setauthpolicy(struct udevice *dev, const char *pw,
const char *key); const ssize_t pw_sz, u32 index, const char *key);
/** /**
* Issue a TPM_PCR_SetAuthValue command. * Issue a TPM_PCR_SetAuthValue command.
* *
* @dev TPM device
* @pw Platform password * @pw Platform password
* @pw_sz Length of the password * @pw_sz Length of the password
* @index Index of the PCR * @index Index of the PCR
@ -257,7 +271,8 @@ u32 tpm2_pcr_setauthpolicy(const char *pw, const ssize_t pw_sz, u32 index,
* *
* @return code of the operation * @return code of the operation
*/ */
u32 tpm2_pcr_setauthvalue(const char *pw, const ssize_t pw_sz, u32 index, u32 tpm2_pcr_setauthvalue(struct udevice *dev, const char *pw,
const char *key, const ssize_t key_sz); const ssize_t pw_sz, u32 index, const char *key,
const ssize_t key_sz);
#endif /* __TPM_V2_H */ #endif /* __TPM_V2_H */

View File

@ -151,9 +151,9 @@ u32 tpm_return_code(const void *response)
return get_unaligned_be32(response + return_code_offset); return get_unaligned_be32(response + return_code_offset);
} }
u32 tpm_sendrecv_command(const void *command, void *response, size_t *size_ptr) u32 tpm_sendrecv_command(struct udevice *dev, const void *command,
void *response, size_t *size_ptr)
{ {
struct udevice *dev;
int err, ret; int err, ret;
u8 response_buffer[COMMAND_BUFFER_SIZE]; u8 response_buffer[COMMAND_BUFFER_SIZE];
size_t response_length; size_t response_length;
@ -166,9 +166,6 @@ u32 tpm_sendrecv_command(const void *command, void *response, size_t *size_ptr)
response_length = sizeof(response_buffer); response_length = sizeof(response_buffer);
} }
ret = uclass_first_device_err(UCLASS_TPM, &dev);
if (ret)
return ret;
err = tpm_xfer(dev, command, tpm_command_size(command), err = tpm_xfer(dev, command, tpm_command_size(command),
response, &response_length); response, &response_length);
@ -188,14 +185,7 @@ u32 tpm_sendrecv_command(const void *command, void *response, size_t *size_ptr)
return ret; return ret;
} }
int tpm_init(void) int tpm_init(struct udevice *dev)
{ {
struct udevice *dev;
int err;
err = uclass_first_device_err(UCLASS_TPM, &dev);
if (err)
return err;
return tpm_open(dev); return tpm_open(dev);
} }

View File

@ -18,24 +18,6 @@
#define tpm_u16(x) __MSB(x), __LSB(x) #define tpm_u16(x) __MSB(x), __LSB(x)
#define tpm_u32(x) tpm_u16((x) >> 16), tpm_u16((x) & 0xFFFF) #define tpm_u32(x) tpm_u16((x) >> 16), tpm_u16((x) & 0xFFFF)
/**
* tpm_open() - Request access to locality 0 for the caller
*
* After all commands have been completed the caller is supposed to
* call tpm_close().
*
* Returns 0 on success, -ve on failure.
*/
int tpm_open(struct udevice *dev);
/**
* tpm_close() - Close the current session
*
* Releasing the locked locality. Returns 0 on success, -ve 1 on
* failure (in case lock removal did not succeed).
*/
int tpm_close(struct udevice *dev);
/** /**
* Pack data into a byte string. The data types are specified in * Pack data into a byte string. The data types are specified in
* the format string: 'b' means unsigned byte, 'w' unsigned word, * the format string: 'b' means unsigned byte, 'w' unsigned word,
@ -96,6 +78,7 @@ u32 tpm_return_code(const void *response);
* is a bidirectional * is a bidirectional
* @return return code of the TPM response * @return return code of the TPM response
*/ */
u32 tpm_sendrecv_command(const void *command, void *response, size_t *size_ptr); u32 tpm_sendrecv_command(struct udevice *dev, const void *command,
void *response, size_t *size_ptr);
#endif /* __TPM_UTILS_H */ #endif /* __TPM_UTILS_H */

View File

@ -31,7 +31,7 @@ static struct session_data oiap_session = {0, };
#endif /* CONFIG_TPM_AUTH_SESSIONS */ #endif /* CONFIG_TPM_AUTH_SESSIONS */
u32 tpm_startup(enum tpm_startup_type mode) u32 tpm_startup(struct udevice *dev, enum tpm_startup_type mode)
{ {
const u8 command[12] = { const u8 command[12] = {
0x0, 0xc1, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x99, 0x0, 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x99, 0x0, 0x0,
@ -44,49 +44,49 @@ u32 tpm_startup(enum tpm_startup_type mode)
mode_offset, mode)) mode_offset, mode))
return TPM_LIB_ERROR; return TPM_LIB_ERROR;
return tpm_sendrecv_command(buf, NULL, NULL); return tpm_sendrecv_command(dev, buf, NULL, NULL);
} }
u32 tpm_resume(void) u32 tpm_resume(struct udevice *dev)
{ {
return tpm_startup(TPM_ST_STATE); return tpm_startup(dev, TPM_ST_STATE);
} }
u32 tpm_self_test_full(void) u32 tpm_self_test_full(struct udevice *dev)
{ {
const u8 command[10] = { const u8 command[10] = {
0x0, 0xc1, 0x0, 0x0, 0x0, 0xa, 0x0, 0x0, 0x0, 0x50, 0x0, 0xc1, 0x0, 0x0, 0x0, 0xa, 0x0, 0x0, 0x0, 0x50,
}; };
return tpm_sendrecv_command(command, NULL, NULL); return tpm_sendrecv_command(dev, command, NULL, NULL);
} }
u32 tpm_continue_self_test(void) u32 tpm_continue_self_test(struct udevice *dev)
{ {
const u8 command[10] = { const u8 command[10] = {
0x0, 0xc1, 0x0, 0x0, 0x0, 0xa, 0x0, 0x0, 0x0, 0x53, 0x0, 0xc1, 0x0, 0x0, 0x0, 0xa, 0x0, 0x0, 0x0, 0x53,
}; };
return tpm_sendrecv_command(command, NULL, NULL); return tpm_sendrecv_command(dev, command, NULL, NULL);
} }
u32 tpm_clear_and_reenable(void) u32 tpm_clear_and_reenable(struct udevice *dev)
{ {
u32 ret; u32 ret;
log_info("TPM: Clear and re-enable\n"); log_info("TPM: Clear and re-enable\n");
ret = tpm_force_clear(); ret = tpm_force_clear(dev);
if (ret != TPM_SUCCESS) { if (ret != TPM_SUCCESS) {
log_err("Can't initiate a force clear\n"); log_err("Can't initiate a force clear\n");
return ret; return ret;
} }
#if IS_ENABLED(CONFIG_TPM_V1) #if IS_ENABLED(CONFIG_TPM_V1)
ret = tpm_physical_enable(); ret = tpm_physical_enable(dev);
if (ret != TPM_SUCCESS) { if (ret != TPM_SUCCESS) {
log_err("TPM: Can't set enabled state\n"); log_err("TPM: Can't set enabled state\n");
return ret; return ret;
} }
ret = tpm_physical_set_deactivated(0); ret = tpm_physical_set_deactivated(dev, 0);
if (ret != TPM_SUCCESS) { if (ret != TPM_SUCCESS) {
log_err("TPM: Can't set deactivated state\n"); log_err("TPM: Can't set deactivated state\n");
return ret; return ret;
@ -96,7 +96,7 @@ u32 tpm_clear_and_reenable(void)
return TPM_SUCCESS; return TPM_SUCCESS;
} }
u32 tpm_nv_define_space(u32 index, u32 perm, u32 size) u32 tpm_nv_define_space(struct udevice *dev, u32 index, u32 perm, u32 size)
{ {
const u8 command[101] = { const u8 command[101] = {
0x0, 0xc1, /* TPM_TAG */ 0x0, 0xc1, /* TPM_TAG */
@ -136,15 +136,15 @@ u32 tpm_nv_define_space(u32 index, u32 perm, u32 size)
size_offset, size)) size_offset, size))
return TPM_LIB_ERROR; return TPM_LIB_ERROR;
return tpm_sendrecv_command(buf, NULL, NULL); return tpm_sendrecv_command(dev, buf, NULL, NULL);
} }
u32 tpm_nv_set_locked(void) u32 tpm_nv_set_locked(struct udevice *dev)
{ {
return tpm_nv_define_space(TPM_NV_INDEX_LOCK, 0, 0); return tpm_nv_define_space(dev, TPM_NV_INDEX_LOCK, 0, 0);
} }
u32 tpm_nv_read_value(u32 index, void *data, u32 count) u32 tpm_nv_read_value(struct udevice *dev, u32 index, void *data, u32 count)
{ {
const u8 command[22] = { const u8 command[22] = {
0x0, 0xc1, 0x0, 0x0, 0x0, 0x16, 0x0, 0x0, 0x0, 0xcf, 0x0, 0xc1, 0x0, 0x0, 0x0, 0x16, 0x0, 0x0, 0x0, 0xcf,
@ -163,7 +163,7 @@ u32 tpm_nv_read_value(u32 index, void *data, u32 count)
index_offset, index, index_offset, index,
length_offset, count)) length_offset, count))
return TPM_LIB_ERROR; return TPM_LIB_ERROR;
err = tpm_sendrecv_command(buf, response, &response_length); err = tpm_sendrecv_command(dev, buf, response, &response_length);
if (err) if (err)
return err; return err;
if (unpack_byte_string(response, response_length, "d", if (unpack_byte_string(response, response_length, "d",
@ -178,7 +178,8 @@ u32 tpm_nv_read_value(u32 index, void *data, u32 count)
return 0; return 0;
} }
u32 tpm_nv_write_value(u32 index, const void *data, u32 length) u32 tpm_nv_write_value(struct udevice *dev, u32 index, const void *data,
u32 length)
{ {
const u8 command[256] = { const u8 command[256] = {
0x0, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcd, 0x0, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcd,
@ -201,21 +202,22 @@ u32 tpm_nv_write_value(u32 index, const void *data, u32 length)
length_offset, length, length_offset, length,
data_offset, data, length)) data_offset, data, length))
return TPM_LIB_ERROR; return TPM_LIB_ERROR;
err = tpm_sendrecv_command(buf, response, &response_length); err = tpm_sendrecv_command(dev, buf, response, &response_length);
if (err) if (err)
return err; return err;
return 0; return 0;
} }
uint32_t tpm_set_global_lock(void) uint32_t tpm_set_global_lock(struct udevice *dev)
{ {
u32 x; u32 x;
return tpm_nv_write_value(TPM_NV_INDEX_0, (uint8_t *)&x, 0); return tpm_nv_write_value(dev, TPM_NV_INDEX_0, (uint8_t *)&x, 0);
} }
u32 tpm_extend(u32 index, const void *in_digest, void *out_digest) u32 tpm_extend(struct udevice *dev, u32 index, const void *in_digest,
void *out_digest)
{ {
const u8 command[34] = { const u8 command[34] = {
0x0, 0xc1, 0x0, 0x0, 0x0, 0x22, 0x0, 0x0, 0x0, 0x14, 0x0, 0xc1, 0x0, 0x0, 0x0, 0x22, 0x0, 0x0, 0x0, 0x14,
@ -234,7 +236,7 @@ u32 tpm_extend(u32 index, const void *in_digest, void *out_digest)
in_digest_offset, in_digest, in_digest_offset, in_digest,
PCR_DIGEST_LENGTH)) PCR_DIGEST_LENGTH))
return TPM_LIB_ERROR; return TPM_LIB_ERROR;
err = tpm_sendrecv_command(buf, response, &response_length); err = tpm_sendrecv_command(dev, buf, response, &response_length);
if (err) if (err)
return err; return err;
@ -246,7 +248,7 @@ u32 tpm_extend(u32 index, const void *in_digest, void *out_digest)
return 0; return 0;
} }
u32 tpm_pcr_read(u32 index, void *data, size_t count) u32 tpm_pcr_read(struct udevice *dev, u32 index, void *data, size_t count)
{ {
const u8 command[14] = { const u8 command[14] = {
0x0, 0xc1, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x15, 0x0, 0xc1, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x15,
@ -264,7 +266,7 @@ u32 tpm_pcr_read(u32 index, void *data, size_t count)
0, command, sizeof(command), 0, command, sizeof(command),
index_offset, index)) index_offset, index))
return TPM_LIB_ERROR; return TPM_LIB_ERROR;
err = tpm_sendrecv_command(buf, response, &response_length); err = tpm_sendrecv_command(dev, buf, response, &response_length);
if (err) if (err)
return err; return err;
if (unpack_byte_string(response, response_length, "s", if (unpack_byte_string(response, response_length, "s",
@ -274,7 +276,7 @@ u32 tpm_pcr_read(u32 index, void *data, size_t count)
return 0; return 0;
} }
u32 tpm_tsc_physical_presence(u16 presence) u32 tpm_tsc_physical_presence(struct udevice *dev, u16 presence)
{ {
const u8 command[12] = { const u8 command[12] = {
0x0, 0xc1, 0x0, 0x0, 0x0, 0xc, 0x40, 0x0, 0x0, 0xa, 0x0, 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0xc, 0x40, 0x0, 0x0, 0xa, 0x0, 0x0,
@ -287,19 +289,19 @@ u32 tpm_tsc_physical_presence(u16 presence)
presence_offset, presence)) presence_offset, presence))
return TPM_LIB_ERROR; return TPM_LIB_ERROR;
return tpm_sendrecv_command(buf, NULL, NULL); return tpm_sendrecv_command(dev, buf, NULL, NULL);
} }
u32 tpm_finalise_physical_presence(void) u32 tpm_finalise_physical_presence(struct udevice *dev)
{ {
const u8 command[12] = { const u8 command[12] = {
0x0, 0xc1, 0x0, 0x0, 0x0, 0xc, 0x40, 0x0, 0x0, 0xa, 0x2, 0xa0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0xc, 0x40, 0x0, 0x0, 0xa, 0x2, 0xa0,
}; };
return tpm_sendrecv_command(command, NULL, NULL); return tpm_sendrecv_command(dev, command, NULL, NULL);
} }
u32 tpm_read_pubek(void *data, size_t count) u32 tpm_read_pubek(struct udevice *dev, void *data, size_t count)
{ {
const u8 command[30] = { const u8 command[30] = {
0x0, 0xc1, 0x0, 0x0, 0x0, 0x1e, 0x0, 0x0, 0x0, 0x7c, 0x0, 0xc1, 0x0, 0x0, 0x0, 0x1e, 0x0, 0x0, 0x0, 0x7c,
@ -312,7 +314,7 @@ u32 tpm_read_pubek(void *data, size_t count)
u32 data_size; u32 data_size;
u32 err; u32 err;
err = tpm_sendrecv_command(command, response, &response_length); err = tpm_sendrecv_command(dev, command, response, &response_length);
if (err) if (err)
return err; return err;
if (unpack_byte_string(response, response_length, "d", if (unpack_byte_string(response, response_length, "d",
@ -330,34 +332,34 @@ u32 tpm_read_pubek(void *data, size_t count)
return 0; return 0;
} }
u32 tpm_force_clear(void) u32 tpm_force_clear(struct udevice *dev)
{ {
const u8 command[10] = { const u8 command[10] = {
0x0, 0xc1, 0x0, 0x0, 0x0, 0xa, 0x0, 0x0, 0x0, 0x5d, 0x0, 0xc1, 0x0, 0x0, 0x0, 0xa, 0x0, 0x0, 0x0, 0x5d,
}; };
return tpm_sendrecv_command(command, NULL, NULL); return tpm_sendrecv_command(dev, command, NULL, NULL);
} }
u32 tpm_physical_enable(void) u32 tpm_physical_enable(struct udevice *dev)
{ {
const u8 command[10] = { const u8 command[10] = {
0x0, 0xc1, 0x0, 0x0, 0x0, 0xa, 0x0, 0x0, 0x0, 0x6f, 0x0, 0xc1, 0x0, 0x0, 0x0, 0xa, 0x0, 0x0, 0x0, 0x6f,
}; };
return tpm_sendrecv_command(command, NULL, NULL); return tpm_sendrecv_command(dev, command, NULL, NULL);
} }
u32 tpm_physical_disable(void) u32 tpm_physical_disable(struct udevice *dev)
{ {
const u8 command[10] = { const u8 command[10] = {
0x0, 0xc1, 0x0, 0x0, 0x0, 0xa, 0x0, 0x0, 0x0, 0x70, 0x0, 0xc1, 0x0, 0x0, 0x0, 0xa, 0x0, 0x0, 0x0, 0x70,
}; };
return tpm_sendrecv_command(command, NULL, NULL); return tpm_sendrecv_command(dev, command, NULL, NULL);
} }
u32 tpm_physical_set_deactivated(u8 state) u32 tpm_physical_set_deactivated(struct udevice *dev, u8 state)
{ {
const u8 command[11] = { const u8 command[11] = {
0x0, 0xc1, 0x0, 0x0, 0x0, 0xb, 0x0, 0x0, 0x0, 0x72, 0x0, 0xc1, 0x0, 0x0, 0x0, 0xb, 0x0, 0x0, 0x0, 0x72,
@ -370,10 +372,11 @@ u32 tpm_physical_set_deactivated(u8 state)
state_offset, state)) state_offset, state))
return TPM_LIB_ERROR; return TPM_LIB_ERROR;
return tpm_sendrecv_command(buf, NULL, NULL); return tpm_sendrecv_command(dev, buf, NULL, NULL);
} }
u32 tpm_get_capability(u32 cap_area, u32 sub_cap, void *cap, size_t count) u32 tpm_get_capability(struct udevice *dev, u32 cap_area, u32 sub_cap,
void *cap, size_t count)
{ {
const u8 command[22] = { const u8 command[22] = {
0x0, 0xc1, /* TPM_TAG */ 0x0, 0xc1, /* TPM_TAG */
@ -397,7 +400,7 @@ u32 tpm_get_capability(u32 cap_area, u32 sub_cap, void *cap, size_t count)
cap_area_offset, cap_area, cap_area_offset, cap_area,
sub_cap_offset, sub_cap)) sub_cap_offset, sub_cap))
return TPM_LIB_ERROR; return TPM_LIB_ERROR;
err = tpm_sendrecv_command(buf, response, &response_length); err = tpm_sendrecv_command(dev, buf, response, &response_length);
if (err) if (err)
return err; return err;
if (unpack_byte_string(response, response_length, "d", if (unpack_byte_string(response, response_length, "d",
@ -412,7 +415,8 @@ u32 tpm_get_capability(u32 cap_area, u32 sub_cap, void *cap, size_t count)
return 0; return 0;
} }
u32 tpm_get_permanent_flags(struct tpm_permanent_flags *pflags) u32 tpm_get_permanent_flags(struct udevice *dev,
struct tpm_permanent_flags *pflags)
{ {
const u8 command[22] = { const u8 command[22] = {
0x0, 0xc1, /* TPM_TAG */ 0x0, 0xc1, /* TPM_TAG */
@ -429,7 +433,7 @@ u32 tpm_get_permanent_flags(struct tpm_permanent_flags *pflags)
u32 err; u32 err;
u32 data_size; u32 data_size;
err = tpm_sendrecv_command(command, response, &response_length); err = tpm_sendrecv_command(dev, command, response, &response_length);
if (err) if (err)
return err; return err;
if (unpack_byte_string(response, response_length, "d", if (unpack_byte_string(response, response_length, "d",
@ -450,7 +454,7 @@ u32 tpm_get_permanent_flags(struct tpm_permanent_flags *pflags)
return 0; return 0;
} }
u32 tpm_get_permissions(u32 index, u32 *perm) u32 tpm_get_permissions(struct udevice *dev, u32 index, u32 *perm)
{ {
const u8 command[22] = { const u8 command[22] = {
0x0, 0xc1, /* TPM_TAG */ 0x0, 0xc1, /* TPM_TAG */
@ -468,7 +472,7 @@ u32 tpm_get_permissions(u32 index, u32 *perm)
if (pack_byte_string(buf, sizeof(buf), "d", 0, command, sizeof(command), if (pack_byte_string(buf, sizeof(buf), "d", 0, command, sizeof(command),
index_offset, index)) index_offset, index))
return TPM_LIB_ERROR; return TPM_LIB_ERROR;
err = tpm_sendrecv_command(buf, response, &response_length); err = tpm_sendrecv_command(dev, buf, response, &response_length);
if (err) if (err)
return err; return err;
if (unpack_byte_string(response, response_length, "d", if (unpack_byte_string(response, response_length, "d",
@ -479,7 +483,7 @@ u32 tpm_get_permissions(u32 index, u32 *perm)
} }
#ifdef CONFIG_TPM_FLUSH_RESOURCES #ifdef CONFIG_TPM_FLUSH_RESOURCES
u32 tpm_flush_specific(u32 key_handle, u32 resource_type) u32 tpm_flush_specific(struct udevice *dev, u32 key_handle, u32 resource_type)
{ {
const u8 command[18] = { const u8 command[18] = {
0x00, 0xc1, /* TPM_TAG */ 0x00, 0xc1, /* TPM_TAG */
@ -500,7 +504,7 @@ u32 tpm_flush_specific(u32 key_handle, u32 resource_type)
resource_type_offset, resource_type)) resource_type_offset, resource_type))
return TPM_LIB_ERROR; return TPM_LIB_ERROR;
err = tpm_sendrecv_command(buf, response, &response_length); err = tpm_sendrecv_command(dev, buf, response, &response_length);
if (err) if (err)
return err; return err;
return 0; return 0;
@ -638,7 +642,7 @@ static u32 verify_response_auth(u32 command_code, const void *response,
return TPM_SUCCESS; return TPM_SUCCESS;
} }
u32 tpm_terminate_auth_session(u32 auth_handle) u32 tpm_terminate_auth_session(struct udevice *dev, u32 auth_handle)
{ {
const u8 command[18] = { const u8 command[18] = {
0x00, 0xc1, /* TPM_TAG */ 0x00, 0xc1, /* TPM_TAG */
@ -657,19 +661,19 @@ u32 tpm_terminate_auth_session(u32 auth_handle)
if (oiap_session.valid && oiap_session.handle == auth_handle) if (oiap_session.valid && oiap_session.handle == auth_handle)
oiap_session.valid = 0; oiap_session.valid = 0;
return tpm_sendrecv_command(request, NULL, NULL); return tpm_sendrecv_command(dev, request, NULL, NULL);
} }
u32 tpm_end_oiap(void) u32 tpm_end_oiap(struct udevice *dev)
{ {
u32 err = TPM_SUCCESS; u32 err = TPM_SUCCESS;
if (oiap_session.valid) if (oiap_session.valid)
err = tpm_terminate_auth_session(oiap_session.handle); err = tpm_terminate_auth_session(dev, oiap_session.handle);
return err; return err;
} }
u32 tpm_oiap(u32 *auth_handle) u32 tpm_oiap(struct udevice *dev, u32 *auth_handle)
{ {
const u8 command[10] = { const u8 command[10] = {
0x00, 0xc1, /* TPM_TAG */ 0x00, 0xc1, /* TPM_TAG */
@ -683,9 +687,9 @@ u32 tpm_oiap(u32 *auth_handle)
u32 err; u32 err;
if (oiap_session.valid) if (oiap_session.valid)
tpm_terminate_auth_session(oiap_session.handle); tpm_terminate_auth_session(dev, oiap_session.handle);
err = tpm_sendrecv_command(command, response, &response_length); err = tpm_sendrecv_command(dev, command, response, &response_length);
if (err) if (err)
return err; return err;
if (unpack_byte_string(response, response_length, "ds", if (unpack_byte_string(response, response_length, "ds",
@ -699,8 +703,9 @@ u32 tpm_oiap(u32 *auth_handle)
return 0; return 0;
} }
u32 tpm_load_key2_oiap(u32 parent_handle, const void *key, size_t key_length, u32 tpm_load_key2_oiap(struct udevice *dev, u32 parent_handle, const void *key,
const void *parent_key_usage_auth, u32 *key_handle) size_t key_length, const void *parent_key_usage_auth,
u32 *key_handle)
{ {
const u8 command[14] = { const u8 command[14] = {
0x00, 0xc2, /* TPM_TAG */ 0x00, 0xc2, /* TPM_TAG */
@ -719,7 +724,7 @@ u32 tpm_load_key2_oiap(u32 parent_handle, const void *key, size_t key_length,
u32 err; u32 err;
if (!oiap_session.valid) { if (!oiap_session.valid) {
err = tpm_oiap(NULL); err = tpm_oiap(dev, NULL);
if (err) if (err)
return err; return err;
} }
@ -739,7 +744,7 @@ u32 tpm_load_key2_oiap(u32 parent_handle, const void *key, size_t key_length,
parent_key_usage_auth); parent_key_usage_auth);
if (err) if (err)
return err; return err;
err = tpm_sendrecv_command(request, response, &response_length); err = tpm_sendrecv_command(dev, request, response, &response_length);
if (err) { if (err) {
if (err == TPM_AUTHFAIL) if (err == TPM_AUTHFAIL)
oiap_session.valid = 0; oiap_session.valid = 0;
@ -764,7 +769,8 @@ u32 tpm_load_key2_oiap(u32 parent_handle, const void *key, size_t key_length,
return 0; return 0;
} }
u32 tpm_get_pub_key_oiap(u32 key_handle, const void *usage_auth, void *pubkey, u32 tpm_get_pub_key_oiap(struct udevice *dev, u32 key_handle,
const void *usage_auth, void *pubkey,
size_t *pubkey_len) size_t *pubkey_len)
{ {
const u8 command[14] = { const u8 command[14] = {
@ -783,7 +789,7 @@ u32 tpm_get_pub_key_oiap(u32 key_handle, const void *usage_auth, void *pubkey,
u32 err; u32 err;
if (!oiap_session.valid) { if (!oiap_session.valid) {
err = tpm_oiap(NULL); err = tpm_oiap(dev, NULL);
if (err) if (err)
return err; return err;
} }
@ -799,7 +805,7 @@ u32 tpm_get_pub_key_oiap(u32 key_handle, const void *usage_auth, void *pubkey,
request + sizeof(command), usage_auth); request + sizeof(command), usage_auth);
if (err) if (err)
return err; return err;
err = tpm_sendrecv_command(request, response, &response_length); err = tpm_sendrecv_command(dev, request, response, &response_length);
if (err) { if (err) {
if (err == TPM_AUTHFAIL) if (err == TPM_AUTHFAIL)
oiap_session.valid = 0; oiap_session.valid = 0;
@ -829,8 +835,8 @@ u32 tpm_get_pub_key_oiap(u32 key_handle, const void *usage_auth, void *pubkey,
} }
#ifdef CONFIG_TPM_LOAD_KEY_BY_SHA1 #ifdef CONFIG_TPM_LOAD_KEY_BY_SHA1
u32 tpm_find_key_sha1(const u8 auth[20], const u8 pubkey_digest[20], u32 tpm_find_key_sha1(struct udevice *dev, const u8 auth[20],
u32 *handle) const u8 pubkey_digest[20], u32 *handle)
{ {
u16 key_count; u16 key_count;
u32 key_handles[10]; u32 key_handles[10];
@ -842,7 +848,8 @@ u32 tpm_find_key_sha1(const u8 auth[20], const u8 pubkey_digest[20],
unsigned int i; unsigned int i;
/* fetch list of already loaded keys in the TPM */ /* fetch list of already loaded keys in the TPM */
err = tpm_get_capability(TPM_CAP_HANDLE, TPM_RT_KEY, buf, sizeof(buf)); err = tpm_get_capability(dev, TPM_CAP_HANDLE, TPM_RT_KEY, buf,
sizeof(buf));
if (err) if (err)
return -1; return -1;
key_count = get_unaligned_be16(buf); key_count = get_unaligned_be16(buf);
@ -870,7 +877,7 @@ u32 tpm_find_key_sha1(const u8 auth[20], const u8 pubkey_digest[20],
#endif /* CONFIG_TPM_AUTH_SESSIONS */ #endif /* CONFIG_TPM_AUTH_SESSIONS */
u32 tpm_get_random(void *data, u32 count) u32 tpm_get_random(struct udevice *dev, void *data, u32 count)
{ {
const u8 command[14] = { const u8 command[14] = {
0x0, 0xc1, /* TPM_TAG */ 0x0, 0xc1, /* TPM_TAG */
@ -894,7 +901,8 @@ u32 tpm_get_random(void *data, u32 count)
0, command, sizeof(command), 0, command, sizeof(command),
length_offset, this_bytes)) length_offset, this_bytes))
return TPM_LIB_ERROR; return TPM_LIB_ERROR;
err = tpm_sendrecv_command(buf, response, &response_length); err = tpm_sendrecv_command(dev, buf, response,
&response_length);
if (err) if (err)
return err; return err;
if (unpack_byte_string(response, response_length, "d", if (unpack_byte_string(response, response_length, "d",

View File

@ -10,7 +10,7 @@
#include <tpm-v2.h> #include <tpm-v2.h>
#include "tpm-utils.h" #include "tpm-utils.h"
u32 tpm2_startup(enum tpm2_startup_types mode) u32 tpm2_startup(struct udevice *dev, enum tpm2_startup_types mode)
{ {
const u8 command_v2[12] = { const u8 command_v2[12] = {
tpm_u16(TPM2_ST_NO_SESSIONS), tpm_u16(TPM2_ST_NO_SESSIONS),
@ -24,14 +24,14 @@ u32 tpm2_startup(enum tpm2_startup_types mode)
* Note TPM2_Startup command will return RC_SUCCESS the first time, * Note TPM2_Startup command will return RC_SUCCESS the first time,
* but will return RC_INITIALIZE otherwise. * but will return RC_INITIALIZE otherwise.
*/ */
ret = tpm_sendrecv_command(command_v2, NULL, NULL); ret = tpm_sendrecv_command(dev, command_v2, NULL, NULL);
if (ret && ret != TPM2_RC_INITIALIZE) if (ret && ret != TPM2_RC_INITIALIZE)
return ret; return ret;
return 0; return 0;
} }
u32 tpm2_self_test(enum tpm2_yes_no full_test) u32 tpm2_self_test(struct udevice *dev, enum tpm2_yes_no full_test)
{ {
const u8 command_v2[12] = { const u8 command_v2[12] = {
tpm_u16(TPM2_ST_NO_SESSIONS), tpm_u16(TPM2_ST_NO_SESSIONS),
@ -40,10 +40,11 @@ u32 tpm2_self_test(enum tpm2_yes_no full_test)
full_test, full_test,
}; };
return tpm_sendrecv_command(command_v2, NULL, NULL); return tpm_sendrecv_command(dev, command_v2, NULL, NULL);
} }
u32 tpm2_clear(u32 handle, const char *pw, const ssize_t pw_sz) u32 tpm2_clear(struct udevice *dev, u32 handle, const char *pw,
const ssize_t pw_sz)
{ {
u8 command_v2[COMMAND_BUFFER_SIZE] = { u8 command_v2[COMMAND_BUFFER_SIZE] = {
tpm_u16(TPM2_ST_SESSIONS), /* TAG */ tpm_u16(TPM2_ST_SESSIONS), /* TAG */
@ -75,10 +76,10 @@ u32 tpm2_clear(u32 handle, const char *pw, const ssize_t pw_sz)
if (ret) if (ret)
return TPM_LIB_ERROR; return TPM_LIB_ERROR;
return tpm_sendrecv_command(command_v2, NULL, NULL); return tpm_sendrecv_command(dev, command_v2, NULL, NULL);
} }
u32 tpm2_pcr_extend(u32 index, const uint8_t *digest) u32 tpm2_pcr_extend(struct udevice *dev, u32 index, const uint8_t *digest)
{ {
u8 command_v2[COMMAND_BUFFER_SIZE] = { u8 command_v2[COMMAND_BUFFER_SIZE] = {
tpm_u16(TPM2_ST_SESSIONS), /* TAG */ tpm_u16(TPM2_ST_SESSIONS), /* TAG */
@ -113,11 +114,11 @@ u32 tpm2_pcr_extend(u32 index, const uint8_t *digest)
if (ret) if (ret)
return TPM_LIB_ERROR; return TPM_LIB_ERROR;
return tpm_sendrecv_command(command_v2, NULL, NULL); return tpm_sendrecv_command(dev, command_v2, NULL, NULL);
} }
u32 tpm2_pcr_read(u32 idx, unsigned int idx_min_sz, void *data, u32 tpm2_pcr_read(struct udevice *dev, u32 idx, unsigned int idx_min_sz,
unsigned int *updates) void *data, unsigned int *updates)
{ {
u8 idx_array_sz = max(idx_min_sz, DIV_ROUND_UP(idx, 8)); u8 idx_array_sz = max(idx_min_sz, DIV_ROUND_UP(idx, 8));
u8 command_v2[COMMAND_BUFFER_SIZE] = { u8 command_v2[COMMAND_BUFFER_SIZE] = {
@ -142,7 +143,7 @@ u32 tpm2_pcr_read(u32 idx, unsigned int idx_min_sz, void *data,
17 + pcr_sel_idx, pcr_sel_bit)) 17 + pcr_sel_idx, pcr_sel_bit))
return TPM_LIB_ERROR; return TPM_LIB_ERROR;
ret = tpm_sendrecv_command(command_v2, response, &response_len); ret = tpm_sendrecv_command(dev, command_v2, response, &response_len);
if (ret) if (ret)
return ret; return ret;
@ -158,8 +159,8 @@ u32 tpm2_pcr_read(u32 idx, unsigned int idx_min_sz, void *data,
return 0; return 0;
} }
u32 tpm2_get_capability(u32 capability, u32 property, void *buf, u32 tpm2_get_capability(struct udevice *dev, u32 capability, u32 property,
size_t prop_count) void *buf, size_t prop_count)
{ {
u8 command_v2[COMMAND_BUFFER_SIZE] = { u8 command_v2[COMMAND_BUFFER_SIZE] = {
tpm_u16(TPM2_ST_NO_SESSIONS), /* TAG */ tpm_u16(TPM2_ST_NO_SESSIONS), /* TAG */
@ -175,7 +176,7 @@ u32 tpm2_get_capability(u32 capability, u32 property, void *buf,
unsigned int properties_off; unsigned int properties_off;
int ret; int ret;
ret = tpm_sendrecv_command(command_v2, response, &response_len); ret = tpm_sendrecv_command(dev, command_v2, response, &response_len);
if (ret) if (ret)
return ret; return ret;
@ -191,7 +192,7 @@ u32 tpm2_get_capability(u32 capability, u32 property, void *buf,
return 0; return 0;
} }
u32 tpm2_dam_reset(const char *pw, const ssize_t pw_sz) u32 tpm2_dam_reset(struct udevice *dev, const char *pw, const ssize_t pw_sz)
{ {
u8 command_v2[COMMAND_BUFFER_SIZE] = { u8 command_v2[COMMAND_BUFFER_SIZE] = {
tpm_u16(TPM2_ST_SESSIONS), /* TAG */ tpm_u16(TPM2_ST_SESSIONS), /* TAG */
@ -223,11 +224,12 @@ u32 tpm2_dam_reset(const char *pw, const ssize_t pw_sz)
if (ret) if (ret)
return TPM_LIB_ERROR; return TPM_LIB_ERROR;
return tpm_sendrecv_command(command_v2, NULL, NULL); return tpm_sendrecv_command(dev, command_v2, NULL, NULL);
} }
u32 tpm2_dam_parameters(const char *pw, const ssize_t pw_sz, u32 tpm2_dam_parameters(struct udevice *dev, const char *pw,
unsigned int max_tries, unsigned int recovery_time, const ssize_t pw_sz, unsigned int max_tries,
unsigned int recovery_time,
unsigned int lockout_recovery) unsigned int lockout_recovery)
{ {
u8 command_v2[COMMAND_BUFFER_SIZE] = { u8 command_v2[COMMAND_BUFFER_SIZE] = {
@ -271,11 +273,12 @@ u32 tpm2_dam_parameters(const char *pw, const ssize_t pw_sz,
if (ret) if (ret)
return TPM_LIB_ERROR; return TPM_LIB_ERROR;
return tpm_sendrecv_command(command_v2, NULL, NULL); return tpm_sendrecv_command(dev, command_v2, NULL, NULL);
} }
int tpm2_change_auth(u32 handle, const char *newpw, const ssize_t newpw_sz, int tpm2_change_auth(struct udevice *dev, u32 handle, const char *newpw,
const char *oldpw, const ssize_t oldpw_sz) const ssize_t newpw_sz, const char *oldpw,
const ssize_t oldpw_sz)
{ {
unsigned int offset = 27; unsigned int offset = 27;
u8 command_v2[COMMAND_BUFFER_SIZE] = { u8 command_v2[COMMAND_BUFFER_SIZE] = {
@ -315,11 +318,11 @@ int tpm2_change_auth(u32 handle, const char *newpw, const ssize_t newpw_sz,
if (ret) if (ret)
return TPM_LIB_ERROR; return TPM_LIB_ERROR;
return tpm_sendrecv_command(command_v2, NULL, NULL); return tpm_sendrecv_command(dev, command_v2, NULL, NULL);
} }
u32 tpm2_pcr_setauthpolicy(const char *pw, const ssize_t pw_sz, u32 index, u32 tpm2_pcr_setauthpolicy(struct udevice *dev, const char *pw,
const char *key) const ssize_t pw_sz, u32 index, const char *key)
{ {
u8 command_v2[COMMAND_BUFFER_SIZE] = { u8 command_v2[COMMAND_BUFFER_SIZE] = {
tpm_u16(TPM2_ST_SESSIONS), /* TAG */ tpm_u16(TPM2_ST_SESSIONS), /* TAG */
@ -370,11 +373,12 @@ u32 tpm2_pcr_setauthpolicy(const char *pw, const ssize_t pw_sz, u32 index,
if (ret) if (ret)
return TPM_LIB_ERROR; return TPM_LIB_ERROR;
return tpm_sendrecv_command(command_v2, NULL, NULL); return tpm_sendrecv_command(dev, command_v2, NULL, NULL);
} }
u32 tpm2_pcr_setauthvalue(const char *pw, const ssize_t pw_sz, u32 index, u32 tpm2_pcr_setauthvalue(struct udevice *dev, const char *pw,
const char *key, const ssize_t key_sz) const ssize_t pw_sz, u32 index, const char *key,
const ssize_t key_sz)
{ {
u8 command_v2[COMMAND_BUFFER_SIZE] = { u8 command_v2[COMMAND_BUFFER_SIZE] = {
tpm_u16(TPM2_ST_SESSIONS), /* TAG */ tpm_u16(TPM2_ST_SESSIONS), /* TAG */
@ -415,5 +419,5 @@ u32 tpm2_pcr_setauthvalue(const char *pw, const ssize_t pw_sz, u32 index,
if (ret) if (ret)
return TPM_LIB_ERROR; return TPM_LIB_ERROR;
return tpm_sendrecv_command(command_v2, NULL, NULL); return tpm_sendrecv_command(dev, command_v2, NULL, NULL);
} }

View File

@ -10,11 +10,15 @@ Running tests
To run most tests on sandbox, type this: To run most tests on sandbox, type this:
test/run make check
in the U-Boot directory. Note that only the pytest suite is run using this in the U-Boot directory. Note that only the pytest suite is run using this
command. command.
Some tests take ages to run. To run just the quick ones, type this:
make qcheck
Sandbox Sandbox
------- -------

View File

@ -35,7 +35,7 @@ static int dm_test_i2c_find(struct unit_test_state *uts)
*/ */
ut_assertok(uclass_get_device_by_seq(UCLASS_I2C, busnum, &bus)); ut_assertok(uclass_get_device_by_seq(UCLASS_I2C, busnum, &bus));
ut_assertok(dm_i2c_probe(bus, chip, 0, &dev)); ut_assertok(dm_i2c_probe(bus, chip, 0, &dev));
ut_asserteq(-ENODEV, dm_i2c_probe(bus, no_chip, 0, &dev)); ut_asserteq(-ENOENT, dm_i2c_probe(bus, no_chip, 0, &dev));
ut_asserteq(-ENODEV, uclass_get_device_by_seq(UCLASS_I2C, 1, &bus)); ut_asserteq(-ENODEV, uclass_get_device_by_seq(UCLASS_I2C, 1, &bus));
return 0; return 0;

View File

@ -6,6 +6,7 @@
#include <common.h> #include <common.h>
#include <dm.h> #include <dm.h>
#include <i2c.h>
#include <rtc.h> #include <rtc.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/test.h> #include <asm/test.h>
@ -60,7 +61,7 @@ static int dm_test_rtc_set_get(struct unit_test_state *uts)
ut_assertok(uclass_get_device(UCLASS_RTC, 0, &dev)); ut_assertok(uclass_get_device(UCLASS_RTC, 0, &dev));
ut_assertok(dm_rtc_get(dev, &now)); ut_assertok(dm_rtc_get(dev, &now));
ut_assertok(device_find_first_child(dev, &emul)); ut_assertok(i2c_emul_find(dev, &emul));
ut_assert(emul != NULL); ut_assert(emul != NULL);
/* Tell the RTC to go into manual mode */ /* Tell the RTC to go into manual mode */
@ -125,7 +126,7 @@ static int dm_test_rtc_reset(struct unit_test_state *uts)
ut_assertok(uclass_get_device(UCLASS_RTC, 0, &dev)); ut_assertok(uclass_get_device(UCLASS_RTC, 0, &dev));
ut_assertok(dm_rtc_get(dev, &now)); ut_assertok(dm_rtc_get(dev, &now));
ut_assertok(device_find_first_child(dev, &emul)); ut_assertok(i2c_emul_find(dev, &emul));
ut_assert(emul != NULL); ut_assert(emul != NULL);
old_base_time = sandbox_i2c_rtc_get_set_base_time(emul, 0); old_base_time = sandbox_i2c_rtc_get_set_base_time(emul, 0);
@ -154,9 +155,9 @@ static int dm_test_rtc_dual(struct unit_test_state *uts)
ut_assertok(uclass_get_device(UCLASS_RTC, 1, &dev2)); ut_assertok(uclass_get_device(UCLASS_RTC, 1, &dev2));
ut_assertok(dm_rtc_get(dev2, &now2)); ut_assertok(dm_rtc_get(dev2, &now2));
ut_assertok(device_find_first_child(dev1, &emul1)); ut_assertok(i2c_emul_find(dev1, &emul1));
ut_assert(emul1 != NULL); ut_assert(emul1 != NULL);
ut_assertok(device_find_first_child(dev2, &emul2)); ut_assertok(i2c_emul_find(dev2, &emul2));
ut_assert(emul2 != NULL); ut_assert(emul2 != NULL);
offset = sandbox_i2c_rtc_set_offset(emul1, false, -1); offset = sandbox_i2c_rtc_set_offset(emul1, false, -1);

View File

@ -611,3 +611,50 @@ static int dm_test_fdt_disable_enable_by_path(struct unit_test_state *uts)
} }
DM_TEST(dm_test_fdt_disable_enable_by_path, DM_TESTF_SCAN_PDATA | DM_TEST(dm_test_fdt_disable_enable_by_path, DM_TESTF_SCAN_PDATA |
DM_TESTF_SCAN_FDT); DM_TESTF_SCAN_FDT);
/* Test a few uclass phandle functions */
static int dm_test_fdt_phandle(struct unit_test_state *uts)
{
struct udevice *back, *dev, *dev2;
ut_assertok(uclass_find_first_device(UCLASS_PANEL_BACKLIGHT, &back));
ut_asserteq(-ENOENT, uclass_find_device_by_phandle(UCLASS_REGULATOR,
back, "missing", &dev));
ut_assertok(uclass_find_device_by_phandle(UCLASS_REGULATOR, back,
"power-supply", &dev));
ut_asserteq(0, device_active(dev));
ut_asserteq_str("ldo1", dev->name);
ut_assertok(uclass_get_device_by_phandle(UCLASS_REGULATOR, back,
"power-supply", &dev2));
ut_asserteq_ptr(dev, dev2);
return 0;
}
DM_TEST(dm_test_fdt_phandle, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
/* Test device_find_first_child_by_uclass() */
static int dm_test_first_child(struct unit_test_state *uts)
{
struct udevice *i2c, *dev, *dev2;
ut_assertok(uclass_first_device_err(UCLASS_I2C, &i2c));
ut_assertok(device_find_first_child_by_uclass(i2c, UCLASS_RTC, &dev));
ut_asserteq_str("rtc@43", dev->name);
ut_assertok(device_find_child_by_name(i2c, "rtc@43", &dev2));
ut_asserteq_ptr(dev, dev2);
ut_assertok(device_find_child_by_name(i2c, "rtc@61", &dev2));
ut_asserteq_str("rtc@61", dev2->name);
ut_assertok(device_find_first_child_by_uclass(i2c, UCLASS_I2C_EEPROM,
&dev));
ut_asserteq_str("eeprom@2c", dev->name);
ut_assertok(device_find_child_by_name(i2c, "eeprom@2c", &dev2));
ut_asserteq_ptr(dev, dev2);
ut_asserteq(-ENODEV, device_find_first_child_by_uclass(i2c,
UCLASS_VIDEO, &dev));
ut_asserteq(-ENODEV, device_find_child_by_name(i2c, "missing", &dev));
return 0;
}
DM_TEST(dm_test_first_child, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);

View File

@ -13,6 +13,7 @@ import re
from fstest_defs import * from fstest_defs import *
@pytest.mark.boardspec('sandbox') @pytest.mark.boardspec('sandbox')
@pytest.mark.slow
class TestFsBasic(object): class TestFsBasic(object):
def test_fs1(self, u_boot_console, fs_obj_basic): def test_fs1(self, u_boot_console, fs_obj_basic):
""" """

View File

@ -13,6 +13,7 @@ import re
from fstest_defs import * from fstest_defs import *
@pytest.mark.boardspec('sandbox') @pytest.mark.boardspec('sandbox')
@pytest.mark.slow
class TestFsExt(object): class TestFsExt(object):
def test_fs_ext1(self, u_boot_console, fs_obj_ext): def test_fs_ext1(self, u_boot_console, fs_obj_ext):
""" """

View File

@ -11,6 +11,7 @@ This test verifies mkdir operation on file system.
import pytest import pytest
@pytest.mark.boardspec('sandbox') @pytest.mark.boardspec('sandbox')
@pytest.mark.slow
class TestMkdir(object): class TestMkdir(object):
def test_mkdir1(self, u_boot_console, fs_obj_mkdir): def test_mkdir1(self, u_boot_console, fs_obj_mkdir):
""" """

View File

@ -12,6 +12,7 @@ on file system.
import pytest import pytest
@pytest.mark.boardspec('sandbox') @pytest.mark.boardspec('sandbox')
@pytest.mark.slow
class TestUnlink(object): class TestUnlink(object):
def test_unlink1(self, u_boot_console, fs_obj_unlink): def test_unlink1(self, u_boot_console, fs_obj_unlink):
""" """

View File

@ -1,6 +1,7 @@
#!/bin/bash #!/bin/bash
# Script to run all U-Boot tests that use sandbox. # Script to run all U-Boot tests that use sandbox.
# $1: tests to run (empty for all, 'quick' for quick ones only)
# Runs a test and checks the exit code to decide if it passed # Runs a test and checks the exit code to decide if it passed
# $1: Test name # $1: Test name
@ -12,10 +13,13 @@ run_test() {
[ $? -ne 0 ] && failures=$((failures+1)) [ $? -ne 0 ] && failures=$((failures+1))
} }
# SKip slow tests if requested
[ "$1" == "quick" ] && mark_expr="not slow"
failures=0 failures=0
# Run all tests that the standard sandbox build can support # Run all tests that the standard sandbox build can support
run_test "sandbox" ./test/py/test.py --bd sandbox --build run_test "sandbox" ./test/py/test.py --bd sandbox --build -m "${mark_expr}"
# Run tests which require sandbox_spl # Run tests which require sandbox_spl
run_test "sandbox_spl" ./test/py/test.py --bd sandbox_spl --build \ run_test "sandbox_spl" ./test/py/test.py --bd sandbox_spl --build \
@ -36,7 +40,9 @@ export DTC=${DTC_DIR}/dtc
run_test "binman" ./tools/binman/binman -t run_test "binman" ./tools/binman/binman -t
run_test "patman" ./tools/patman/patman --test run_test "patman" ./tools/patman/patman --test
run_test "buildman" ./tools/buildman/buildman -t
[ "$1" == "quick" ] && skip=--skip-net-tests
run_test "buildman" ./tools/buildman/buildman -t ${skip}
run_test "fdt" ./tools/dtoc/test_fdt -t run_test "fdt" ./tools/dtoc/test_fdt -t
run_test "dtoc" ./tools/dtoc/dtoc -t run_test "dtoc" ./tools/dtoc/dtoc -t