mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-26 06:04:14 +08:00
042f057fe2
Many IPMB devices don't support smbus protocol and this driver only supports the smbus protocol at the moment. Added support for the i2c protocol as well. There will be a variable "i2c-protocol" passed by the device tree or ACPI table which determines whether the protocol is i2c or smbus. Signed-off-by: Vijay Khemka <vijaykhemka@fb.com> Reviewed-by: Asmaa Mnebhi <asmaa@mellanox.com> Message-Id: <20191211185604.1266063-1-vijaykhemka@fb.com> [IPMB.txt had moved to driver-api/ipmb.rst, I adjusted] Signed-off-by: Corey Minyard <cminyard@mvista.com>
110 lines
3.5 KiB
ReStructuredText
110 lines
3.5 KiB
ReStructuredText
==============================
|
|
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.
|