lkml.org 
[lkml]   [2020]   [Jun]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v10 1/8] tpm: Make read{16, 32}() and write32() in tpm_tis_phy_ops optional
    Date
    From: Amir Mizinski <amirmizi6@gmail.com>

    Only tpm_tis can use memory-mapped I/O, which is truly mapped into
    the kernel's memory space. Therefore, using ioread16/ioread32/iowrite32
    turns into a straightforward pointer dereference.
    Every other driver requires more complicated operations to read more than
    one byte at a time and will just fall back to read_bytes/write_bytes.
    Therefore, move this common code out of tpm_tis_spi and into tpm_tis_core
    so that it is used automatically when low-level drivers do not implement
    the specialized methods.

    Co-developed-by: Alexander Steffen <Alexander.Steffen@infineon.com>
    Signed-off-by: Alexander Steffen <Alexander.Steffen@infineon.com>
    Signed-off-by: Amir Mizinski <amirmizi6@gmail.com>
    ---
    drivers/char/tpm/tpm_tis_core.h | 38 +++++++++++++++++++++++++++++++---
    drivers/char/tpm/tpm_tis_spi.h | 4 ----
    drivers/char/tpm/tpm_tis_spi_cr50.c | 3 ---
    drivers/char/tpm/tpm_tis_spi_main.c | 41 -------------------------------------
    4 files changed, 35 insertions(+), 51 deletions(-)

    diff --git a/drivers/char/tpm/tpm_tis_core.h b/drivers/char/tpm/tpm_tis_core.h
    index 7337819..d06c65b 100644
    --- a/drivers/char/tpm/tpm_tis_core.h
    +++ b/drivers/char/tpm/tpm_tis_core.h
    @@ -122,13 +122,35 @@ static inline int tpm_tis_read8(struct tpm_tis_data *data, u32 addr, u8 *result)
    static inline int tpm_tis_read16(struct tpm_tis_data *data, u32 addr,
    u16 *result)
    {
    - return data->phy_ops->read16(data, addr, result);
    + __le16 result_le;
    + int rc;
    +
    + if (data->phy_ops->read16)
    + return data->phy_ops->read16(data, addr, result);
    +
    + rc = data->phy_ops->read_bytes(data, addr, sizeof(u16),
    + (u8 *)&result_le);
    + if (!rc)
    + *result = le16_to_cpu(result_le);
    +
    + return rc;
    }

    static inline int tpm_tis_read32(struct tpm_tis_data *data, u32 addr,
    u32 *result)
    {
    - return data->phy_ops->read32(data, addr, result);
    + __le32 result_le;
    + int rc;
    +
    + if (data->phy_ops->read32)
    + return data->phy_ops->read32(data, addr, result);
    +
    + rc = data->phy_ops->read_bytes(data, addr, sizeof(u32),
    + (u8 *)&result_le);
    + if (!rc)
    + *result = le32_to_cpu(result_le);
    +
    + return rc;
    }

    static inline int tpm_tis_write_bytes(struct tpm_tis_data *data, u32 addr,
    @@ -145,7 +167,17 @@ static inline int tpm_tis_write8(struct tpm_tis_data *data, u32 addr, u8 value)
    static inline int tpm_tis_write32(struct tpm_tis_data *data, u32 addr,
    u32 value)
    {
    - return data->phy_ops->write32(data, addr, value);
    + __le32 value_le;
    + int rc;
    +
    + if (data->phy_ops->write32)
    + return data->phy_ops->write32(data, addr, value);
    +
    + value_le = cpu_to_le32(value);
    + rc = data->phy_ops->write_bytes(data, addr, sizeof(u32),
    + (u8 *)&value_le);
    +
    + return rc;
    }

    static inline bool is_bsw(void)
    diff --git a/drivers/char/tpm/tpm_tis_spi.h b/drivers/char/tpm/tpm_tis_spi.h
    index bba7397..d0f66f6 100644
    --- a/drivers/char/tpm/tpm_tis_spi.h
    +++ b/drivers/char/tpm/tpm_tis_spi.h
    @@ -31,10 +31,6 @@ extern int tpm_tis_spi_init(struct spi_device *spi, struct tpm_tis_spi_phy *phy,
    extern int tpm_tis_spi_transfer(struct tpm_tis_data *data, u32 addr, u16 len,
    u8 *in, const u8 *out);

    -extern int tpm_tis_spi_read16(struct tpm_tis_data *data, u32 addr, u16 *result);
    -extern int tpm_tis_spi_read32(struct tpm_tis_data *data, u32 addr, u32 *result);
    -extern int tpm_tis_spi_write32(struct tpm_tis_data *data, u32 addr, u32 value);
    -
    #ifdef CONFIG_TCG_TIS_SPI_CR50
    extern int cr50_spi_probe(struct spi_device *spi);
    #else
    diff --git a/drivers/char/tpm/tpm_tis_spi_cr50.c b/drivers/char/tpm/tpm_tis_spi_cr50.c
    index 37d72e8..f339d20 100644
    --- a/drivers/char/tpm/tpm_tis_spi_cr50.c
    +++ b/drivers/char/tpm/tpm_tis_spi_cr50.c
    @@ -215,9 +215,6 @@ static int tpm_tis_spi_cr50_write_bytes(struct tpm_tis_data *data, u32 addr,
    static const struct tpm_tis_phy_ops tpm_spi_cr50_phy_ops = {
    .read_bytes = tpm_tis_spi_cr50_read_bytes,
    .write_bytes = tpm_tis_spi_cr50_write_bytes,
    - .read16 = tpm_tis_spi_read16,
    - .read32 = tpm_tis_spi_read32,
    - .write32 = tpm_tis_spi_write32,
    };

    static void cr50_print_fw_version(struct tpm_tis_data *data)
    diff --git a/drivers/char/tpm/tpm_tis_spi_main.c b/drivers/char/tpm/tpm_tis_spi_main.c
    index d1754fd..95fef9d 100644
    --- a/drivers/char/tpm/tpm_tis_spi_main.c
    +++ b/drivers/char/tpm/tpm_tis_spi_main.c
    @@ -152,44 +152,6 @@ static int tpm_tis_spi_write_bytes(struct tpm_tis_data *data, u32 addr,
    return tpm_tis_spi_transfer(data, addr, len, NULL, value);
    }

    -int tpm_tis_spi_read16(struct tpm_tis_data *data, u32 addr, u16 *result)
    -{
    - __le16 result_le;
    - int rc;
    -
    - rc = data->phy_ops->read_bytes(data, addr, sizeof(u16),
    - (u8 *)&result_le);
    - if (!rc)
    - *result = le16_to_cpu(result_le);
    -
    - return rc;
    -}
    -
    -int tpm_tis_spi_read32(struct tpm_tis_data *data, u32 addr, u32 *result)
    -{
    - __le32 result_le;
    - int rc;
    -
    - rc = data->phy_ops->read_bytes(data, addr, sizeof(u32),
    - (u8 *)&result_le);
    - if (!rc)
    - *result = le32_to_cpu(result_le);
    -
    - return rc;
    -}
    -
    -int tpm_tis_spi_write32(struct tpm_tis_data *data, u32 addr, u32 value)
    -{
    - __le32 value_le;
    - int rc;
    -
    - value_le = cpu_to_le32(value);
    - rc = data->phy_ops->write_bytes(data, addr, sizeof(u32),
    - (u8 *)&value_le);
    -
    - return rc;
    -}
    -
    int tpm_tis_spi_init(struct spi_device *spi, struct tpm_tis_spi_phy *phy,
    int irq, const struct tpm_tis_phy_ops *phy_ops)
    {
    @@ -205,9 +167,6 @@ int tpm_tis_spi_init(struct spi_device *spi, struct tpm_tis_spi_phy *phy,
    static const struct tpm_tis_phy_ops tpm_spi_phy_ops = {
    .read_bytes = tpm_tis_spi_read_bytes,
    .write_bytes = tpm_tis_spi_write_bytes,
    - .read16 = tpm_tis_spi_read16,
    - .read32 = tpm_tis_spi_read32,
    - .write32 = tpm_tis_spi_write32,
    };

    static int tpm_tis_spi_probe(struct spi_device *dev)
    --
    2.7.4
    \
     
     \ /
      Last update: 2020-06-04 15:49    [W:5.319 / U:0.068 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site