TZASC地址空间控制器
TZASC 是一种符合高级微控制器总线架构*(AMBA)*的片上系统(SoC) 外设。它是一种高性能、面积优化的地址空间控制器,具有符合 AMBA高级可扩展接口(AXI) 协议和 AMBA高级外设总线(APB) 协议的片上 AMBA 总线接口。
接口如下:
(1)AXI master interface 连接要控制的内存设备
(2) APB interface 连接 AXI to APB bridge (该桥可通过ARM内核直接控制寄存器)
(3)AXI slave interface 连接 AXI接口(读取内存的总线)(程序不可控)
如图2所示,这个系统的 AXI主设备包括ARM processor 和 DSP,通过编写程序控制 TZASC registers 来控制 从机 DMC(动态内存控制)->DRAM的安全和非安全读写。
TZASC具体的功能如下:
(1)能够对每个地址区域设置安全访问权限(可配置的安全地址数量为2,4,8,16)
(2)仅当AXI bus 的安全状态与其寻址的内存区域的安全设置一致时,才允许主设备和从设备之间传输数据。
(3)在使能secure_boot_lock之后主设备对寄存器的写访问
TZASC的输入和输出信号
1、输入信号
输入信号包括时钟信号和复位信号
2、AXI 总线信号
总线信号接口分为 AXI master接口 和 AXI slave接口
1、AXI slave接口
AXI slave接口的宽度为32,主要的信号(这些信号都是由硬件实现)分为五种:
(1)AXI-AW 写地址
(2)AXI-W 写数据
(3)AXI-B 写响应
(4)AXI-AR 读地址
(5)AXI-R 读数据
2、AXI master接口
AXI master接口的宽度为32,主要的信号(这些信号都是由硬件实现)分为五种:
(1)AXI-AW 写地址
(2)AXI-W 写数据
(3)AXI-B 写响应
(4)AXI-AR 读地址
(5)AXI-R 读数据
3、APB总线信号
APB接口的宽度为32位:
4、其他信号
其他信号主要分为secure_boot_lock和tzasc_int
(1)secure_boot_lock 输入信号 控制 lockdown_range speculation_control security_inversion_en这些寄存器的写功能
(2)tzasc_int 输出信号 由Action Register控制当访问权限失败时 tzasc_in传什么状态给中断控制器
TZASC功能特性概述
1、地址域(region)
TZASC 为每个区域提供一个可编程的安全权限字段。安全权限值用于使 TZASC 能够接受或拒绝对该区域的事务访问。arprots[2:0]或awprots[2:0]**信号用于确定该事项的安全设置。
TZASC 始终提供两个区域,区域 0 和区域 1,您可以对其进行配置以提供其他区域。除区域 0 外,TZASC 允许您为每个区域设置以下操作参数:
(1)地址域的启动(Region enable)
(2)安全权限(Security permissions)
(3)基地址(Base address)
(4)每个区域的大小(Size)
(5)子区域禁用(Susbregion disable)
2、优先级(proiority)
区域的优先级是固定的,由区域编号决定。图3显示了一个区域的优先级如何随着区域编号的增加而增加。
当收到命令时,会依次检查其地址是否与所有配置的区域匹配。检查区域的顺序由优先级决定,最高优先级在前(0最高7最低)。第一个匹配地址匹配的区域被用作匹配区域。匹配区域的安全权限决定了命令是否被允许。
3、子区域(Subregion)
TZASC 将每个区域划分为八个大小相等、不重叠的子区域。图4显示了一个示例区域的子区域,该区域被编程为占用 32KB的地址跨度。
除区域 0 外,程序可以对 TZASC 进行编程以禁用组成区域的八个子区域中的任何一个或所有子区域。当子区域被禁用时,其地址范围的安全权限由地址范围重叠的下一个最高优先级区域提供。例如图5。
将region1、region2、region3的部分subregon disable,如图所示各个region是可以重叠的,如果region3的Susbregion 2时disable 的话会首先查看 region2 于其地址重叠的 Susbregion 是否disable 如果 disable 继续查看 region1 直到 region0(该区域不可写) ,如果没有disable ,则该区域的安全权限等于 region2 = sp2
4、安全权限(Region security permissions)
TZASC 使程序能够为它配置的任何Regions设置安全访问权限。一个Region在它的 region_attributes_ 寄存器中分配了一个安全权限字段 sp,使程序能够完全控制该区域的权限。
Region的安全权限设置有两种模式Security inversion和禁用Security inversion模式
默认情况下,如果对区域进行编程以支持非安全访问,TZASC会确保该区域也必须支持安全访问。例如,如果将区域 3 的区域权限编程为非安全只读,则 TZASC 允许访问区域 3 以进行安全读取和非安全读取。如果要求某些区域在安全状态下无法被主设备访问,但在非安全状态下可以访问,那么您必须启用安全反转(Security inversion)。
默认情况下,安全反转被禁用,因此 TZASC 只允许您对安全权限的某些组合进行编程。这些组合确保处于安全状态的主机不会被拒绝访问被编程为仅接受非安全访问的区域。图6显示了禁用安全反转时可能的安全权限。
可以从表中看出sp字段用于控制TZASC的读写权限。禁用Security inversion模式 安全权限 = 非安全权限 + 读/写访问(相关寄存器配置),Security inversion模式 安全权限与非安全权限无关联。图8是例子。
图8中的TZASC属性配置如下:
(1)地址域的启动(Region enable) = Region 字段 = 14个区域
(2)安全权限(Security permissions)= sp 字段
(3)基地址(Base address) = Starting address 字段
(4)每个区域的大小(Size) = Size field 字段 = Region size 字段
(5)子区域禁用(Susbregion disable)图中没有包含
5、被拒绝的AXI命令(Denied AXI transactions)
如果AXI命令没有足够的安全权限,那么TZASC的操作如下:
(1)读操作被拒绝
TZASC 通过将读取数据总线的所有位**rdatas[AXI_DATA_MSB:0]**设置为零来响应主设备。(数据寄存器返回0)
(2)写操作被拒绝
TZASC 通过丢弃**wdatas[AXI_DATA_MSB:0]**包含的数据来防止数据从主机传输到从机。如果您对 TZASC 进行编程以执行推测访问,它会通过设置以下所有位来修改到从设备的传输:
- 将数据总线**wdatam[AXI_DATA_MSB:0]**写入零
- 将数据选通**wstrbm[AXI_STRB_MSB:0]**写入零
6、推测访问(Speculative accesses) (相当于 主设备-> AXI -> TZASC -> AXI ->从设备 中 TZASC的判断)
默认情况下,TZASC 执行读或写推测访问,这意味着它在验证 AXI 命令是否被允许分别读取地址或写入地址之前,将 AXI命令地址转发给从设备。TZASC 只允许在其 AXI 总线接口之间传输数据,在验证访问分别允许读或写访问之后。如果验证失败,则会阻止主机和从机之间的数据传输。
程序可以通过对speculation_control寄存器进行编程来禁用推测访问当推测访问被禁用时,TZASC 再将访问转发给从站之前验证访问的权限。如果 TZASC:
- 允许访问,它开始到从设备的 AXI命令,并增加一个时钟延迟。
- 拒绝访问,它会阻止主设备和从设备之间的数据传输。在这种情况下,从站不知道 TZASC 何时阻止主站访问从站。
7、防止写入寄存器(secure_boot_lock) (写行为的保护)
通过对locking_select和lockdown_range寄存器进行编程并置位secure_boot_lock信号,程序可以锁定TZASC 的行为,以防止意外或错误地写入locking_range寄存器中指定的区域。但是,允许对这些区域进行读访问。
TZASC 的secure_boot_lock信号至少在一个时钟周期内被置位。在secure_boot_lock之后的一个时钟被TZASC采样为高电平,则无法写入使用locking_range 和locking_select 中锁定区域中的寄存器,除非通过使能aresetn重置TZASC。
8、使用锁定的命令序列(Using locked transaction sequences)
如果锁定命令序列跨越 4KB 边界并且区域具有不同的区域权限,TZASC 可能会阻止访问第二个区域,因此从站将不会收到锁定命令序列的后半部分。(注:AXI 协议建议锁定事务序列不要跨越 4KB 地址边界)
安全状态更改
在一个锁定的命令列中,如果一个 master 改变了**arprots[1]或awprots[1]**的状态,并且该区域对安全状态和非安全状态有不同的区域权限,TZASC 可能会拒绝交易,因此从站不会接收锁定交易序列的后半部分。
读取和写入
在锁定事务序列期间,如果主节点对区域执行读写操作,根据区域权限,TZASC 可能会拒绝事务,因此从节点将不会收到锁定事务序列的后半部分。
9、使用独占访问(Using exclusive accesses)
如果主机执行对地址区域的独占访问,则必须对 TZASC 进行编程以允许对该地址区域的读写访问,对于**arprots[1]和awprots[1]**的预期设置,否则读取或写入命令可能会失败.
TZASC寄存器配置
TZASC 的寄存器映射跨越 4KB 区域,如图9所示。
如上图所示,寄存器根据功能分为6组:
配置、锁定和中断(Configuration, lockdown, and interrupt):使用这些寄存器来确定 TZASC 的全局配置,并控制其操作状态。
失败状态(Fail status): 这些寄存器提供有关由于权限不足而失败的访问的信息。
控制(Control): 使用这些寄存器使 TZASC 能够执行安全反转(Security inversion)或推测访问(Speculative accesses)。
区域控制(Region control):使用这些寄存器来控制每个区域的操作状态。
集成测试(Integration test):测试 TZASC 在片上系统(SoC) 中的集成时使用这些寄存器。
组件配置(Component configuration):这些寄存器允许通过软件识别系统组件。
1、配置、锁定和中断(Configuration, lockdown, and interrupt)
Configuration Resgister (0x000)
目的:提供有关TZASC配置的信息
使用限制:无
配置:适用于TZASC的所用配置
属性:type RO reset 取决于TZSAC其他寄存器配置
功能:no_of_regions:读取 regions块数
address_width:AXI地址总线的宽度
Action Register (0x004)
目的:控制 TZASC 对区域权限失败的响应信号行为。
使用限制:无
配置:适用于TZASC的所用配置
属性:type RW reset 0x00000001
功能:reaction_value:TZASC在区域权限配置失败时发出的信号配置
Lockdown Range Register (0x008)
目的:控制锁定区域的范围。 LOCK
使用限制:lockdown_select寄存器可以限制该寄存器的访问类型为 RO
配置:适用于TZASC的所用配置
属性:type RW reset 0x00000000
功能:enable : 使能Lockdown Range Register
lockdown_regions:设置锁定区域
Lockdown Select Register(0x00C)
目的:控制 TZASC 是否允许对以下寄存器进行写访问: Lockdown Range Register Speculation Control Register Security Inversion Enable Register
使用限制:在aresetn变为高电平后,如果secure_boot_lock保持为低电平,TZASC 仅允许对该寄存器的写访问。当secure_boot_lock在一个aclk周期内为高电平时,TZASC将忽略对该寄存器的写操作。
配置:适用于TZASC的所用配置
属性:type RW(如果在复位时secure_boot_lock设置为HIGH,则访问类型为RO) reset 0x00000000
功能:acc_speculation_cntl: Speculation Control Register 写权限使能
sercurity_inv:Security Inversion Enable Register 写权限使能
region_register: Lockdown Range Register 写权限使能
Interrupt Status Register(0x010)
目的:返回中断状态(内存访问失败 会触发中断)
使用限制:无
配置:适用于TZASC的所用配置
属性:type RO reset 0x00000000
功能:overrun: 设置为1时,表示自上次中断清除以来发生了两次或两次以上的区域权限失败
status: 中断状态
Interrupt Clear Register(0x014)
目的:清除中断
使用限制:无
配置:适用于TZASC的所用配置
属性:type WO reset 0x00000000
功能:置一清空 Interrupt Status Register 相应的 bit
2、失败状态(Fail status)
fail_address_low(0x020)
目的:清除中断后,返回区域权限失败的第一次访问的地址,即低 32 位。
使用限制:无
配置:适用于TZASC的所用配置
属性:type RO reset 0x00000000
功能:置一清空 Interrupt Status Register 相应的 bit
fail_address_high(0x024)
目的:清除中断后,返回区域权限失败的第一次访问的地址,即高 32 位。
使用限制:无
配置:仅当 TZASC 的 AXI 地址宽度大于 32 位时才可用。
属性:type RO reset 0x00000000
功能:置一清空 Interrupt Status Register 相应的 bit
fail_control(0x028)
目的:清除中断后,返回第一个区域权限失败的访问的控制状态信息。
使用限制:无
配置:适用于TZASC的所用配置
属性:type RO reset 0x00000000
功能:write: 访问命令是 读访问 还是 写访问
nonsecure: 未通过访问的权限是 安全访问 还是 非安全访问
privileged: 未通过访问的权限是 特权访问 还是 非特权访问
fail_id(0x02C)
目的:清除中断后,返回区域权限失败的第一次访问的主设备AXI ID。
使用限制:无
配置:适用于TZASC的所用配置
属性:type RO reset 0x00000000
功能:id: 返回拒绝访问的主设备id
3、控制(Control) (推测功能和 安全反转功能的使能)
speculation_control(0x030)
目的:控制读访问推测和写访问推测。
使用限制:lockdown_select Register可以限制该寄存器的访问类型为 RO
配置:适用于TZASC的所用配置
属性:type RW reset 0x00000000
功能:write_speculation:控制写访问推测
read_speculation:控制读访问推测
security_inversion_en(0x034)
目的:控制 TZASC 是否启用安全反转发生。
使用限制:lockdown_select Register可以限制该寄存器的访问类型为 RO
配置:适用于TZASC的所用配置
属性:type RW reset 0x00000000
功能:security_inversion_en: 是否允许安全反转功能。这使得处于非安全状态的主控可以访问区域,但处于安全状态的主控无法访问该区域。
4、区域控制(Region control)
region_setup_low_0 - region_setup_low_15(0x100 + 0x010 x n)
目的:配置Region区域的基地址[31-0]
使用限制:无
配置:适用于TZASC的所用配置
属性:type RW reset 0x00000000
功能:base_address_low : 配置region块的基地址 基地址能整除32KB
region_setup_high_0 - region_setup_high_15(0x104 + 0x010 x n)
目的:配置Region区域的基地址[63-32]
使用限制:无
配置:适用于TZASC的所用配置
属性:type RW reset 0x00000000
功能:base_address_high : 配置region块的基地址
region_attribute_size_0 - region_attribute_size_15(0x108+ 0x010 x n)
目的:控制Region0的权限。对于所有其他Regions,它控制权限、区域大小、子区域禁用和区域启用。
使用限制:无
配置:适用于TZASC的所用配置
属性: (region_attribute_size_0)type RW reset 0xc0000000
(region_attribute_size_1- region_attribute_size_15)type RW reset 0x0000001c
功能: sp:每个区域的安全权限设置
subregion_disable:
size:该区域的大小
en: 是否使能该区域
5、集成测试(Integration test) (读取secure_boot_lock状态,写入tzasc_int )
Integration Test Control Register(0xE00)
目的:启用集成测试逻辑。
使用限制:在集成测试模式下使用它
配置:适用于TZASC的所用配置
属性:type RW reset 0x00000000
功能:nt_test_en 启动系统测试逻辑
Integration Test Input Register(0xE04)
目的:使处理器能够读取secure_boot_lock的状态。
使用限制:必须启用集成测试逻辑,否则读取 return 0x0
。
配置:适用于TZASC的所用配置
属性:type RW reset 0x00000000
功能:itip_secure_boot_lock:读取secure_boot_lock的状态 0:低电平 1:高电平
itop(0xE08)
目的使处理器能够在集成测试模式下设置tzasc_int的状态。
使用限制:必须启用集成测试逻辑,否则它会忽略写入和读取返回0x0
。
配置:适用于TZASC的所用配置
属性:type RW reset 0x00000000
功能:itop_int:写入tzasc_int 0:低电平 1:高电平
6、组件配置(Component configuration) (ARM官方用来记录组件信息的寄存器,无具体功能实现)
periph_id_4(0xFD0) periph_id_[3:0] (0xFE0-0xFEC)
目的:外设识别寄存器提供有关外设配置的信息。每个寄存器提供 8 位数据,但由于某些字段跨越两个相邻的 periph_id 寄存器(一共六个信息记录在五个寄存器中)。
属性:type RO reset 0x001BB380
功能:RevAnd:标识制造商修订号 -> periph_id_3[7:4]
mod_number:标识与 ARM 合作伙伴相关的数据 -> periph_id_3[3:0]
revision:标识 TZASC 的修订版
jedec_used:JEP106分配的制造商标识码。这个位总是读回0x1 ->periph_id_2[3]
JEP106[6:0]:标识设计者。设置为 b0111011,表示 ARM 设计了外设 -> periph_id_1[7:4] = JEP106[3:0] periph_id_2[2:0] = JEP106[6:4]
part_number:标识外围设备。TZASC 的部件号是0x380 -> periph_id_0[7:0] = 0x80 periph_id_1[3:0] = 0x3
periph_id_0
periph_id_1
periph_id_2
periph_id_3
periph_id_4
component_id_[3:0] (0xFF0-0xFFC)
目的:控制读访问推测和写访问推测。
属性:type RO reset 0xB105F00D
功能: component_id
component_id_0
component_id_1
component_id_2
component_id_3
TZASC寄存器配置相关问题及其记忆难点
(1)问题:当总线访问权限错误时,如何向中断控制器发送(权限错误)中断。
通过Action Register寄存器配置器中断触发的高、低电平输入的中断控制器
(2)问题:推测访问(Speculative accesses)
在文档中推测访问的概念好像是在 从设备 -> TZASC 传输完信号之后,先判断器的读写权限,如果使能推测访问,该信号如果权限不足则自动放弃。(这个希望哪位大佬看见了能评论一下自己的见解)
(3)问题:安全权限中的安全反转模式(Security inversion)
这个安全反转模式应该是颠覆了正常人类思维的概念,常规想法是非安全模式下对该区域具有读/写访问权限,所以安全模式下也应该对该区域具有读/写访问权限,而安全反转模式这种观念是错误的(具体看上述图标中的配置)
(注:该文章只是梳理了DDI0431C_tzasc_tzc380_r0p1_trm.pdf文档,方便学习以及工作中使用)