SOL 全名是 Serial Over LAN, 对BMC来说这个功能和UART息息相关。因此这篇文章主要分为SOL和UART两个部分。
目录
IPMI的 Serial Over LAN(SOL)是什么?
UART 控制器和序列埠 (UART Controller and COM port)
IPMI的 Serial Over LAN(SOL)是什么?
SOL在IPMI Spec中的描述是
Serial Over LAN(SOL) is the name for the redirection of baseboard serial controller traffic over an IPMI session. This can be used to enable asynchronous serial-based OS and pre-OS communication over a connection to the BMC.
简单翻译就是
Serial Over LAN(SOL)就是将BMC的串行控制器在IPMI 连线阶段重新导向,其中包含作业系统与BMC之间的非同步串行传输
在数据传输(Data communication)中,假如OS(发送端)想要传送一个字元'A' (二进位表示法为:01000001) 给BMC(接收端),在实体线路上,可以有两种选择:
- Parallel communication(并行传输):由多条总线同时传输欲传送之数据。因为Clock skew(时序偏移)问题,所以频率和距离会有所限制。
- Serial communication(串行传输):在单一总线上依序传输完数据,因此频率相对快。目前几乎取代并行传输,最常见的UART、I2C、SPI等都是属于串行传输。
在串行传输中,又可以分为同步(synchronous)和异步(Asynchronous)传输
- 同步(synchronous):需搭配Clock讯号,效率高,可一对多。 I2C、SPI属于此类。
- 异步(Asynchronous):效率低,仅可一对一。 UART属于此类。因此IPMI所提及的"Asynchronous serial-based OS communication over a connection to the BMC"指的就是BMC和OS之间的UART传输。
OS会藉由LPC/eSPI与BMC的UART Controller相接,我们就可以透过IPMI指令(ipmitool sol activate)将系统画面导向出来,以便远端去操作OS,其中包含下指令给OS或调整BIOS的设定。
在近年来的服务器设计中,通常板端也会有多个控制器,例如Chassis Manager Controller(CMC)或是FPGA等,他们的debug console也会透过UART接至BMC。大部分SOL预设是导系统画面,可以透过制作OEM指令切换channel,来导出其他serial port画面。
你可能想知道的那些关于UART的东西
UART 介绍
UART全名是Universal Asynchronous Receiver/Transmitter(通用異步接收/发送器),它是一个常用的異步串行传输协议。透过UART传输前,接收方须要先知道传输方的
- 鲍率(Baud rate):单位时间内,讯号状态变化的次数。例如 115200 bps,表示每秒会传送115200个bits--> 因此读取率就是 1/115200=8.6微秒读取一次讯号。
- 封包内的资料长度:通常是 8bits
- 开始位与结束位:拉LOW一个bit表示Start,拉HIGH两个bit表示Stop
因此,如果A、B双方想要进行双向沟通,至少需要三条线
- 发送讯号线:TX
- 接收讯号线:RX
- 参考准位:GND
A的发送讯号线(TX)会接至B的接收讯号线(RX),反之亦然
UART 控制器和序列埠 (UART Controller and COM port)
对BMC来说,UART有分控制器和IO (COM port)
上图是BMC路由拓朴的示意图,硬体线路上,EE会将线路接至特定的IO,BMC需要将IO路由(route)至指定UART控制器(透过设定晶片的暂存器)。图中灰色的线是可以的选择,蓝色是实际路由完的结果。
IO需要路由至控制器,这样BMC才可以处理IO接口进来的讯息;反之,若想将控制器的讯息定向至指定IO,就要将该控制器路由至指定IO。 SOL就是指定要重新定向出哪个UART控制器的画面,因此根据上图的设定,SOL就是重新定向出FPGA的Console 画面。
*BMC Console中可以看到 /dev/ttyS* 指的就是UART 控制器,只是数字不太一样:ttyS0对应到的是UART1 控制器。
详细且正确的路由拓朴可行方式可以参考 ASPEED AST2500/AST2600 Design Guide的"UART Routing Topology"和相关文件
linux/aspeed-g6.dtsi at aspeed-master-v5.15 · AspeedTech-BMC/linux · GitHub
linux/aspeed-uart-routing.c at aspeed-master-v5.15 · AspeedTech-BMC/linux · GitHub
- AST2500 有 5 个 UART Controller和 6 个 UART IO,5 个 UART Controller可以指向 6 个 UART IO 中的任何一个。
- AST2600 则是有 13 个 UART 控制器和 13 个 UART IO 接口,UART1 - UART4 控制器可以定向到前 4 个 UART IO 接口中的任何一个。
另外,AST2500 和 AST2600 预设将 UART1和UART2 控制器分配给OS作为 SuperIO COM port功能。我们可以将UART2 路由至 UART3,并指定SOL路径为/dev/ttyS2 就可以透过IPMI重新定向与OS沟通了。
OpenBMC 的code
UART routing 在DTS中设定
EVB dts: linux/aspeed-ast2600-evb.dts at aspeed-master-v5.15 · AspeedTech-BMC/linux · GitHub
AST2600 dtsi: linux/aspeed-g6.dtsi at aspeed-master-v5.15 · AspeedTech-BMC/linux · GitHub
ast2600的dtsi 预设将UART都连到IO了,所以如果仅想使用某UART 控制器,但是该对应的IO想要做其他用途(例如GPIO),这时候记得在dts 覆写掉 =<>,把控制器和IO的路由断开。
SOL: GitHub - openbmc/obmc-console: OpenBMC host console infrastructure (我没用过,听说是这包)