【UEFI实战】BIOS与IPMI

news2025/3/2 4:42:45

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供应商提供的命令可能会有不同,导致维护困难。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/404622.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[LeetCode周赛复盘] 第 99 场双周赛20230304

[LeetCode周赛复盘] 第 99 场双周赛20230304 一、本周周赛总结二、 [Easy] 2578. 最小和分割1. 题目描述2. 思路分析3. 代码实现三、[Medium] 2579. 统计染色格子数1. 题目描述2. 思路分析3. 代码实现四、[Medium] 2580. 统计将重叠区间合并成组的方案数1. 题目描述2. 思路分析…

DALL·E 2 论文阅读笔记

《Hierarchical Text-Conditional Image Generation with CLIP Latents》Paper: https://cdn.openai.com/papers/dall-e-2.pdfProject: https://openai.com/product/dall-e-2Author: OpenAI闲言碎语时间线&#xff1a;2021.01推出DALLE&#xff0c;2021年底推出GLIDE&#xff0…

锦正茂风冷系列电源JCP-10-80的技术参数

JCP-10-80为高稳定度的双极性恒流电源&#xff0c;广泛应用于电磁铁、亥姆霍兹线圈等感性负载的励磁。电源采用线性电源结构&#xff0c;输出电流稳定度高&#xff0c;纹波和噪声低。电源输出电流可在正负额定电流*值之间连续变化&#xff0c;电流平滑连续过零&#xff0c;可使…

引出生命周期、生命周期_挂载流程、生命周期_更新流程、生命周期_销毁流程、生命周期_总结——Vue

目录 一、引出生命周期 二、生命周期_挂载流程 三、生命周期_更新流程 四、生命周期_销毁流程 五、生命周期_总结 一、引出生命周期 生命周期&#xff1a; 1.又名&#xff1a;生命周期回调函数、生命周期函数、生命周期钩子。 2.是什么&#xff1a;Vue在关键时刻帮我们调…

centos安装 jenkins

目录 一、安装 jdk 二、安装 maven 三、安装 jenkins 官网地址&#xff1a;Jenkins 一、安装 jdk 首先检索包含 java 的列表 yum list java* 检索1.8的列表 yum list java-1.8* 安装 1.8.0 的所有文件 yum install java-1.8.0-openjdk* -y使用命令检查是否安装成功 …

Git图解-IDEA中的Git操作

目录 一、配置Idea 二、项目克隆 三、文件状态识别 四、Git操作 4.1 git add--添加暂存区 4.2 git commit--提交本地仓库 4.3 git push--推送远程仓库 4.4 git pull--更新本地仓库 五、完整开发流程 5.1 步骤1&#xff1a;克隆项目 5.2 步骤2&#xff1a;创建自己开发…

呆头鹅批量剪辑软件,一天制作1000+视频过审神器,0基础批量操作

当我们需要处理大量的视频时&#xff0c;怎么样才能够让工作变得更加简单&#xff1f;可以来试试呆头鹅批量剪辑软件&#xff0c;软件功能非常强大&#xff0c;支持批量剪辑视频&#xff0c;剪辑的过程中可以设置输出的位置和分辨率&#xff0c;同时可以对视频进行一些编辑处理…

CentOS定时任务——crontab

crontab Linux crontab 是用来定期执行程序的命令。 crond 命令每分钟会定期检查是否有要执行的工作&#xff0c;如果有要执行的工作便会自动执行该工作。 注意&#xff1a;新创建的 cron 任务&#xff0c;不会马上执行&#xff0c;至少要过 2 分钟后才可以&#xff0c;当然你…

软件测试16

在桌面上打开终端窗口, 执行如下操作: 将根目录下所有文件的详细信息输出到 demo 文件中查看 demo 文件前 5 行内容查看 demo 文件后 5 行内容将 ping www.itheima.com 的信息输出到 ping_log 文件中重新开启一个终端窗口, 动态查看 ping_log 文件中的信息 查看日志文件内容…

unity3D基础操作之01--unity3d窗口界面介绍

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录最常使用5种窗口1、Scene场景编辑窗口2、Game游戏运行窗口需要注意的是3、Hierarchy场景物体列表窗口4、Project项目资源列表窗口需要注意的是5、Inspector属性编辑列…

4.Spring Cloud (Hoxton.SR8) 学习笔记—Nacos微服务治理、Nacos配置管理

本文目录如下&#xff1a;一、Nacos微服务治理Nacos 下载 与 启动Spring Cloud 集成 NacosIDEA 同一个 Application 启动多次Nacos - 配置集群Nacos - 设置负载均衡Nacos - 设置服务实例的权重二、Nacos 配置管理Nacos - 合理的把配置信息迁移到 Nacos 中Nacos - 如何使用 Naco…

自然语言处理中数据增强(Data Augmentation)技术最全盘点

与“计算机视觉”中使用图像数据增强的标准做法不同&#xff0c;在NLP中&#xff0c;文本数据的增强非常少见。这是因为对图像的琐碎操作&#xff08;例如将图像旋转几度或将其转换为灰度&#xff09;不会改变其语义。语义上不变的转换的存在是使增强成为Computer Vision研究中…

【Java开发】设计模式 03:建造者模式

1 建造者模式介绍建造者模式使用多个简单的对象一步一步构建成一个复杂的对象。当一个类的构造函数参数个数超过4个&#xff0c;而且这些参数有些是可选的参数&#xff0c;考虑使用构造者模式。&#x1f4cc; 场景当一个类的构造函数参数超过4个&#xff0c;而且这些参数有些是…

【论文研读 上】基于开源软件的无人机飞行仿真 鹿珂珂,刘登攀,王超

基于开源软件的无人机飞行仿真 摘 要 飞行控制算法设计和仿真是无人机研制的关键步骤。为了缩短无人机飞行控制算法设计周期和试验成本&#xff0c;对无人 机纵向和侧向控制算法进行了设计&#xff0c;并基于开源软件开发了固定翼无人机可视化的飞行仿真系统&#xff0c; 固定…

Kafka入门教程

1 Kafka安装 1.1 压缩包安装 1.1.1 JDK环境安装 Kafka是依赖JDK环境的,所以需要事先安装好JDK 下载JDK安装包: Oracle JDK8下载SSH上传到想要安装的目录,比如 /opt.然后使用tar -zxvf jdk-8u351-linux-x64.tar.gz命令解压 添加环境变量 vi /etc/profile,输入如下内容保存后…

【9.数据页结构】

概述 InnoDB 的数据是按「数据页」为单位来读写的&#xff0c;也就是说&#xff0c;当需要读一条记录的时候&#xff0c;并不是将这个记录本身从磁盘读出来&#xff0c;而是以页为单位&#xff0c;将其整体读入内存。数据库的 I/O 操作的最小单位是页&#xff0c;InnoDB 数据页…

【Linux内核三】网络丢包debug案例

&#x1f449;个人主页&#xff1a;highman110 &#x1f449;作者简介&#xff1a;一名硬件工程师&#xff0c;持续学习&#xff0c;不断记录&#xff0c;保持思考&#xff0c;输出干货内容 目录 前言 测试环境 测试现象 ​编辑 定位过程 ​编辑 优化手段 1、加大ring buffer …

X86ARM @Linux平台cache eviction功能测试

经典的ARM处理器高速缓存工作原理: 高速缓存内部结构:

Qt样式表

1>样式表介绍 样式表可通过 QApplication::setStyleSheet()函数将其设置到整个应用程序上&#xff0c;也可以使用 QWidget::setStyleSheet()将其设置到指定的部件或子部件上&#xff0c;不同级别均可设置样式表&#xff0c;称为样式表的层叠。样式表也可通过设计模式编辑样…

vue中render函数的作用及解析

在vue脚手架的main.js文件中&#xff0c;存在这样一段代码&#xff1a; 意思是对vue实例的配置&#xff0c;其中render函数的作用是&#xff0c;将h创建的Node节点信息return返回给Vue.js底层处理文件中的beforeMount()生命周期钩子函数&#xff0c;让其将Node节点信息在界面中…