IPMB Driver for a Satellite MC

The Intelligent Platform Management Bus or IPMB, is anI2C bus that provides a standardized interconnection betweendifferent boards within a chassis. This interconnection isbetween the baseboard management (BMC) and chassis electronics.IPMB is also associated with the messaging protocol through theIPMB bus.

The devices using the IPMB are usually managementcontrollers that perform management functions such as servicingthe front panel interface, monitoring the baseboard,hot-swapping disk drivers in the system chassis, etc…

When an IPMB is implemented in the system, the BMC serves asa controller to give system software access to the IPMB. The BMCsends IPMI requests to a device (usually a Satellite ManagementController or Satellite MC) via IPMB and the devicesends a response back to the BMC.

For more information on IPMB and the format of an IPMB message,refer to the IPMB and IPMI specifications.

IPMB driver for Satellite MC

ipmb-dev-int - This is the driver needed on a Satellite MC toreceive IPMB messages from a BMC and send a response back.This driver works with the I2C driver and a userspaceprogram such as OpenIPMI:

  1. It is an I2C slave backend driver. So, it defines a callbackfunction to set the Satellite MC as an I2C slave.This callback function handles the received IPMI requests.
  2. It defines the read and write functions to enable a userspace program (such as OpenIPMI) to communicate with the kernel.

Load the IPMB driver

The driver needs to be loaded at boot time or manually first.First, make sure you have the following in your config file:CONFIG_IPMB_DEVICE_INTERFACE=y

  1. If you want the driver to be loaded at boot time:
  1. Add this entry to your ACPI table, under the appropriate SMBus:

    Device (SMB0) // Example SMBus host controller{Name (_HID, "<Vendor-Specific HID>") // Vendor-Specific HIDName (_UID, 0) // Unique ID of particular host controller::  Device (IPMB)  {    Name (_HID, "IPMB0001") // IPMB device interface    Name (_UID, 0) // Unique device identifier  }}
  2. Example for device tree:

    &i2c2 {       status = "okay";       ipmb@10 {               compatible = "ipmb-dev";               reg = <0x10>;               i2c-protocol;       };};

If xmit of data to be done using raw i2c block vs smbusthen “i2c-protocol” needs to be defined as above.

  1. Manually from Linux:

    modprobe ipmb-dev-int

Instantiate the device

After loading the driver, you can instantiate the device asdescribed in ‘Documentation/i2c/instantiating-devices.rst’.If you have multiple BMCs, each connected to your Satellite MC viaa different I2C bus, you can instantiate a device for each ofthose BMCs.

The name of the instantiated device contains the I2C bus numberassociated with it as follows:

BMC1 ------ IPMB/I2C bus 1 ---------|   /dev/ipmb-1                              Satellite MCBMC1 ------ IPMB/I2C bus 2 ---------|   /dev/ipmb-2

For instance, you can instantiate the ipmb-dev-int device fromuser space at the 7 bit address 0x10 on bus 2:

# echo ipmb-dev 0x1010 > /sys/bus/i2c/devices/i2c-2/new_device

This will create the device file /dev/ipmb-2, which can be accessedby the user space program. The device needs to be instantiatedbefore running the user space program.