@@ -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+
107118struct 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
117126static 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
123133static 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
128138static 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
134152static 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
140166static 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
146173static 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
151179static 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
157191static inline bool is_bsw (void )
0 commit comments