2023年1月3日 星期二

IPMI的SOL (Serial Over LAN) 和 UART

SOL 全名是 Serial Over LAN, 對BMC來說這個功能和UART息息相關。因此這篇文章主要分為兩個部分:

  1. IPMI的 Serial Over LAN(SOL)是什麼?
  2. 你可能想知道的那些關於UART的東西
    • UART 介紹
    • UART 控制器和序列埠 (UART Controller and COM port)
    • OpenBMC 的code ?

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)中,假如作業系統(發送端)想要傳送一個字元'A' (二進位表示法為:01000001) 給BMC(接收端),在實體線路上,可以有兩種選擇:

  • Parallel communication(並行傳輸):由多條總線同時傳輸欲傳送之資料。因為Clock skew(時序偏移)問題,所以頻率和距離會有所限制。
  • Serial communication(串行傳輸):在單一總線上依序傳輸完資料,因此頻率相對快。目前幾乎取代並行傳輸,最常見的UART、I2C、SPI等都是屬於串行傳輸。

傳輸字元'A' (ASCII: 01000001b) 之範例

在串行傳輸中,又可以分為同步(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傳輸前,接收方須要先知道傳輸方的

  1. 鮑率(Baud rate):單位時間內,訊號狀態變化的次數。例如 115200 bps,表示每秒會傳送115200個bits--> 因此讀取率就是 1/115200=8.6微秒讀取一次訊號。
  2. 封包內的資料長度:通常是 8bits
  3. 開始位與結束位:拉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 (我沒用過,聽說是這包)

沒有留言:

張貼留言

注意:只有此網誌的成員可以留言。