]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
bus: rifsc: fix RIF configuration check for peripherals
authorGatien Chevallier <gatien.chevallier@foss.st.com>
Thu, 29 Jan 2026 12:56:17 +0000 (13:56 +0100)
committerAlexandre Torgue <alexandre.torgue@foss.st.com>
Wed, 25 Mar 2026 16:40:21 +0000 (17:40 +0100)
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: a18208457253 ("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>
drivers/bus/stm32_rifsc.c

index ab8d4e3128c3a02a0ea138a1ac03668d4eb0d764..19d10379dcefbbd6cce57a1a98bf590d540f5408 100644 (file)
@@ -687,34 +687,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,
@@ -722,19 +694,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;
 }