On i.MX8M, OP-TEE reserves CAAM job ring 2 for the secure world (its
CAAM driver forces CFG_JR_INDEX=2 for all i.MX8M variants).

As a result, the ring stays enabled in the device-tree handed to Linux.
The kernel then tries to reset a ring it has no access to and logs:

  caam_jr 30903000.jr: failed to flush job ring 1
  caam_jr 30903000.jr: probe with driver caam_jr failed with error -5

Function ft_add_optee_node() already detects a running OP-TEE and adds
its node and reserved memory. Disable job ring 2 there as well, so the
OS only sees the job rings it can actually use. The node path is the
same on NXP i.MX8MQ, i.MX8MM, i.MX8MN and i.MX8MP SoCs.

Signed-off-by: Primoz Fiser <[email protected]>
---
 arch/arm/mach-imx/imx8m/soc.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/arch/arm/mach-imx/imx8m/soc.c b/arch/arm/mach-imx/imx8m/soc.c
index 909bd7476db3..29c0216aca2f 100644
--- a/arch/arm/mach-imx/imx8m/soc.c
+++ b/arch/arm/mach-imx/imx8m/soc.c
@@ -1234,6 +1234,10 @@ static int cleanup_nodes_for_efi(void *blob)
 #define OPTEE_SHM_SIZE 0x00400000
 static int ft_add_optee_node(void *fdt, struct bd_info *bd)
 {
+       /* CAAM job ring reserved by OP-TEE on i.MX8M (CFG_JR_INDEX = 2) */
+       static const char * const optee_jr_path[] = {
+               "/soc@0/bus@30800000/crypto@30900000/jr@3000",
+       };
        struct fdt_memory carveout;
        const char *path, *subpath;
        phys_addr_t optee_start;
@@ -1305,7 +1309,11 @@ static int ft_add_optee_node(void *fdt, struct bd_info 
*bd)
                return ret;
        }
 
-       return 0;
+       /*
+        * OP-TEE uses this job ring from the secure world. Disable it so
+        * the OS does not try to probe a ring it cannot access.
+        */
+       return disable_fdt_nodes(fdt, optee_jr_path, ARRAY_SIZE(optee_jr_path));
 }
 
 int ft_system_setup(void *blob, struct bd_info *bd)
-- 
2.34.1

Reply via email to