From: msuchanek <msuchanek@suse.de>
To: Benjamin Herrenschmidt <benh@kernel.crashing.org>,
Paul Mackerras <paulus@samba.org>,
Michael Ellerman <mpe@ellerman.id.au>,
Ashley Lai <ashleydlai@gmail.com>,
Peter Huewe <peterhuewe@gmx.de>,
Marcel Selhorst <tpmdd@selhorst.net>,
Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>,
Jason Gunthorpe <jgunthorpe@obsidianresearch.com>,
linuxppc-dev@lists.ozlabs.org, tpmdd-devel@lists.sourceforge.net,
linux-kernel@vger.kernel.org
Cc: tpmdd@selhorst.ne
Subject: Re: [RFT PATCH] tpm: ibmvtpm: simplify crq initialization and document crq format
Date: Fri, 18 Aug 2017 00:21:45 +0200 [thread overview]
Message-ID: <20170818002145.62fb72eb@naga> (raw)
In-Reply-To: <20170224193516.9342-1-msuchanek@suse.de>
ping?
On Fri, 24 Feb 2017 20:35:16 +0100
Michal Suchanek <msuchanek@suse.de> wrote:
> The crq is passed in registers and is the same on BE and LE hosts.
> However, current implementation allocates a structure on-stack to
> represent the crq, initializes the members swapping them to BE, and
> loads the structure swapping it from BE. This is pointless and causes
> GCC warnings about ununitialized members. Get rid of the structure and
> the warnings.
>
> Signed-off-by: Michal Suchanek <msuchanek@suse.de>
> Reviewed-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
> ---
> v2
>
> fix typos and spelling in comments
> ---
> drivers/char/tpm/tpm_ibmvtpm.c | 96
> ++++++++++++++++++++++++++---------------- 1 file changed, 60
> insertions(+), 36 deletions(-)
>
> diff --git a/drivers/char/tpm/tpm_ibmvtpm.c
> b/drivers/char/tpm/tpm_ibmvtpm.c index 1b9d61ffe991..89027339d55f
> 100644 --- a/drivers/char/tpm/tpm_ibmvtpm.c
> +++ b/drivers/char/tpm/tpm_ibmvtpm.c
> @@ -39,19 +39,63 @@ static struct vio_device_id
> tpm_ibmvtpm_device_table[] = { MODULE_DEVICE_TABLE(vio,
> tpm_ibmvtpm_device_table);
> /**
> + *
> + * ibmvtpm_send_crq_word - Send a CRQ request
> + * @vdev: vio device struct
> + * @w1: pre-constructed first word of tpm crq (second
> word is reserved)
> + *
> + * Return:
> + * 0 - Success
> + * Non-zero - Failure
> + */
> +static int ibmvtpm_send_crq_word(struct vio_dev *vdev, u64 w1)
> +{
> + return plpar_hcall_norets(H_SEND_CRQ, vdev->unit_address,
> w1, 0); +}
> +
> +/**
> + *
> * ibmvtpm_send_crq - Send a CRQ request
> *
> * @vdev: vio device struct
> - * @w1: first word
> - * @w2: second word
> + * @valid: Valid field
> + * @msg: Type field
> + * @len: Length field
> + * @data: Data field
> + *
> + * The ibmvtpm crq is defined as follows:
> + *
> + * Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
> 7
> + *
> -----------------------------------------------------------------------
> + * Word0 | Valid | Type | Length | Data
> + *
> -----------------------------------------------------------------------
> + * Word1 | Reserved
> + *
> -----------------------------------------------------------------------
> + *
> + * Which matches the following structure (on bigendian host):
> + *
> + * struct ibmvtpm_crq {
> + * u8 valid;
> + * u8 msg;
> + * __be16 len;
> + * __be32 data;
> + * __be64 reserved;
> + * } __attribute__((packed, aligned(8)));
> + *
> + * However, the value is passed in a register so just compute the
> numeric value
> + * to load into the register avoiding byteswap altogether. Endian
> only affects
> + * memory loads and stores - registers are internally represented
> the same. *
> * Return:
> - * 0 -Sucess
> + * 0 (H_SUCCESS) - Success
> * Non-zero - Failure
> */
> -static int ibmvtpm_send_crq(struct vio_dev *vdev, u64 w1, u64 w2)
> +static int ibmvtpm_send_crq(struct vio_dev *vdev,
> + u8 valid, u8 msg, u16 len, u32 data)
> {
> - return plpar_hcall_norets(H_SEND_CRQ, vdev->unit_address,
> w1, w2);
> + u64 w1 = ((u64)valid << 56) | ((u64)msg << 48) | ((u64)len
> << 32) |
> + (u64)data;
> + return ibmvtpm_send_crq_word(vdev, w1);
> }
>
> /**
> @@ -109,8 +153,6 @@ static int tpm_ibmvtpm_recv(struct tpm_chip
> *chip, u8 *buf, size_t count) static int tpm_ibmvtpm_send(struct
> tpm_chip *chip, u8 *buf, size_t count) {
> struct ibmvtpm_dev *ibmvtpm = dev_get_drvdata(&chip->dev);
> - struct ibmvtpm_crq crq;
> - __be64 *word = (__be64 *)&crq;
> int rc, sig;
>
> if (!ibmvtpm->rtce_buf) {
> @@ -137,10 +179,6 @@ static int tpm_ibmvtpm_send(struct tpm_chip
> *chip, u8 *buf, size_t count) spin_lock(&ibmvtpm->rtce_lock);
> ibmvtpm->res_len = 0;
> memcpy((void *)ibmvtpm->rtce_buf, (void *)buf, count);
> - crq.valid = (u8)IBMVTPM_VALID_CMD;
> - crq.msg = (u8)VTPM_TPM_COMMAND;
> - crq.len = cpu_to_be16(count);
> - crq.data = cpu_to_be32(ibmvtpm->rtce_dma_handle);
>
> /*
> * set the processing flag before the Hcall, since we may
> get the @@ -148,8 +186,9 @@ static int tpm_ibmvtpm_send(struct
> tpm_chip *chip, u8 *buf, size_t count) */
> ibmvtpm->tpm_processing_cmd = true;
>
> - rc = ibmvtpm_send_crq(ibmvtpm->vdev, be64_to_cpu(word[0]),
> - be64_to_cpu(word[1]));
> + rc = ibmvtpm_send_crq(ibmvtpm->vdev,
> + IBMVTPM_VALID_CMD, VTPM_TPM_COMMAND,
> + count, ibmvtpm->rtce_dma_handle);
> if (rc != H_SUCCESS) {
> dev_err(ibmvtpm->dev, "tpm_ibmvtpm_send failed
> rc=%d\n", rc); rc = 0;
> @@ -182,15 +221,10 @@ static u8 tpm_ibmvtpm_status(struct tpm_chip
> *chip) */
> static int ibmvtpm_crq_get_rtce_size(struct ibmvtpm_dev *ibmvtpm)
> {
> - struct ibmvtpm_crq crq;
> - u64 *buf = (u64 *) &crq;
> int rc;
>
> - crq.valid = (u8)IBMVTPM_VALID_CMD;
> - crq.msg = (u8)VTPM_GET_RTCE_BUFFER_SIZE;
> -
> - rc = ibmvtpm_send_crq(ibmvtpm->vdev, cpu_to_be64(buf[0]),
> - cpu_to_be64(buf[1]));
> + rc = ibmvtpm_send_crq(ibmvtpm->vdev,
> + IBMVTPM_VALID_CMD,
> VTPM_GET_RTCE_BUFFER_SIZE, 0, 0); if (rc != H_SUCCESS)
> dev_err(ibmvtpm->dev,
> "ibmvtpm_crq_get_rtce_size failed rc=%d\n",
> rc); @@ -210,15 +244,10 @@ static int
> ibmvtpm_crq_get_rtce_size(struct ibmvtpm_dev *ibmvtpm) */
> static int ibmvtpm_crq_get_version(struct ibmvtpm_dev *ibmvtpm)
> {
> - struct ibmvtpm_crq crq;
> - u64 *buf = (u64 *) &crq;
> int rc;
>
> - crq.valid = (u8)IBMVTPM_VALID_CMD;
> - crq.msg = (u8)VTPM_GET_VERSION;
> -
> - rc = ibmvtpm_send_crq(ibmvtpm->vdev, cpu_to_be64(buf[0]),
> - cpu_to_be64(buf[1]));
> + rc = ibmvtpm_send_crq(ibmvtpm->vdev,
> + IBMVTPM_VALID_CMD, VTPM_GET_VERSION, 0, 0);
> if (rc != H_SUCCESS)
> dev_err(ibmvtpm->dev,
> "ibmvtpm_crq_get_version failed rc=%d\n",
> rc); @@ -238,7 +267,7 @@ static int
> ibmvtpm_crq_send_init_complete(struct ibmvtpm_dev *ibmvtpm) {
> int rc;
>
> - rc = ibmvtpm_send_crq(ibmvtpm->vdev, INIT_CRQ_COMP_CMD, 0);
> + rc = ibmvtpm_send_crq_word(ibmvtpm->vdev, INIT_CRQ_COMP_CMD);
> if (rc != H_SUCCESS)
> dev_err(ibmvtpm->dev,
> "ibmvtpm_crq_send_init_complete failed
> rc=%d\n", rc); @@ -258,7 +287,7 @@ static int
> ibmvtpm_crq_send_init(struct ibmvtpm_dev *ibmvtpm) {
> int rc;
>
> - rc = ibmvtpm_send_crq(ibmvtpm->vdev, INIT_CRQ_CMD, 0);
> + rc = ibmvtpm_send_crq_word(ibmvtpm->vdev, INIT_CRQ_CMD);
> if (rc != H_SUCCESS)
> dev_err(ibmvtpm->dev,
> "ibmvtpm_crq_send_init failed rc=%d\n", rc);
> @@ -336,15 +365,10 @@ static int tpm_ibmvtpm_suspend(struct device
> *dev) {
> struct tpm_chip *chip = dev_get_drvdata(dev);
> struct ibmvtpm_dev *ibmvtpm = dev_get_drvdata(&chip->dev);
> - struct ibmvtpm_crq crq;
> - u64 *buf = (u64 *) &crq;
> int rc = 0;
>
> - crq.valid = (u8)IBMVTPM_VALID_CMD;
> - crq.msg = (u8)VTPM_PREPARE_TO_SUSPEND;
> -
> - rc = ibmvtpm_send_crq(ibmvtpm->vdev, cpu_to_be64(buf[0]),
> - cpu_to_be64(buf[1]));
> + rc = ibmvtpm_send_crq(ibmvtpm->vdev,
> + IBMVTPM_VALID_CMD, VTPM_PREPARE_TO_SUSPEND,
> 0, 0); if (rc != H_SUCCESS)
> dev_err(ibmvtpm->dev,
> "tpm_ibmvtpm_suspend failed rc=%d\n", rc);
next prev parent reply other threads:[~2017-08-17 22:21 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-07-29 7:24 [PATCH 0/5] tpm: tpm_ibmvtpm: - style fix SZ Lin
2017-02-24 19:35 ` [RFT PATCH] tpm: ibmvtpm: simplify crq initialization and document crq format Michal Suchanek
2017-02-24 19:35 ` Michal Suchanek
2017-08-17 22:21 ` msuchanek [this message]
2017-08-19 17:18 ` Jarkko Sakkinen
2017-08-19 17:18 ` Jarkko Sakkinen
2017-08-19 17:24 ` Jarkko Sakkinen
2017-08-19 17:24 ` Jarkko Sakkinen
2017-07-29 7:24 ` [PATCH 1/5] Fix packed and aligned attribute warnings SZ Lin
2017-07-31 13:27 ` David Laight
2017-07-31 13:27 ` David Laight
2017-07-29 7:24 ` [PATCH 2/5] Fix "ERROR: code indent should use tabs where possible" SZ Lin
2017-07-31 10:25 ` Michael Ellerman
2017-07-31 10:25 ` Michael Ellerman
2017-07-29 7:24 ` [PATCH 3/5] Fix 'void function return statements are not generally useful' warning SZ Lin
2017-07-29 7:24 ` [PATCH 4/5] Remove unneccessary 'out of memory' message SZ Lin
2017-07-29 7:24 ` [PATCH 5/5] Use __func__ instead of function name SZ Lin
2017-08-18 8:03 ` Michal Suchánek
2017-08-18 8:03 ` Michal Suchánek
2017-08-18 11:25 ` Michael Ellerman
2017-08-18 11:25 ` Michael Ellerman
2017-08-18 11:25 ` Michael Ellerman
2017-08-19 7:58 ` 김동현
2017-08-02 12:36 ` [PATCH 0/5] tpm: tpm_ibmvtpm: - style fix Jarkko Sakkinen
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=20170818002145.62fb72eb@naga \
--to=msuchanek@suse.de \
--cc=ashleydlai@gmail.com \
--cc=benh@kernel.crashing.org \
--cc=jarkko.sakkinen@linux.intel.com \
--cc=jgunthorpe@obsidianresearch.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=mpe@ellerman.id.au \
--cc=paulus@samba.org \
--cc=peterhuewe@gmx.de \
--cc=tpmdd-devel@lists.sourceforge.net \
--cc=tpmdd@selhorst.ne \
--cc=tpmdd@selhorst.net \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.