From: Jarkko Sakkinen <jarkko@kernel.org>
To: Stefano Garzarella <sgarzare@redhat.com>
Cc: linux-kernel@vger.kernel.org,
Nicolas Ferre <nicolas.ferre@microchip.com>,
Naveen N Rao <naveen@kernel.org>,
Sumit Garg <sumit.garg@kernel.org>,
linux-integrity@vger.kernel.org, Peter Huewe <peterhuewe@gmx.de>,
Jens Wiklander <jens.wiklander@linaro.org>,
James Bottomley <James.Bottomley@hansenpartnership.com>,
linux-arm-kernel@lists.infradead.org,
linuxppc-dev@lists.ozlabs.org,
Christophe Leroy <christophe.leroy@csgroup.eu>,
Nicholas Piggin <npiggin@gmail.com>,
Jason Gunthorpe <jgg@ziepe.ca>,
Michael Ellerman <mpe@ellerman.id.au>,
Alexandre Belloni <alexandre.belloni@bootlin.com>,
Claudiu Beznea <claudiu.beznea@tuxon.dev>,
Madhavan Srinivasan <maddy@linux.ibm.com>
Subject: Re: [PATCH v6 1/4] tpm: add bufsiz parameter in the .send callback
Date: Wed, 25 Jun 2025 15:00:43 +0300 [thread overview]
Message-ID: <aFvk67ZGNFezJ8Vr@kernel.org> (raw)
In-Reply-To: <20250620130810.99069-2-sgarzare@redhat.com>
On Fri, Jun 20, 2025 at 03:08:07PM +0200, Stefano Garzarella wrote:
> From: Stefano Garzarella <sgarzare@redhat.com>
>
> Add a new `bufsiz` 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 `bufsiz` is
> not used, but it will be used to implement devices with synchronous send()
> to send the command and receive the response on the same buffer.
>
> 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 bufsiz,
>
> Suggested-by: Jarkko Sakkinen <jarkko@kernel.org>
> Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
> ---
> v5:
> - changed order and parameter names to match tpm_try_transmit() [Jarkko]
> v4:
> - rework the commit description [Jarkko]
> ---
> 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 a3d8305e88a5..cafe8c283e88 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 bufsiz,
> + size_t cmd_len);
> 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..2ed7815e4899 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 bufsiz, size_t len)
> {
> 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..816b7c690bc9 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, bufsiz, count);
> 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..f25faf468bba 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 bufsiz,
> + size_t count)
> {
> 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..ed97344f2324 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 bufsiz, size_t len)
> {
> 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..dbad83bf798e 100644
> --- a/drivers/char/tpm/tpm_ftpm_tee.c
> +++ b/drivers/char/tpm/tpm_ftpm_tee.c
> @@ -63,13 +63,15 @@ static int ftpm_tee_tpm_op_recv(struct tpm_chip *chip, u8 *buf, size_t count)
> * ftpm_tee_tpm_op_send() - send TPM commands through the TEE shared memory.
> * @chip: the tpm_chip description as specified in driver/char/tpm/tpm.h
> * @buf: the buffer to send.
> + * @bufsiz: the size of the buffer.
> * @len: the number of bytes to send.
> *
> * 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 bufsiz,
> + size_t len)
> {
> 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..4f229656a8e2 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 bufsiz,
> + size_t len)
> {
> 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..bdf1f329a679 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 bufsiz,
> + size_t len)
> {
> 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..d44903b29929 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 bufsiz,
> + size_t len)
> {
> 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..4734a69406ce 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
> + * @bufsiz: size of the buffer
> + * @count: length of the command
> *
> * 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 bufsiz,
> + size_t count)
> {
> 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..7638b65b851b 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 bufsiz,
> + size_t count)
> {
> int i;
> int ret;
> diff --git a/drivers/char/tpm/tpm_nsc.c b/drivers/char/tpm/tpm_nsc.c
> index 0f62bbc940da..879ac88f5783 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 bufsiz,
> + size_t count)
> {
> 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..0847cbf450b4 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 bufsiz,
> + size_t len)
> {
> 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..4b12c4b9da8b 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 bufsiz,
> + size_t len)
> {
> 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..fc6891a0b693 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.
> + * @bufsiz: Buffer size.
> + * @len: Command length.
> *
> * 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 bufsiz,
> + size_t len)
> {
> 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..0818bb517805 100644
> --- a/drivers/char/tpm/tpm_vtpm_proxy.c
> +++ b/drivers/char/tpm/tpm_vtpm_proxy.c
> @@ -321,12 +321,14 @@ static int vtpm_proxy_is_driver_command(struct tpm_chip *chip,
> *
> * @chip: tpm chip to use
> * @buf: send buffer
> + * @bufsiz: size of the buffer
> * @count: bytes to send
> *
> * 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 bufsiz,
> + size_t count)
> {
> 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..556bf2256716 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 bufsiz,
> + size_t count)
> {
> struct tpm_private *priv = dev_get_drvdata(&chip->dev);
> struct vtpm_shared_page *shr = priv->shr;
> --
> 2.49.0
>
Reviewed-by: Jarkko Sakkinen <jarkko@kernel.org>
BR, Jarkko
next prev parent reply other threads:[~2025-06-25 18:38 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-20 13:08 [PATCH v6 0/4] tpm: add support for sync send() and use it in ftpm and svsm drivers Stefano Garzarella
2025-06-20 13:08 ` [PATCH v6 1/4] tpm: add bufsiz parameter in the .send callback Stefano Garzarella
2025-06-25 12:00 ` Jarkko Sakkinen [this message]
2025-06-20 13:08 ` [PATCH v6 2/4] tpm: support devices with synchronous send() Stefano Garzarella
2025-06-20 13:08 ` [PATCH v6 3/4] tpm/tpm_ftpm_tee: support TPM_CHIP_FLAG_SYNC Stefano Garzarella
2025-06-25 12:01 ` Jarkko Sakkinen
2025-06-20 13:08 ` [PATCH v6 4/4] tpm/tpm_svsm: " Stefano Garzarella
2025-06-25 12:02 ` Jarkko Sakkinen
2025-06-25 15:08 ` Jarkko Sakkinen
2025-06-25 16:42 ` Stefano Garzarella
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aFvk67ZGNFezJ8Vr@kernel.org \
--to=jarkko@kernel.org \
--cc=James.Bottomley@hansenpartnership.com \
--cc=alexandre.belloni@bootlin.com \
--cc=christophe.leroy@csgroup.eu \
--cc=claudiu.beznea@tuxon.dev \
--cc=jens.wiklander@linaro.org \
--cc=jgg@ziepe.ca \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-integrity@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=maddy@linux.ibm.com \
--cc=mpe@ellerman.id.au \
--cc=naveen@kernel.org \
--cc=nicolas.ferre@microchip.com \
--cc=npiggin@gmail.com \
--cc=peterhuewe@gmx.de \
--cc=sgarzare@redhat.com \
--cc=sumit.garg@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).