Open BMC开发系列(八)ipmi之kcs通道

一、官方文档

我使用的ast2500芯片,所以,我查了下2500的芯片手册,搜了下kcs的内容,主要搜到两块内容。

1,PIC-Express 2.0 Bus支持kcs设备。

PCI-Express 2.0 Bus Device Controller   Support optional BMC KCS device
2,LPC接口对KCS的支持
 LPC Bus Interface
Slave mode: designed for BMC functions (I/O and memory or fifirmware read/write cycles)
Support Serial IRQ (reduce polling time)
Support port 80H/81H (programmable address) snooping registers with interrupt options
Support 1 virtual UART for Serial-over-Lan (SOL) application
Support up to 4 sets of KCS mode registers and 1 BT mode registers (IPMI 2.0 Complaint), or 3 sets of
KCS mode registers and 1+1 BT mode registers
LPC Controller  Features
Compliant with IPMI version 2.0 KCS mode and BT mode
Channel #1 supports KCS interface
Channel #2 supports KCS interface
Channel #3 supports KCS or BT (H8S/2168 compliant) interface
Channel #4 supports KCS interface
Channel #5 supports iBT (IPMI compliant) interface
我主要是关注IPMI的功能,所以我们可以看到kcs是挂在LPC接口下的功能,LPC控制器支持IPMI 2.0的话,主要有两种模式,一种是kcs模式,一种是BT模式。
其中LPC 5个通道中,其中3个只支持设置成kcs,1个只能设置为走IPMI协议的BT通道。还有1个可以设置成走H8S/2168的BT通道,也可以设置成kcs。
设备树的配置我们通常会专门配置kcs3通道,原因就再这里,kcs3是个可选的通道。

以下是转载的KCS有用的博文:

二、KCS说明

BMC和BIOS通信的接口
BMC和UEFI通信主要是通过LPC总线的方式连接的,AST2500的LPC控制器和我们桥片的LPC控制器连接在一起了,桥片的LPC控制器是主,bmc端是从。这样bios就可以通过LPC总线域的地址来访问BMC端LPC下设备的寄存器。7a桥片是将LPC总线的地址映射到了桥片的IO空间去了,这样我们就可以通过访问IO空间的方式,去访问BMC LPC下的设备寄存器。这样就可以通信了。

KCS模块的初始化
KCS模块是属于BMC LPC控制器下的一个子模块,AST2500这块芯片的LPC控制器接口特别丰富,KCS也只是其中之一。该模块的初始化,包括通道选择,时钟使能,寄存器映射的地址(0xCA2默认)这些寄存器都是由BMC 的驱动完成的,也就是KCS模块进行了必要的初始化之后,KCS模块就可以正常工作了,这时候BIOS这边就可以访问了。注意初始化工作是由BMC内核里面驱动完成的,详细如何初始化已经都配置了哪些寄存器,这里不做详细的介绍了。

BIOS端主要注意的地方
(1)KCS寄存器映射的地址
这个地址是是Address reg里面设置的,这个寄存器的默认值就是0xCA2,也可以自己修改,我们这里没有修改。这个地址决定了读写数据所使用的寄存器的地址。其实后面使用的寄存器就两个个,分别是command/data/
在我们平台,这几个寄存器最终的虚拟地址是在IO 空间的基地址加上上面的偏移。也就是
LPC_IO_BASE + 0xCA2是command寄存器,LPC_IO_BASE + 0xCA3是data寄存器
而LPCIO基地址就是0x90000efdfc000000.

(2)如何完成数据的传输
主要就是驱动要遵守IPMI 的第九章Keyboard Controller Style (KCS) Interface的规范,按照协议规范的寄存器的状态去读写数据就可以了,在内核下是有参考代码的。
接口中,每一个ipmi命令都包含一下部分:NetFn,Lun,Cmd data…
下图就是bios给BMC发送命令的数据格式,和BMC给bios回信息的数据格式。
注意:每个ipmi的命令实现不一样,有的命令不需要data部分,有的需要,有的命令没有返回数据,有的有。所以详细的还要看IPMI的规范,看每个命令对应的格式。每个命令的NetFn,Lun,CMd都是协议定义好的,其中也提供了OEM自己定义的命令。


注意,在响应数据中,有三个字节是必须有的,那就是CompletionCode NetFn和Cmd是每个命令都要返回的内容,第一个字节就是CompletionCode完成码,这个完成码表示了发送给BMC的命令的状态。如果那边成功接收,完成码为0,否则就是有问题的。

注意:ipmi -raw [netfn] [lun] [cmd][data1–datan]
的格式如上,其中netfn lun cmd是必须的,data部分有的命令不需要。

三、IPMI的KCS实现

IPMI为描述平台管理能力的信息提供两种机制:

(1)capabilities commands,IPMI command

(2)Sensor Data Records(SDR),command about sensor

IPMI定义了三种标准系统接口来向BMC传送信息。

(1)       Keyboard Controller Style (KCS),

Intel 8742 Universal Peripheral Interface microcontroller

(2)       System Management Interface Chip(SMIC),

当BMC没有建立KCS接口时,SMIC提供一个可选择的选项。

(3)       Block Transfer(BT),

统提供的一个更高执行效率的接口,与前两者不同,它以a per-block handshake来进行数据传输。

除了以上基本接口,还有我们常用的串口,LAN口。

串口支持3种connection modes

Basic Mode        PPP Mode       Terminal Mode:

SOL, Serial Over LAN ,

它被用于异步的serial-based OS and pre-OS communication同BMC。

BMC Transfer在我们的code中一般通过KCS接口实现。

了解实现过程之前首先要了解KCS Interface Registers

1,Status Register

系统中总会开始一些信息传送,传送之前需要判断设备的状态,对于KCS接口就通过他的Status Register来进行判断。Status Register每一位代表的信息如图所示:

Bit6,Bit7两个状态位总共表示接口会处于的4种状态。

2,Command Register

当IBF被清除时,可以向其中写进命令。

3,Data Registers

BMC用来传输数据。

CODE中如何实现通过KCS接口向BMC写入数据:

(1)       读取Status Register信息,获得IBF的值,直至等到IBF值为0时,继续执行。

(2)       清除   OBF

(3)       检查KCS状态

(4)       以byte为单位向BMC发送数据

(5)       再次检查KCS状态

从BMC读取数据:

(1)       检查KCS状态,若为IDLE_STATE,则返回EFI_SUCCESS。

(2)       从DATA_OUT读取数据。

(3)       将DATA_OUT读出的数据写入DATA_IN

注意到KCS在PEI与DXE两个阶段中的code并不一样。

 在DXE阶段memory已经初始化好了,所以KCS在DXE阶段的使用需要判断是否是SMM模式。

最后:一键三连哦,么么哒!

        点赞是美德,

        关注是缘分,

        收藏是肯定,

        打赏你随意,

你的鼓励是我世界善的一部分,爱你们!

  • 39
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大余里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值