---
# System prepended metadata

title: IPMI
tags: [IPMI, ' BMC']

---

---
title: IPMI
tags: IPMI, BMC
---
[toc]
# **Regarding IPMI and BMC**
## **名詞解釋**
- IPMB：Intelligent Platform Management Bus，以i2c為基礎的一個Bus，用來管理BMC和其週邊的裝置
- ICMB：Intelligent Chassis Management Bus，提供一個標準介面來管理機箱的設備，例如PSU、FAN、LET
- SEL：system event log，存放在非揮發性的儲存裝置中，IPMI也可透過IPMB將event message加到SEL
- FRU：Field Replaced Unit，存放serial number、產品編號、型號和庫存編號
- IPMI messages：使用訊息為基礎的方式讓不同的subsystem例如IPMB、LAN、ICMB可以連接到BMC，
可將它分為request和response 兩個protocol，request就是我們常用的IPMI command，由Network Function 、command和data欄位組成，而response則額外加上了completion code欄位
- SDR：sensor data record，紀錄sensor的值
- SOL：serial over LAN，一種通過網路連接到遠端伺服器的控制台技術，通過SOL，Admin可以透過網路訪問服務器就像直接連接到server一樣
- KVM：keyboard video mouse，一種遠端管理技術，讓我們可以透過網路連接到遠端server的圖形控制台
- RPC：Remote Procedure Call
- SNMP：Simple Network Management Protocol
- DMI：Desktop Management Interface由Desktop Management Task Force (DMTF) 所草擬
DMI-MI(Management Interface)
DMI-CI(Component Interface)
DMI SERVICE PROVIDER 透過 Component Interface(CI)
取得作業系統和相關軟硬體的資訊並且將這些資訊存在MIF DB (Management Information Format 資料庫)這些MIF DB中的資料都具備標準格式所以不同的管理軟體都可以透過Management Interface來取得MIF DB中的資料
- System Event Log (SEL) and Event Messages：BMC提供系統事件紀錄，並存放在非揮發性的儲存裝置確保系統發生錯誤時SEL仍是可用的。
而Event Message是用來將event加入SEL的，且Event Message可以透過IPMB的方式傳送到BMC，我們將產生event message並透過IPMB送到其他控制器的控制器稱為IPMB event generator，接收event的則稱為IPMB event receiver，BMC就是一個典型的event receiver。
管理控制器需要知道sensor type和event type才可以將資訊放入event message，這通常會寫再控制器firmware裡面，但IPMI也可以透過command將sensor和event type於控制器初始階段時寫入，或讀取這些資訊
- AMBA（Advanced Microcontroller Bus Architecture）是由ARM（Advanced RISC Machines）公司提出的一種開放的、可延伸的處理器系統互連架構。AMBA提供了一系列標準的匯流排規範，
旨在連接處理器核心、記憶體、週邊設備和其他IP核心，以構建高效、靈活且易於整合的SoC（System on Chip）設計。
```
AMBA的主要匯流排規範包括：
AHB（Advanced High-performance Bus）：高性能匯流排，用於連接處理器核心、高速外設和記憶體等主要元件，提供高頻寬和低延遲的通信。
APB（Advanced Peripheral Bus）：低功耗匯流排，用於連接處理器和低頻週邊設備，提供簡單且低功耗的通信。
AXI（Advanced eXtensible Interface）：高度可擴展的匯流排，用於連接處理器、高速週邊設備和其他IP核心，支援高性能和高頻寬的通信。
ACE（AXI Coherency Extension）：擴展了AXI匯流排，提供一致性（coherency）支援，用於連接多個處理器和高速記憶體控制器。
AMBA架構被廣泛應用於ARM架構的SoC設計中，是許多現代處理器和嵌入式系統的主要互連架構，它的主要目標是促進SoC設計的標準化和可重用性。透過AMBA的標準規範，不同供應商的處理器核心、IP核心和週邊設備可以更容易地相互連接和整合，從而加快系統開發時間，提高設計的彈性和效率。
```
- APB（Advanced Peripheral Bus）縮寫為APB bus，是一種在ARM架構的系統中用於連接外設的簡單、低速串行匯流排。APB bus是ARM處理器與外部週邊設備之間的通信通道。
在ARM處理器的SoC（System on Chip）中，通常會有多個外設，例如UART（通用非同步收發傳輸器）、SPI（串列外設接口）、I2C（I²C）等。這些外設需要與處理器進行通信，以進行數據的傳輸和控制。
APB bus的特點是簡單、低速和節能。它通常用於連接低頻的週邊設備，並且其設計主要考慮了功耗和面積的優化。APB bus的速度相對較低，適用於不需要高頻寬的外設，因此不適用於高速的數據傳輸。
在ARM架構中，還有其他高速串行匯流排，例如AHB（Advanced High-performance Bus）和AXI（Advanced eXtensible Interface），它們更適合高速數據傳輸和高性能需求的設備。這些匯流排在SoC中按需使用，以滿足不同外設的連接要求。

- MBus（Microcontroller Bus）是一種用於低功耗微控制器和嵌入式系統中的串行匯流排。MBus的設計目標是在低功耗和高效能的條件下，連接微控制器和其它週邊設備，提供高度節能和適合嵌入式應用的通信解決方案。
MBus主要用於微控制器的通信，包括了傳感器、記憶體、時鐘、控制器等外設裝置。由於在嵌入式系統中，功耗和效能通常是首要考慮的因素，MBus在設計時將這些需求納入考量，因此通常會有以下特點：
低功耗：MBus設計為低功耗通信，避免了高功率消耗，因此非常適合嵌入式系統，尤其是運行於電池供電的應用。
簡單和輕量：MBus的協定相對簡單，不需要複雜的控制和驅動電路，這有助於減少外設的成本和面積。
高效率：MBus的通信協定設計為高效率，能夠在短時間內完成數據的傳輸，這對於低延遲和快速回應的應用很重要。
靈活性：MBus支援多種不同的通信模式，包括點對點（Point-to-Point）、多主控制器（Multi-Master）、多從設備（Multi-Slave）等，這使得它適用於各種不同的應用場景。
MBus通常用於輕量、低功耗、嵌入式的應用，例如智慧穿戴裝置、嵌入式感測系統、物聯網（IoT）設備等。它提供了一個有效且可靠的通信解決方案，使得這些應用能夠在有限的資源下實現高效的數據傳輸和控制。

- AXI（Advanced eXtensible Interface）是ARM架構中高性能、高頻寬的串行匯流排，被廣泛用於連接處理器、記憶體、高速週邊設備和其他IP核心的系統互連。AXI bus提供了一個高效的通信通道，支援高度並行處理，使得多個主控制器可以同時訪問共享資源，大大提高了系統的整體性能。
AXI bus的主要特點如下：
    1. 高性能：AXI bus設計用於支援高頻率和高性能的處理器和週邊設備，它提供了快速的數據傳輸和低延遲的通信，有助於實現高效的數據處理和高性能計算。
    2. 高頻寬：AXI bus具有寬闊的資料通道，能夠同時傳輸多個數據位元，提供了更高的數據傳輸速率和頻寬，適合連接高速的記憶體和高速週邊設備。
    3. 多主控制：AXI bus支援多個主控制器，這意味著多個裝置可以同時訪問共享的資源，提高了系統的並行處理能力。
支援Out-of-Order Transaction：AXI bus支援無序事務處理，這使得主控制器可以以無序方式發送和處理數據事務，從而提高了系統的吞吐量。
    4. 支援節能功能：AXI bus支援節能功能，例如能夠在空閒時自動進入節能模式，降低功耗。

AXI bus通常用於高性能的處理器、高速記憶體控制器、高速DMA（Direct Memory Access）控制器和其他需要高頻寬和高效率通信的IP核心之間的連接。在ARM架構中，AXI bus是目前最常用的高性能匯流排，特別適用於複雜的SoC（System on Chip）設計，可以有效地處理高速數據傳輸和高度並行的要求。

- multi function pin(GPIO)：查2400 data sheet(page 448為address)，multi function pin(page 108)
>[!Note]
IPMI SPEC 重要chapter 1、2、5、9、31、36

```
42.2 Sensor Type Codes and data 定義SEL的sensor Type
page 529 Table 42 Event/Reading Type Code Ranges 定義SEL的event type

ipmi_msghandler：傳入和傳出訊息處理程序 (incoming and outgoing message handler)
ipmi_devintf：IPMI driver的字符設備介面 (character device interface to IPMI driver)
對於2.4.x和早期2.6.x kernel，您需要根據硬體支持的系統介面類型選擇module。例如：
ipmi_kcs_drv：Keyboard Controller Style (鍵盤控制器樣式) driver
最新的2.6.x kernel已將這些整併到一個module中：
ipmi_si：通用的IPMI系統介面driver
```
- BMC Message Bridging用於橋接兩個media的通訊，只用於傳遞不同channel的訊息，不用於傳遞同channel的訊息
SMS : System Management Software
SMS_ATN page 64,81~86,89, 91~95, 108
## **KCS**
source code在kcs_hw package
系統默認分配給KCS的port 是CA2h，使用IO空間，對應ast2500的KCS通道3
channel : CA0
channe2 : CA8
channe3 : CA2
KCS的暫存器是在BMC裡implement的，一共四個register，每個register占1byte，
系統側通過IO訪問這四個register來達到操作KCS的目的。
當系統端向BMC發送KCS請求時，IBF會被設置1，觸發BMC的KCS中斷，BMC在KCS中斷後讀取status register，判斷現在的狀態然後設定S1和S0，KCS的接收和發送都是透過中斷完成的，系統向BMC寫資料稱KCS write，BMC向系統寫data稱KCS read

第九章:(以System management software視角, 可視為BIOS)
四種resigister:
Status(Read only)
Command(Write only)
Data-In(Write only)
Data-Out(Read only)
當BIOS想要從BMC讀取資料時，會在Command and Data-In寫入Command想讀取的資料。同時Status的ibf bit設為1(推測是KCS driver作用)。若BIOS想繼續對Command和Data-In寫資料。須等ibf bit被clear(=0)此動作根據spec需有等待時間。建議五秒以上。BMC會將要給BIOS的資料寫到Data-Out register。之後會將status的obf bit設1。當BIOS確認obf bit為1後，再去讀取。同樣BIOS確認obf bit也建議等到五秒以上。

command相關，請參考page 612
- SetUserName
```
ipmitool user set name [user ID] [user name]
	ex: ipmitool user set name 3 Allen
The corresponding IPMI command formats in “intel _ipmitool” are:
SetUserName
ipmitool  0x20 0x18 0x45 5 0x64 0x61 0x64 0x00-zero padded to 16 =>ipmitool raw 0x45 5 0x64 0x61 0x64 0x00
	    BMCaddr/NetfunLun/cmd/ID/name
```
- Get message command
```
ipmitool  0x20 0x18 0x33  => ipmitool raw 0x33
For example
[IPMItool in Linux] Hint: hover over Place your mouse over the highlighted area in below
for Response Data description
$ ipmitool raw 0x06 0x35
 80Byte 1
Completion Code
80h = data not available (queue / buffer empty)
```
Test Procedure:
1. Enable Event Message reception into Event Message Buffer by "Set BMC Global Enables Command"
$ ipmitool raw 0x06 0x2e 0x04
2. Produce a SEL log
$ ipmitool event 1
3. Read Event Message Buffer
$ ipmitool raw 0x06 0x35
 32 4f 02 a6 b3 ff 4e 20 00 04 04 b0 01 50 00 010
4. Disable Event Message reception into Event Message Buffer
$ ipmitool raw 0x06 0x2e 0x04
5. Read Event Message Buffer, where response 80h = data not available (queue / buffer empty)
$ ipmitool raw 0x06 0x35
 80
 
```
ipmitool -Uadmin -Padmin -H127.0.0.1 raw 0x06 0x35 -vvv
-vvv  啟動偵錯 或-vvvvv (v愈多愈詳細)
```

一種稍微複雜的通信模式就是使用IPMB、大家所謂的橋接命令(Bridged Command)。
例：
```
  ipmitool -m 0x94 -t 0x9a raw 6 4
  55 00
  或者
  ipmitool -m 0x94 -t 0x9a mc selftest
  Selftest: passed
```
這仍然從netfn 6（應用程序）向目標target發送相同的命令4（selftest）。 但是，為此，命令（由驅動程序）封裝，並使用command 0x34（發送message）從netfn 6（應用程序）發送到KCS。然後，驅動程序輪詢(poll) KCS，直到收到message，然後驅動程序使用命令0x33（獲得message）。驅動程序還追踪message並確保響應與請求匹配。然後它解封message並將響應返回給應用程序。
 
>[!Note]
KCS Source code
user space : libipmikcs > KCSIfc.c 
kernel space : Kcs_hw > ast_kcs.c > kcs module > KCSmain.c 

## **SDR Code**
SDR.c 的GetSDRRepositoryInfo() > SDR_ReserveSDRRepository() > ReserveSDRRepository() > PreCheckSDRUpdateModeCmd() > GetSDRRec() > SDR_GetNextSDRId() > GetSDRRec() > GetSDR() > PreCheckSDRUpdateModeCmd() > SDR_GetSDRRec()
SDR 透過g_BMCInfo 取得各sensor data
e.g.:
UnableRead = pBMCInfo->SensorSharedMem.SensorInfo[CL_Sensor_Info[index].Sensor_Number].EventFlags & BIT5; 
CL_Sensor_Info[index].Reading = pBMCInfo->SensorSharedMem.SensorInfo[CL_Sensor_Info[index].Sensor_Number].SensorReading;

SDR欄位定義參考ipmi SPEC(page 554或552)43.2 SDR Type 02h Compact Sensor Record 的Table43 Compact Sensor Record - SDR Type
base unit為單位可參考Table 43-15或43.17章節, Sensor Unit Type Codes(溫度為1，電壓為4，風扇轉速為18)
sensor number只是編號，不重複即可(通常none connection sensor 需和PDKSensor.c所定義相同，)
新增sensor SDR檔案副檔名為pmc，路徑libipmipar_ast2400
AVIN = ADC
ADC需查ast2400V13 公式和ipmi公式(page 509 ， 36.35章節Sensor Reading Conversion Formula)
Y=(MX+(B*10^K1))*10^k2
Sensor Number為自定義，各sensor不能重複定義
ipmi second gen interface spec > page:613 有最基本的RAW caommand 
B Exp = K1 = 指數 (需用2的補數表示)
R Exp = K2 = 小數 (需用2的補數表示)
I2c = slave address 必填(電路圖位址通常需*2)
Temp 填UNR、 UC、 UNC、 LEN、 LC、 LNC、| K1 K2 B通常為0不需調整 M為1 ，Analog Data Format設定為2sComplement(2的補數)
(M、B、K1、K2在其他地方須根據情況做調整例如小數點，B和K1通常都為0，小數點用K2控制需用2的補數表示如-2則為E)
sensor取得的值可能大於1 byte，所以會除以一個常數值(向右shift N位)，用略微的數值失真換取可處理的值，之後再透過 B M K1 K2補償回來
(例如FAN轉數1789轉存放在兩byte的data裡，可以將它除100約shift兩位變成1byte的值，我們才可以再pread_buf處理，因為pread_buf只能放1byte)
SEEPROM 填slave address
PMBUS需填slave address和write/read  slaveaddr(如果電路圖沒提供，slave address可用i2c-test -b 2 --scan掃看看)
AVIN的電壓須改Constant multipiler(M)=1 ，B=0，K1=0，K2=0xd (表示到小數點第3位)
AVIN的UNR、UC....需參考分壓公式計算
最後generate configuration output, generate SDR records, generate sensor monitoring code
Settable Readable Threshold: 設定哪些threshold可讀或可寫(page:551)
assertion mask:設定當來到門檻是否發event(章節SDR type 01h full sensor record)
deassertion mask:設定當來到門檻是否發解除event
FAN 的UNR、 UC、 UNC、 LEN、 LC、 LNC 透過取最大公因數設為M來調整通常為105或120(值太大可再用最大公因數在跟最小的數值再做一次輾轉相除法)，商為各threshold值，Rate Unit為PerMinute ，tolerence和accuracy都為0x0

analog data format的溫度是二的補數
ddf的code 必須是4個空白加1個TAB鍵做開頭，包含空白行也是

Gen config>gen sdr> gen sensor monitor code >gen simulate....
*.dat ,FRU.bin, IPMI.conf會放在系統的conf/BMC1/

## **IPMI Command**
- 取得網路資訊(檢查MAC、是否有拿到IP、IP來源是否為DHCP、確認有gateway IP)
```
ipmitool lan print 1
```
- 開啟dhcp,其中的channel為1 -H為host端ip ( ipmitool channel 第1個網路port為1 第2個網路port為8 )
```
ipmitool -Uadmin -Padmin -H127.0.0.1 lan set 1 ipsrc dhcp
```
- 取得Sensor狀態
```
ipmitool -Uadmin -Padmin -H127.0.0.1 sensor
```
- system event log
```
ipmitool -Uadmin -Padmin -H192.168.5.100 sel
ipmitool -Uadmin -Padmin -H127.0.0.1 sel elist
```
- system event log，檢查Sensor 發門檻的event是否生效
```
ipmitool -Uadmin -Padmin -H192.168.5.100 sel list
```
- 根據id 去Get sensor event log詳細資訊
```
ipmitool -Uadmin -Padmin -H127.0.0.1 sel get 0x46

System_Temp1     | 0Eh | ok  |  7.1 | 31 degrees C
System_Temp2     | 0Fh | ok  |  7.1 | 35 degrees C
P12V_SEN         | 01h | ok  |  7.1 | 11.86 Volts
P5V_SEN          | 02h | ok  |  7.1 | 4.99 Volts
```
- i2c test tool
```
檢查bus number 0的slave list的位址是否正確
i2c-test -b 0 --scan

i2c slave address要除2所以b0為59 ,0x79 為PMbus Command，透過這command可取得pmbus的值
i2c-test -b 2 -s 0x59 -rc 2 -d 0x79

i2c-test --scan
Done!  Found 4 valid slave address(es)
Slave list:
0xa0
0xa2
0xb0
0xb2

掃第3個block，假設CPU Temp接再第三個block
i2c-test --scan -b 3						
Done!  Found 3 valid slave address(es)
Slave list:
0x00
0x54
0xa0

PMBUS 的STATUS_WORD 須看SPEC par II的page 91
i2c-test -b 0 -s 0x58 -rc 2 -d 0x79		#79就是的STATUS_WORD
i2c_dev = /dev/i2c0
Bytes read:     2
02 00
Bytes written:   1
79

斷電時return為 4b 28	#4b是low byte ，28是high byte

i2cdetect -r -y 5	#列出 Bus 5上的所有Device
標示為 UU 的代表該設備有被 偵測到並正在被 kernel driver 使用著
i2cdump  -y 4 0x56	#取得 i2c-4 上的 0x56 資訊
```
>[!Note]
PMbus可以在pmbus的ddf看他下了甚麼PMBUS command
0x79;  /* STATUS_WORD */
0x7e;  /* STATUS_CML */
0x7f;  /* STATUS_OTHER */
0x7b;  /* STATUS_IOUT */
0x7c;  /* STATUS_INPUT */
0x7d; /* STATUS_TEMPERATURE */
0x81; /* STATUS_FANS_1_2 */
0x82; /* STATUS_FANS_3_4 */
0x03; /* CLEAR_FAULTS */
讀回來的值順序為LOW Byte , High Byte(負值<1開頭>透過取2補數轉轉十進位並加負號，正值不須取2補數)

- sensor data record
```
ipmitool -Uadmin -Padmin -H192.168.5.100 sdr type
```
- command help
```
ipmitool -Uadmin -Padmin -H127.0.0.1 sdr help
```
- 取得watchdog資訊
```
ipmitool -I lanplus -Uadmin -P admin -H 192.168.0.100 mc watchdog get
```
- 取得chassis資訊
```
ipmitool -I lanplus -Uadmin -P admin -H 192.168.0.100 chassis
ipmitool -I lanplus -Uadmin -P admin -H 192.168.0.100 chassis status
```
- hardware monitor start scan
```
ipmitool -Uadmin -Padmin -H127.0.0.1 raw 0x2e 0x06 1
```
- hardware monitor stop scan
```
ipmitool -Uadmin -Padmin -H127.0.0.1 raw 0x2e 0x06 0
```
- show detail
```
ipmitool -Uadmin -Padmin -H127.0.0.1 sdr get "CPU0 VCCIO"
ipmitool -Uadmin -Padmin -H127.0.0.1 sensor
```
- SOL功能驗證
```
需要先進WEB改密碼(maybe)
ipmitool -I lanplus -Uadmin -P Ladmin -H 192.168.0.100 sol info
ipmitool -I lanplus -Uadmin -P Ladmin -H 192.168.0.100 sol set non-volatile-bit-rate 115.2
ipmitool -I lanplus -Uadmin -P Ladmin -H 192.168.0.100 sol activate
```
- GPIO tool
```
Base Address of GPIO = 0x1E78:0000
查ipmipdk_dev/XXXGPIOMap.h 的pin define(GPIO_D6 為30)
gpiotool 30 --get-dir		#input/output
gpiotool 30 --get-data		#high/low
```
- PECI
peciapp 0x30 -g 讀CPU溫度
Human readable temperature w.r.t Tcc : -71 Celsius
 讀到的溫度 - TJMAX = 現實溫度 (TJmax要看CPU spec通常可能是-100或110)
 Tjmax讀取方式
```
if(!bTjmax_init)
{
    phal->read_len = 5;
    phal->write_len = 5;
    phal->pwrite_buf[0]= 0xA1;
    phal->pwrite_buf[1]= 0;
    phal->pwrite_buf[2]= 16;
    phal->pwrite_buf[3]= 0;
    phal->pwrite_buf[4]= 0;
    peci_cmd_writeread(phal);

    if(phal->pread_buf[0] == 0x40)
    {
        Tjmax = phal->pread_buf[3];
        bTjmax_init = TRUE;
    }
}
```
- 透過command改multi function pin (Register : 0x1e6e:2000)
```
先對SCU00 寫入0x1688a8a8來解鎖multi funcion pin修改功能
devmem 0x1e6e2000 32 0x1688a8a8

GPIO register 1e78:0000
讀GPIO的GPIOAB
devmem 0x1e7801e0
透過register將GPIOAB2 AB3 data設成low
devmem 0x1e7801e0 32 0x0208a0f9

PWM register 1e78:6000 (風扇)
Duty Control 0 Register
devmem 0x1e786008
Duty Control 1 Register
devmem 0x1e78600C 
Duty Control 2 Register
devmem 0x1e786048 
Duty Control 3 Register
devmem 0x1e78604C
//set clock division and period of type M/N
//0xFF11 --> 24000000 / (2 * 2 * 256) = 23437.5 Hz
iowrite32(0xFF11FF11, (void * __iomem)AST_PWM_FAN_BASE+0x04);
```
- disable GPIOE0 pass through //需要disable Power/reset/UID button時會用到
```
#unlock SCU
devmem 0x1e6e2000 32 0x1688a8a8
devmem 0x1e6e208C 32 0x00000000			#原始值為0x00802000
#Lock SCU protection key
devmem 0x1e6e2000 32 0x00000000
```
- create default user
```
ipmitool user list 1
ipmitool user set name 2 admin
ipmitool user set password 2 admin
ipmitool user enable 2
ipmitool user priv 2 4 1
ipmitool channel setaccess 1 2 callin=on ipmi=on link=on privilege=4
```
- set MAC
```
開機壓ESC進入Uboot
setenv ethaddr +(MAC 位址)	#可設定MAC
print	檢查設定
saveenv	儲存設定
reset	重啟
ifconfig eth0 172.31.31.31	設定IP

設定動態取得 ip
# ipmitool lan set 1 ipsrc dhcp

設定靜態ip
# ipmitool lan set 1 ipsrc static
# ipmitool lan set 1 ipaddr 192.168.0.xxx
# ipmitool lan set 1 netmask 255.255.255.0
# ipmitool lan set 1 defgw ipaddr 192.168.0.1
# ipmitool lan set 1 access on
# ipmitool lan print 1
```
- PMBUS
pmbus psu status check
```
~ # i2c-test -b 0 -s 0x58 -rc 1 -d 0x19
i2c_dev = /dev/i2c0
Bytes read:     1
90
0x19 is pmbus CAPABILITY
retrun bit 7 is 1 means "Packet Error Checking is supported"
```
```
~ # i2c-test -b 0 -s 0x58 -rc 3 -d 0x79
i2c_dev = /dev/i2c0
Bytes read:     3
00 00 d4
Bytes written:   1
79
0x79 is pmbus STATUS_WORD
retrun 順序是low byte優先
```
- System power up 產生SEL
```
ipmitool raw 0x0a 0x44 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x20 0x00 0x04 0x1d 0x00 0x6f 0x00 0x00 0x00
```
- System hard reset 產生SEL
```
ipmitool raw 0x0a 0x44 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x20 0x00 0x04 0x1d 0x00 0x6f 0x01 0x00 0x00
```
- System warm reset 產生SEL
```
ipmitool raw 0x0a 0x44 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x20 0x00 0x04 0x1d 0x00 0x6f 0x02 0x00 0x00
```
- 未整理
```
ipmitool -I lanplus -Uadmin -P admin -H 192.168.0.100 raw 0x36 1 0
```

## **雜記**
- 製作開機隨身碟透過Rufus
firmware reset透過x86 console 重燒
cd SOCFLA~1
socflash -s FNCB55~2.IMA
抓不到隨身碟就power off power on 進bios更改boot開機選項將USB裝置設到第一個
- NCSI(network controller sideband interface)為共享網孔，通常由一個管理控制器(Management Controller, MC)和多個網路控制器(Network Controller, NC)組成，
(x86和bmc共用，通常ast2500會使用I210 chip(in ecb4025 product)) 另一種為非共用RGMII(通常使用Realtek RTL8211C/D/DN/E/F chip)
- intel cpu 溫度透過PECI protocol取得
- ADC input 分壓公式
參考ast2400 data sheet 的26.4.2 Voltage Sense Method 章節 (或ast2500 Voltage Sense Method 章節)
- M k1 k2 B計算
36.3 Sensor Reading Conversion Formula
- 門檻狀態
ok：溫度正常
nc： non-critical，溫度偏高（或者偏低），但是並不太嚴重
cr：critical，温度太高或者溫度太低，很嚴重
nr： non-recoverable，溫度太高或者溫度太低，造成不可恢復的損傷。
na：溫度狀態不明，較少見
- ast2500 datasheet 的Firmware Programming Guide章節(p129)定義multi function pin  通常會用到Base Address =0x1E6E:2000
Bootlooder_oem_ast2x00evb的Lanner_XXX_board_init定義所有的pin(multi function pin)
PDKSensor.c定DIMM 和CPU temp
SCI
SCU(System Control Unit) (Page 351)
GPIO 設定data為high/low dir為input/output
libcomponent_manager build error >wipe & rebuild (libhosthelper > libcompamibios > libfcgi > libadvisercfg > libjson >libldapconf >libdapauth > libuserauth > libvideorecordcfg > spx_restservice)
lighttpd error (libsession)
製作package時dev-install路徑也需要修改，需要改folder name
ast2500 => code base 為LTS3
ast2600 => code base 為RR13

- NCSI(set in uboot)
```
set ethact ast_eth1 為i210
set ethact ast_eth0 為x766
```
- 多層
libipmimsghndlr 所有的ipmi command會經過 ipmi message handler判斷處理決定要執行甚麼command
import > spx > import encrypted image key pair 裡import key
- ipmimain為ipmimain daemon
- Web
webui_html  	> 前端html ,javascript ,css
spx_restservice > 後端C code
AMI web admin/admin
- dediprog
currently working on選application memory chip 1(須根據jump作變更)
(讀取bios轉存為bin)dediprog 選edit >read (read data from chip)> chip buffer to file
- libipmipdk定義了sensor code
- Add OEM command
NetFn | CMD
libipmipdkcmds > cmdselect.c 新增{ CMD_SET_BMC_FAN_SPEED,	ENABLED,	NONE },
ipmipdk_dev裡PDKCmds.h定義 function  > extern int SetBMCFanSpeed(_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes, int BMCInst);
libipmimsghndlr > corecmdselect.c 可enable/disable OEM command 和定NetFN number
libipmimsghndlr > *.c 定CMD number
header定義=>common/packages/ipmi_dev-src/data/IPMI_AewinPrivateCmd.h
- ipmi_dev定義所有command number
- GPIO編號算法
A=0, B=1, C=2, D=3以此類推，英文字母A代表0，每組8個所以B6如下(2-1)是因為B是英文字母第二個，但是起始是0所以2-1
GPIOB6(2-1)*8+6=14
超過Z後
2500=> AA AB
2600=> 18A0 B0 ...
- gpio dir和data設定，可於ast2500 data sheet用0x1E78:0000去搜尋
- buzzer可以是設成timer或gpio
- multi function設成特殊pin後不需要再調方向，它們會有預設的方向
#define AST_LPC_BASE                   0x1E789000    /* Not in AST3100   */
#define AST_SCU_BASE                   0x1E6E2000
- Build command
git spx buildsrc <config> <package dir> <workspace dir>
sudo git spx buildsrc ./configs/projectname.PRJ ./packages/ ./workspace/	
重build 需要將spx-packages-links和 workspace砍掉再build
- FAN
FAN有13bit和16bit的讀取方式(16bit讀取會比較準確，且不會有問題)
13 bit必須先讀出high byte的值向左shift left 5 bit 再和low byte的data 相加變成2 byte的 fan count data，再根據公式即可算出RPM
16 bit則high byte讀出後shift left 8 bit和low byte相加就是轉數
- PERST
PERST是PCI Express (PCIe)介面中的一種訊號，其全稱為"PERST#"，其中 "#"表示為訊號的電氣特性符號。PERST信號是由PCIe設備傳送給主機的一種reset訊號，其作用是通知主機系統該設備正在進行初始化或者已經發生錯誤，需要進行重新初始化。
當PCIe設備插入系統插槽時，其會在訊號線上拉高PERST訊號。如果設備正常啟動，該訊號會在啟動過程中保持高電位，直到初始化完成後才會拉低該信號。如果初始化過程中出現錯誤，設備會再次拉高該信號，以通知主機進行重新初始化。
Anyway，PERST信號的作用是協調PCIe設備和主機系統之間的通訊，保證系統和設備之間的互動正常運作。它也有助於診斷系統中可能出現的問題，例如設備初始化失敗或者硬件錯誤等。
- ipmimain 為ipmi的進入點
- i2c
byte mode 和pool mode 的設定是定義i2c driver處理傳送和接收資料的方法.
byte mode : BMC收送資料以byte為單位.
pool mode : BMC收送資料使用32 bytes buffer.
一般來說建議使用pool mode，傳送和接收過程中產生的中斷比少，傳輸效率比較高還可以減少佔用cpu的資源。但若有使用SSIF(用於arm base system取代kcs interface)則只能使用byte mode，因為有資料需要額外處理。
- NCSI
NCSI 只要將multi function pin 設成RMII1RCLK1，先查線路圖是2500的MAC幾，再根據GPIO腳位將對應腳位設成RMII1RCLK1
- power restore policy
在 *.pmc > Chassis Cfg TAB > 的 power restore policy
AlwaysPowerUp 是斷電後重開會自動開機
StaysPoweredOff 是斷電後重開需要按power button
RestorePowerState 是會記住斷電時的狀態
a. 如果電源中斷前，系統是開機，睡眠，或休眠其中的一種狀態，那麼電源中斷後再次連接電源後，系統恢復至對應狀態
b. 如果電源中斷前，系統是關機狀態，那麼電源中斷後再次連接電源後，系統狀態還是關機狀態
- eSPI的clock可能會影響ipmi command速度
- ddf的DEBUG_PRINTING 在 ddf的configuration可以enable(Enable Debug printing(values))，就是在設定k和門檻值那裏
- libipmimsghndlr/SensorEvent/SensorDevice/SensorMonitor.c  ipmi daemon 用來定時讀sensor值的task   (SensorMonitorTask 用來定期讀sensor值 ,SensorMonitorTimer會根據sensor_monitor_interval(再ddf裡面設定)定期去讀值)
libipmimsghndlr/SensorEvent/SensorDevice/SensorMonitor.c SensorMonitorTask() 會去讀所有有效的sensor值
libipmimsghndlr/SensorEvent/SensorDevice/SensorMonitor.c GetSensorDeviceReading()會call IPMI_HAL_GET_SENSOR_READING() 讀sensor值
libipmihalapi > hal_api.c 會呼叫ddf gen出來的API table 做初始化
ipmi_dev > ipmi header定義
ddf > epilog.c 可用來print sensor的資訊
- ADD_MODULES_ONLY gpio > 加在dev-install可避免gpio kernel module 被unload
- ACPI電源管理的工作狀態
S0(G0) 正常工作狀態: pc正式工作，CPU、DIM,PCH 、硬碟都開始工作。
G1 （睡眠）狀態：裡面包括S1-S4四個狀態，睡眠的模式不同對應的功耗也是不同的。具體如下：
S1: 最耗電的睡眠模式。CPU所有暫存器刷新，且CPU停止執行指令。但是CPU、DIM電源沒有掉。
S2: CPU電關閉，通常不用。
S3：將任務掛到RAM中，當喚醒後（S3->S0）狀態，用戶剛剛的工作可以恢復到睡眠前的相同狀態。但是在這個狀態下如果突然AC掉電，這樣用戶之前處理的資料將會丟失。
S4：將任務掛到HD上，當喚醒後（S4->S0）狀態，用戶剛剛的工作可以恢復到睡眠前的相同狀態。但是在這個狀態下如果突然AC掉電，這樣用戶之前處理的資料將會丟失，再次重啟後依然能夠恢復進入睡眠模式前的工作狀態。
S5: soft off ，軟關機——包括POWER BUTTON或USER觸發（用戶介面）。
G3 狀態是：AC掉電，主版上只有RTC電源。
- realtek RTL8211E Page.54
Page 30 是有關 Extension Page
Step 1. phy_write(phydev, 0x1f, 0x0007); 1F is Page Select Register, 0007 is extension page. (Ref Page 52)
Step 2. phy_write(phydev, 0x1e, 0x002c); 2c is extension Page44(0x2c)
Step 3. Write the target Register Data.
Step 4. phy_write(phydev, 0x1f, 0x0000); Switch to Page 0