Skip to content

Commit 6422cbd

Browse files
joholljarkkojs
authored andcommitted
tpm: Remove read16/read32/write32 calls from tpm_tis_phy_ops
Only tpm_tis and tpm_tis_synquacer have a dedicated way to access multiple bytes at once, every other driver will just fall back to read_bytes/write_bytes. Therefore, remove the read16/read32/write32 calls and move their logic to read_bytes/write_bytes. Suggested-by: Jarkko Sakkinen <jarkko@kernel.org> Signed-off-by: Johannes Holland <johannes.holland@infineon.com> Reviewed-by: Jarkko Sakkinen <jarkko@kernel.org> Signed-off-by: Jarkko Sakkinen <jarkko@kernel.org>
1 parent d0dc1a7 commit 6422cbd

6 files changed

Lines changed: 118 additions & 161 deletions

File tree

drivers/char/tpm/tpm_tis.c

Lines changed: 30 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -153,60 +153,53 @@ static int check_acpi_tpm2(struct device *dev)
153153
#endif
154154

155155
static int tpm_tcg_read_bytes(struct tpm_tis_data *data, u32 addr, u16 len,
156-
u8 *result)
156+
u8 *result, enum tpm_tis_io_mode io_mode)
157157
{
158158
struct tpm_tis_tcg_phy *phy = to_tpm_tis_tcg_phy(data);
159-
160-
while (len--)
161-
*result++ = ioread8(phy->iobase + addr);
159+
__le16 result_le16;
160+
__le32 result_le32;
161+
162+
switch (io_mode) {
163+
case TPM_TIS_PHYS_8:
164+
while (len--)
165+
*result++ = ioread8(phy->iobase + addr);
166+
break;
167+
case TPM_TIS_PHYS_16:
168+
result_le16 = cpu_to_le16(ioread16(phy->iobase + addr));
169+
memcpy(result, &result_le16, sizeof(u16));
170+
break;
171+
case TPM_TIS_PHYS_32:
172+
result_le32 = cpu_to_le32(ioread32(phy->iobase + addr));
173+
memcpy(result, &result_le32, sizeof(u32));
174+
break;
175+
}
162176

163177
return 0;
164178
}
165179

166180
static int tpm_tcg_write_bytes(struct tpm_tis_data *data, u32 addr, u16 len,
167-
const u8 *value)
181+
const u8 *value, enum tpm_tis_io_mode io_mode)
168182
{
169183
struct tpm_tis_tcg_phy *phy = to_tpm_tis_tcg_phy(data);
170184

171-
while (len--)
172-
iowrite8(*value++, phy->iobase + addr);
173-
174-
return 0;
175-
}
176-
177-
static int tpm_tcg_read16(struct tpm_tis_data *data, u32 addr, u16 *result)
178-
{
179-
struct tpm_tis_tcg_phy *phy = to_tpm_tis_tcg_phy(data);
180-
181-
*result = ioread16(phy->iobase + addr);
182-
183-
return 0;
184-
}
185-
186-
static int tpm_tcg_read32(struct tpm_tis_data *data, u32 addr, u32 *result)
187-
{
188-
struct tpm_tis_tcg_phy *phy = to_tpm_tis_tcg_phy(data);
189-
190-
*result = ioread32(phy->iobase + addr);
191-
192-
return 0;
193-
}
194-
195-
static int tpm_tcg_write32(struct tpm_tis_data *data, u32 addr, u32 value)
196-
{
197-
struct tpm_tis_tcg_phy *phy = to_tpm_tis_tcg_phy(data);
198-
199-
iowrite32(value, phy->iobase + addr);
185+
switch (io_mode) {
186+
case TPM_TIS_PHYS_8:
187+
while (len--)
188+
iowrite8(*value++, phy->iobase + addr);
189+
break;
190+
case TPM_TIS_PHYS_16:
191+
return -EINVAL;
192+
case TPM_TIS_PHYS_32:
193+
iowrite32(le32_to_cpu(*((__le32 *)value)), phy->iobase + addr);
194+
break;
195+
}
200196

201197
return 0;
202198
}
203199

204200
static const struct tpm_tis_phy_ops tpm_tcg = {
205201
.read_bytes = tpm_tcg_read_bytes,
206202
.write_bytes = tpm_tcg_write_bytes,
207-
.read16 = tpm_tcg_read16,
208-
.read32 = tpm_tcg_read32,
209-
.write32 = tpm_tcg_write32,
210203
};
211204

212205
static int tpm_tis_init(struct device *dev, struct tpm_info *tpm_info)

drivers/char/tpm/tpm_tis_core.h

Lines changed: 46 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -104,54 +104,88 @@ struct tpm_tis_data {
104104
unsigned int timeout_max; /* usecs */
105105
};
106106

107+
/*
108+
* IO modes to indicate how many bytes should be read/written at once in the
109+
* tpm_tis_phy_ops read_bytes/write_bytes calls. Use TPM_TIS_PHYS_8 to
110+
* receive/transmit byte-wise, TPM_TIS_PHYS_16 for two bytes etc.
111+
*/
112+
enum tpm_tis_io_mode {
113+
TPM_TIS_PHYS_8,
114+
TPM_TIS_PHYS_16,
115+
TPM_TIS_PHYS_32,
116+
};
117+
107118
struct tpm_tis_phy_ops {
119+
/* data is passed in little endian */
108120
int (*read_bytes)(struct tpm_tis_data *data, u32 addr, u16 len,
109-
u8 *result);
121+
u8 *result, enum tpm_tis_io_mode mode);
110122
int (*write_bytes)(struct tpm_tis_data *data, u32 addr, u16 len,
111-
const u8 *value);
112-
int (*read16)(struct tpm_tis_data *data, u32 addr, u16 *result);
113-
int (*read32)(struct tpm_tis_data *data, u32 addr, u32 *result);
114-
int (*write32)(struct tpm_tis_data *data, u32 addr, u32 src);
123+
const u8 *value, enum tpm_tis_io_mode mode);
115124
};
116125

117126
static inline int tpm_tis_read_bytes(struct tpm_tis_data *data, u32 addr,
118127
u16 len, u8 *result)
119128
{
120-
return data->phy_ops->read_bytes(data, addr, len, result);
129+
return data->phy_ops->read_bytes(data, addr, len, result,
130+
TPM_TIS_PHYS_8);
121131
}
122132

123133
static inline int tpm_tis_read8(struct tpm_tis_data *data, u32 addr, u8 *result)
124134
{
125-
return data->phy_ops->read_bytes(data, addr, 1, result);
135+
return data->phy_ops->read_bytes(data, addr, 1, result, TPM_TIS_PHYS_8);
126136
}
127137

128138
static inline int tpm_tis_read16(struct tpm_tis_data *data, u32 addr,
129139
u16 *result)
130140
{
131-
return data->phy_ops->read16(data, addr, result);
141+
__le16 result_le;
142+
int rc;
143+
144+
rc = data->phy_ops->read_bytes(data, addr, sizeof(u16),
145+
(u8 *)&result_le, TPM_TIS_PHYS_16);
146+
if (!rc)
147+
*result = le16_to_cpu(result_le);
148+
149+
return rc;
132150
}
133151

134152
static inline int tpm_tis_read32(struct tpm_tis_data *data, u32 addr,
135153
u32 *result)
136154
{
137-
return data->phy_ops->read32(data, addr, result);
155+
__le32 result_le;
156+
int rc;
157+
158+
rc = data->phy_ops->read_bytes(data, addr, sizeof(u32),
159+
(u8 *)&result_le, TPM_TIS_PHYS_32);
160+
if (!rc)
161+
*result = le32_to_cpu(result_le);
162+
163+
return rc;
138164
}
139165

140166
static inline int tpm_tis_write_bytes(struct tpm_tis_data *data, u32 addr,
141167
u16 len, const u8 *value)
142168
{
143-
return data->phy_ops->write_bytes(data, addr, len, value);
169+
return data->phy_ops->write_bytes(data, addr, len, value,
170+
TPM_TIS_PHYS_8);
144171
}
145172

146173
static inline int tpm_tis_write8(struct tpm_tis_data *data, u32 addr, u8 value)
147174
{
148-
return data->phy_ops->write_bytes(data, addr, 1, &value);
175+
return data->phy_ops->write_bytes(data, addr, 1, &value,
176+
TPM_TIS_PHYS_8);
149177
}
150178

151179
static inline int tpm_tis_write32(struct tpm_tis_data *data, u32 addr,
152180
u32 value)
153181
{
154-
return data->phy_ops->write32(data, addr, value);
182+
__le32 value_le;
183+
int rc;
184+
185+
value_le = cpu_to_le32(value);
186+
rc = data->phy_ops->write_bytes(data, addr, sizeof(u32),
187+
(u8 *)&value_le, TPM_TIS_PHYS_32);
188+
return rc;
155189
}
156190

157191
static inline bool is_bsw(void)

drivers/char/tpm/tpm_tis_spi.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,6 @@ extern int tpm_tis_spi_init(struct spi_device *spi, struct tpm_tis_spi_phy *phy,
3131
extern int tpm_tis_spi_transfer(struct tpm_tis_data *data, u32 addr, u16 len,
3232
u8 *in, const u8 *out);
3333

34-
extern int tpm_tis_spi_read16(struct tpm_tis_data *data, u32 addr, u16 *result);
35-
extern int tpm_tis_spi_read32(struct tpm_tis_data *data, u32 addr, u32 *result);
36-
extern int tpm_tis_spi_write32(struct tpm_tis_data *data, u32 addr, u32 value);
37-
3834
#ifdef CONFIG_TCG_TIS_SPI_CR50
3935
extern int cr50_spi_probe(struct spi_device *spi);
4036
#else

drivers/char/tpm/tpm_tis_spi_cr50.c

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -222,23 +222,20 @@ static int tpm_tis_spi_cr50_transfer(struct tpm_tis_data *data, u32 addr, u16 le
222222
}
223223

224224
static int tpm_tis_spi_cr50_read_bytes(struct tpm_tis_data *data, u32 addr,
225-
u16 len, u8 *result)
225+
u16 len, u8 *result, enum tpm_tis_io_mode io_mode)
226226
{
227227
return tpm_tis_spi_cr50_transfer(data, addr, len, result, NULL);
228228
}
229229

230230
static int tpm_tis_spi_cr50_write_bytes(struct tpm_tis_data *data, u32 addr,
231-
u16 len, const u8 *value)
231+
u16 len, const u8 *value, enum tpm_tis_io_mode io_mode)
232232
{
233233
return tpm_tis_spi_cr50_transfer(data, addr, len, NULL, value);
234234
}
235235

236236
static const struct tpm_tis_phy_ops tpm_spi_cr50_phy_ops = {
237237
.read_bytes = tpm_tis_spi_cr50_read_bytes,
238238
.write_bytes = tpm_tis_spi_cr50_write_bytes,
239-
.read16 = tpm_tis_spi_read16,
240-
.read32 = tpm_tis_spi_read32,
241-
.write32 = tpm_tis_spi_write32,
242239
};
243240

244241
static void cr50_print_fw_version(struct tpm_tis_data *data)

drivers/char/tpm/tpm_tis_spi_main.c

Lines changed: 2 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -141,55 +141,17 @@ int tpm_tis_spi_transfer(struct tpm_tis_data *data, u32 addr, u16 len,
141141
}
142142

143143
static int tpm_tis_spi_read_bytes(struct tpm_tis_data *data, u32 addr,
144-
u16 len, u8 *result)
144+
u16 len, u8 *result, enum tpm_tis_io_mode io_mode)
145145
{
146146
return tpm_tis_spi_transfer(data, addr, len, result, NULL);
147147
}
148148

149149
static int tpm_tis_spi_write_bytes(struct tpm_tis_data *data, u32 addr,
150-
u16 len, const u8 *value)
150+
u16 len, const u8 *value, enum tpm_tis_io_mode io_mode)
151151
{
152152
return tpm_tis_spi_transfer(data, addr, len, NULL, value);
153153
}
154154

155-
int tpm_tis_spi_read16(struct tpm_tis_data *data, u32 addr, u16 *result)
156-
{
157-
__le16 result_le;
158-
int rc;
159-
160-
rc = data->phy_ops->read_bytes(data, addr, sizeof(u16),
161-
(u8 *)&result_le);
162-
if (!rc)
163-
*result = le16_to_cpu(result_le);
164-
165-
return rc;
166-
}
167-
168-
int tpm_tis_spi_read32(struct tpm_tis_data *data, u32 addr, u32 *result)
169-
{
170-
__le32 result_le;
171-
int rc;
172-
173-
rc = data->phy_ops->read_bytes(data, addr, sizeof(u32),
174-
(u8 *)&result_le);
175-
if (!rc)
176-
*result = le32_to_cpu(result_le);
177-
178-
return rc;
179-
}
180-
181-
int tpm_tis_spi_write32(struct tpm_tis_data *data, u32 addr, u32 value)
182-
{
183-
__le32 value_le;
184-
int rc;
185-
186-
value_le = cpu_to_le32(value);
187-
rc = data->phy_ops->write_bytes(data, addr, sizeof(u32),
188-
(u8 *)&value_le);
189-
190-
return rc;
191-
}
192-
193155
int tpm_tis_spi_init(struct spi_device *spi, struct tpm_tis_spi_phy *phy,
194156
int irq, const struct tpm_tis_phy_ops *phy_ops)
195157
{
@@ -205,9 +167,6 @@ int tpm_tis_spi_init(struct spi_device *spi, struct tpm_tis_spi_phy *phy,
205167
static const struct tpm_tis_phy_ops tpm_spi_phy_ops = {
206168
.read_bytes = tpm_tis_spi_read_bytes,
207169
.write_bytes = tpm_tis_spi_write_bytes,
208-
.read16 = tpm_tis_spi_read16,
209-
.read32 = tpm_tis_spi_read32,
210-
.write32 = tpm_tis_spi_write32,
211170
};
212171

213172
static int tpm_tis_spi_probe(struct spi_device *dev)

0 commit comments

Comments
 (0)