firmware: arm_scmi: Make mutex channel specific
authorSudeep Holla <sudeep.holla@arm.com>
Fri, 27 Mar 2020 16:36:51 +0000 (16:36 +0000)
committerSudeep Holla <sudeep.holla@arm.com>
Tue, 14 Apr 2020 08:31:48 +0000 (09:31 +0100)
In order to support multiple SMC/HVC transport channels with associated
shared memory, it is better to maintain the mutex per channel instead of
existing global one.

Move the smc_mutex into the scmi_smc structure and also rename it to
shmem_lock which is more appropriate for it's use.

Link: https://lore.kernel.org/r/20200327163654.13389-2-sudeep.holla@arm.com
Tested-by: Peng Fan <peng.fan@nxp.com>
Reviewed-by: Peng Fan <peng.fan@nxp.com>
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
drivers/firmware/arm_scmi/smc.c

index 336168e40f494002ed655778a87fd4d385b4412e..6dc8a88cc91b9205416f8c214acbf38df469582b 100644 (file)
 struct scmi_smc {
        struct scmi_chan_info *cinfo;
        struct scmi_shared_mem __iomem *shmem;
+       struct mutex shmem_lock;
        u32 func_id;
 };
 
-static DEFINE_MUTEX(smc_mutex);
-
 static bool smc_chan_available(struct device *dev, int idx)
 {
        return true;
@@ -78,6 +77,7 @@ static int smc_chan_setup(struct scmi_chan_info *cinfo, struct device *dev,
 
        scmi_info->func_id = func_id;
        scmi_info->cinfo = cinfo;
+       mutex_init(&scmi_info->shmem_lock);
        cinfo->transport_info = scmi_info;
 
        return 0;
@@ -102,14 +102,14 @@ static int smc_send_message(struct scmi_chan_info *cinfo,
        struct scmi_smc *scmi_info = cinfo->transport_info;
        struct arm_smccc_res res;
 
-       mutex_lock(&smc_mutex);
+       mutex_lock(&scmi_info->shmem_lock);
 
        shmem_tx_prepare(scmi_info->shmem, xfer);
 
        arm_smccc_1_1_invoke(scmi_info->func_id, 0, 0, 0, 0, 0, 0, 0, &res);
        scmi_rx_callback(scmi_info->cinfo, shmem_read_header(scmi_info->shmem));
 
-       mutex_unlock(&smc_mutex);
+       mutex_unlock(&scmi_info->shmem_lock);
 
        return res.a0;
 }