tpm_ffa_crb: access tpm service over FF-A direct message request v2
Subsystems (2)
PATCH v3 1/1 tpm_ffa_crb: access tpm service over FF-A direct message request v2
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.
---
Since v2:
- rewokring commit message
- https://lore.kernel.org/all/[email protected]/
Since v1:
- Fix indentation.
- https://lore.kernel.org/all/[email protected]/
--- drivers/char/tpm/tpm_crb_ffa.c | 55 ++++++++++++++++++++++++---------- 1 file changed, 40 insertions(+), 15 deletions(-)
drivers/char/tpm/tpm_crb_ffa.c +40 -15
@@ -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" );return -EINVAL ; }
--
LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7}
Jarkko Sakkinen
maintainerQuoted 100 lines · Yeoreum Yun
For secure partition with multi service,
tpm_ffa_crbcan 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 <[email protected]>Signed-off-by Yeoreum Yun <[email protected]>---
Since v2:
- rewokring commit message
- https://lore.kernel.org/all/[email protected]/Since v1:
- Fix indentation.
- https://lore.kernel.org/all/[email protected]/--- drivers/char/tpm/tpm_crb_ffa.c | 55 ++++++++++++++++++++++++---------- 1 file changed, 40 insertions(+), 15 deletions(-)drivers/char/tpm/tpm_crb_ffa.c +38
-14@@ -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;
drivers/char/tpm/tpm_crb_ffa.c static int tpm_crb_ffa_probe(struct ffa_device *ffa_dev) · line 306
Quoted 7 lines
drivers/char/tpm/tpm_crb_ffa.c +2
-1@@ -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.
Quoted 5 lines
drivers/char/tpm/tpm_crb_ffa.c +0
-1return -EINVAL ; } --LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7}
BR, Jarkko
Hi,
Quoted 111 lines · Yeoreum Yun
Quoted 100 lines
For secure partition with multi service,
tpm_ffa_crbcan 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 <[email protected]>Signed-off-by Yeoreum Yun <[email protected]>---
Since v2:
- rewokring commit message
- https://lore.kernel.org/all/[email protected]/Since v1:
- Fix indentation.
- https://lore.kernel.org/all/[email protected]/--- drivers/char/tpm/tpm_crb_ffa.c | 55 ++++++++++++++++++++++++---------- 1 file changed, 40 insertions(+), 15 deletions(-)drivers/char/tpm/tpm_crb_ffa.c +38
-14@@ -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;drivers/char/tpm/tpm_crb_ffa.c static int tpm_crb_ffa_probe(struct ffa_device *ffa_dev) · line 306
Quoted 7 lines
drivers/char/tpm/tpm_crb_ffa.c +2
-1@@ -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:
Quoted 16 lines
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.
Quoted 5 lines
drivers/char/tpm/tpm_crb_ffa.c +0
-1return -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