|  | ============================== | 
|  | IPMB Driver for a Satellite MC | 
|  | ============================== | 
|  |  | 
|  | The Intelligent Platform Management Bus or IPMB, is an | 
|  | I2C bus that provides a standardized interconnection between | 
|  | different boards within a chassis. This interconnection is | 
|  | between the baseboard management (BMC) and chassis electronics. | 
|  | IPMB is also associated with the messaging protocol through the | 
|  | IPMB bus. | 
|  |  | 
|  | The devices using the IPMB are usually management | 
|  | controllers that perform management functions such as servicing | 
|  | the 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 as | 
|  | a controller to give system software access to the IPMB. The BMC | 
|  | sends IPMI requests to a device (usually a Satellite Management | 
|  | Controller or Satellite MC) via IPMB and the device | 
|  | sends 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 to | 
|  | receive IPMB messages from a BMC and send a response back. | 
|  | This driver works with the I2C driver and a userspace | 
|  | program such as OpenIPMI: | 
|  |  | 
|  | 1) It is an I2C slave backend driver. So, it defines a callback | 
|  | function 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 user | 
|  | space 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: | 
|  |  | 
|  | a) Add this entry to your ACPI table, under the appropriate SMBus:: | 
|  |  | 
|  | Device (SMB0) // Example SMBus host controller | 
|  | { | 
|  | Name (_HID, "<Vendor-Specific HID>") // Vendor-Specific HID | 
|  | Name (_UID, 0) // Unique ID of particular host controller | 
|  | : | 
|  | : | 
|  | Device (IPMB) | 
|  | { | 
|  | Name (_HID, "IPMB0001") // IPMB device interface | 
|  | Name (_UID, 0) // Unique device identifier | 
|  | } | 
|  | } | 
|  |  | 
|  | b) 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 smbus | 
|  | then "i2c-protocol" needs to be defined as above. | 
|  |  | 
|  | 2) Manually from Linux:: | 
|  |  | 
|  | modprobe ipmb-dev-int | 
|  |  | 
|  |  | 
|  | Instantiate the device | 
|  | ---------------------- | 
|  |  | 
|  | After loading the driver, you can instantiate the device as | 
|  | described in 'Documentation/i2c/instantiating-devices.rst'. | 
|  | If you have multiple BMCs, each connected to your Satellite MC via | 
|  | a different I2C bus, you can instantiate a device for each of | 
|  | those BMCs. | 
|  |  | 
|  | The name of the instantiated device contains the I2C bus number | 
|  | associated with it as follows:: | 
|  |  | 
|  | BMC1 ------ IPMB/I2C bus 1 ---------|   /dev/ipmb-1 | 
|  | Satellite MC | 
|  | BMC1 ------ IPMB/I2C bus 2 ---------|   /dev/ipmb-2 | 
|  |  | 
|  | For instance, you can instantiate the ipmb-dev-int device from | 
|  | user 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 accessed | 
|  | by the user space program. The device needs to be instantiated | 
|  | before running the user space program. |