Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

tpm: read burstcount from TPM_STS in one 32-bit transaction

Some chips incorrectly support partial reads from TPM_STS register
at non-zero offsets. Read the entire 32-bits register instead of
making two 8-bit reads to support such devices and reduce the number
of bus transactions when obtaining the burstcount from TPM_STS.

Fixes: 27084efee0c3 ("tpm: driver for next generation TPM chips")
Signed-off-by: Andrey Pronin <apronin@chromium.org>
Reviewed-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>

authored by

Andrey Pronin and committed by
Jarkko Sakkinen
9754d45e 1b0612b0

+3 -8
+3 -8
drivers/char/tpm/tpm_tis_core.c
··· 157 157 struct tpm_tis_data *priv = dev_get_drvdata(&chip->dev); 158 158 unsigned long stop; 159 159 int burstcnt, rc; 160 - u8 value; 160 + u32 value; 161 161 162 162 /* wait for burstcount */ 163 163 /* which timeout value, spec has 2 answers (c & d) */ 164 164 stop = jiffies + chip->timeout_d; 165 165 do { 166 - rc = tpm_tis_read8(priv, TPM_STS(priv->locality) + 1, &value); 166 + rc = tpm_tis_read32(priv, TPM_STS(priv->locality), &value); 167 167 if (rc < 0) 168 168 return rc; 169 169 170 - burstcnt = value; 171 - rc = tpm_tis_read8(priv, TPM_STS(priv->locality) + 2, &value); 172 - if (rc < 0) 173 - return rc; 174 - 175 - burstcnt += value << 8; 170 + burstcnt = (value >> 8) & 0xFFFF; 176 171 if (burstcnt) 177 172 return burstcnt; 178 173 msleep(TPM_TIMEOUT);