内存映射方式

LAWs 本地访问窗口

ATMUs 地址转换与映射单元

配置、控制、状态寄存器 CCSRs

芯片地址范围

逻辑

虚拟

物理(真实)

内部地址空间

内部配置、控制、状态寄存器 CCSRs地址空间

PCIE链路扩展内存、IO、和配置地址空间

串行 RapidIO 扩展地址空间

        

MMU单元功能:将逻辑(有效)地址转换为虚拟地址,并最终转换为本地空间中的物理地址

本地空间: e500 核心在访问内存和 I/O 孔家是所看到的 36位 物理地址空间。

1、DMA 所看到的也是同样的本地地址空间映射

2、所有通过DDR、增强本地总线控制器的内存空间也存在这个地址映射。

3、所有内存映射配置、控制、状态寄存器(CCSRs)也是在这个地址映射。

本地地址映射通过一组12个访问窗口定义,每个窗口都将本地地址空间的一个区域映射到一个特定的目标接口。例如:

DDR controller

enhanced local bus controller

serial RapidIO controller

PCI Express controller

or other targets

所有功能块的内部配置、控制和状态寄存器(CCSRs)都位于一个特定的CCSR窗口上的本地内存空间中.

Outbound ATMUs 将本地36位地址空间转换到外部接口

Inbound   ATMUs 将外部接口转换到本地36位地址空间

一、CCSRs

1、所有内存映射配置、控制、状态寄存器包含在 1M 地址空间中

2、CCSR block 可以在本地地址空间重定位

3、本地地址映射被 CCSR 块的配置、状态基址寄存器(CCSRBAR)控制,默认值为(0x0_FFE0_0000)(or 4 Gbytes-9 Mbytes)。

4、CCSR 窗口总是启用的,并且固定在 1M 空间

实例:

emmc sdr50_emmc sdr50

 


CCSR 访问方式

1、通过本地处理器(e500)访问 CCSR 空间。访问 CCSR 空间时,CCSR 内存空间通常应该标记为缓存抑制和保护。在访问其他内存空间时,必须确保 CCSR 配置已经生效,最后配置寄存器的写操作,应该配有对该寄存器的读,然后再写入 SYNC 指令。

2、从外部主服务器访问 CCSR 内存, ccsr还可以从外部PCIExpress接口访问,通过外部 I/O 设备配置核心。通过一个编程模式接口的寄存器定义的窗口访问本地内存映射的 CCSR 区域,外部主机可以通过外部内存映射访问这个寄存器。例如:PCIE 基地址可以通过 PCIE 配置状态寄存器基地址寄存器(PEXCSRBAR)选择访问本地 CCSR 内存空间。此寄存器偏移 0x10, 外部 PCIE 外部主机通过对此设备执行一个 PCIE 配置周期来设置此寄存器。

PCI Express主机对PEXCSRBAR指示的PCI Express地址范围的后续内存访问被转换为CCSRBAR当前设置指示的本地CCSR地址。

一、 CCSR 空间组成 (Organization of CCSR space)

1、通用实用程序寄存器 (General Utilities)

        0x0_0000 ~ 0x3_FFFF

1) 每个功能块在此区间分配 4k 字节地址范围

emmc sdr50_地址映射_02

 

2) 单个功能块 4k 空间经典定义

        前 3k 字节一般定义为通用寄存器,如果功能块是 ATMUs,后面的512字节定义为转换与映射寄存器,如果功能块存在错误管理寄存器,一般存放在块基地址偏移 0xE00 的位置,调试寄存器一般定义在最后的 256K 字节,块基地址偏移 0xF00 的位置。

emmc sdr50_寄存器_03

 

2、可编程中断控制寄存器 (PIC)

分配 CCSR 空间中的第二个 256K 字节        0x4_0000 ~ 0x7_FFFF

PIC 寄存器只能32位读写

emmc sdr50_emmc sdr50_04

 

3 串行 RapidIO 寄存器 (serial RapidIO registers)

此模块使用 128K 字节的 CCSR 空间

所有寄存器 32 位宽,只能 32 访问, 4K 字节的 RapidIO 工具块(implementation block) 与 General Utilities 中的功能块有相同的组织结构。

emmc sdr50_寄存器_05

 

4、设备特定实用程序寄存器 (Device-specific utilities registers)

此寄存器模块不是某个功能单元特有的,而是针对这整个设备的。

占据 CCSR 空间的最高 256K 字节,由电源管理、性能监视器、device-wide debug utilities。只能32位访问,其他位宽访问认定为编程错误或操作为定义。

emmc sdr50_嵌入式硬件_06

二、CCSR 地址映射 (CCSR  address map)

所有 CCSR 寄存器地址都是由 CCSRBAR 中指定的 CCSR 窗口基地址(默认地址0x0_FFE0_0000) + 功能块基地址 + 指定寄存器在功能块中的偏移。

CCSR 地址映射表 (参考p2020开发板手册2.3(page 94))

emmc sdr50_地址映射_07

 

emmc sdr50_寄存器_08

 

emmc sdr50_地址映射_09

 

emmc sdr50_寄存器_10

 


二、 本地访问窗口 (local access windows)

本地地址映射由一组 12个本地访问窗口定义 (LAWs)

每个窗口将本地36位地址空间中一个可编程空间(4K bytes ~ 32G bytes)映射到指定目标接口,每个窗口由一个基地址寄存器定义,此寄存器指定窗口的起始地址,一个属性寄存器指定映射是否使能,窗口大小,窗口的目标接口。LAW 不执行任何地址转换,本地访问窗口寄存器作为本地访问块的一部分存在于CCSR空间中的通用实用程序寄存器中。 (CCSR ->general utilities registers -> local access)。除了配置空间由 (CCSRBASR) 映射和默认的 boot ROM 空间,其他空间映射都必须由 LAW 映射。这包括由入站ATMU窗口映射的地址。因此,本地访问窗口和入站ATMU窗口的目标映射必须保持一致。

LAWs

1、本地访问窗口的优先级(Precedence:优先级)

两个窗口映射重叠,窗口号小的拥有更高优先级。例:窗口1映射的空间与窗口2的空间存在重叠


emmc sdr50_emmc sdr50_11

 

2、配置本地访问窗口 (configuring local access windows)

自一个本地访问窗口被使能,系统中任何设备使用这个窗口时,都不应该修改它。

一个新窗口不应该被使用, 直到对窗口的写入效果对使用该窗口的所有块都可见。在使能其他设备使用这个窗口前,应该通过读取最后一次窗口配置寄存器的值,确保窗口配置完成。配置完最后一个窗口寄存器后,应该读取最后一个窗口寄存器,然后使用 iSYNC 指令。


3、区分本地访问窗口与额外映射功能( Distinguishing local access windows frim other mapping functions)

区分目标接口执行的映射功能来自于本地访问窗口,还是额外映射功能。

LAWS定义一个事件如何通过设备内部连接从事件源被路由到目标地址。

在事务到达其目标接口后,该接口控制器可以执行额外的映射。例:

DDR控制器具有将内存请求映射到特定的外部设备的芯片选择寄存器。

额外映射功能被配置通过编程各个接口的 CCSRs.

窗口和芯片选择区域或出站ATMU窗口之间不需要一对一的对应关系。在目标接口处,单个窗口可以进一步解码为任意数量的芯片选择或任意数量的出站ATMU窗口。

4、本地访问窗口与 DDR 芯片选择之间的非法交互

如果本地访问窗口将一个地址映射到DDR控制器以外的接口,则在DDR控制器中不应该有为相同地址配置的有效芯片选择。

由于DDR芯片的选择边界是由起始地址和结束地址定义的,因此很容易定义它们,以便它们不会与映射到其他接口的法律重叠。

5、典型本地地址映射例子

emmc sdr50_地址空间_12

 

emmc sdr50_嵌入式硬件_13

 


三、本地访问窗口寄存器 (local access window registers)

本地访问窗口寄存器通过读写一个地址被访问,该地址由基地址(CCSRBAR) + 块基地址+ 指定寄存器在块中的偏移地址构成。LAW 块基地址为 0x0_0000; 所有的 LAW 寄存器都应该是用32位(4字节)访问。LAW 寄存器映射表:

emmc sdr50_地址映射_14

emmc sdr50_地址空间_15

 

LAW registers

1、local access window 0 base address register

       本地访问窗口0 基地址寄存器 (LAW_LAWBARn)

LAW_LAWBARn 定义高24位有效,用来固定本地地址空间中每个窗口的位置。请注意,任何LAW的最小大小都是4kbytes,因此不能指定基本地址的12个最低阶位。

address = 0h base + C08H offset (32d * i), where i = 0d ~ 11d (12个窗口)

emmc sdr50_地址映射_16

 

2、local access window 0 attribute register (LAW_LAWARn)

 本地地址访问窗口0属性寄存器

AWARn 寄存器被用于使能指定本地访问窗口,定义他们的大小和指定目标接口。

配置寄存器是由ccsrbar定义的窗口映射的。CCSR映射将取代本地访问窗口映射,因此配置寄存器不会作为本地访问窗口的目标出现。每个LAW指定目标接口使用如下编码

emmc sdr50_嵌入式硬件_17

emmc sdr50_地址映射_18

emmc sdr50_emmc sdr50_19

 

 address = 0h base + C10H offset (32d * i), where i = 0d ~ 11d (12个窗口)


emmc sdr50_寄存器_20

 

emmc sdr50_地址空间_21

 

 四、地址转换与映射单元 (ATMUs)

为了便于灵活地定义外部接口如串行RapidIO和PCIdIxprex的地址映射,该设备提供了地址转换和映射单元(ATMUs),功能:

1、转换一个36位本地地址到一个外部地址空间

2、转换外部地址到36位本地地址空间

3、为事务处理分配属性

4、为一个目标接口映射一个本地地址

出站地址转换和映射是指地址从本地36位地址空间到外部地址空间和特定I/O接口的属性的转换。

入站地址的转换和映射指的是一个I/O接口的外部地址转换到一个本地地址空间的地址(理解为这个设备的内部接口)。同时也表示事务到一个目标接口的映射与事务的属性分配。在映射一个事务到目标接口时,一个入栈 ATMU 窗口执行的功能类似一个本地访问窗口。入栈 ATMU 创建的一个目标映射必须与那些 LAWs 保持一致。意思是:一个 inbound ATMU 映射一个事务到指定的本地地址和指定的目标,一个 LAW也必须映射同样的本地地址和目标。

定义ATMU窗口的翻译和映射函数的所有配置寄存器都遵循相同的通用寄存器格式,如下表所示。

emmc sdr50_emmc sdr50_22

 窗口的大小必须是2的幂。为了执行转换或映射功能,将事务的地址与每个窗口的基本地址寄存器进行比较。在比较中使用的位数由每个窗口的大小属性决定。当地址到达窗口时,如果正在执行地址转换,则通过将窗口偏移量连接到转换地址来创建新的转换地址。同样,窗口大小属性决定了转换了多少位。

1、outbound ATMUs

如果本地访问窗口执行的目标映射将事务指向其中一个外部接口(作为出站读或写),则通过与外部接口关联的出站ATMU将事务映射到该接口的外部地址空间。出站 ATMUs 执行从本地36位地址空间到 PCIExpress 和串行 RapidIO 的地址空间的映射,这可能比本地空间大得多。出站atmu 还可以映射事务类型和优先级等属性。

每个串行 RapidIO 控制器都有8个出站ATMU窗口加上一个默认窗口。如果事务的地址没有击中八个出站ATMU窗口中的任何一个,则使用默认窗口定义的转换属性。默认窗口总是启用的。有关串行 RapidIO 出站 ATMU 窗口的详细描述,请参阅端口1 RapidIO 出站窗口转换地址寄存器n(SRIO_P1ROWTARn)。

PCI 快速控制器有四个出站 ATMU 窗口和一个默认窗口。如果事务的地址没有击中四个出站ATMU 窗口中的任何一个,则将使用默认窗口定义的转换属性。默认窗口总是处于启用状态。PCIE 出站atmu包括扩展的转换地址寄存器,以便最多可以支持64位的外部地址空间。有关 PCI出站 ATMU 窗口的详细描述,请参见PCI快车出站ATMU窗口。


2、Inbound ATMUs

入站ATMUs执行从外部地址空间到本地地址空间的地址转换,将属性和事务类型附加到事务,并将事务映射到其目标接口。

每个串行RapidIO控制器都有四个入站ATMU窗口,再加上一个默认窗口。如果入站事务的地址没有击中四个入站ATMU窗口中的任何一个,则将使用默认窗口定义的转换属性。默认窗口总是启用的。有关串行RapidIO入站ATMU窗口的详细描述,请参见端口1RapidIO出站窗口转换地址寄存器n(SRIO_P1ROWTARn)。

PCI快速控制器有三个通用的入站ATMU窗口和一个默认窗口。有关PCI快速入站ATMU窗口的详细描述,请参见PCI快速入站ATMUs。

1、入栈ATMUs 与 LAWs 之间的非法交互

由于本地访问窗口和入站atmu都将事务映射到目标接口,因此它们之间不能相互矛盾。

例如,如果结果转换的本地地址通过本地访问窗口映射到PCI快速接口(目标接口0b0_0000),则使用入站ATMU将事务映射到DDR内存控制器(目标接口0b0_1111),则被认为是编程错误。这种编程错误可能会导致不可预测的系统死锁。