mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-09-22 09:34:56 +02:00
bus: rifsc: fix RIF configuration check for peripherals
[ Upstream commitd5ce3b4e95] Peripheral holding CID0 cannot be accessed, remove this completely incorrect check. While there, fix and simplify the semaphore checking that should be performed when the CID filtering is enabled. Fixes:a182084572("bus: rifsc: introduce RIFSC firewall controller driver") Signed-off-by: Gatien Chevallier <gatien.chevallier@foss.st.com> Link: https://lore.kernel.org/r/20260129-fix_cid_check_rifsc-v1-1-ef280ccf764d@foss.st.com Signed-off-by: Alexandre Torgue <alexandre.torgue@foss.st.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
8bfa413a1b
commit
8344cd62b8
+18
-34
@@ -126,34 +126,6 @@ static int stm32_rifsc_grant_access(struct stm32_firewall_controller *ctrl, u32
|
||||
sec_reg_value = readl(rifsc_controller->mmio + RIFSC_RISC_SECCFGR0 + 0x4 * reg_id);
|
||||
cid_reg_value = readl(rifsc_controller->mmio + RIFSC_RISC_PER0_CIDCFGR + 0x8 * firewall_id);
|
||||
|
||||
/* First check conditions for semaphore mode, which doesn't take into account static CID. */
|
||||
if ((cid_reg_value & CIDCFGR_SEMEN) && (cid_reg_value & CIDCFGR_CFEN)) {
|
||||
if (cid_reg_value & BIT(RIF_CID1 + SEMWL_SHIFT)) {
|
||||
/* Static CID is irrelevant if semaphore mode */
|
||||
goto skip_cid_check;
|
||||
} else {
|
||||
dev_dbg(rifsc_controller->dev,
|
||||
"Invalid bus semaphore configuration: index %d\n", firewall_id);
|
||||
return -EACCES;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Skip CID check if CID filtering isn't enabled or filtering is enabled on CID0, which
|
||||
* corresponds to whatever CID.
|
||||
*/
|
||||
if (!(cid_reg_value & CIDCFGR_CFEN) ||
|
||||
FIELD_GET(RIFSC_RISC_SCID_MASK, cid_reg_value) == RIF_CID0)
|
||||
goto skip_cid_check;
|
||||
|
||||
/* Coherency check with the CID configuration */
|
||||
if (FIELD_GET(RIFSC_RISC_SCID_MASK, cid_reg_value) != RIF_CID1) {
|
||||
dev_dbg(rifsc_controller->dev, "Invalid CID configuration for peripheral: %d\n",
|
||||
firewall_id);
|
||||
return -EACCES;
|
||||
}
|
||||
|
||||
skip_cid_check:
|
||||
/* Check security configuration */
|
||||
if (sec_reg_value & BIT(reg_offset)) {
|
||||
dev_dbg(rifsc_controller->dev,
|
||||
@@ -161,19 +133,31 @@ skip_cid_check:
|
||||
return -EACCES;
|
||||
}
|
||||
|
||||
/*
|
||||
* If the peripheral is in semaphore mode, take the semaphore so that
|
||||
* the CID1 has the ownership.
|
||||
*/
|
||||
if ((cid_reg_value & CIDCFGR_SEMEN) && (cid_reg_value & CIDCFGR_CFEN)) {
|
||||
/* Skip CID check if CID filtering isn't enabled */
|
||||
if (!(cid_reg_value & CIDCFGR_CFEN))
|
||||
goto skip_cid_check;
|
||||
|
||||
/* First check conditions for semaphore mode, which doesn't take into account static CID. */
|
||||
if (cid_reg_value & CIDCFGR_SEMEN) {
|
||||
if (!(cid_reg_value & BIT(RIF_CID1 + SEMWL_SHIFT))) {
|
||||
dev_dbg(rifsc_controller->dev,
|
||||
"Invalid bus semaphore configuration: index %d\n", firewall_id);
|
||||
return -EACCES;
|
||||
}
|
||||
|
||||
rc = stm32_rif_acquire_semaphore(rifsc_controller, firewall_id);
|
||||
if (rc) {
|
||||
dev_err(rifsc_controller->dev,
|
||||
dev_dbg(rifsc_controller->dev,
|
||||
"Couldn't acquire semaphore for peripheral: %d\n", firewall_id);
|
||||
return rc;
|
||||
}
|
||||
} else if (FIELD_GET(RIFSC_RISC_SCID_MASK, cid_reg_value) != RIF_CID1) {
|
||||
dev_dbg(rifsc_controller->dev, "Invalid CID configuration for peripheral: %d\n",
|
||||
firewall_id);
|
||||
return -EACCES;
|
||||
}
|
||||
|
||||
skip_cid_check:
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user