【UEFI实战】BIOS与IPMI

33 篇文章 139 订阅

KCS

KCS全称是Keyboard Controller Style,关于这个名称不用过多的追究,只需要知道它是系统(BIOS和OS)和BMC通信的一种基本方式即可。本文将介绍BIOS下的KCS接口,包括接口使用方式和数据。内容参考自《ipmi-second-gen-interface-spec-v2-rev1-1.pdf》和https://github.com/microsoft/mu_feature_ipmi.git代码。

KCS数据

BIOS和BMC的交互通过Request和Response的方式,所以对应的数据也有两种,首先是Request:

在这里插入图片描述

参数说明如下:

  • NetFn/Cmd:IPMI命令有不同的分组,通过NetFn/Cmd命令字的方式来索引,在IPMI命令介绍会进一步说明。
  • LUNLogical Unit Number,占据8个比特中的最低两个,对于通过KCS向BMC发送的数据,LUN的值都是00b。
  • Data:IPMI命令的实际请求数据。

然后是Response:

在这里插入图片描述

其它参数跟Request类似,只是多了一个Complete Code,说明如下:

  • Completion Code:IPMI命令的返回状态,具体的取值如下:
//
// Generic Completion Codes definitions
//
#define IPMI_COMP_CODE_NORMAL                           0x00
#define IPMI_COMP_CODE_NODE_BUSY                        0xC0
#define IPMI_COMP_CODE_INVALID_COMMAND                  0xC1
#define IPMI_COMP_CODE_INVALID_FOR_GIVEN_LUN            0xC2
#define IPMI_COMP_CODE_TIMEOUT                          0xC3
#define IPMI_COMP_CODE_OUT_OF_SPACE                     0xC4
#define IPMI_COMP_CODE_RESERVATION_CANCELED_OR_INVALID  0xC5
#define IPMI_COMP_CODE_REQUEST_DATA_TRUNCATED           0xC6
#define IPMI_COMP_CODE_INVALID_REQUEST_DATA_LENGTH      0xC7
#define IPMI_COMP_CODE_REQUEST_EXCEED_LIMIT             0xC8
#define IPMI_COMP_CODE_OUT_OF_RANGE                     0xC9
#define IPMI_COMP_CODE_CANNOT_RETURN                    0xCA
#define IPMI_COMP_CODE_NOT_PRESENT                      0xCB
#define IPMI_COMP_CODE_INVALID_DATA_FIELD               0xCC
#define IPMI_COMP_CODE_COMMAND_ILLEGAL                  0xCD
#define IPMI_COMP_CODE_CMD_RESP_NOT_PROVIDED            0xCE
#define IPMI_COMP_CODE_FAIL_DUP_REQUEST                 0xCF
#define IPMI_COMP_CODE_SDR_REP_IN_UPDATE_MODE           0xD0
#define IPMI_COMP_CODE_DEV_IN_FW_UPDATE_MODE            0xD1
#define IPMI_COMP_CODE_BMC_INIT_IN_PROGRESS             0xD2
#define IPMI_COMP_CODE_DEST_UNAVAILABLE                 0xD3
#define IPMI_COMP_CODE_INSUFFICIENT_PRIVILEGE           0xD4
#define IPMI_COMP_CODE_UNSUPPORTED_IN_PRESENT_STATE     0xD5
#define IPMI_COMP_CODE_SUBFUNCTION_DISABLED             0xD6
#define IPMI_COMP_CODE_UNSPECIFIED                      0xFF
  • Data:IPMI命令的实际响应数据。

需要注意,无论是Request还是Response,其数据部分都可以是空的。

另外,还有一种稍微特殊一点的KSC数据,用来上报事件信息:

在这里插入图片描述

其实就是一种IPMI命令数据而已。

KSC通信

KSC接口定义了一组IO寄存器,通过它们就可以完成与BMC的交互,这组寄存器的基地址基本上已经固定:

gIpmiFeaturePkgTokenSpaceGuid.PcdIpmiIoBaseAddress|0xCA2|UINT16|0xF000000A

为了使用该地址,首先需要打开它的映射,代码如下所示:

/**
  Initializing hardware for the IPMI transport.

  @retval   EFI_SUCCESS     Hardware was successfully initialized.
  @retval   Other           An error was returned from PlatformIpmiIoRangeSet.
**/
EFI_STATUS
InitializeIpmiTransportHardware (
  VOID
  )

{
  EFI_STATUS  Status;

  //
  // Enable OEM specific southbridge SIO KCS I/O address range 0xCA0 to 0xCAF at here
  // if the the I/O address range has not been enabled.
  //
  Status = PlatformIpmiIoRangeSet (PcdGet16 (PcdIpmiIoBaseAddress));
  DEBUG ((DEBUG_INFO, "IPMI: PlatformIpmiIoRangeSet - %r!\n", Status));
  return Status;
}

对于PlatformIpmiIoRangeSet()函数的实现,可以暂时不过,因为依赖于不同的硬件平台,对于x86平台,通常是LPC设备一些操作。

当完成PcdIpmiIoBaseAddress基地址之后,就可以进行IO操作了,对应的寄存器如下:

在这里插入图片描述

可以看到就4个寄存器(如果考虑共用的部分,其实就2个寄存器):

  • Status:只读寄存器,包含了操作过程中的Flag。
  • Command:只写寄存器,用于写入各类操作,这些操作称为“Write Control Codes”。
  • Data_Out:只读寄存器,用来读取数据。
  • Data_In:只写寄存器,用来写入数据或者“Read Control Codes”。

这里的“Control Codes”如下:

在这里插入图片描述

前面的4个是“Write Control Codes”,只能写入Status寄存器;最后一个是“Read Control Codes”,写入Data寄存器,前面提到的KSC数据也是写入到Data寄存器的。

Status寄存器的比特说明如下:

在这里插入图片描述

其中的S0和S1根据组合得到如下的值:

在这里插入图片描述

得到四种状态。

Status寄存器的代码表示:

typedef union {
  UINT8    RawData;
  struct {
    UINT8    Obf   : 1;
    UINT8    Ibf   : 1;
    UINT8    SmAtn : 1;
    UINT8    CD    : 1;
    UINT8    Oem1  : 1;
    UINT8    Oem2  : 1;
    UINT8    State : 2;
  } Status;
} KCS_STATUS;

根据上述的寄存器操作,得到BIOS向BMC写数据的流程:

在这里插入图片描述

对应的代码实现可以在IpmiFeaturePkg\GenericIpmi\Common\GenericIpmi.c找到,下面是代码的大致说明:

  1. 等待IBF=0:
  do {
    MicroSecondDelay (IPMI_DELAY_UNIT);
    KcsStatus.RawData = IoRead8 (KcsIoBase + 1);
    if ((KcsStatus.RawData == 0xFF) || (TimeOut >= IpmiTimeoutPeriod)) {
      if ((Status = KcsErrorExit (IpmiTimeoutPeriod)) != EFI_SUCCESS) {
        return Status;
      }
    }

    TimeOut++;
  } while (KcsStatus.Status.Ibf);
  1. 写入KCS_WRITE_START,并等待IBF=0:
  KcsData = KCS_WRITE_START;
  IoWrite8 ((KcsIoBase + 1), KcsData);
  if ((Status = KcsCheckStatus (IpmiTimeoutPeriod, KcsWriteState, &Idle)) != EFI_SUCCESS) {
    return Status;
  }
  1. 开始写入数据,等待数据写入完成之后,最后写入KCS_WRITE_END
  for (i = 0; i < DataSize; i++) {
    if (i == (DataSize - 1)) {
      if ((Status = KcsCheckStatus (IpmiTimeoutPeriod, KcsWriteState, &Idle)) != EFI_SUCCESS) {
        return Status;
      }

      KcsData = KCS_WRITE_END;
      IoWrite8 ((KcsIoBase + 1), KcsData);
    }

    Status = KcsCheckStatus (IpmiTimeoutPeriod, KcsWriteState, &Idle);
    if (EFI_ERROR (Status)) {
      return Status;
    }

    IoWrite8 (KcsIoBase, Data[i]);
  }
  1. 开始接收数据:
  while (TRUE) {
    if ((Status = KcsCheckStatus (IpmiTimeoutPeriod, KcsReadState, &Idle)) != EFI_SUCCESS) {
      return Status;
    }

    if (Idle) {
      *DataSize = Count;
      break;
    }

    //
    // Need to check Data Size -1 to account for array access
    //
    if (Count >= *DataSize) {
      return EFI_DEVICE_ERROR;
    }

    Data[Count] = IoRead8 (KcsIoBase);

    Count++;

    KcsData = KCS_READ;
    IoWrite8 (KcsIoBase, KcsData);
  }
  1. 结束数据接收,并将数据返回。

以上只是简单的介绍,还有一些诸如KcsCheckStatus()的函数没有说明,具体可以直接看代码。

IPMI命令介绍

IPMI命令会通过NetFn/Cmd的方式写入到KSC接口中,以完成不同的操作,这里将列出IPMI规范定义的所以基础操作。在EDK代码中有几个头文件已经定义了部分IPMI命令,具体对应的头文件是:

#include <IndustryStandard/IpmiNetFnChassis.h>
#include <IndustryStandard/IpmiNetFnBridge.h>
#include <IndustryStandard/IpmiNetFnSensorEvent.h>
#include <IndustryStandard/IpmiNetFnApp.h>
#include <IndustryStandard/IpmiNetFnFirmware.h>
#include <IndustryStandard/IpmiNetFnStorage.h>
#include <IndustryStandard/IpmiNetFnTransport.h>
#include <IndustryStandard/IpmiNetFnGroupExtension.h>
#include <IndustryStandard/IpmiFruInformationStorage.h>

需要注意:

  • NetFn都是偶数的。

  • 最后一列的O/M表示的是BMC是否需要实现该命令。

  • BIOS下的头文件中并没有包含所有IPMI规范中定义的命令,所以下面的表中不少命令没有对应的宏。

  • 除了在IPMI规范中定义的命令,还可以有自定义的命令,这当然是有好处的,因为扩展了BIOS和BMC通信的内容,但是也存在不同的BIOS和BMC厂商对同一个命令字有不同的实现,导致了维护的困难。

NetFn 0x00 - IPMI_NETFN_CHASSIS

对应头文件edk2\MdePkg\Include\IndustryStandard\IpmiNetFnChassis.h:

Cmd说明O/M
0x00 - IPMI_CHASSIS_GET_CAPABILITIESGet Chassis Capabilities必需
0x01 - IPMI_CHASSIS_GET_STATUSGet Chassis Status必需
0x02 - IPMI_CHASSIS_CONTROLChassis Control必需
0x03 - IPMI_CHASSIS_RESETChassis Reset可选
0x04 - IPMI_CHASSIS_IDENTIFYChassis Identify可选
0x05 - IPMI_CHASSIS_SET_CAPABILITIESSet Chassis Capabilities可选
0x06 - IPMI_CHASSIS_SET_POWER_RESTORE_POLICYSet Power Restore Policy可选
0x07 - IPMI_CHASSIS_GET_SYSTEM_RESTART_CAUSEGet System Restart Cause可选
0x08 - IPMI_CHASSIS_SET_SYSTEM_BOOT_OPTIONSSet System Boot Options可选
0x09 - IPMI_CHASSIS_GET_SYSTEM_BOOT_OPTIONSGet System Boot Options可选
0x0A - IPMI_CHASSIS_SET_FRONT_PANEL_BUTTON_ENABLESSet Front Panel Enables可选
0x0B - IPMI_CHASSIS_SET_POWER_CYCLE_INTERVALSSet Power Cycle Interval可选
0x0F - IPMI_CHASSIS_GET_POH_COUNTERGet POH Counter可选

NetFn 0x02 - IPMI_NETFN_BRIDGE

对应头文件edk2\MdePkg\Include\IndustryStandard\IpmiNetFnBridge.h:

Cmd
0x00 - IPMI_BRIDGE_GET_STATE
0x01 - IPMI_BRIDGE_SET_STATE
0x02 - IPMI_BRIDGE_GET_ICMB_ADDRESS
0x03 - IPMI_BRIDGE_SET_ICMB_ADDRESS
0x04 - IPMI_BRIDGE_SET_PROXY_ADDRESS
0x05 - IPMI_BRIDGE_GET_BRIDGE_STATISTICS
0x06 - IPMI_BRIDGE_GET_ICMB_CAPABILITIES
0x08 - IPMI_BRIDGE_CLEAR_STATISTICS
0x09 - IPMI_BRIDGE_GET_PROXY_ADDRESS
0x0A - IPMI_BRIDGE_GET_ICMB_CONNECTOR_INFO
0x0B - IPMI_BRIDGE_GET_ICMB_CONNECTION_ID
0x0C - IPMI_BRIDGE_SEND_ICMB_CONNECTION_ID
0x10 - IPMI_BRIDGE_PREPARE_FOR_DISCOVERY
0x11 - IPMI_BRIDGE_GET_ADDRESSES
0x12 - IPMI_BRIDGE_SET_DISCOVERED
0x13 - IPMI_BRIDGE_GET_CHASSIS_DEVICEID
0x14 - IPMI_BRIDGE_SET_CHASSIS_DEVICEID
0x20 - IPMI_BRIDGE_REQUEST
0x21 - IPMI_BRIDGE_MESSAGE
0x30 - IPMI_BRIDGE_GET_EVENT_COUNT
0x31 - IPMI_BRIDGE_SET_EVENT_DESTINATION
0x32 - IPMI_BRIDGE_SET_EVENT_RECEPTION_STATE
0x33 - IPMI_BRIDGE_SEND_ICMB_EVENT_MESSAGE

但是它们并没有在IPMI规范中,而是在ICMB规范中。

NetFn 0x04 - IPMI_NETFN_SENSOR_EVENT

对应头文件edk2\MdePkg\Include\IndustryStandard\IpmiNetFnSensorEvent.h,但是其中只有一个,其它存在空白的是没有在代码中出现的:

Cmd说明O/M
0x00Set Event Receiver必需
0x01Get Event Receiver必需
0x02 - IPMI_SENSOR_PLATFORM_EVENT_MESSAGEPlatform Event (aka Event Message)必需
0x10Get PEF Capabilities必需
0x11Arm PEF Postpone Timer必需
0x12Set PEF Configuration Parameters必需
0x13Get PEF Configuration Parameters必需
0x14Set Last Processed Event ID必需
0x15Get Last Processed Event ID必需
0x16Alert Immediate可选
0x17PET Acknowledge可选
0x20Get Device SDR Info可选
0x21Get Deivce SDR可选
0x22Reserve Device SDR Repository可选
0x23Get Sensor Reading Factors可选
0x24Set Sensor Hysteresis可选
0x25Get Sensor Hysteresis可选
0x26Set Sensor Threshold可选
0x27Get Sensor Threshold可选
0x28Set Sensor Event Enable可选
0x29Get Sensor Event Enable可选
0x2ARe-arm Sensor Events可选
0x2BGet Sensor Event Status可选
0x2DGet Sensor Reading必需
0x2ESet Sensor Type可选
0x2FGet Sensor Type可选
0x30Set Sensor Reading And Event Status可选

NetFn 0x06 - IPMI_NETFN_APP

对应头文件edk2\MdePkg\Include\IndustryStandard\IpmiNetFnApp.h,部分存在空白的是没有在代码中出现的:

Cmd说明O/M
0x01 - IPMI_APP_GET_DEVICE_IDGet Device ID必需
0x02 - IPMI_APP_COLD_RESETCold Rest可选
0x03 - IPMI_APP_WARM_RESETWarm Rest可选
0x04 - IPMI_APP_GET_SELFTEST_RESULTSGet Selft Test Results必需
0x05 - IPMI_APP_MANUFACTURING_TEST_ONManufacturing Test On可选
0x06 - IPMI_APP_SET_ACPI_POWERSTATESet ACPI Power State可选
0x07 - IPMI_APP_GET_ACPI_POWERSTATEGet ACPI Power State可选
0x08 - IPMI_APP_GET_DEVICE_GUIDGet Device GUID可选
0x09Get NetFun Support可选
0x0AGet Command Support可选
0x0BGet Command Sub-function Support可选
0x0CGet Configurable Commands可选
0x0DGet Configurable Command Sub-functions可选
0x22 - IPMI_APP_RESET_WATCHDOG_TIMERReset Watchdog Timer必需
0x24 - IPMI_APP_SET_WATCHDOG_TIMERSet Watchdog Timer必需
0x25 - IPMI_APP_GET_WATCHDOG_TIMERGet Watchdog Timer必需
0x2E - IPMI_APP_SET_BMC_GLOBAL_ENABLESSet BMC Global Enables必需
0x2F - IPMI_APP_GET_BMC_GLOBAL_ENABLESGet BMC Global Enables必需
0x30 - IPMI_APP_CLEAR_MESSAGE_FLAGSClear Message Flags必需
0x31 - IPMI_APP_GET_MESSAGE_FLAGSGet Message Flags必需
0x32 - IPMI_APP_ENABLE_MESSAGE_CHANNEL_RECEIVEEnable Message Channel Receive可选
0x33 - IPMI_APP_GET_MESSAGEGet Message必需
0x34 - IPMI_APP_SEND_MESSAGESend Message必需
0x35 - IPMI_APP_READ_EVENT_MSG_BUFFERRead Event Message Buffer可选
0x36 - IPMI_APP_GET_BT_INTERFACE_CAPABILITYGet BT Interface Capabilities必需
0x37 - IPMI_APP_GET_SYSTEM_GUIDGet System GUID可选
0x38 - IPMI_APP_GET_CHANNEL_AUTHENTICATION_CAPABILITIESGet Channel Authentication Capabilities可选
0x39 - IPMI_APP_GET_SESSION_CHALLENGEGet Session Challenge可选
0x3A - IPMI_APP_ACTIVATE_SESSIONActivate Session可选
0x3B - IPMI_APP_SET_SESSION_PRIVELEGE_LEVELSet Session Privilege Level可选
0x3C - IPMI_APP_CLOSE_SESSIONClose Session可选
0x3D - IPMI_APP_GET_SESSION_INFOGet Session Info可选
0x3F - IPMI_APP_GET_AUTHCODEGet AuthCode可选
0x40 - IPMI_APP_SET_CHANNEL_ACCESSSet Channel Access可选
0x41 - IPMI_APP_GET_CHANNEL_ACCESSGet Channel Access可选
0x42 - IPMI_APP_GET_CHANNEL_INFOGet Channel Info可选
0x43 - IPMI_APP_SET_USER_ACCESSSet User Access可选
0x44 - IPMI_APP_GET_USER_ACCESSGet User Access可选
0x45 - IPMI_APP_SET_USER_NAMESet User Name可选
0x46 - IPMI_APP_GET_USER_NAMEGet User Name可选
0x47 - IPMI_APP_SET_USER_PASSWORDSet User Password可选
0x48 - IPMI_APP_ACTIVATE_PAYLOADActivate Payload可选
0x49 - IPMI_APP_DEACTIVATE_PAYLOADDeactivate Payload可选
0x4A - IPMI_APP_GET_PAYLOAD_ACTIVATION_STATUSGet Payload Activation Status可选
0x4B - IPMI_APP_GET_PAYLOAD_INSTANCE_INFOGet Payload Instance Info可选
0x4C - IPMI_APP_SET_USER_PAYLOAD_ACCESSSet User Payload Access Command可选
0x4D - IPMI_APP_GET_USER_PAYLOAD_ACCESSGet User Payload Access Command可选
0x4E - IPMI_APP_GET_CHANNEL_PAYLOAD_SUPPORTGet Channel Payload Support Command可选
0x4F - IPMI_APP_GET_CHANNEL_PAYLOAD_VERSIONGet Channel Payload Version Command可选
0x50 - IPMI_APP_GET_CHANNEL_OEM_PAYLOAD_INFOGet Channel OEM Payload Info Command可选
0x52 - IPMI_APP_MASTER_WRITE_READMaster Write-Read必需
0x54 - IPMI_APP_GET_CHANNEL_CIPHER_SUITESGet Channel Cipher Suites可选
0x55 - IPMI_APP_SUSPEND_RESUME_PAYLOAD_ENCRYPTIONSuspend/Resume Payload Encryption Command可选
0x56 - IPMI_APP_SET_CHANNEL_SECURITY_KEYSSet Channel Security Keys可选
0x57 - IPMI_APP_GET_SYSTEM_INTERFACE_CAPABILITIESGet System Interface Capabilities可选
0x58Set System Info Parameters可选
0x59Get System Info Parameters可选
0x60Set Command Enables可选
0x61Get Command Enables可选
0x62Set Command Sub-function Enables可选
0x63Get Command Sub-function Enables可选
0x64Get OEM NetFn IANA Support可选

IPMI_APP_GET_DEVICE_ID还有一个广播版本Broadcast “Get Deivce ID”,它的Cmd也是0x01。

NetFn 0x08 - IPMI_NETFN_FIRMWARE

对应头文件edk2\MdePkg\Include\IndustryStandard\IpmiNetFnFirmware.h,但是以下的命令并没有在IPMI规范中找到:

Cmd
0x23 - IPMI_GET_BMC_EXECUTION_CONTEXT

NetFn 0x0A - IPMI_NETFN_STORAGE

对应头文件edk2\MdePkg\Include\IndustryStandard\IpmiNetFnStorage.h:

Cmd说明O/M
0x10 - IPMI_STORAGE_GET_FRU_INVENTORY_AREAINFOGet FRU Inventory Area Info必需
0x11 - IPMI_STORAGE_READ_FRU_DATARead FRU Data必需
0x12 - IPMI_STORAGE_WRITE_FRU_DATAWrite FRU Data必需
0x20 - IPMI_STORAGE_GET_SDR_REPOSITORY_INFOGet SDR Repository Info必需
0x21 - IPMI_STORAGE_GET_SDR_REPOSITORY_ALLOCATION_INFOGet SDR Pepository Allocation Info可选
0x22 - IPMI_STORAGE_RESERVE_SDR_REPOSITORYReserve SDR Repository必需
0x23 - IPMI_STORAGE_GET_SDRGet SDR必需
0x24 - IPMI_STORAGE_ADD_SDRAdd SDR必需
0x25 - IPMI_STORAGE_PARTIAL_ADD_SDRPartial Add SDR必需
0x26 - IPMI_STORAGE_DELETE_SDRDelete SDR可选
0x27 - IPMI_STORAGE_CLEAR_SDRClear SDR Repository必需
0x28 - IPMI_STORAGE_GET_SDR_REPOSITORY_TIMEGet SDR Repository Time可选
0x29 - IPMI_STORAGE_SET_SDR_REPOSITORY_TIMESet SDR Repository Time可选
0x2A - IPMI_STORAGE_ENTER_SDR_UPDATE_MODEEnter SDR Pepository Update Mode可选
0x2B - IPMI_STORAGE_EXIT_SDR_UPDATE_MODEExit SDR Repository Update Mode可选
0x2C - IPMI_STORAGE_RUN_INIT_AGENTRun Initialization Agent可选
0x40 - IPMI_STORAGE_GET_SEL_INFOGet SEL Info必需
0x41 - IPMI_STORAGE_GET_SEL_ALLOCATION_INFOGet SEL Allocation Info可选
0x42 - IPMI_STORAGE_RESERVE_SELReserve SEL可选
0x43 - IPMI_STORAGE_GET_SEL_ENTRYGet SEL Entry必需
0x44 - IPMI_STORAGE_ADD_SEL_ENTRYAdd SEL Entry必需
0x45 - IPMI_STORAGE_PARTIAL_ADD_SEL_ENTRYPartial Add SEL Entry必需
0x46 - IPMI_STORAGE_DELETE_SEL_ENTRYDelete SEL Entry可选
0x47 - IPMI_STORAGE_CLEAR_SELClear SEL必需
0x48 - IPMI_STORAGE_GET_SEL_TIMEGet SEL Time必需
0x49 - IPMI_STORAGE_SET_SEL_TIMESet SEL Time必需
0x5A - IPMI_STORAGE_GET_AUXILLARY_LOG_STATUSGet Auxiliary Log Status可选
0x5B - IPMI_STORAGE_SET_AUXILLARY_LOG_STATUSSet Auxiliary Log Status可选
0x5C - IPMI_STORAGE_GET_SEL_TIME_UTC_OFFSETGet SEL Timer UTC Offset可选
0x5D - IPMI_STORAGE_SET_SEL_TIME_UTC_OFFSETSet SEL Timer UTC Offset可选

NetFn 0x0C - IPMI_NETFN_TRANSPORT

对应头文件edk2\MdePkg\Include\IndustryStandard\IpmiNetFnTransport.h,部分存在空白的是没有在代码中出现的:

Cmd说明O/M
0x01 - IPMI_TRANSPORT_SET_LAN_CONFIG_PARAMETERSSet LAN Configuration Parameters必需
0x02 - IPMI_TRANSPORT_GET_LAN_CONFIG_PARAMETERSGet LAN Configuration Parameters必需
0x03 - IPMI_TRANSPORT_SUSPEND_BMC_ARPSSuspend BMC ARPs可选
0x04 - IPMI_TRANSPORT_GET_PACKET_STATISTICSGet IP/UDP/RMCP Statistics可选
0x10 - IPMI_TRANSPORT_SET_SERIAL_CONFIGURATIONSet Serial/Modem Configuration必需
0x11 - IPMI_TRANSPORT_GET_SERIAL_CONFIGURATIONGet Serial/Modem Configuration必需
0x12 - IPMI_TRANSPORT_SET_SERIAL_MUXSet Serial/Modem Mux可选
0x13 - IPMI_TRANSPORT_GET_TAP_RESPONSE_CODEGet TAP Response Codes可选
0x14 - IPMI_TRANSPORT_SET_PPP_UDP_PROXY_TXDATASet PPP UDP Proxy Transmit Data可选
0x15 - IPMI_TRANSPORT_GET_PPP_UDP_PROXY_TXDATAGet PPP UDP Proxy Transmit Data可选
0x16 - IPMI_TRANSPORT_SEND_PPP_UDP_PROXY_PACKETSend PPP UDP Proxy Packet可选
0x17 - IPMI_TRANSPORT_GET_PPP_UDP_PROXY_RXGet PPP UDP Proxy Receive Data可选
0x18 - IPMI_TRANSPORT_SERIAL_CONNECTION_ACTIVESerial/Modem Connection Active必需
0x19 - IPMI_TRANSPORT_CALLBACKCallback可选
0x1A - IPMI_TRANSPORT_SET_USER_CALLBACK_OPTIONSSet User Callback Options可选
0x1B - IPMI_TRANSPORT_GET_USER_CALLBACK_OPTIONSGet User Callback Options可选
0x1CSet Serial Routing Mux可选
0x20 - IPMI_TRANSPORT_SOL_ACTIVATINGSOL Activating可选
0x21 - IPMI_TRANSPORT_SET_SOL_CONFIG_PARAMSet SOL Configuration Parameters可选
0x22 - IPMI_TRANSPORT_GET_SOL_CONFIG_PARAMGet SOL Configuration Parameters可选
0x30Forwarded Command可选
0x31Set Forwarded Commands可选
0x32Get Forwarded Commands可选
0x33Enable Forwarded Commands可选

NetFn 0x2C - IPMI_NETFN_GROUP_EXT

对应头文件edk2\MdePkg\Include\IndustryStandard\IpmiNetFnGroupExtension.h,但是里面没有具体的内容,属于扩展用的,这其实也导致了额外的问题,因为不同的BIOS供应商提供的命令可能会有不同,导致维护困难。

  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值