@@ -105,7 +105,10 @@ struct tpm_crb_ffa {
105
105
u16 minor_version ;
106
106
/* lock to protect sending of FF-A messages: */
107
107
struct mutex msg_data_lock ;
108
- struct ffa_send_direct_data direct_msg_data ;
108
+ union {
109
+ struct ffa_send_direct_data direct_msg_data ;
110
+ struct ffa_send_direct_data2 direct_msg_data2 ;
111
+ };
109
112
};
110
113
111
114
static struct tpm_crb_ffa * tpm_crb_ffa ;
@@ -185,18 +188,34 @@ static int __tpm_crb_ffa_send_recieve(unsigned long func_id,
185
188
186
189
msg_ops = tpm_crb_ffa -> ffa_dev -> ops -> msg_ops ;
187
190
188
- memset (& tpm_crb_ffa -> direct_msg_data , 0x00 ,
189
- sizeof (struct ffa_send_direct_data ));
190
-
191
- tpm_crb_ffa -> direct_msg_data .data1 = func_id ;
192
- tpm_crb_ffa -> direct_msg_data .data2 = a0 ;
193
- tpm_crb_ffa -> direct_msg_data .data3 = a1 ;
194
- tpm_crb_ffa -> direct_msg_data .data4 = a2 ;
191
+ if (ffa_partition_supports_direct_req2_recv (tpm_crb_ffa -> ffa_dev )) {
192
+ memset (& tpm_crb_ffa -> direct_msg_data2 , 0x00 ,
193
+ sizeof (struct ffa_send_direct_data2 ));
194
+
195
+ tpm_crb_ffa -> direct_msg_data2 .data [0 ] = func_id ;
196
+ tpm_crb_ffa -> direct_msg_data2 .data [1 ] = a0 ;
197
+ tpm_crb_ffa -> direct_msg_data2 .data [2 ] = a1 ;
198
+ tpm_crb_ffa -> direct_msg_data2 .data [3 ] = a2 ;
199
+
200
+ ret = msg_ops -> sync_send_receive2 (tpm_crb_ffa -> ffa_dev ,
201
+ & tpm_crb_ffa -> direct_msg_data2 );
202
+ if (!ret )
203
+ ret = tpm_crb_ffa_to_linux_errno (tpm_crb_ffa -> direct_msg_data2 .data [0 ]);
204
+ } else {
205
+ memset (& tpm_crb_ffa -> direct_msg_data , 0x00 ,
206
+ sizeof (struct ffa_send_direct_data ));
207
+
208
+ tpm_crb_ffa -> direct_msg_data .data1 = func_id ;
209
+ tpm_crb_ffa -> direct_msg_data .data2 = a0 ;
210
+ tpm_crb_ffa -> direct_msg_data .data3 = a1 ;
211
+ tpm_crb_ffa -> direct_msg_data .data4 = a2 ;
212
+
213
+ ret = msg_ops -> sync_send_receive (tpm_crb_ffa -> ffa_dev ,
214
+ & tpm_crb_ffa -> direct_msg_data );
215
+ if (!ret )
216
+ ret = tpm_crb_ffa_to_linux_errno (tpm_crb_ffa -> direct_msg_data .data1 );
217
+ }
195
218
196
- ret = msg_ops -> sync_send_receive (tpm_crb_ffa -> ffa_dev ,
197
- & tpm_crb_ffa -> direct_msg_data );
198
- if (!ret )
199
- ret = tpm_crb_ffa_to_linux_errno (tpm_crb_ffa -> direct_msg_data .data1 );
200
219
201
220
return ret ;
202
221
}
@@ -231,8 +250,13 @@ int tpm_crb_ffa_get_interface_version(u16 *major, u16 *minor)
231
250
232
251
rc = __tpm_crb_ffa_send_recieve (CRB_FFA_GET_INTERFACE_VERSION , 0x00 , 0x00 , 0x00 );
233
252
if (!rc ) {
234
- * major = CRB_FFA_MAJOR_VERSION (tpm_crb_ffa -> direct_msg_data .data2 );
235
- * minor = CRB_FFA_MINOR_VERSION (tpm_crb_ffa -> direct_msg_data .data2 );
253
+ if (ffa_partition_supports_direct_req2_recv (tpm_crb_ffa -> ffa_dev )) {
254
+ * major = CRB_FFA_MAJOR_VERSION (tpm_crb_ffa -> direct_msg_data2 .data [1 ]);
255
+ * minor = CRB_FFA_MINOR_VERSION (tpm_crb_ffa -> direct_msg_data2 .data [1 ]);
256
+ } else {
257
+ * major = CRB_FFA_MAJOR_VERSION (tpm_crb_ffa -> direct_msg_data .data2 );
258
+ * minor = CRB_FFA_MINOR_VERSION (tpm_crb_ffa -> direct_msg_data .data2 );
259
+ }
236
260
}
237
261
238
262
return rc ;
@@ -277,7 +301,8 @@ static int tpm_crb_ffa_probe(struct ffa_device *ffa_dev)
277
301
278
302
tpm_crb_ffa = ERR_PTR (- ENODEV ); // set tpm_crb_ffa so we can detect probe failure
279
303
280
- if (!ffa_partition_supports_direct_recv (ffa_dev )) {
304
+ if (!ffa_partition_supports_direct_recv (ffa_dev ) &&
305
+ !ffa_partition_supports_direct_req2_recv (ffa_dev )) {
281
306
pr_err ("TPM partition doesn't support direct message receive.\n" );
282
307
return - EINVAL ;
283
308
}
0 commit comments