| ============================== |
| 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. |