[U-Boot] [PATCH] Introduce generic TPM support in u-boot

Mike Frysinger vapier at gentoo.org
Mon Oct 10 06:08:29 CEST 2011


On Sunday 09 October 2011 22:53:26 Vadim Bendebury wrote:
> Change-Id: I22a33c3e5b2e20eec9557a7621bd463b30389d73

these don't make sense outside of gerrit ;)

> --- a/Makefile
> +++ b/Makefile
>
> +ifneq ($(CONFIG_GENERIC_LPC_TPM),)

please use:
	ifeq ($(CONFIG_...),y)

> --- a/README
> +++ b/README
> 
> +- TPM Support:
> +		CONFIG_GENERIC_LPC_TPM
> +		Support for generic parallel port TPM devices.
> +
> +			CONFIG_TPM_TIS_BASE_ADDRESS
> +			Base address where the generic TPM device is mapped
> +			to. Default value is 0xfed40000.

i'm not sure a default address makes sense at all for all of u-boot.  best to 
just force people to define it, or keep the default in cpu/soc-specific configs.

> --- /dev/null
> +++ b/drivers/tpm/Makefile
>
> +# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
> +# Use of this source code is governed by a BSD-style license that can be
> +# found in the LICENSE file.

this is incorrect for the u-boot tree.  the "LICENSE" file doesn't exist, and 
the "COPYING" file is GPLv2.  please use something like:
	# Copyright (c) 2011 The Chromium OS Authors.
	# Released under the 2-clause BSD license.

> +$(LIB): $(obj).depend $(OBJS)
> +	$(AR) $(ARFLAGS) $@ $(OBJS)

this is an old makefile.  you have to use cmd_link_o_target now and not AR.

> index 0000000..939f715
> --- /dev/null
> +++ b/drivers/tpm/generic_lpc_tpm.c
>
> +/* #define DEBUG */

just delete it

> +#ifdef DEBUG
> +#define TPM_DEBUG_ON	1
> +#else
> +#define TPM_DEBUG_ON	0
> +#endif
> +
> +#define PREFIX "lpc_tpm: "
> +#define	TPM_DEBUG(fmt, args...)		\
> +	if (TPM_DEBUG_ON) {		\
> +		printf(PREFIX);		\
> +		printf(fmt , ##args);	\
> +	}

simplify this with one line:
#define tpm_debug(fmt, args...) debug("lpc_tpm: " fmt, ## args)

> +/* the macro accepts the locality value, but only locality 0 is
> operational */
> +#define TIS_REG(LOCALITY, REG) \
> +	(void *)(CONFIG_TPM_TIS_BASE_ADDRESS + (LOCALITY << 12) + REG)
> +
> +/* hardware registers' offsets */
> +#define TIS_REG_ACCESS                 0x0
> +#define TIS_REG_INT_ENABLE             0x8
> +#define TIS_REG_INT_VECTOR             0xc
> +#define TIS_REG_INT_STATUS             0x10
> +#define TIS_REG_INTF_CAPABILITY        0x14
> +#define TIS_REG_STS                    0x18
> +#define TIS_REG_DATA_FIFO              0x24
> +#define TIS_REG_DID_VID                0xf00
> +#define TIS_REG_RID                    0xf04

you need to use C structs here and not offsets.  same feedback as i gave you 
when you posted it to gerrit :P.

> +/* Some registers' bit field definitions */
> +#define TIS_STS_VALID                  (1 << 7) /* 0x80 */
> +#define TIS_STS_COMMAND_READY          (1 << 6) /* 0x40 */
> +#define TIS_STS_TPM_GO                 (1 << 5) /* 0x20 */
> +#define TIS_STS_DATA_AVAILABLE         (1 << 4) /* 0x10 */
> +#define TIS_STS_EXPECT                 (1 << 3) /* 0x08 */
> +#define TIS_STS_RESPONSE_RETRY         (1 << 1) /* 0x02 */

having both values is a bit silly.  pick one.  if you think 0x80 is more clear 
than 1<<7, then define that.

> +struct device_name {
> +	u16 dev_id;
> +	const char * const dev_name;
> +};
> +
> +struct vendor_name {
> +	u16 vendor_id;
> +	const char *vendor_name;
> +	struct device_name *dev_names;
> +};
> +
> +static struct device_name infineon_devices[] = {
> +	{0xb, "SLB9635 TT 1.2"},
> +	{0}
> +};
> +
> +static const struct vendor_name vendor_names[] = {
> +	{0x15d1, "Infineon", infineon_devices},
> +};

the infineon_devices (and thus dev_names) should be constified

> +
> +/*
> + * Cached vendor/device ID pair to indicate that the device has been
> + * already discovered
> + */
> +static u32 vendor_dev_id;

so you're assuming only one TPM device per system.  probably not a realistic 
problem, but this should be documented in the README.

> +static u32 tis_senddata(const u8 * const data, u32 len)
> ...
> +		printf("%s:%d - failed to get 'command_ready' status\n",
> +		       __FILE__, __LINE__);

__FILE__/__LINE__ don't really belong in common output.  please replace with 
__func__.  same feedback as in gerrit :P.

> +/*
> + * tis_init()
> + *
> + * Initialize the TPM device. Returns 0 on success or TPM_DRIVER_ERR on
> + * failure (in case device probing did not succeed).
> + */
> +int tis_init(void)
> +{
> +	if (tis_probe())
> +		return TPM_DRIVER_ERR;
> +	return 0;
> +}

but TPM_DRIVER_ERR is only defined in this file.  please just use the more u-
boot normal "0 on success, non-zero on failure".

> +/*
> + * tis_sendrecv()
> + *
> + * Send the requested data to the TPM and then try to get its response
> + *
> + * @sendbuf - buffer of the data to send
> + * @send_size size of the data to send
> + * @recvbuf - memory to save the response to
> + * @recv_len - pointer to the size of the response buffer
> + *
> + * Returns 0 on success (and places the number of response bytes at
> recv_len) + * or TPM_DRIVER_ERR on failure.
> + */

i'd think this API documentation really belongs in the API header ... that's 
generally what people who use the API are going to read first ...
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
Url : http://lists.denx.de/pipermail/u-boot/attachments/20111010/1cfad4ac/attachment.pgp 


More information about the U-Boot mailing list