[PATCH v3 1/4] tpm: add buf_size parameter in the .send callback
Stefano Garzarella
sgarzare at redhat.com
Tue May 6 22:56:54 AEST 2025
On Wed, Apr 30, 2025 at 06:39:58PM +0300, Jarkko Sakkinen wrote:
>On Mon, Apr 14, 2025 at 04:56:50PM +0200, Stefano Garzarella wrote:
>> From: Stefano Garzarella <sgarzare at redhat.com>
>>
>> In preparation for the next commit, add a new `buf_size` parameter to
>> the `.send` callback in `tpm_class_ops` which contains the entire buffer
>> size. In this patch it is pretty much ignored by all drivers, but it will
>> be used in the next patch.
>
>So instead "in preparation for the next commit" just plain say why it
>will be needed. "next commit" is a fuzzy reference :-)
>
>Same goes for "next patch". Neither can be used to query any possible
>information. That sort of makes the whole paragraph useless, once it
>is in the commit log.
Got it! What about somethig like this:
Add a new `buf_size` parameter to the `.send` callback in
`tpm_class_ops`. This parameter will allow drivers to differentiate
between the actual command length to send and the total buffer
size. Currently `buf_now` is not used, but it will be used to
support devices with synchronous `.send` callback to send the
command and receive the response on the same buffer.
Thanks,
Stefano
>
>>
>> Also rename the previous parameter `len` to `cmd_len` in the
>> declaration to make it clear that it contains the length in bytes of the
>> command stored in the buffer. The semantics don't change and it can be
>> used as before by drivers. This is an optimization since the drivers
>> could get it from the header, but let's avoid duplicating code.
>>
>> While we are here, resolve a checkpatch warning:
>> WARNING: Unnecessary space before function pointer arguments
>> #66: FILE: include/linux/tpm.h:90:
>> + int (*send) (struct tpm_chip *chip, u8 *buf, size_t cmd_len,
>>
>> Suggested-by: Jarkko Sakkinen <jarkko at kernel.org>
>> Signed-off-by: Stefano Garzarella <sgarzare at redhat.com>
>> ---
>> include/linux/tpm.h | 3 ++-
>> drivers/char/tpm/st33zp24/st33zp24.c | 2 +-
>> drivers/char/tpm/tpm-interface.c | 2 +-
>> drivers/char/tpm/tpm_atmel.c | 3 ++-
>> drivers/char/tpm/tpm_crb.c | 2 +-
>> drivers/char/tpm/tpm_ftpm_tee.c | 4 +++-
>> drivers/char/tpm/tpm_i2c_atmel.c | 3 ++-
>> drivers/char/tpm/tpm_i2c_infineon.c | 3 ++-
>> drivers/char/tpm/tpm_i2c_nuvoton.c | 3 ++-
>> drivers/char/tpm/tpm_ibmvtpm.c | 6 ++++--
>> drivers/char/tpm/tpm_infineon.c | 3 ++-
>> drivers/char/tpm/tpm_nsc.c | 3 ++-
>> drivers/char/tpm/tpm_svsm.c | 3 ++-
>> drivers/char/tpm/tpm_tis_core.c | 3 ++-
>> drivers/char/tpm/tpm_tis_i2c_cr50.c | 6 ++++--
>> drivers/char/tpm/tpm_vtpm_proxy.c | 4 +++-
>> drivers/char/tpm/xen-tpmfront.c | 3 ++-
>> 17 files changed, 37 insertions(+), 19 deletions(-)
>>
>> diff --git a/include/linux/tpm.h b/include/linux/tpm.h
>> index 6c3125300c00..2e38edd5838c 100644
>> --- a/include/linux/tpm.h
>> +++ b/include/linux/tpm.h
>> @@ -87,7 +87,8 @@ struct tpm_class_ops {
>> const u8 req_complete_val;
>> bool (*req_canceled)(struct tpm_chip *chip, u8 status);
>> int (*recv) (struct tpm_chip *chip, u8 *buf, size_t len);
>> - int (*send) (struct tpm_chip *chip, u8 *buf, size_t len);
>> + int (*send)(struct tpm_chip *chip, u8 *buf, size_t cmd_len,
>> + size_t buf_size);
>> void (*cancel) (struct tpm_chip *chip);
>> u8 (*status) (struct tpm_chip *chip);
>> void (*update_timeouts)(struct tpm_chip *chip,
>> diff --git a/drivers/char/tpm/st33zp24/st33zp24.c b/drivers/char/tpm/st33zp24/st33zp24.c
>> index c0771980bc2f..3de68bca1740 100644
>> --- a/drivers/char/tpm/st33zp24/st33zp24.c
>> +++ b/drivers/char/tpm/st33zp24/st33zp24.c
>> @@ -300,7 +300,7 @@ static irqreturn_t tpm_ioserirq_handler(int irq, void *dev_id)
>> * send TPM commands through the I2C bus.
>> */
>> static int st33zp24_send(struct tpm_chip *chip, unsigned char *buf,
>> - size_t len)
>> + size_t len, size_t buf_size)
>> {
>> struct st33zp24_dev *tpm_dev = dev_get_drvdata(&chip->dev);
>> u32 status, i, size, ordinal;
>> diff --git a/drivers/char/tpm/tpm-interface.c b/drivers/char/tpm/tpm-interface.c
>> index 8d7e4da6ed53..3b6ddcdb4051 100644
>> --- a/drivers/char/tpm/tpm-interface.c
>> +++ b/drivers/char/tpm/tpm-interface.c
>> @@ -106,7 +106,7 @@ static ssize_t tpm_try_transmit(struct tpm_chip *chip, void *buf, size_t bufsiz)
>> return -E2BIG;
>> }
>>
>> - rc = chip->ops->send(chip, buf, count);
>> + rc = chip->ops->send(chip, buf, count, bufsiz);
>> if (rc < 0) {
>> if (rc != -EPIPE)
>> dev_err(&chip->dev,
>> diff --git a/drivers/char/tpm/tpm_atmel.c b/drivers/char/tpm/tpm_atmel.c
>> index 54a0360a3c95..5733168bfc26 100644
>> --- a/drivers/char/tpm/tpm_atmel.c
>> +++ b/drivers/char/tpm/tpm_atmel.c
>> @@ -148,7 +148,8 @@ static int tpm_atml_recv(struct tpm_chip *chip, u8 *buf, size_t count)
>> return size;
>> }
>>
>> -static int tpm_atml_send(struct tpm_chip *chip, u8 *buf, size_t count)
>> +static int tpm_atml_send(struct tpm_chip *chip, u8 *buf, size_t count,
>> + size_t buf_size)
>> {
>> struct tpm_atmel_priv *priv = dev_get_drvdata(&chip->dev);
>> int i;
>> diff --git a/drivers/char/tpm/tpm_crb.c b/drivers/char/tpm/tpm_crb.c
>> index 876edf2705ab..38f765a44a97 100644
>> --- a/drivers/char/tpm/tpm_crb.c
>> +++ b/drivers/char/tpm/tpm_crb.c
>> @@ -426,7 +426,7 @@ static int tpm_crb_smc_start(struct device *dev, unsigned long func_id)
>> }
>> #endif
>>
>> -static int crb_send(struct tpm_chip *chip, u8 *buf, size_t len)
>> +static int crb_send(struct tpm_chip *chip, u8 *buf, size_t len, size_t buf_size)
>> {
>> struct crb_priv *priv = dev_get_drvdata(&chip->dev);
>> int rc = 0;
>> diff --git a/drivers/char/tpm/tpm_ftpm_tee.c b/drivers/char/tpm/tpm_ftpm_tee.c
>> index 53ba28ccd5d3..637cc8b6599e 100644
>> --- a/drivers/char/tpm/tpm_ftpm_tee.c
>> +++ b/drivers/char/tpm/tpm_ftpm_tee.c
>> @@ -64,12 +64,14 @@ static int ftpm_tee_tpm_op_recv(struct tpm_chip *chip, u8 *buf, size_t count)
>> * @chip: the tpm_chip description as specified in driver/char/tpm/tpm.h
>> * @buf: the buffer to send.
>> * @len: the number of bytes to send.
>> + * @buf_size: the size of the buffer.
>> *
>> * Return:
>> * In case of success, returns 0.
>> * On failure, -errno
>> */
>> -static int ftpm_tee_tpm_op_send(struct tpm_chip *chip, u8 *buf, size_t len)
>> +static int ftpm_tee_tpm_op_send(struct tpm_chip *chip, u8 *buf, size_t len,
>> + size_t buf_size)
>> {
>> struct ftpm_tee_private *pvt_data = dev_get_drvdata(chip->dev.parent);
>> size_t resp_len;
>> diff --git a/drivers/char/tpm/tpm_i2c_atmel.c b/drivers/char/tpm/tpm_i2c_atmel.c
>> index d1d27fdfe523..572f97cb9e89 100644
>> --- a/drivers/char/tpm/tpm_i2c_atmel.c
>> +++ b/drivers/char/tpm/tpm_i2c_atmel.c
>> @@ -37,7 +37,8 @@ struct priv_data {
>> u8 buffer[sizeof(struct tpm_header) + 25];
>> };
>>
>> -static int i2c_atmel_send(struct tpm_chip *chip, u8 *buf, size_t len)
>> +static int i2c_atmel_send(struct tpm_chip *chip, u8 *buf, size_t len,
>> + size_t buf_size)
>> {
>> struct priv_data *priv = dev_get_drvdata(&chip->dev);
>> struct i2c_client *client = to_i2c_client(chip->dev.parent);
>> diff --git a/drivers/char/tpm/tpm_i2c_infineon.c b/drivers/char/tpm/tpm_i2c_infineon.c
>> index 81d8a78dc655..25d6ae3a4cc1 100644
>> --- a/drivers/char/tpm/tpm_i2c_infineon.c
>> +++ b/drivers/char/tpm/tpm_i2c_infineon.c
>> @@ -514,7 +514,8 @@ static int tpm_tis_i2c_recv(struct tpm_chip *chip, u8 *buf, size_t count)
>> return size;
>> }
>>
>> -static int tpm_tis_i2c_send(struct tpm_chip *chip, u8 *buf, size_t len)
>> +static int tpm_tis_i2c_send(struct tpm_chip *chip, u8 *buf, size_t len,
>> + size_t buf_size)
>> {
>> int rc, status;
>> ssize_t burstcnt;
>> diff --git a/drivers/char/tpm/tpm_i2c_nuvoton.c b/drivers/char/tpm/tpm_i2c_nuvoton.c
>> index 3c3ee5f551db..169078ce6ac4 100644
>> --- a/drivers/char/tpm/tpm_i2c_nuvoton.c
>> +++ b/drivers/char/tpm/tpm_i2c_nuvoton.c
>> @@ -350,7 +350,8 @@ static int i2c_nuvoton_recv(struct tpm_chip *chip, u8 *buf, size_t count)
>> * tpm.c can skip polling for the data to be available as the interrupt is
>> * waited for here
>> */
>> -static int i2c_nuvoton_send(struct tpm_chip *chip, u8 *buf, size_t len)
>> +static int i2c_nuvoton_send(struct tpm_chip *chip, u8 *buf, size_t len,
>> + size_t buf_size)
>> {
>> struct priv_data *priv = dev_get_drvdata(&chip->dev);
>> struct device *dev = chip->dev.parent;
>> diff --git a/drivers/char/tpm/tpm_ibmvtpm.c b/drivers/char/tpm/tpm_ibmvtpm.c
>> index 76d048f63d55..660a7f9da1d8 100644
>> --- a/drivers/char/tpm/tpm_ibmvtpm.c
>> +++ b/drivers/char/tpm/tpm_ibmvtpm.c
>> @@ -191,13 +191,15 @@ static int tpm_ibmvtpm_resume(struct device *dev)
>> * tpm_ibmvtpm_send() - Send a TPM command
>> * @chip: tpm chip struct
>> * @buf: buffer contains data to send
>> - * @count: size of buffer
>> + * @count: length of the command
>> + * @buf_size: size of the buffer
>> *
>> * Return:
>> * 0 on success,
>> * -errno on error
>> */
>> -static int tpm_ibmvtpm_send(struct tpm_chip *chip, u8 *buf, size_t count)
>> +static int tpm_ibmvtpm_send(struct tpm_chip *chip, u8 *buf, size_t count,
>> + size_t buf_size)
>> {
>> struct ibmvtpm_dev *ibmvtpm = dev_get_drvdata(&chip->dev);
>> bool retry = true;
>> diff --git a/drivers/char/tpm/tpm_infineon.c b/drivers/char/tpm/tpm_infineon.c
>> index 2d2ae37153ba..7896fdacd156 100644
>> --- a/drivers/char/tpm/tpm_infineon.c
>> +++ b/drivers/char/tpm/tpm_infineon.c
>> @@ -312,7 +312,8 @@ static int tpm_inf_recv(struct tpm_chip *chip, u8 * buf, size_t count)
>> return -EIO;
>> }
>>
>> -static int tpm_inf_send(struct tpm_chip *chip, u8 * buf, size_t count)
>> +static int tpm_inf_send(struct tpm_chip *chip, u8 *buf, size_t count,
>> + size_t buf_size)
>> {
>> int i;
>> int ret;
>> diff --git a/drivers/char/tpm/tpm_nsc.c b/drivers/char/tpm/tpm_nsc.c
>> index 0f62bbc940da..12aedef3c50e 100644
>> --- a/drivers/char/tpm/tpm_nsc.c
>> +++ b/drivers/char/tpm/tpm_nsc.c
>> @@ -178,7 +178,8 @@ static int tpm_nsc_recv(struct tpm_chip *chip, u8 * buf, size_t count)
>> return size;
>> }
>>
>> -static int tpm_nsc_send(struct tpm_chip *chip, u8 * buf, size_t count)
>> +static int tpm_nsc_send(struct tpm_chip *chip, u8 *buf, size_t count,
>> + size_t buf_size)
>> {
>> struct tpm_nsc_priv *priv = dev_get_drvdata(&chip->dev);
>> u8 data;
>> diff --git a/drivers/char/tpm/tpm_svsm.c b/drivers/char/tpm/tpm_svsm.c
>> index 4280edf427d6..d3ca5615b6f7 100644
>> --- a/drivers/char/tpm/tpm_svsm.c
>> +++ b/drivers/char/tpm/tpm_svsm.c
>> @@ -25,7 +25,8 @@ struct tpm_svsm_priv {
>> void *buffer;
>> };
>>
>> -static int tpm_svsm_send(struct tpm_chip *chip, u8 *buf, size_t len)
>> +static int tpm_svsm_send(struct tpm_chip *chip, u8 *buf, size_t len,
>> + size_t buf_size)
>> {
>> struct tpm_svsm_priv *priv = dev_get_drvdata(&chip->dev);
>> int ret;
>> diff --git a/drivers/char/tpm/tpm_tis_core.c b/drivers/char/tpm/tpm_tis_core.c
>> index ed0d3d8449b3..5641a73ce280 100644
>> --- a/drivers/char/tpm/tpm_tis_core.c
>> +++ b/drivers/char/tpm/tpm_tis_core.c
>> @@ -580,7 +580,8 @@ static int tpm_tis_send_main(struct tpm_chip *chip, const u8 *buf, size_t len)
>> return rc;
>> }
>>
>> -static int tpm_tis_send(struct tpm_chip *chip, u8 *buf, size_t len)
>> +static int tpm_tis_send(struct tpm_chip *chip, u8 *buf, size_t len,
>> + size_t buf_size)
>> {
>> int rc, irq;
>> struct tpm_tis_data *priv = dev_get_drvdata(&chip->dev);
>> diff --git a/drivers/char/tpm/tpm_tis_i2c_cr50.c b/drivers/char/tpm/tpm_tis_i2c_cr50.c
>> index 3b55a7b05c46..1914b368472d 100644
>> --- a/drivers/char/tpm/tpm_tis_i2c_cr50.c
>> +++ b/drivers/char/tpm/tpm_tis_i2c_cr50.c
>> @@ -546,13 +546,15 @@ static int tpm_cr50_i2c_tis_recv(struct tpm_chip *chip, u8 *buf, size_t buf_len)
>> * tpm_cr50_i2c_tis_send() - TPM transmission callback.
>> * @chip: A TPM chip.
>> * @buf: Buffer to send.
>> - * @len: Buffer length.
>> + * @len: Command length.
>> + * @buf_size: Buffer size.
>> *
>> * Return:
>> * - 0: Success.
>> * - -errno: A POSIX error code.
>> */
>> -static int tpm_cr50_i2c_tis_send(struct tpm_chip *chip, u8 *buf, size_t len)
>> +static int tpm_cr50_i2c_tis_send(struct tpm_chip *chip, u8 *buf, size_t len,
>> + size_t buf_size)
>> {
>> size_t burstcnt, limit, sent = 0;
>> u8 tpm_go[4] = { TPM_STS_GO };
>> diff --git a/drivers/char/tpm/tpm_vtpm_proxy.c b/drivers/char/tpm/tpm_vtpm_proxy.c
>> index 8fe4a01eea12..beaa84428b49 100644
>> --- a/drivers/char/tpm/tpm_vtpm_proxy.c
>> +++ b/drivers/char/tpm/tpm_vtpm_proxy.c
>> @@ -322,11 +322,13 @@ static int vtpm_proxy_is_driver_command(struct tpm_chip *chip,
>> * @chip: tpm chip to use
>> * @buf: send buffer
>> * @count: bytes to send
>> + * @buf_size: size of the buffer
>> *
>> * Return:
>> * 0 in case of success, negative error value otherwise.
>> */
>> -static int vtpm_proxy_tpm_op_send(struct tpm_chip *chip, u8 *buf, size_t count)
>> +static int vtpm_proxy_tpm_op_send(struct tpm_chip *chip, u8 *buf, size_t count,
>> + size_t buf_size)
>> {
>> struct proxy_dev *proxy_dev = dev_get_drvdata(&chip->dev);
>>
>> diff --git a/drivers/char/tpm/xen-tpmfront.c b/drivers/char/tpm/xen-tpmfront.c
>> index 80cca3b83b22..66a4dbb4a4d8 100644
>> --- a/drivers/char/tpm/xen-tpmfront.c
>> +++ b/drivers/char/tpm/xen-tpmfront.c
>> @@ -131,7 +131,8 @@ static size_t shr_data_offset(struct vtpm_shared_page *shr)
>> return struct_size(shr, extra_pages, shr->nr_extra_pages);
>> }
>>
>> -static int vtpm_send(struct tpm_chip *chip, u8 *buf, size_t count)
>> +static int vtpm_send(struct tpm_chip *chip, u8 *buf, size_t count,
>> + size_t buf_size)
>> {
>> struct tpm_private *priv = dev_get_drvdata(&chip->dev);
>> struct vtpm_shared_page *shr = priv->shr;
>> --
>> 2.49.0
>>
>>
>
>BR, Jarkko
>
More information about the Linuxppc-dev
mailing list