Hi, > On Sat, Apr 12, 2025 at 06:47:21AM +0100, Yeoreum Yun wrote: > > For secure partition with multi service, tpm_ffa_crb can access tpm > > service with direct message request v2 interface according to chapter 3.3, > > TPM Service Command Response Buffer Interface Over FF-A specification, v1.0 > > BET. > > > > This patch reflects this spec to access tpm service over > > FF-A direct message request v2 ABI. > > > > Acked-by: Sudeep Holla <sudeep.ho...@arm.com> > > Signed-off-by: Yeoreum Yun <yeoreum....@arm.com> > > --- > > Since v2: > > - rewokring commit message > > - > > https://lore.kernel.org/all/20250411090856.1417021-1-yeoreum....@arm.com/ > > > > Since v1: > > - Fix indentation. > > - > > https://lore.kernel.org/all/20250410110701.1244965-1-yeoreum....@arm.com/ > > --- > > drivers/char/tpm/tpm_crb_ffa.c | 55 ++++++++++++++++++++++++---------- > > 1 file changed, 40 insertions(+), 15 deletions(-) > > > > diff --git a/drivers/char/tpm/tpm_crb_ffa.c b/drivers/char/tpm/tpm_crb_ffa.c > > index 3169a87a56b6..fed775cf53ab 100644 > > --- a/drivers/char/tpm/tpm_crb_ffa.c > > +++ b/drivers/char/tpm/tpm_crb_ffa.c > > @@ -105,7 +105,10 @@ struct tpm_crb_ffa { > > u16 minor_version; > > /* lock to protect sending of FF-A messages: */ > > struct mutex msg_data_lock; > > - struct ffa_send_direct_data direct_msg_data; > > + union { > > + struct ffa_send_direct_data direct_msg_data; > > + struct ffa_send_direct_data2 direct_msg_data2; > > + }; > > }; > > > > static struct tpm_crb_ffa *tpm_crb_ffa; > > @@ -185,18 +188,34 @@ static int __tpm_crb_ffa_send_recieve(unsigned long > > func_id, > > > > msg_ops = tpm_crb_ffa->ffa_dev->ops->msg_ops; > > > > - memset(&tpm_crb_ffa->direct_msg_data, 0x00, > > - sizeof(struct ffa_send_direct_data)); > > - > > - tpm_crb_ffa->direct_msg_data.data1 = func_id; > > - tpm_crb_ffa->direct_msg_data.data2 = a0; > > - tpm_crb_ffa->direct_msg_data.data3 = a1; > > - tpm_crb_ffa->direct_msg_data.data4 = a2; > > + if (ffa_partition_supports_direct_req2_recv(tpm_crb_ffa->ffa_dev)) { > > + memset(&tpm_crb_ffa->direct_msg_data2, 0x00, > > + sizeof(struct ffa_send_direct_data2)); > > + > > + tpm_crb_ffa->direct_msg_data2.data[0] = func_id; > > + tpm_crb_ffa->direct_msg_data2.data[1] = a0; > > + tpm_crb_ffa->direct_msg_data2.data[2] = a1; > > + tpm_crb_ffa->direct_msg_data2.data[3] = a2; > > + > > + ret = msg_ops->sync_send_receive2(tpm_crb_ffa->ffa_dev, > > + &tpm_crb_ffa->direct_msg_data2); > > + if (!ret) > > + ret = > > tpm_crb_ffa_to_linux_errno(tpm_crb_ffa->direct_msg_data2.data[0]); > > + } else { > > + memset(&tpm_crb_ffa->direct_msg_data, 0x00, > > + sizeof(struct ffa_send_direct_data)); > > + > > + tpm_crb_ffa->direct_msg_data.data1 = func_id; > > + tpm_crb_ffa->direct_msg_data.data2 = a0; > > + tpm_crb_ffa->direct_msg_data.data3 = a1; > > + tpm_crb_ffa->direct_msg_data.data4 = a2; > > + > > + ret = msg_ops->sync_send_receive(tpm_crb_ffa->ffa_dev, > > + &tpm_crb_ffa->direct_msg_data); > > + if (!ret) > > + ret = > > tpm_crb_ffa_to_linux_errno(tpm_crb_ffa->direct_msg_data.data1); > > + } > > > > - ret = msg_ops->sync_send_receive(tpm_crb_ffa->ffa_dev, > > - &tpm_crb_ffa->direct_msg_data); > > - if (!ret) > > - ret = > > tpm_crb_ffa_to_linux_errno(tpm_crb_ffa->direct_msg_data.data1); > > > > return ret; > > } > > @@ -231,8 +250,13 @@ int tpm_crb_ffa_get_interface_version(u16 *major, u16 > > *minor) > > > > rc = __tpm_crb_ffa_send_recieve(CRB_FFA_GET_INTERFACE_VERSION, 0x00, > > 0x00, 0x00); > > if (!rc) { > > - *major = > > CRB_FFA_MAJOR_VERSION(tpm_crb_ffa->direct_msg_data.data2); > > - *minor = > > CRB_FFA_MINOR_VERSION(tpm_crb_ffa->direct_msg_data.data2); > > + if > > (ffa_partition_supports_direct_req2_recv(tpm_crb_ffa->ffa_dev)) { > > + *major = > > CRB_FFA_MAJOR_VERSION(tpm_crb_ffa->direct_msg_data2.data[1]); > > + *minor = > > CRB_FFA_MINOR_VERSION(tpm_crb_ffa->direct_msg_data2.data[1]); > > + } else { > > + *major = > > CRB_FFA_MAJOR_VERSION(tpm_crb_ffa->direct_msg_data.data2); > > + *minor = > > CRB_FFA_MINOR_VERSION(tpm_crb_ffa->direct_msg_data.data2); > > + } > > } > > > > return rc; > > @@ -277,7 +301,8 @@ static int tpm_crb_ffa_probe(struct ffa_device *ffa_dev) > > > > tpm_crb_ffa = ERR_PTR(-ENODEV); // set tpm_crb_ffa so we can detect > > probe failure > > > > - if (!ffa_partition_supports_direct_recv(ffa_dev)) { > > + if (!ffa_partition_supports_direct_recv(ffa_dev) && > > + !ffa_partition_supports_direct_req2_recv(ffa_dev)) { > > pr_err("TPM partition doesn't support direct message > > receive.\n"); > > did not notice but there's couple of things: > > 1. It should be probably warn. Driver is working incorrectly, isn't it? > 2. dev_warn() > > So along the lines of would summarize all this: > > dev_warn(&ffa_dev->dev, "partition doesn't support direct message > receive.\n"); > > "TPM" was removed because this gives the device info. > > > > return -EINVAL; > > } > > -- > > LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7} > > >
Agree. thou it seems not related for this patch, it's simple one, I'll include this modification in next version. Thanks. -- Sincerely, Yeoreum Yun