@@ -105,7 +105,10 @@ struct tpm_crb_ffa {
105105 u16 minor_version ;
106106 /* lock to protect sending of FF-A messages: */
107107 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+ };
109112};
110113
111114static struct tpm_crb_ffa * tpm_crb_ffa ;
@@ -185,18 +188,34 @@ static int __tpm_crb_ffa_send_recieve(unsigned long func_id,
185188
186189 msg_ops = tpm_crb_ffa -> ffa_dev -> ops -> msg_ops ;
187190
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+ }
195218
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 );
200219
201220 return ret ;
202221}
@@ -231,8 +250,13 @@ int tpm_crb_ffa_get_interface_version(u16 *major, u16 *minor)
231250
232251 rc = __tpm_crb_ffa_send_recieve (CRB_FFA_GET_INTERFACE_VERSION , 0x00 , 0x00 , 0x00 );
233252 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+ }
236260 }
237261
238262 return rc ;
@@ -277,7 +301,8 @@ static int tpm_crb_ffa_probe(struct ffa_device *ffa_dev)
277301
278302 tpm_crb_ffa = ERR_PTR (- ENODEV ); // set tpm_crb_ffa so we can detect probe failure
279303
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 )) {
281306 pr_err ("TPM partition doesn't support direct message receive.\n" );
282307 return - EINVAL ;
283308 }
0 commit comments