mirror of
https://github.com/nxp-imx/linux-imx.git
synced 2025-07-07 18:05:21 +02:00
soc: qcom: smem: Add qcom_smem_bust_hwspin_lock_by_host()
[ Upstream commit 2e3f0d6938
]
Add qcom_smem_bust_hwspin_lock_by_host to enable remoteproc to bust the
hwspin_lock owned by smem. In the event the remoteproc crashes
unexpectedly, the remoteproc driver can invoke this API to try and bust
the hwspin_lock and release the lock if still held by the remoteproc
device.
Signed-off-by: Chris Lew <quic_clew@quicinc.com>
Reviewed-by: Bjorn Andersson <quic_bjorande@quicinc.com>
Link: https://lore.kernel.org/r/20240529-hwspinlock-bust-v3-3-c8b924ffa5a2@quicinc.com
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
a6978d1b7b
commit
220725de5a
|
@ -359,6 +359,32 @@ static struct qcom_smem *__smem;
|
||||||
/* Timeout (ms) for the trylock of remote spinlocks */
|
/* Timeout (ms) for the trylock of remote spinlocks */
|
||||||
#define HWSPINLOCK_TIMEOUT 1000
|
#define HWSPINLOCK_TIMEOUT 1000
|
||||||
|
|
||||||
|
/* The qcom hwspinlock id is always plus one from the smem host id */
|
||||||
|
#define SMEM_HOST_ID_TO_HWSPINLOCK_ID(__x) ((__x) + 1)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* qcom_smem_bust_hwspin_lock_by_host() - bust the smem hwspinlock for a host
|
||||||
|
* @host: remote processor id
|
||||||
|
*
|
||||||
|
* Busts the hwspin_lock for the given smem host id. This helper is intended
|
||||||
|
* for remoteproc drivers that manage remoteprocs with an equivalent smem
|
||||||
|
* driver instance in the remote firmware. Drivers can force a release of the
|
||||||
|
* smem hwspin_lock if the rproc unexpectedly goes into a bad state.
|
||||||
|
*
|
||||||
|
* Context: Process context.
|
||||||
|
*
|
||||||
|
* Returns: 0 on success, otherwise negative errno.
|
||||||
|
*/
|
||||||
|
int qcom_smem_bust_hwspin_lock_by_host(unsigned int host)
|
||||||
|
{
|
||||||
|
/* This function is for remote procs, so ignore SMEM_HOST_APPS */
|
||||||
|
if (host == SMEM_HOST_APPS || host >= SMEM_HOST_COUNT)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
return hwspin_lock_bust(__smem->hwlock, SMEM_HOST_ID_TO_HWSPINLOCK_ID(host));
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(qcom_smem_bust_hwspin_lock_by_host);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* qcom_smem_is_available() - Check if SMEM is available
|
* qcom_smem_is_available() - Check if SMEM is available
|
||||||
*
|
*
|
||||||
|
|
|
@ -14,4 +14,6 @@ phys_addr_t qcom_smem_virt_to_phys(void *p);
|
||||||
|
|
||||||
int qcom_smem_get_soc_id(u32 *id);
|
int qcom_smem_get_soc_id(u32 *id);
|
||||||
|
|
||||||
|
int qcom_smem_bust_hwspin_lock_by_host(unsigned int host);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue
Block a user