Asmaa Mnebhi | 51bd6f2 | 2019-06-10 14:57:02 -0400 | [diff] [blame] | 1 | ============================== |
| 2 | IPMB Driver for a Satellite MC |
| 3 | ============================== |
| 4 | |
| 5 | The Intelligent Platform Management Bus or IPMB, is an |
| 6 | I2C bus that provides a standardized interconnection between |
| 7 | different boards within a chassis. This interconnection is |
| 8 | between the baseboard management (BMC) and chassis electronics. |
| 9 | IPMB is also associated with the messaging protocol through the |
| 10 | IPMB bus. |
| 11 | |
| 12 | The devices using the IPMB are usually management |
| 13 | controllers that perform management functions such as servicing |
| 14 | the front panel interface, monitoring the baseboard, |
| 15 | hot-swapping disk drivers in the system chassis, etc... |
| 16 | |
| 17 | When an IPMB is implemented in the system, the BMC serves as |
| 18 | a controller to give system software access to the IPMB. The BMC |
| 19 | sends IPMI requests to a device (usually a Satellite Management |
| 20 | Controller or Satellite MC) via IPMB and the device |
| 21 | sends a response back to the BMC. |
| 22 | |
| 23 | For more information on IPMB and the format of an IPMB message, |
| 24 | refer to the IPMB and IPMI specifications. |
| 25 | |
| 26 | IPMB driver for Satellite MC |
| 27 | ---------------------------- |
| 28 | |
| 29 | ipmb-dev-int - This is the driver needed on a Satellite MC to |
| 30 | receive IPMB messages from a BMC and send a response back. |
| 31 | This driver works with the I2C driver and a userspace |
| 32 | program such as OpenIPMI: |
| 33 | |
| 34 | 1) It is an I2C slave backend driver. So, it defines a callback |
Mauro Carvalho Chehab | ac499fb | 2019-06-29 07:36:46 -0300 | [diff] [blame] | 35 | function to set the Satellite MC as an I2C slave. |
| 36 | This callback function handles the received IPMI requests. |
Asmaa Mnebhi | 51bd6f2 | 2019-06-10 14:57:02 -0400 | [diff] [blame] | 37 | |
| 38 | 2) It defines the read and write functions to enable a user |
Mauro Carvalho Chehab | ac499fb | 2019-06-29 07:36:46 -0300 | [diff] [blame] | 39 | space program (such as OpenIPMI) to communicate with the kernel. |
Asmaa Mnebhi | 51bd6f2 | 2019-06-10 14:57:02 -0400 | [diff] [blame] | 40 | |
| 41 | |
| 42 | Load the IPMB driver |
| 43 | -------------------- |
| 44 | |
| 45 | The driver needs to be loaded at boot time or manually first. |
| 46 | First, make sure you have the following in your config file: |
| 47 | CONFIG_IPMB_DEVICE_INTERFACE=y |
| 48 | |
| 49 | 1) If you want the driver to be loaded at boot time: |
| 50 | |
Mauro Carvalho Chehab | ac499fb | 2019-06-29 07:36:46 -0300 | [diff] [blame] | 51 | a) Add this entry to your ACPI table, under the appropriate SMBus:: |
Asmaa Mnebhi | 51bd6f2 | 2019-06-10 14:57:02 -0400 | [diff] [blame] | 52 | |
Mauro Carvalho Chehab | ac499fb | 2019-06-29 07:36:46 -0300 | [diff] [blame] | 53 | Device (SMB0) // Example SMBus host controller |
| 54 | { |
| 55 | Name (_HID, "<Vendor-Specific HID>") // Vendor-Specific HID |
| 56 | Name (_UID, 0) // Unique ID of particular host controller |
| 57 | : |
| 58 | : |
| 59 | Device (IPMB) |
| 60 | { |
| 61 | Name (_HID, "IPMB0001") // IPMB device interface |
| 62 | Name (_UID, 0) // Unique device identifier |
| 63 | } |
| 64 | } |
Asmaa Mnebhi | 51bd6f2 | 2019-06-10 14:57:02 -0400 | [diff] [blame] | 65 | |
Mauro Carvalho Chehab | ac499fb | 2019-06-29 07:36:46 -0300 | [diff] [blame] | 66 | b) Example for device tree:: |
Asmaa Mnebhi | 51bd6f2 | 2019-06-10 14:57:02 -0400 | [diff] [blame] | 67 | |
Mauro Carvalho Chehab | ac499fb | 2019-06-29 07:36:46 -0300 | [diff] [blame] | 68 | &i2c2 { |
| 69 | status = "okay"; |
Asmaa Mnebhi | 51bd6f2 | 2019-06-10 14:57:02 -0400 | [diff] [blame] | 70 | |
Mauro Carvalho Chehab | ac499fb | 2019-06-29 07:36:46 -0300 | [diff] [blame] | 71 | ipmb@10 { |
| 72 | compatible = "ipmb-dev"; |
| 73 | reg = <0x10>; |
| 74 | }; |
| 75 | }; |
Asmaa Mnebhi | 51bd6f2 | 2019-06-10 14:57:02 -0400 | [diff] [blame] | 76 | |
Mauro Carvalho Chehab | ac499fb | 2019-06-29 07:36:46 -0300 | [diff] [blame] | 77 | 2) Manually from Linux:: |
| 78 | |
| 79 | modprobe ipmb-dev-int |
Asmaa Mnebhi | 51bd6f2 | 2019-06-10 14:57:02 -0400 | [diff] [blame] | 80 | |
| 81 | |
| 82 | Instantiate the device |
| 83 | ---------------------- |
| 84 | |
| 85 | After loading the driver, you can instantiate the device as |
Mauro Carvalho Chehab | ccf988b | 2019-07-26 09:51:16 -0300 | [diff] [blame] | 86 | described in 'Documentation/i2c/instantiating-devices.rst'. |
Asmaa Mnebhi | 51bd6f2 | 2019-06-10 14:57:02 -0400 | [diff] [blame] | 87 | If you have multiple BMCs, each connected to your Satellite MC via |
| 88 | a different I2C bus, you can instantiate a device for each of |
| 89 | those BMCs. |
Asmaa Mnebhi | 51bd6f2 | 2019-06-10 14:57:02 -0400 | [diff] [blame] | 90 | |
Mauro Carvalho Chehab | ac499fb | 2019-06-29 07:36:46 -0300 | [diff] [blame] | 91 | The name of the instantiated device contains the I2C bus number |
| 92 | associated with it as follows:: |
| 93 | |
| 94 | BMC1 ------ IPMB/I2C bus 1 ---------| /dev/ipmb-1 |
Asmaa Mnebhi | 51bd6f2 | 2019-06-10 14:57:02 -0400 | [diff] [blame] | 95 | Satellite MC |
Mauro Carvalho Chehab | ac499fb | 2019-06-29 07:36:46 -0300 | [diff] [blame] | 96 | BMC1 ------ IPMB/I2C bus 2 ---------| /dev/ipmb-2 |
Asmaa Mnebhi | 51bd6f2 | 2019-06-10 14:57:02 -0400 | [diff] [blame] | 97 | |
| 98 | For instance, you can instantiate the ipmb-dev-int device from |
Mauro Carvalho Chehab | ac499fb | 2019-06-29 07:36:46 -0300 | [diff] [blame] | 99 | user space at the 7 bit address 0x10 on bus 2:: |
Asmaa Mnebhi | 51bd6f2 | 2019-06-10 14:57:02 -0400 | [diff] [blame] | 100 | |
| 101 | # echo ipmb-dev 0x1010 > /sys/bus/i2c/devices/i2c-2/new_device |
| 102 | |
| 103 | This will create the device file /dev/ipmb-2, which can be accessed |
| 104 | by the user space program. The device needs to be instantiated |
| 105 | before running the user space program. |