I would like to read/write CAAM's Master Configuration Register (MCFGR) (address space 0x02100000+4) in non-secure world Linux kernel, but it does not function well and always return 0. The code I have used is as follows:
res = platform_get_resource_byname(pdev,
IORESOURCE_MEM, "iobase_caam");
if (!res) {
dev_err(dev, "caam: invalid address resource type\n");
return -ENODEV;
}
ctrl = ioremap(res->start, SZ_64K); //0x02100000
if (ctrl == NULL) {
dev_err(dev, "caam: ioremap() failed\n");
return -ENOMEM;
}
...
printk("MCFGR: %x\n", ioread32(&ctrl->mcr)); //0x02100000 + 4
setbits32(&topregs->ctrl.mcr, MCFGR_WDENABLE |(sizeof(dma_addr_t) == sizeof(u64) ? MCFGR_LONG_PTR : 0));
printk("MCFGR: %x\n", ioread32(&ctrl->mcr));
The returned value is always 0, while the expected value is 0x2140
U-Boot > md.l 0x02100000 6
02100000: 00000000 00002140 00000000 00000001 ....@!..........
02100010: 00000001 00020002 ........
I have set the CSU_CSL17 register to 0x00ff00ff so that CAAM can be accessible in both non-secure and secure worlds. However, it does not solve the problem. Could anyone please help me figure it out?
Thank you very much!