mirror of
https://github.com/torvalds/linux.git
synced 2026-04-18 14:53:58 -04:00
firmware: qcom: scm: take struct device as argument in SHM bridge enable
qcom_scm_shm_bridge_enable() is used early in the SCM initialization routine. It makes an SCM call and so expects the internal __scm pointer in the SCM driver to be assigned. For this reason the tzmem memory pool is allocated *after* this pointer is assigned. However, this can lead to a crash if another consumer of the SCM API makes a call using the memory pool between the assignment of the __scm pointer and the initialization of the tzmem memory pool. As qcom_scm_shm_bridge_enable() is a special case, not meant to be called by ordinary users, pull it into the local SCM header. Make it take struct device as argument. This is the device that will be used to make the SCM call as opposed to the global __scm pointer. This will allow us to move the tzmem initialization *before* the __scm assignment in the core SCM driver. Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com> Link: https://lore.kernel.org/r/20250630-qcom-scm-race-v2-2-fa3851c98611@linaro.org Signed-off-by: Bjorn Andersson <andersson@kernel.org>
This commit is contained in:
committed by
Bjorn Andersson
parent
23972da96e
commit
dc3f4e75c5
@@ -1603,7 +1603,13 @@ bool qcom_scm_lmh_dcvsh_available(void)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(qcom_scm_lmh_dcvsh_available);
|
||||
|
||||
int qcom_scm_shm_bridge_enable(void)
|
||||
/*
|
||||
* This is only supposed to be called once by the TZMem module. It takes the
|
||||
* SCM struct device as argument and uses it to pass the call as at the time
|
||||
* the SHM Bridge is enabled, the SCM is not yet fully set up and doesn't
|
||||
* accept global user calls. Don't try to use the __scm pointer here.
|
||||
*/
|
||||
int qcom_scm_shm_bridge_enable(struct device *scm_dev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
@@ -1615,11 +1621,11 @@ int qcom_scm_shm_bridge_enable(void)
|
||||
|
||||
struct qcom_scm_res res;
|
||||
|
||||
if (!__qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_MP,
|
||||
if (!__qcom_scm_is_call_available(scm_dev, QCOM_SCM_SVC_MP,
|
||||
QCOM_SCM_MP_SHM_BRIDGE_ENABLE))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
ret = qcom_scm_call(__scm->dev, &desc, &res);
|
||||
ret = qcom_scm_call(scm_dev, &desc, &res);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
Reference in New Issue
Block a user