【ARM系列】GIC700 Multichip operation

概述和寄存器

通过配置GIC700可以支持Multichip operation。

multichip系统中,每个chip/soc都集成了一个gic700。multichip系统中最多可以包含16个chip。
为了控制配置中所有芯片的一致性,并使GIC对于OS而言表现为单个实体,GIC-700使用了一组定义芯片间连接关系的寄存器。这些寄存器被称为路由表Routing table),有三类寄存器:

1. GICD_CHIPR,Chip Registers
芯片寄存器,这一组寄存器定义了路由表,用于控制multichip system中对应的chip,它指定了该芯片所拥有的SPIs以及如何访问该芯片。该寄存器存在于multichip configuration中的每个芯片中,因此每个chip都有路由表的副本,寄存器编号对应于其chip_id信号的值。
在这里插入图片描述

bitsNameFunction
[63:48]-Reserved
[47:16]ADDR在进行跨片传输时,控制icdrtdest的值。配置参数chip_addr_width控制该位域的位宽
[15]-Reserved
[14:9]SPI_BLOCK_MIN控制一个block中SPI的数量,可配置范围0-62
[8:3]SPI_BLOCKS控制SPI blocks的数量,可配置范围0-62
[2]-Reserved
[1]PUP返回power updata 的状态:
  • 0 = power updata 完成
  • 1 = power updata进行中
[0]SocketStateTo control the state of the chip:
  • 0 = Chip is offline
  • 1 = Chip is online

2.GICD_DCHIPR,Default Chip Registers
默认芯片寄存器,指定负责路由表一致性的当前芯片,并指示何时正在进行更新。允许Secure software访问multichip system中芯片的状态。在multichip configuration中的每个芯片都存在该寄存器的单一副本。
在这里插入图片描述

BitsNameFunctionType
[31:8]-Reserved-
[7:4]rt_ownerRouting table owner:
  • Value = 0-maximum chip
RW
[3:1]-Reserved-
[0]PUPPower update in progress:
  • 0 = PUP not in progress
  • 1 = PUP in progress
RO

3.GICD_CHIPSR,Chip Status Register
芯片状态寄存器,指定芯片当前状态的详细信息。通过Secure Read该状态寄存器,可以获取到在multichip configuration中芯片的状态信息。在multichip configuration中的每个芯片都存在该寄存器的单一副本。
在这里插入图片描述

BitsNameFunction
[31:12]-Reserved,RES0
[11]SPI_busy
  • 0 = no traffic
  • 1 = 正在进行SPI相关的跨片传输
[10]SGI_busy
  • 0 = no traffic
  • 1 = 正在进行SGI相关的传输或非所有core处于asleep
[9]LPI_busy
  • 0 = no traffic
  • 1 = 正在进行LPI相关的传输
[8]CC_busy
  • 0 = no traffic
  • 1 = 正在进行跨片传输
[7:6]-Reserved,RES0
[5:4]RTS路由表状态:
  • 0b00 = disconnected
  • 0b01 = updating
  • 0b10 = consistent
  • 0b11 = Reserved
[3]-Reserved,RES0
[2]GTOGating transaction ongoing,
  • 0 = no accesses
  • 1 = accesses ongoing
[1GTSGating status,
  • 0 = not gated
  • 1 = gated
[0]-Reserved,RES0

复位时,multichip system中的每个chip实际上都是一个独立的全功能GIC。GICD_CHIPSR.RTS==Disconnected,表明此时尚未进行连接。

为了使multichip configuration完全一致,multichip system中的所有芯片都要进行连接,同时指定one chip作为Routing table owner。

当多个芯片连接完成后,每组32个SPIs(SPI block)由某个特定芯片所拥有的,从而完成芯片之间的SPI空间的划分。

A.5 设置多芯片选项

A5.1 Changing Routing Table owner

随时更改拥有路由表的芯片。更改rt_owner的步骤:

  1. 写入GICD_DCHIPR.rt_owner,其中rt_owner的值为新owner的chip_id
  2. 轮询 GICD_DCHIPR.PUP == 0。

注:必须要保证rt_owner是最后进行power down的芯片

A5.2 Connecting the chips

在multichip configuration中连接芯片的过程如下:

  1. 确保所有芯片的chip_id tie-off 输入信号的值正确。

  2. 确保禁用GICD_CTLR中的所有组使能,且GICD_CTLR.RWP == 0(表示没有寄存器正在写)。

  3. 指定一个chip x 来拥有路由表。

  4. 在使芯片online之前,您必须先对所有本地 GICD_CHIPRx.ADDR 字段进行编程,然后再通过向 RT owner写入数据使其online。

  5. 在单个寄存器写入中,使用以下命令对 GICD_CHIPRx 进行编程:
    a. GICD_CHIPRx.ADDR 以便每个芯片都可以将消息转发到芯片 x;

注: 该值由 AXI4-Stream 输入接口 icdrtdest 信号驱动。
根据跨芯片消息的路由方式,该值可以是chip_id,或更复杂的标识符。(需要考虑代码中icdrtdest与chip_id的关系)

b. GICD_CHIPRx.SPI_BLOCK_MIN 和 GICD_CHIPRx.SPI_BLOCKS 为芯片 x 拥有的 SPI 的适当值。

示例:如果chip x 的spi 中断 id 范围为 ID96-ID159:
Set SPI_BLOCK_MIN = (96 - 32) / 32 =2
Set SPI_BLOCKS = (159 - 96 + 1) / 32 = 2

c. GICD_CHIPRx.SocketState = 1

6.读取 GICD_CHIPRx,检查写入是否成功

注: 由于安全设置,SPI重叠或不存在,或另一个更新仍在进行中,可能会导致写入失败。如果访问失败,则GICD_CHIPRx.SocketState == 0,表示芯片离线。

7.要检查此序列的动作是否已正确执行,可以通过读取并检测以下寄存器的值

GICD_CHIPSR.RTS == 2 (Consistent)
GICD_DCHIPR.rt_owner == chip x
GICD_DCHIPR.PUP == 0

结果:chip x 现在处于 Consistent 状态并准备好接受与系统配置中其他芯片的连接。

连接其他芯片:
8.通过写入GICD_CHIPRy,设置下一个要连接的芯片y的相关地址和SPI所有权信息。

注: 您可以通过任何已连接的芯片执行此操作,或者通过写入拥有路由表chip_id == rt_owner 的芯片来更有效地执行此操作。

9.轮询GICD_DCHIPR,直到位PUP == 0,表示连接完成。
10. 读取 GICD_CHIPRy,检查GICD_CHIPRy 的写入是否成功。

对于其他芯片连接,重复步骤 8 到 10。

A5.2 Isolating a chip from the system

使用以下步骤,可以将芯片与系统隔离:

  1. 通过设置 GICR_WAKER.ProcessorSleep 确保芯片上的所有内核都处于睡眠状态。
  2. 确保芯片上的所有 ITS 模块被disable,同时使用 Q-Channel 接口信号qreqn_its 使bus总线处于quiesce状态

注: 在隔离芯片之前,ITS 必须断电,因为当 GIC P-Channel 处于 OFF 状态时路由表是无效的。

  1. 确保来自其他芯片的 LPI 没有路由到该芯片。
  2. 尝试进入CONFIG状态(pstate=0x9)
    如果 GIC 空闲并且已经返回了所有credits,则它接受进入 CONFIG 状态的请求,否则它拒绝请求并保持 RUN 状态。

注: 在接受请求之前,所有 SPI 必须返回到它们自己的芯片。 这意味着启用和挂起的SPI,尽管路由的remote chip上的core 相关的CPU group是disable的,也会阻止转换到 CONFIG 状态。

当处于 CONFIG 状态时,任何改变内部状态的cross-chip message都保存在corss-chip interface中,并且所有消息都断言 pactive。 在尝试进入低功耗状态时,如果pactive 断言,则必须返回到 RUN (pstate == 0x0)。

  1. 在CONFIG 状态下,可以保存任何需要的状态。

注: 除了在硬件复位后恢复保存的值之外,出于任何目的写入 GICD_CHIPRn 或 GICD_DCHIPR 是不可预测的。

  1. 如果使用 GICv4.1,则软件必须从所有其他芯片中写入并轮询至少一个 PE 上的 GICR_VINCHIPR 寄存器。 此检查可确保不存在会不必要地唤醒正在断电的芯片的陈旧缓存 vPE 路由信息。

If using GICv4.1, then software must write and poll the GICR_VINVCHIPR register on at least one PE from all the other chips. This check ensures that no stale cached vPE routing information exists that would unnecessarily wake the chip that is being powered down.

  1. 使用 GICR_PWRR 寄存器关闭再分配器的电源。
  2. 如有必要,使用 GICR_WAKER.Sleep 刷新 LPI 缓存。

Arm建议,如果需要唤醒中断,则在芯片断电时,来自其他芯片的LPI不会以该芯片为目标(步骤3)。此外,当芯片处于断开状态时,来自其他芯片的LPI必须路由返回。

在睡眠被设置为CONFIG状态之后到达的LPI被丢弃

  1. 使用Q通道将GIC置于安全模式进行重置。

如果SPI排序器与分发服务器位于不同的域中,并且只有其中一个域正在重置,则在重置之前,电源Q通道必须也已接受。这可能需要屏蔽GIC之外的中断,以确保所有中断线都已达到空闲状态。
通电与断电顺序相反。但是必须确保在其他寄存器之前恢复路由表,否则行为是不可预测的。将与重置前读取的值不完全相同的值还原到路由表可能会导致不可预测的行为。
对GICD_CTLR的访问将继续广播到请求唤醒的隔离芯片。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: "Linux ARM GIC 中断流程" 是指在 ARM 架构的 Linux 操作系统中,使用 Generic Interrupt Controller(GIC)处理器来管理系统中各种中断的流程。它负责将来自不同设备和外部事件的中断请求,分派给适当的处理程序来处理,并确保系统按顺序执行这些处理程序。中断处理是系统中一个重要的组成部分,它允许设备和软件互相通信,并提高了系统的稳定性和可靠性。 ### 回答2: Linux是一个非常流行的开源操作系统,可以在不同架构的计算机上运行。ARM架构是一种广泛使用的嵌入式系统架构,因此,许多嵌入式设备都使用Linux作为其操作系统。在ARM架构上,通常会使用GIC(通用中断控制器)来管理中断,这个过程可以分为中断触发、CPU响应和中断处理三个部分。 中断触发是指中断信号从设备到达GIC的过程。当一个设备需要发送一个中断时,它会向GIC发送一个中断请求信号,并指定中断号,这个中断号是唯一的,用于区分不同的中断。GIC会根据中断号去查找到这个中断对应的中断控制器,进而把这个请求传递给指定的CPU。 CPU响应是指CPU接收到中断请求信号后的响应过程。当GIC把中断请求传递给CPU时,CPU需要检查是否允许这个中断请求,也就是检查中断屏蔽寄存器(Interrupt Mask Register)。如果这个中断请求已被屏蔽,则CPU不会响应,否则,它会设置自己的中断挂起寄存器(Interrupt Pending Register),告诉GIC它已经准备好去处理这个中断。 中断处理是指CPU执行中断处理程序,处理具体的中断。当CPU设置了它的中断挂起寄存器后,GIC会向CPU发送一个中断信号。CPU会暂停当前的进程,并把当前的上下文信息(比如,寄存器值)保存到内存中。之后,CPU会跳转到中断处理程序(Interrupt Service Routine),开始执行具体的中断处理代码。中断处理程序完成后,CPU会从内存中恢复之前保存的上下文信息,并恢复之前进程的执行。 总的来说,ARM架构上的Linux操作系统通常使用GIC来管理中断,其中包括中断触发、CPU响应和中断处理三个方面。这个流程对于保证系统的稳定性和快速响应非常重要。 ### 回答3: 在ARM架构的Linux系统中,GIC(Generic Interrupt Controller)被用来管理中断。当发生中断时,GIC会将中断信号发送到CPU,然后CPU会停止当前的进程并处理该中断。 GIC的中断流程如下: 1. 报告中断:设备或其他外部事件引发中断信号,设备向GIC发送中断信号,GIC会产生一个中断源标识符,然后将其发给CPU。 2. 响应中断:CPU根据中断源标识符查询GIC,查看中断请求的优先级和处理器状态,如果中断请求的优先级高于当前中断处理器,那么CPU会中止当前进程,执行中断处理程序。 3. 中断处理:中断处理程序会读取设备状态,进行相应的操作,处理完成后会发出一个中断信号,通知GIC中断已被处理。 4. 中断结束:GIC收到来自设备的中断完成信号后,将中断源标识符置为未激活状态。 在这个流程中,GIC起到了一种路由的作用,将中断信号从设备传输到CPU,同时根据中断请求的优先级来优先处理高优先级的中断。这样就可以保证系统的稳定性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值