【ARM系列】GIC700 Multichip operation

文章详细介绍了如何通过配置GIC700的寄存器来实现多芯片系统的连接和管理,包括设置RoutingTableowner,连接和隔离芯片的步骤,以及涉及的芯片状态和控制寄存器。重点强调了路由一致性、芯片状态监控和电源管理的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述和寄存器

通过配置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的访问将继续广播到请求唤醒的隔离芯片。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值