Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1724425 > unrolled thread

[PATCH RESEND v3 0/2] tpm_tis_spi: Use DMA-safe memory

Started byAlexander Steffen <Alexander.Steffen@infineon.com>
First post2017-08-31 19:10 +0200
Last post2017-09-08 14:20 +0200
Articles 5 — 2 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH RESEND v3 0/2] tpm_tis_spi: Use DMA-safe memory Alexander Steffen <Alexander.Steffen@infineon.com> - 2017-08-31 19:10 +0200
    [PATCH RESEND v3 1/2] tpm_tis_spi: Use DMA-safe memory for SPI transfers Alexander Steffen <Alexander.Steffen@infineon.com> - 2017-08-31 19:10 +0200
    Re: [PATCH RESEND v3 0/2] tpm_tis_spi: Use DMA-safe memory Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> - 2017-09-02 13:00 +0200
    Re: [PATCH RESEND v3 0/2] tpm_tis_spi: Use DMA-safe memory Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> - 2017-09-06 15:00 +0200
      Re: [PATCH RESEND v3 0/2] tpm_tis_spi: Use DMA-safe memory Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> - 2017-09-08 14:20 +0200

#1724425 — [PATCH RESEND v3 0/2] tpm_tis_spi: Use DMA-safe memory

FromAlexander Steffen <Alexander.Steffen@infineon.com>
Date2017-08-31 19:10 +0200
Subject[PATCH RESEND v3 0/2] tpm_tis_spi: Use DMA-safe memory
Message-ID<ukB8B-8op-3@gated-at.bofh.it>
The documentation says that DMA-safe memory is required for SPI transfers.
The I/O buffers passed in by the caller can be allocated anywhere,
including on the stack, which is not DMA-safe. So the data needs to be
copied to separate, DMA-safe buffers.

We did not see any DMA-related issues on our test systems, even without
DMA-safe buffers. But this might simply be due to the fact that the SPI
transfer size is rather small, so our systems do not bother to set up DMA
transfers. Other systems might do so.

v2:
- Updated commit message with more explanations.

v3:
- Split into two patches, one for making the buffers DMA-safe and another
  for using only a single buffer.

Alexander Steffen (2):
  tpm_tis_spi: Use DMA-safe memory for SPI transfers
  tpm_tis_spi: Use a single buffer for SPI transfers

 drivers/char/tpm/tpm_tis_spi.c | 32 ++++++++++++++++++--------------
 1 file changed, 18 insertions(+), 14 deletions(-)

-- 
2.7.4

[toc] | [next] | [standalone]


#1724430 — [PATCH RESEND v3 1/2] tpm_tis_spi: Use DMA-safe memory for SPI transfers

FromAlexander Steffen <Alexander.Steffen@infineon.com>
Date2017-08-31 19:10 +0200
Subject[PATCH RESEND v3 1/2] tpm_tis_spi: Use DMA-safe memory for SPI transfers
Message-ID<ukB8D-8op-35@gated-at.bofh.it>
In reply to#1724425
The buffers used as tx_buf/rx_buf in a SPI transfer need to be DMA-safe.
This cannot be guaranteed for the buffers passed to tpm_tis_spi_read_bytes
and tpm_tis_spi_write_bytes. Therefore, we need to use our own DMA-safe
buffer and copy the data to/from it.

The buffer needs to be allocated separately, to ensure that it is
cacheline-aligned and not shared with other data, so that DMA can work
correctly.

Fixes: 0edbfea537d1 ("tpm/tpm_tis_spi: Add support for spi phy")
Cc: stable@vger.kernel.org
Signed-off-by: Alexander Steffen <Alexander.Steffen@infineon.com>
Reviewed-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
---
 drivers/char/tpm/tpm_tis_spi.c | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/drivers/char/tpm/tpm_tis_spi.c b/drivers/char/tpm/tpm_tis_spi.c
index 88fe72a..05ce841 100644
--- a/drivers/char/tpm/tpm_tis_spi.c
+++ b/drivers/char/tpm/tpm_tis_spi.c
@@ -47,8 +47,8 @@ struct tpm_tis_spi_phy {
 	struct tpm_tis_data priv;
 	struct spi_device *spi_device;
 
-	u8 tx_buf[4];
-	u8 rx_buf[4];
+	u8 *tx_buf;
+	u8 *rx_buf;
 };
 
 static inline struct tpm_tis_spi_phy *to_tpm_tis_spi_phy(struct tpm_tis_data *data)
@@ -115,10 +115,9 @@ static int tpm_tis_spi_transfer(struct tpm_tis_data *data, u32 addr, u16 len,
 
 		if (direction) {
 			spi_xfer.tx_buf = NULL;
-			spi_xfer.rx_buf = buffer;
 		} else {
-			spi_xfer.tx_buf = buffer;
 			spi_xfer.rx_buf = NULL;
+			memcpy(phy->tx_buf, buffer, transfer_len);
 		}
 
 		spi_message_init(&m);
@@ -127,6 +126,9 @@ static int tpm_tis_spi_transfer(struct tpm_tis_data *data, u32 addr, u16 len,
 		if (ret < 0)
 			goto exit;
 
+		if (direction)
+			memcpy(buffer, phy->rx_buf, transfer_len);
+
 		len -= transfer_len;
 		buffer += transfer_len;
 	}
@@ -194,6 +196,14 @@ static int tpm_tis_spi_probe(struct spi_device *dev)
 
 	phy->spi_device = dev;
 
+	phy->tx_buf = devm_kmalloc(&dev->dev, MAX_SPI_FRAMESIZE, GFP_KERNEL);
+	if (!phy->tx_buf)
+		return -ENOMEM;
+
+	phy->rx_buf = devm_kmalloc(&dev->dev, MAX_SPI_FRAMESIZE, GFP_KERNEL);
+	if (!phy->rx_buf)
+		return -ENOMEM;
+
 	return tpm_tis_core_init(&dev->dev, &phy->priv, -1, &tpm_spi_phy_ops,
 				 NULL);
 }
-- 
2.7.4

[toc] | [prev] | [next] | [standalone]


#1725486

FromJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Date2017-09-02 13:00 +0200
Message-ID<ulejD-1Wa-3@gated-at.bofh.it>
In reply to#1724425
On Thu, Aug 31, 2017 at 06:58:17PM +0200, Alexander Steffen wrote:
> The documentation says that DMA-safe memory is required for SPI transfers.
> The I/O buffers passed in by the caller can be allocated anywhere,
> including on the stack, which is not DMA-safe. So the data needs to be
> copied to separate, DMA-safe buffers.
> 
> We did not see any DMA-related issues on our test systems, even without
> DMA-safe buffers. But this might simply be due to the fact that the SPI
> transfer size is rather small, so our systems do not bother to set up DMA
> transfers. Other systems might do so.
> 
> v2:
> - Updated commit message with more explanations.
> 
> v3:
> - Split into two patches, one for making the buffers DMA-safe and another
>   for using only a single buffer.
> 
> Alexander Steffen (2):
>   tpm_tis_spi: Use DMA-safe memory for SPI transfers
>   tpm_tis_spi: Use a single buffer for SPI transfers
> 
>  drivers/char/tpm/tpm_tis_spi.c | 32 ++++++++++++++++++--------------
>  1 file changed, 18 insertions(+), 14 deletions(-)
> 
> -- 
> 2.7.4
> 

Great, I'll try to get means to test this!

/Jarkko

[toc] | [prev] | [next] | [standalone]


#1727424

FromJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Date2017-09-06 15:00 +0200
Message-ID<umI5Y-1TZ-27@gated-at.bofh.it>
In reply to#1724425
On Thu, Aug 31, 2017 at 06:58:17PM +0200, Alexander Steffen wrote:
> The documentation says that DMA-safe memory is required for SPI transfers.
> The I/O buffers passed in by the caller can be allocated anywhere,
> including on the stack, which is not DMA-safe. So the data needs to be
> copied to separate, DMA-safe buffers.
> 
> We did not see any DMA-related issues on our test systems, even without
> DMA-safe buffers. But this might simply be due to the fact that the SPI
> transfer size is rather small, so our systems do not bother to set up DMA
> transfers. Other systems might do so.
> 
> v2:
> - Updated commit message with more explanations.
> 
> v3:
> - Split into two patches, one for making the buffers DMA-safe and another
>   for using only a single buffer.
> 
> Alexander Steffen (2):
>   tpm_tis_spi: Use DMA-safe memory for SPI transfers
>   tpm_tis_spi: Use a single buffer for SPI transfers
> 
>  drivers/char/tpm/tpm_tis_spi.c | 32 ++++++++++++++++++--------------
>  1 file changed, 18 insertions(+), 14 deletions(-)
> 
> -- 
> 2.7.4
> 

Applied to my bleeding edge master brach for more convenient testing.
Have not yet applied to my next branch.

/Jarkko

[toc] | [prev] | [next] | [standalone]


#1728785

FromJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Date2017-09-08 14:20 +0200
Message-ID<unqql-6V3-3@gated-at.bofh.it>
In reply to#1727424
On Wed, Sep 06, 2017 at 03:54:58PM +0300, Jarkko Sakkinen wrote:
> On Thu, Aug 31, 2017 at 06:58:17PM +0200, Alexander Steffen wrote:
> > The documentation says that DMA-safe memory is required for SPI transfers.
> > The I/O buffers passed in by the caller can be allocated anywhere,
> > including on the stack, which is not DMA-safe. So the data needs to be
> > copied to separate, DMA-safe buffers.
> > 
> > We did not see any DMA-related issues on our test systems, even without
> > DMA-safe buffers. But this might simply be due to the fact that the SPI
> > transfer size is rather small, so our systems do not bother to set up DMA
> > transfers. Other systems might do so.
> > 
> > v2:
> > - Updated commit message with more explanations.
> > 
> > v3:
> > - Split into two patches, one for making the buffers DMA-safe and another
> >   for using only a single buffer.
> > 
> > Alexander Steffen (2):
> >   tpm_tis_spi: Use DMA-safe memory for SPI transfers
> >   tpm_tis_spi: Use a single buffer for SPI transfers
> > 
> >  drivers/char/tpm/tpm_tis_spi.c | 32 ++++++++++++++++++--------------
> >  1 file changed, 18 insertions(+), 14 deletions(-)
> > 
> > -- 
> > 2.7.4
> > 
> 
> Applied to my bleeding edge master brach for more convenient testing.
> Have not yet applied to my next branch.
> 
> /Jarkko

Tested-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>

My XP13 happened to have suitable TPM.

/Jarkko

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web