Messages in this thread | | | From | Jens Wiklander <> | Date | Thu, 1 Sep 2022 10:18:01 +0200 | Subject | Re: [PATCH 5/9] firmware: arm_ffa: Use FFA_FEATURES to detect if native versions are supported |
| |
On Tue, Aug 30, 2022 at 12:07 PM Sudeep Holla <sudeep.holla@arm.com> wrote: > > Currently, the ffa_dev->mode_32bit is use to detect if the native 64-bit > or 32-bit versions of FF-A ABI needs to be used. However for the FF-A > memory ABIs, it is not dependent on the ffa_device(i.e. the partition) > itself, but the partition manager(SPM). > > So, the FFA_FEATURES can be use to detect if the native 64bit ABIs are > supported or not and appropriate calls can be made based on that. > > Use FFA_FEATURES to detect if native versions of MEM_LEND or MEM_SHARE > are implemented and make of the same to use native memory ABIs later on. > > Signed-off-by: Sudeep Holla <sudeep.holla@arm.com> > --- > drivers/firmware/arm_ffa/driver.c | 22 ++++++++++++++++------ > 1 file changed, 16 insertions(+), 6 deletions(-)
Reviewed-by: Jens Wiklander <jens.wiklander@linaro.org>
> > diff --git a/drivers/firmware/arm_ffa/driver.c b/drivers/firmware/arm_ffa/driver.c > index de94073f4109..5f02b670e964 100644 > --- a/drivers/firmware/arm_ffa/driver.c > +++ b/drivers/firmware/arm_ffa/driver.c > @@ -163,6 +163,7 @@ struct ffa_drv_info { > struct mutex tx_lock; /* lock to protect Tx buffer */ > void *rx_buffer; > void *tx_buffer; > + bool mem_ops_native; > }; > > static struct ffa_drv_info *drv_info; > @@ -594,6 +595,13 @@ static int ffa_features(u32 func_feat_id, u32 input_props, u32 *if_props) > return 0; > } > > +static void ffa_set_up_mem_ops_native_flag(void) > +{ > + if (!ffa_features(FFA_FN_NATIVE(MEM_LEND), 0, NULL) || > + !ffa_features(FFA_FN_NATIVE(MEM_SHARE), 0, NULL)) > + drv_info->mem_ops_native = true; > +} > + > static u32 ffa_api_version_get(void) > { > return drv_info->version; > @@ -635,10 +643,10 @@ static int ffa_sync_send_receive(struct ffa_device *dev, > static int > ffa_memory_share(struct ffa_device *dev, struct ffa_mem_ops_args *args) > { > - if (dev->mode_32bit) > - return ffa_memory_ops(FFA_MEM_SHARE, args); > + if (drv_info->mem_ops_native) > + return ffa_memory_ops(FFA_FN_NATIVE(MEM_SHARE), args); > > - return ffa_memory_ops(FFA_FN_NATIVE(MEM_SHARE), args); > + return ffa_memory_ops(FFA_MEM_SHARE, args); > } > > static int > @@ -651,10 +659,10 @@ ffa_memory_lend(struct ffa_device *dev, struct ffa_mem_ops_args *args) > * however on systems without a hypervisor the responsibility > * falls to the calling kernel driver to prevent access. > */ > - if (dev->mode_32bit) > - return ffa_memory_ops(FFA_MEM_LEND, args); > + if (drv_info->mem_ops_native) > + return ffa_memory_ops(FFA_FN_NATIVE(MEM_LEND), args); > > - return ffa_memory_ops(FFA_FN_NATIVE(MEM_LEND), args); > + return ffa_memory_ops(FFA_MEM_LEND, args); > } > > static const struct ffa_dev_ops ffa_ops = { > @@ -765,6 +773,8 @@ static int __init ffa_init(void) > > ffa_setup_partitions(); > > + ffa_set_up_mem_ops_native_flag(); > + > return 0; > free_pages: > if (drv_info->tx_buffer) > -- > 2.37.2 >
| |