Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1582673 > unrolled thread
| Started by | Peter Huewe <peter.huewe@infineon.com> |
|---|---|
| First post | 2017-02-16 17:10 +0100 |
| Last post | 2017-02-24 16:20 +0100 |
| Articles | 10 — 4 participants |
Back to article view | Back to linux.kernel
[PATCH 0/5] Fix whole native SPI TPM driver Peter Huewe <peter.huewe@infineon.com> - 2017-02-16 17:10 +0100
[PATCH 3/5] tpm_tis_spi: Check correct byte for wait state indicator Peter Huewe <peter.huewe@infineon.com> - 2017-02-16 17:10 +0100
Re: [PATCH 3/5] tpm_tis_spi: Check correct byte for wait state indicator Christophe Ricard <christophe.ricard@gmail.com> - 2017-02-17 06:20 +0100
Re: [PATCH 3/5] tpm_tis_spi: Check correct byte for wait state indicator Peter Huewe <peterhuewe@gmx.de> - 2017-02-17 08:20 +0100
Re: [PATCH 3/5] tpm_tis_spi: Check correct byte for wait state indicator Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> - 2017-02-24 14:20 +0100
[PATCH 1/5] tpm_tis_spi: Use single function to transfer data Peter Huewe <peter.huewe@infineon.com> - 2017-02-16 17:20 +0100
Re: [PATCH 1/5] tpm_tis_spi: Use single function to transfer data Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> - 2017-02-24 14:00 +0100
Re: [PATCH 0/5] Fix whole native SPI TPM driver Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> - 2017-02-22 22:20 +0100
Re: [PATCH 0/5] Fix whole native SPI TPM driver Peter Huewe <peterhuewe@gmx.de> - 2017-02-23 00:00 +0100
Re: [PATCH 0/5] Fix whole native SPI TPM driver Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> - 2017-02-24 16:20 +0100
| From | Peter Huewe <peter.huewe@infineon.com> |
|---|---|
| Date | 2017-02-16 17:10 +0100 |
| Subject | [PATCH 0/5] Fix whole native SPI TPM driver |
| Message-ID | <tbwN4-fF-17@gated-at.bofh.it> |
During our testing it showed that unfortunately the whole native spi tpm driver was more or less non-functional since it was merged, e.g. the wrong byte for waitstate handling was used and transfers larger than 64 bytes did not work at all. This was probably caused by the merging of the different approaches back then, as the initial RFC patch did not have these problems, and also my sudden lack of time/commitment back then. I'm sorry that the final driver code went untested for that long time. This patch set fixes these issues one by one. In order to avoid duplication the read/write function was consolidated to one transfer function, so we do not have to apply the same fix at two locations. Maybe consider squashing it - we splitted it for easier review. Affected Kernels: 4.8, 4.9, 4.10 Patchset was tested on Raspberry Pi2 with SLB9670 (TPM1.2 and TPM2.0) Peter Huewe (5): tpm_tis_spi: Use single function to transfer data tpm_tis_spi: Abort transfer when too many wait states are signaled tpm_tis_spi: Check correct byte for wait state indicator tpm_tis_spi: Remove limitation of transfers to MAX_SPI_FRAMESIZE bytes tpm_tis_spi: Add small delay after last transfer drivers/char/tpm/tpm_tis_spi.c | 163 +++++++++++++++++------------------------ 1 file changed, 69 insertions(+), 94 deletions(-) -- 2.7.4
[toc] | [next] | [standalone]
| From | Peter Huewe <peter.huewe@infineon.com> |
|---|---|
| Date | 2017-02-16 17:10 +0100 |
| Subject | [PATCH 3/5] tpm_tis_spi: Check correct byte for wait state indicator |
| Message-ID | <tbwN5-fF-31@gated-at.bofh.it> |
| In reply to | #1582673 |
Wait states are signaled in the last byte received from the TPM in
response to the header, not the first byte. Check rx_buf[3] instead of
rx_buf[0].
Cc: <stable@vger.kernel.org>
Fixes: 0edbfea537d1 ("tpm/tpm_tis_spi: Add support for spi phy")
Signed-off-by: Alexander Steffen <Alexander.Steffen@infineon.com>
Signed-off-by: Peter Huewe <peter.huewe@infineon.com>
---
drivers/char/tpm/tpm_tis_spi.c | 40 +++++++++++++++++++++-------------------
1 file changed, 21 insertions(+), 19 deletions(-)
diff --git a/drivers/char/tpm/tpm_tis_spi.c b/drivers/char/tpm/tpm_tis_spi.c
index d782b9974c14..16938e2253d2 100644
--- a/drivers/char/tpm/tpm_tis_spi.c
+++ b/drivers/char/tpm/tpm_tis_spi.c
@@ -60,7 +60,7 @@ static int tpm_tis_spi_transfer(struct tpm_tis_data *data, u32 addr, u8 len,
u8 *buffer, u8 direction)
{
struct tpm_tis_spi_phy *phy = to_tpm_tis_spi_phy(data);
- int ret, i;
+ int ret;
struct spi_message m;
struct spi_transfer spi_xfer = {
.tx_buf = phy->tx_buf,
@@ -85,25 +85,27 @@ static int tpm_tis_spi_transfer(struct tpm_tis_data *data, u32 addr, u8 len,
if (ret < 0)
goto exit;
- phy->tx_buf[0] = 0;
-
- /* According to TCG PTP specification, if there is no TPM present at
- * all, then the design has a weak pull-up on MISO. If a TPM is not
- * present, a pull-up on MISO means that the SB controller sees a 1,
- * and will latch in 0xFF on the read.
- */
- for (i = 0; (phy->rx_buf[0] & 0x01) == 0 && i < TPM_RETRY; i++) {
- spi_xfer.len = 1;
- spi_message_init(&m);
- spi_message_add_tail(&spi_xfer, &m);
- ret = spi_sync_locked(phy->spi_device, &m);
- if (ret < 0)
+ if ((phy->rx_buf[3] & 0x01) == 0) {
+ // handle SPI wait states
+ int i;
+
+ phy->tx_buf[0] = 0;
+
+ for (i = 0; i < TPM_RETRY; i++) {
+ spi_xfer.len = 1;
+ spi_message_init(&m);
+ spi_message_add_tail(&spi_xfer, &m);
+ ret = spi_sync_locked(phy->spi_device, &m);
+ if (ret < 0)
+ goto exit;
+ if (phy->rx_buf[0] & 0x01)
+ break;
+ }
+
+ if (i == TPM_RETRY) {
+ ret = -ETIMEDOUT;
goto exit;
- }
-
- if (i == TPM_RETRY) {
- ret = -ETIMEDOUT;
- goto exit;
+ }
}
spi_xfer.cs_change = 0;
--
2.7.4
[toc] | [prev] | [next] | [standalone]
| From | Christophe Ricard <christophe.ricard@gmail.com> |
|---|---|
| Date | 2017-02-17 06:20 +0100 |
| Subject | Re: [PATCH 3/5] tpm_tis_spi: Check correct byte for wait state indicator |
| Message-ID | <tbJ7z-8ju-1@gated-at.bofh.it> |
| In reply to | #1582676 |
That's is correct, this is a mistake on my side and never saw it :-(.
I guess it was possibly leading to "waste" at least 1 wait state on some
TPMs.
Wouldn't it be better to merge that with #1 and update the comment
consequently?
On 16/02/2017 08:08, Peter Huewe wrote:
> Wait states are signaled in the last byte received from the TPM in
> response to the header, not the first byte. Check rx_buf[3] instead of
> rx_buf[0].
>
> Cc: <stable@vger.kernel.org>
> Fixes: 0edbfea537d1 ("tpm/tpm_tis_spi: Add support for spi phy")
> Signed-off-by: Alexander Steffen <Alexander.Steffen@infineon.com>
> Signed-off-by: Peter Huewe <peter.huewe@infineon.com>
> ---
> drivers/char/tpm/tpm_tis_spi.c | 40 +++++++++++++++++++++-------------------
> 1 file changed, 21 insertions(+), 19 deletions(-)
>
> diff --git a/drivers/char/tpm/tpm_tis_spi.c b/drivers/char/tpm/tpm_tis_spi.c
> index d782b9974c14..16938e2253d2 100644
> --- a/drivers/char/tpm/tpm_tis_spi.c
> +++ b/drivers/char/tpm/tpm_tis_spi.c
> @@ -60,7 +60,7 @@ static int tpm_tis_spi_transfer(struct tpm_tis_data *data, u32 addr, u8 len,
> u8 *buffer, u8 direction)
> {
> struct tpm_tis_spi_phy *phy = to_tpm_tis_spi_phy(data);
> - int ret, i;
> + int ret;
> struct spi_message m;
> struct spi_transfer spi_xfer = {
> .tx_buf = phy->tx_buf,
> @@ -85,25 +85,27 @@ static int tpm_tis_spi_transfer(struct tpm_tis_data *data, u32 addr, u8 len,
> if (ret < 0)
> goto exit;
>
> - phy->tx_buf[0] = 0;
> -
> - /* According to TCG PTP specification, if there is no TPM present at
> - * all, then the design has a weak pull-up on MISO. If a TPM is not
> - * present, a pull-up on MISO means that the SB controller sees a 1,
> - * and will latch in 0xFF on the read.
> - */
> - for (i = 0; (phy->rx_buf[0] & 0x01) == 0 && i < TPM_RETRY; i++) {
> - spi_xfer.len = 1;
> - spi_message_init(&m);
> - spi_message_add_tail(&spi_xfer, &m);
> - ret = spi_sync_locked(phy->spi_device, &m);
> - if (ret < 0)
> + if ((phy->rx_buf[3] & 0x01) == 0) {
> + // handle SPI wait states
> + int i;
> +
> + phy->tx_buf[0] = 0;
> +
> + for (i = 0; i < TPM_RETRY; i++) {
> + spi_xfer.len = 1;
> + spi_message_init(&m);
> + spi_message_add_tail(&spi_xfer, &m);
> + ret = spi_sync_locked(phy->spi_device, &m);
> + if (ret < 0)
> + goto exit;
> + if (phy->rx_buf[0] & 0x01)
> + break;
> + }
> +
> + if (i == TPM_RETRY) {
> + ret = -ETIMEDOUT;
> goto exit;
> - }
> -
> - if (i == TPM_RETRY) {
> - ret = -ETIMEDOUT;
> - goto exit;
> + }
> }
>
> spi_xfer.cs_change = 0;
[toc] | [prev] | [next] | [standalone]
| From | Peter Huewe <peterhuewe@gmx.de> |
|---|---|
| Date | 2017-02-17 08:20 +0100 |
| Subject | Re: [PATCH 3/5] tpm_tis_spi: Check correct byte for wait state indicator |
| Message-ID | <tbKZH-176-9@gated-at.bofh.it> |
| In reply to | #1583093 |
Am 17. Februar 2017 06:09:30 MEZ schrieb Christophe Ricard <christophe.ricard@gmail.com>:
>That's is correct, this is a mistake on my side and never saw it :-(.
>
>I guess it was possibly leading to "waste" at least 1 wait state on
>some
>TPMs.
Unfortunately the 1 for indicating end of waitstates does only appear once so it actually rendered the driver non-functional - atleast with our tpms.
>
>Wouldn't it be better to merge that with #1 and update the comment
>consequently?
Yes, that's what I wanted to express in the cover letter, logically it makes sense to squash #1 and #3 - but reviewing it merged with #1 is quite hard since it "obfuscates" the problem - since too much stuff moves around.
That's why I decided to split it - for easier review.
Peter
>
>
>On 16/02/2017 08:08, Peter Huewe wrote:
>> Wait states are signaled in the last byte received from the TPM in
>> response to the header, not the first byte. Check rx_buf[3] instead
>of
>> rx_buf[0].
>>
>> Cc: <stable@vger.kernel.org>
>> Fixes: 0edbfea537d1 ("tpm/tpm_tis_spi: Add support for spi phy")
>> Signed-off-by: Alexander Steffen <Alexander.Steffen@infineon.com>
>> Signed-off-by: Peter Huewe <peter.huewe@infineon.com>
>> ---
>> drivers/char/tpm/tpm_tis_spi.c | 40
>+++++++++++++++++++++-------------------
>> 1 file changed, 21 insertions(+), 19 deletions(-)
>>
>> diff --git a/drivers/char/tpm/tpm_tis_spi.c
>b/drivers/char/tpm/tpm_tis_spi.c
>> index d782b9974c14..16938e2253d2 100644
>> --- a/drivers/char/tpm/tpm_tis_spi.c
>> +++ b/drivers/char/tpm/tpm_tis_spi.c
>> @@ -60,7 +60,7 @@ static int tpm_tis_spi_transfer(struct tpm_tis_data
>*data, u32 addr, u8 len,
>> u8 *buffer, u8 direction)
>> {
>> struct tpm_tis_spi_phy *phy = to_tpm_tis_spi_phy(data);
>> - int ret, i;
>> + int ret;
>> struct spi_message m;
>> struct spi_transfer spi_xfer = {
>> .tx_buf = phy->tx_buf,
>> @@ -85,25 +85,27 @@ static int tpm_tis_spi_transfer(struct
>tpm_tis_data *data, u32 addr, u8 len,
>> if (ret < 0)
>> goto exit;
>>
>> - phy->tx_buf[0] = 0;
>> -
>> - /* According to TCG PTP specification, if there is no TPM present
>at
>> - * all, then the design has a weak pull-up on MISO. If a TPM is not
>> - * present, a pull-up on MISO means that the SB controller sees a
>1,
>> - * and will latch in 0xFF on the read.
>> - */
>> - for (i = 0; (phy->rx_buf[0] & 0x01) == 0 && i < TPM_RETRY; i++) {
>> - spi_xfer.len = 1;
>> - spi_message_init(&m);
>> - spi_message_add_tail(&spi_xfer, &m);
>> - ret = spi_sync_locked(phy->spi_device, &m);
>> - if (ret < 0)
>> + if ((phy->rx_buf[3] & 0x01) == 0) {
>> + // handle SPI wait states
>> + int i;
>> +
>> + phy->tx_buf[0] = 0;
>> +
>> + for (i = 0; i < TPM_RETRY; i++) {
>> + spi_xfer.len = 1;
>> + spi_message_init(&m);
>> + spi_message_add_tail(&spi_xfer, &m);
>> + ret = spi_sync_locked(phy->spi_device, &m);
>> + if (ret < 0)
>> + goto exit;
>> + if (phy->rx_buf[0] & 0x01)
>> + break;
>> + }
>> +
>> + if (i == TPM_RETRY) {
>> + ret = -ETIMEDOUT;
>> goto exit;
>> - }
>> -
>> - if (i == TPM_RETRY) {
>> - ret = -ETIMEDOUT;
>> - goto exit;
>> + }
>> }
>>
>> spi_xfer.cs_change = 0;
--
Sent from my mobile
[toc] | [prev] | [next] | [standalone]
| From | Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> |
|---|---|
| Date | 2017-02-24 14:20 +0100 |
| Subject | Re: [PATCH 3/5] tpm_tis_spi: Check correct byte for wait state indicator |
| Message-ID | <tenWW-FB-45@gated-at.bofh.it> |
| In reply to | #1582676 |
On Thu, Feb 16, 2017 at 04:08:24PM +0000, Peter Huewe wrote:
> Wait states are signaled in the last byte received from the TPM in
> response to the header, not the first byte. Check rx_buf[3] instead of
> rx_buf[0].
>
> Cc: <stable@vger.kernel.org>
> Fixes: 0edbfea537d1 ("tpm/tpm_tis_spi: Add support for spi phy")
> Signed-off-by: Alexander Steffen <Alexander.Steffen@infineon.com>
> Signed-off-by: Peter Huewe <peter.huewe@infineon.com>
Reviewed-by: Jarkko Sakkien <jarkko.sakkinen@linux.intel.com>
/Jarkko
> ---
> drivers/char/tpm/tpm_tis_spi.c | 40 +++++++++++++++++++++-------------------
> 1 file changed, 21 insertions(+), 19 deletions(-)
>
> diff --git a/drivers/char/tpm/tpm_tis_spi.c b/drivers/char/tpm/tpm_tis_spi.c
> index d782b9974c14..16938e2253d2 100644
> --- a/drivers/char/tpm/tpm_tis_spi.c
> +++ b/drivers/char/tpm/tpm_tis_spi.c
> @@ -60,7 +60,7 @@ static int tpm_tis_spi_transfer(struct tpm_tis_data *data, u32 addr, u8 len,
> u8 *buffer, u8 direction)
> {
> struct tpm_tis_spi_phy *phy = to_tpm_tis_spi_phy(data);
> - int ret, i;
> + int ret;
> struct spi_message m;
> struct spi_transfer spi_xfer = {
> .tx_buf = phy->tx_buf,
> @@ -85,25 +85,27 @@ static int tpm_tis_spi_transfer(struct tpm_tis_data *data, u32 addr, u8 len,
> if (ret < 0)
> goto exit;
>
> - phy->tx_buf[0] = 0;
> -
> - /* According to TCG PTP specification, if there is no TPM present at
> - * all, then the design has a weak pull-up on MISO. If a TPM is not
> - * present, a pull-up on MISO means that the SB controller sees a 1,
> - * and will latch in 0xFF on the read.
> - */
> - for (i = 0; (phy->rx_buf[0] & 0x01) == 0 && i < TPM_RETRY; i++) {
> - spi_xfer.len = 1;
> - spi_message_init(&m);
> - spi_message_add_tail(&spi_xfer, &m);
> - ret = spi_sync_locked(phy->spi_device, &m);
> - if (ret < 0)
> + if ((phy->rx_buf[3] & 0x01) == 0) {
> + // handle SPI wait states
> + int i;
> +
> + phy->tx_buf[0] = 0;
> +
> + for (i = 0; i < TPM_RETRY; i++) {
> + spi_xfer.len = 1;
> + spi_message_init(&m);
> + spi_message_add_tail(&spi_xfer, &m);
> + ret = spi_sync_locked(phy->spi_device, &m);
> + if (ret < 0)
> + goto exit;
> + if (phy->rx_buf[0] & 0x01)
> + break;
> + }
> +
> + if (i == TPM_RETRY) {
> + ret = -ETIMEDOUT;
> goto exit;
> - }
> -
> - if (i == TPM_RETRY) {
> - ret = -ETIMEDOUT;
> - goto exit;
> + }
> }
>
> spi_xfer.cs_change = 0;
> --
> 2.7.4
>
[toc] | [prev] | [next] | [standalone]
| From | Peter Huewe <peter.huewe@infineon.com> |
|---|---|
| Date | 2017-02-16 17:20 +0100 |
| Subject | [PATCH 1/5] tpm_tis_spi: Use single function to transfer data |
| Message-ID | <tbwWJ-kC-1@gated-at.bofh.it> |
| In reply to | #1582673 |
The algorithm for sending data to the TPM is mostly identical to the
algorithm for receiving data from the TPM, so a single function is
sufficient to handle both cases.
This is a prequisite for all the other fixes, so we don't have to fix
everything twice (send/receive)
Cc: <stable@vger.kernel.org>
[prerequisite for other fixes in this series]
Fixes: 0edbfea537d1 ("tpm/tpm_tis_spi: Add support for spi phy")
Signed-off-by: Alexander Steffen <Alexander.Steffen@infineon.com>
Signed-off-by: Peter Huewe <peter.huewe@infineon.com>
---
drivers/char/tpm/tpm_tis_spi.c | 87 ++++++++++++------------------------------
1 file changed, 24 insertions(+), 63 deletions(-)
diff --git a/drivers/char/tpm/tpm_tis_spi.c b/drivers/char/tpm/tpm_tis_spi.c
index 5292e5768a7e..6e1a3c43f621 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[MAX_SPI_FRAMESIZE + 4];
- u8 rx_buf[MAX_SPI_FRAMESIZE + 4];
+ u8 tx_buf[4];
+ u8 rx_buf[4];
};
static inline struct tpm_tis_spi_phy *to_tpm_tis_spi_phy(struct tpm_tis_data *data)
@@ -56,8 +56,8 @@ static inline struct tpm_tis_spi_phy *to_tpm_tis_spi_phy(struct tpm_tis_data *da
return container_of(data, struct tpm_tis_spi_phy, priv);
}
-static int tpm_tis_spi_read_bytes(struct tpm_tis_data *data, u32 addr,
- u16 len, u8 *result)
+static int tpm_tis_spi_transfer(struct tpm_tis_data *data, u32 addr, u8 len,
+ u8 *buffer, u8 direction)
{
struct tpm_tis_spi_phy *phy = to_tpm_tis_spi_phy(data);
int ret, i;
@@ -66,17 +66,17 @@ static int tpm_tis_spi_read_bytes(struct tpm_tis_data *data, u32 addr,
.tx_buf = phy->tx_buf,
.rx_buf = phy->rx_buf,
.len = 4,
+ .cs_change = 1,
};
if (len > MAX_SPI_FRAMESIZE)
return -ENOMEM;
- phy->tx_buf[0] = 0x80 | (len - 1);
+ phy->tx_buf[0] = direction | (len - 1);
phy->tx_buf[1] = 0xd4;
- phy->tx_buf[2] = (addr >> 8) & 0xFF;
- phy->tx_buf[3] = addr & 0xFF;
+ phy->tx_buf[2] = addr >> 8;
+ phy->tx_buf[3] = addr;
- spi_xfer.cs_change = 1;
spi_message_init(&m);
spi_message_add_tail(&spi_xfer, &m);
@@ -85,7 +85,7 @@ static int tpm_tis_spi_read_bytes(struct tpm_tis_data *data, u32 addr,
if (ret < 0)
goto exit;
- memset(phy->tx_buf, 0, len);
+ phy->tx_buf[0] = 0;
/* According to TCG PTP specification, if there is no TPM present at
* all, then the design has a weak pull-up on MISO. If a TPM is not
@@ -103,7 +103,14 @@ static int tpm_tis_spi_read_bytes(struct tpm_tis_data *data, u32 addr,
spi_xfer.cs_change = 0;
spi_xfer.len = len;
- spi_xfer.rx_buf = result;
+
+ if (direction) {
+ spi_xfer.tx_buf = NULL;
+ spi_xfer.rx_buf = buffer;
+ } else {
+ spi_xfer.tx_buf = buffer;
+ spi_xfer.rx_buf = NULL;
+ }
spi_message_init(&m);
spi_message_add_tail(&spi_xfer, &m);
@@ -114,62 +121,16 @@ static int tpm_tis_spi_read_bytes(struct tpm_tis_data *data, u32 addr,
return ret;
}
+static int tpm_tis_spi_read_bytes(struct tpm_tis_data *data, u32 addr,
+ u16 len, u8 *result)
+{
+ return tpm_tis_spi_transfer(data, addr, len, result, 0x80);
+}
+
static int tpm_tis_spi_write_bytes(struct tpm_tis_data *data, u32 addr,
u16 len, u8 *value)
{
- struct tpm_tis_spi_phy *phy = to_tpm_tis_spi_phy(data);
- int ret, i;
- struct spi_message m;
- struct spi_transfer spi_xfer = {
- .tx_buf = phy->tx_buf,
- .rx_buf = phy->rx_buf,
- .len = 4,
- };
-
- if (len > MAX_SPI_FRAMESIZE)
- return -ENOMEM;
-
- phy->tx_buf[0] = len - 1;
- phy->tx_buf[1] = 0xd4;
- phy->tx_buf[2] = (addr >> 8) & 0xFF;
- phy->tx_buf[3] = addr & 0xFF;
-
- spi_xfer.cs_change = 1;
- spi_message_init(&m);
- spi_message_add_tail(&spi_xfer, &m);
-
- spi_bus_lock(phy->spi_device->master);
- ret = spi_sync_locked(phy->spi_device, &m);
- if (ret < 0)
- goto exit;
-
- memset(phy->tx_buf, 0, len);
-
- /* According to TCG PTP specification, if there is no TPM present at
- * all, then the design has a weak pull-up on MISO. If a TPM is not
- * present, a pull-up on MISO means that the SB controller sees a 1,
- * and will latch in 0xFF on the read.
- */
- for (i = 0; (phy->rx_buf[0] & 0x01) == 0 && i < TPM_RETRY; i++) {
- spi_xfer.len = 1;
- spi_message_init(&m);
- spi_message_add_tail(&spi_xfer, &m);
- ret = spi_sync_locked(phy->spi_device, &m);
- if (ret < 0)
- goto exit;
- }
-
- spi_xfer.len = len;
- spi_xfer.tx_buf = value;
- spi_xfer.cs_change = 0;
- spi_xfer.tx_buf = value;
- spi_message_init(&m);
- spi_message_add_tail(&spi_xfer, &m);
- ret = spi_sync_locked(phy->spi_device, &m);
-
-exit:
- spi_bus_unlock(phy->spi_device->master);
- return ret;
+ return tpm_tis_spi_transfer(data, addr, len, value, 0);
}
static int tpm_tis_spi_read16(struct tpm_tis_data *data, u32 addr, u16 *result)
--
2.7.4
[toc] | [prev] | [next] | [standalone]
| From | Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> |
|---|---|
| Date | 2017-02-24 14:00 +0100 |
| Subject | Re: [PATCH 1/5] tpm_tis_spi: Use single function to transfer data |
| Message-ID | <tenDA-eO-23@gated-at.bofh.it> |
| In reply to | #1582678 |
On Thu, Feb 16, 2017 at 04:08:22PM +0000, Peter Huewe wrote:
> The algorithm for sending data to the TPM is mostly identical to the
> algorithm for receiving data from the TPM, so a single function is
> sufficient to handle both cases.
>
> This is a prequisite for all the other fixes, so we don't have to fix
> everything twice (send/receive)
>
> Cc: <stable@vger.kernel.org>
> [prerequisite for other fixes in this series]
> Fixes: 0edbfea537d1 ("tpm/tpm_tis_spi: Add support for spi phy")
> Signed-off-by: Alexander Steffen <Alexander.Steffen@infineon.com>
> Signed-off-by: Peter Huewe <peter.huewe@infineon.com>
Reviewed-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
/Jarkko
> ---
> drivers/char/tpm/tpm_tis_spi.c | 87 ++++++++++++------------------------------
> 1 file changed, 24 insertions(+), 63 deletions(-)
>
> diff --git a/drivers/char/tpm/tpm_tis_spi.c b/drivers/char/tpm/tpm_tis_spi.c
> index 5292e5768a7e..6e1a3c43f621 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[MAX_SPI_FRAMESIZE + 4];
> - u8 rx_buf[MAX_SPI_FRAMESIZE + 4];
> + u8 tx_buf[4];
> + u8 rx_buf[4];
> };
>
> static inline struct tpm_tis_spi_phy *to_tpm_tis_spi_phy(struct tpm_tis_data *data)
> @@ -56,8 +56,8 @@ static inline struct tpm_tis_spi_phy *to_tpm_tis_spi_phy(struct tpm_tis_data *da
> return container_of(data, struct tpm_tis_spi_phy, priv);
> }
>
> -static int tpm_tis_spi_read_bytes(struct tpm_tis_data *data, u32 addr,
> - u16 len, u8 *result)
> +static int tpm_tis_spi_transfer(struct tpm_tis_data *data, u32 addr, u8 len,
> + u8 *buffer, u8 direction)
> {
> struct tpm_tis_spi_phy *phy = to_tpm_tis_spi_phy(data);
> int ret, i;
> @@ -66,17 +66,17 @@ static int tpm_tis_spi_read_bytes(struct tpm_tis_data *data, u32 addr,
> .tx_buf = phy->tx_buf,
> .rx_buf = phy->rx_buf,
> .len = 4,
> + .cs_change = 1,
> };
>
> if (len > MAX_SPI_FRAMESIZE)
> return -ENOMEM;
>
> - phy->tx_buf[0] = 0x80 | (len - 1);
> + phy->tx_buf[0] = direction | (len - 1);
> phy->tx_buf[1] = 0xd4;
> - phy->tx_buf[2] = (addr >> 8) & 0xFF;
> - phy->tx_buf[3] = addr & 0xFF;
> + phy->tx_buf[2] = addr >> 8;
> + phy->tx_buf[3] = addr;
>
> - spi_xfer.cs_change = 1;
> spi_message_init(&m);
> spi_message_add_tail(&spi_xfer, &m);
>
> @@ -85,7 +85,7 @@ static int tpm_tis_spi_read_bytes(struct tpm_tis_data *data, u32 addr,
> if (ret < 0)
> goto exit;
>
> - memset(phy->tx_buf, 0, len);
> + phy->tx_buf[0] = 0;
>
> /* According to TCG PTP specification, if there is no TPM present at
> * all, then the design has a weak pull-up on MISO. If a TPM is not
> @@ -103,7 +103,14 @@ static int tpm_tis_spi_read_bytes(struct tpm_tis_data *data, u32 addr,
>
> spi_xfer.cs_change = 0;
> spi_xfer.len = len;
> - spi_xfer.rx_buf = result;
> +
> + if (direction) {
> + spi_xfer.tx_buf = NULL;
> + spi_xfer.rx_buf = buffer;
> + } else {
> + spi_xfer.tx_buf = buffer;
> + spi_xfer.rx_buf = NULL;
> + }
>
> spi_message_init(&m);
> spi_message_add_tail(&spi_xfer, &m);
> @@ -114,62 +121,16 @@ static int tpm_tis_spi_read_bytes(struct tpm_tis_data *data, u32 addr,
> return ret;
> }
>
> +static int tpm_tis_spi_read_bytes(struct tpm_tis_data *data, u32 addr,
> + u16 len, u8 *result)
> +{
> + return tpm_tis_spi_transfer(data, addr, len, result, 0x80);
> +}
> +
> static int tpm_tis_spi_write_bytes(struct tpm_tis_data *data, u32 addr,
> u16 len, u8 *value)
> {
> - struct tpm_tis_spi_phy *phy = to_tpm_tis_spi_phy(data);
> - int ret, i;
> - struct spi_message m;
> - struct spi_transfer spi_xfer = {
> - .tx_buf = phy->tx_buf,
> - .rx_buf = phy->rx_buf,
> - .len = 4,
> - };
> -
> - if (len > MAX_SPI_FRAMESIZE)
> - return -ENOMEM;
> -
> - phy->tx_buf[0] = len - 1;
> - phy->tx_buf[1] = 0xd4;
> - phy->tx_buf[2] = (addr >> 8) & 0xFF;
> - phy->tx_buf[3] = addr & 0xFF;
> -
> - spi_xfer.cs_change = 1;
> - spi_message_init(&m);
> - spi_message_add_tail(&spi_xfer, &m);
> -
> - spi_bus_lock(phy->spi_device->master);
> - ret = spi_sync_locked(phy->spi_device, &m);
> - if (ret < 0)
> - goto exit;
> -
> - memset(phy->tx_buf, 0, len);
> -
> - /* According to TCG PTP specification, if there is no TPM present at
> - * all, then the design has a weak pull-up on MISO. If a TPM is not
> - * present, a pull-up on MISO means that the SB controller sees a 1,
> - * and will latch in 0xFF on the read.
> - */
> - for (i = 0; (phy->rx_buf[0] & 0x01) == 0 && i < TPM_RETRY; i++) {
> - spi_xfer.len = 1;
> - spi_message_init(&m);
> - spi_message_add_tail(&spi_xfer, &m);
> - ret = spi_sync_locked(phy->spi_device, &m);
> - if (ret < 0)
> - goto exit;
> - }
> -
> - spi_xfer.len = len;
> - spi_xfer.tx_buf = value;
> - spi_xfer.cs_change = 0;
> - spi_xfer.tx_buf = value;
> - spi_message_init(&m);
> - spi_message_add_tail(&spi_xfer, &m);
> - ret = spi_sync_locked(phy->spi_device, &m);
> -
> -exit:
> - spi_bus_unlock(phy->spi_device->master);
> - return ret;
> + return tpm_tis_spi_transfer(data, addr, len, value, 0);
> }
>
> static int tpm_tis_spi_read16(struct tpm_tis_data *data, u32 addr, u16 *result)
> --
> 2.7.4
>
[toc] | [prev] | [next] | [standalone]
| From | Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> |
|---|---|
| Date | 2017-02-22 22:20 +0100 |
| Message-ID | <tdMun-7Lo-39@gated-at.bofh.it> |
| In reply to | #1582673 |
On Thu, Feb 16, 2017 at 04:08:21PM +0000, Peter Huewe wrote: > During our testing it showed that unfortunately the whole native spi tpm driver > was more or less non-functional since it was merged, e.g. the wrong byte for > waitstate handling was used and transfers larger than 64 bytes did not work at all. > > This was probably caused by the merging of the different approaches back then, > as the initial RFC patch did not have these problems, and also my sudden lack > of time/commitment back then. > I'm sorry that the final driver code went untested for that long time. > > This patch set fixes these issues one by one. > In order to avoid duplication the read/write function was consolidated to one > transfer function, so we do not have to apply the same fix at two locations. > Maybe consider squashing it - we splitted it for easier review. > > Affected Kernels: 4.8, 4.9, 4.10 > Patchset was tested on Raspberry Pi2 with SLB9670 (TPM1.2 and TPM2.0) > > Peter Huewe (5): > tpm_tis_spi: Use single function to transfer data > tpm_tis_spi: Abort transfer when too many wait states are signaled > tpm_tis_spi: Check correct byte for wait state indicator > tpm_tis_spi: Remove limitation of transfers to MAX_SPI_FRAMESIZE bytes > tpm_tis_spi: Add small delay after last transfer > > drivers/char/tpm/tpm_tis_spi.c | 163 +++++++++++++++++------------------------ > 1 file changed, 69 insertions(+), 94 deletions(-) > > -- > 2.7.4 > I also found type errors a whilea ago: https://patchwork.kernel.org/patch/9547993/ Do this take care of these issues? /JArkko
[toc] | [prev] | [next] | [standalone]
| From | Peter Huewe <peterhuewe@gmx.de> |
|---|---|
| Date | 2017-02-23 00:00 +0100 |
| Message-ID | <tdO37-jP-13@gated-at.bofh.it> |
| In reply to | #1586497 |
Am 22. Februar 2017 22:19:24 MEZ schrieb Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>: >On Thu, Feb 16, 2017 at 04:08:21PM +0000, Peter Huewe wrote: >> During our testing it showed that unfortunately the whole native spi >tpm driver >> was more or less non-functional since it was merged, e.g. the wrong >byte for >> waitstate handling was used and transfers larger than 64 bytes did >not work at all. >> >> This was probably caused by the merging of the different approaches >back then, >> as the initial RFC patch did not have these problems, and also my >sudden lack >> of time/commitment back then. >> I'm sorry that the final driver code went untested for that long >time. >> >> This patch set fixes these issues one by one. >> In order to avoid duplication the read/write function was >consolidated to one >> transfer function, so we do not have to apply the same fix at two >locations. >> Maybe consider squashing it - we splitted it for easier review. >> >> Affected Kernels: 4.8, 4.9, 4.10 >> Patchset was tested on Raspberry Pi2 with SLB9670 (TPM1.2 and TPM2.0) >> >> Peter Huewe (5): >> tpm_tis_spi: Use single function to transfer data >> tpm_tis_spi: Abort transfer when too many wait states are signaled >> tpm_tis_spi: Check correct byte for wait state indicator >> tpm_tis_spi: Remove limitation of transfers to MAX_SPI_FRAMESIZE >bytes >> tpm_tis_spi: Add small delay after last transfer >> >> drivers/char/tpm/tpm_tis_spi.c | 163 >+++++++++++++++++------------------------ >> 1 file changed, 69 insertions(+), 94 deletions(-) >> >> -- >> 2.7.4 >> > >I also found type errors a whilea ago: > >https://patchwork.kernel.org/patch/9547993/ > >Do this take care of these issues? Not that I'm aware of. We did not test it on any big endian system yet so the problem never became visible. In any case it would be really nice to see this patchset to be applied so people have a working,but maybe not perfect, spi tpm on the common little endian platforms. When do you think you can merge and pull-request them? Peter > >/JArkko -- Sent from my mobile
[toc] | [prev] | [next] | [standalone]
| From | Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> |
|---|---|
| Date | 2017-02-24 16:20 +0100 |
| Message-ID | <tepP3-1Yk-9@gated-at.bofh.it> |
| In reply to | #1586538 |
On Wed, Feb 22, 2017 at 11:32:17PM +0100, Peter Huewe wrote: > > > Am 22. Februar 2017 22:19:24 MEZ schrieb Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>: > >On Thu, Feb 16, 2017 at 04:08:21PM +0000, Peter Huewe wrote: > >> During our testing it showed that unfortunately the whole native spi > >tpm driver > >> was more or less non-functional since it was merged, e.g. the wrong > >byte for > >> waitstate handling was used and transfers larger than 64 bytes did > >not work at all. > >> > >> This was probably caused by the merging of the different approaches > >back then, > >> as the initial RFC patch did not have these problems, and also my > >sudden lack > >> of time/commitment back then. > >> I'm sorry that the final driver code went untested for that long > >time. > >> > >> This patch set fixes these issues one by one. > >> In order to avoid duplication the read/write function was > >consolidated to one > >> transfer function, so we do not have to apply the same fix at two > >locations. > >> Maybe consider squashing it - we splitted it for easier review. > >> > >> Affected Kernels: 4.8, 4.9, 4.10 > >> Patchset was tested on Raspberry Pi2 with SLB9670 (TPM1.2 and TPM2.0) > >> > >> Peter Huewe (5): > >> tpm_tis_spi: Use single function to transfer data > >> tpm_tis_spi: Abort transfer when too many wait states are signaled > >> tpm_tis_spi: Check correct byte for wait state indicator > >> tpm_tis_spi: Remove limitation of transfers to MAX_SPI_FRAMESIZE > >bytes > >> tpm_tis_spi: Add small delay after last transfer > >> > >> drivers/char/tpm/tpm_tis_spi.c | 163 > >+++++++++++++++++------------------------ > >> 1 file changed, 69 insertions(+), 94 deletions(-) > >> > >> -- > >> 2.7.4 > >> > > > >I also found type errors a whilea ago: > > > >https://patchwork.kernel.org/patch/9547993/ > > > >Do this take care of these issues? > Not that I'm aware of. > We did not test it on any big endian system yet so the problem never became visible. > > In any case it would be really nice to see this patchset to be applied so people have a working,but maybe not perfect, spi tpm on the common little endian platforms. > When do you think you can merge and pull-request them? > > Peter Please fix 4/5 and send v2. Other patches were fine. /Jarkko
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web