xRDC简介
项目上,有很多外设和内存资源都可以被利用,例如核心,总线,内存区域,从外设等等。为了能够将这些资源划分到不同的分区或者域中,我们需要借助xRDC完成,由xRDC来管理访问权限,系统内存保护和外设隔离等等。

划分的域,可以为每种特权等级定义访问权限策略,关于Arm的特权等级介绍,可以参考:
基于xRDC分配不同的资源,可以为同一芯片上的应用强制应用FFI。常见的应用场景有:
隔离实时应用和非实时应用
隔离安全代码和非安全代码
隔离第三方非可信应用和可信应用

xRDC没有自己的中断,如果监测到非法访问,在M核上会引发Bus Fault异常,在A核上会引发Data Abort异常。关于M核上异常的其他类型,可以参考:
xRDC子模块
xRDC_MGR:管理子模块,协调所有的读写操作
xRDC_MDAC:域分配控制器,处理资源分配以及域ID生成
xRDC_MRC:内存区域控制器,基于预编程的区域描述寄存器实现从存储的访问控制
xRDC_PAC:外设访问控制器,基于预编程的域访问控制寄存器实现从外设的访问控制

S32G有两个xRDC实例:xRDC_0(system instance)和xRDC_1(accelerator subsystem instance)。
全局xRDC配置定义了16个域(domain),每个域都有固定的域序号。
xRDC是如何工作的

我们以一个读操作的总线事务为例,Bus Master(M核)会提供以下信息:
master ID(每个bus master都有固定的值,例如Cortex-M7_0 AXI是8)
Secure/non-secure bit(0代表安全访问)
Priv/user mode(1代表特权模式)
PID会和master ID信息一起输入到MDAC,由MDAC根据这一对ID分配一个domain ID。
domain ID,secure_in以及priv_in信息会给到MRC/PAC,如果访问地址是内存,则由MRC处理,如果访问地址是外设,则由PAC处理,MRC/PAC决定是否为合法访问。
需要注意的是,xRDC默认是未使能状态,需要在启动代码中配置并使能。
MDAC

每个core的AXI/AHB端口都有对应的MDAC,也即每个core有两个MDAC。
由于M核不支持trust zone,所以,除了特殊情况外,所有的访问都被视为安全访问。
Priv位来自于M核模式状态,MDAC不改变它。

A核有trust zone,所以secure_in会根据实际情况变化。不过由于A核支持MMU,建议使用MMU对内存和外设进行访问控制。

对于非核心Master,不需要pid输入,did_in信号固定为0(eDMC除外)。
MRC/PAC
根据slave port是存储还是外设,对应有MRC和PAC。如上所说,它们基于Domain ID/Priv/Secure信息决定访问权限。
对于MRC/PAC配置寄存器的访问,必须在secure/priv模式下。
根据PAC slot号(需要在S32G文档附带的memory map信息中查询),PAC对应有PDAC_Wx_y寄存器记录相关设置,如果Domain ID/Priv/Secure都符合,那么则允许访问。
MRC流程类似,根据所在地址范围,查询对应的MRCx控制器,基于MRGD_Ww_x寄存器设置判断是否有权限访问。

错误处理
当发生非法访问时,错误信息会记录在域错误寄存器中。
DERRLOCn:哪个PAC/MRC触发的错误
DERRm_W0:访问的地址
DERRm_W1:错误属性,例如哪个MRC,什么类型的访问,哪个域
DERRm_W2:未使用
DERRm_W3:异常完成后再次启用以上寄存器,此时W0/W1信息被清除
Nxp Rm模块可以配置xRDC。

参考
【玩转多核异构】处理器对共享外设和资源的调配方法_卡卡罗特GT的博客-CSDN博客
Understanding the S32G Extended Resource Domain Controller (XRDC) | NXP Semiconductors
Extended Resource Domain Controller xRDC