google-ipmi-sys: Add support for PCIE slot to I2C bus mapping
Say the bmc has the following information:
root@xyz:/sys/bus/i2c/devices# ls
0-0070 10-0048 4-0049 5-0062 5-0066 5-0074 i2c-1 i2c-15 i2c-18 i2c-20 i2c-4 i2c-7
1-004e 3-0054 4-004d 5-0063 5-0067 9-004c i2c-10 i2c-16 i2c-19 i2c-21 i2c-5 i2c-8
1-004f 4-0048 5-0061 5-0065 5-0072 i2c-0 i2c-14 i2c-17 i2c-2 i2c-3 i2c-6 i2c-9
root@xyz:/sys/bus/i2c/devices# cd i2c-18
root@xyz:/sys/bus/i2c/devices/i2c-18# ls
delete_device i2c-dev mux_device name new_device
of_node power subsystem uevent
root@xyz:/sys/bus/i2c/devices/i2c-18# cd of_node
root@xyz:/sys/bus/i2c/devices/i2c-18/of_node# ls
root@xyz:/sys/bus/i2c/devices/i2c-18/of_node# cat pcie-slot
/pcie-slot/pcie@4root@xyz:/sys/bus/i2c/devices/i2c-18/of_node# cd
root@xyz:~# cd /sys/firmware/devicetree/base
root@xyz:/sys/firmware/devicetree/base# ls
root@xyz:/sys/firmware/devicetree/base# cd pcie-slot/
root@xyz:/sys/firmware/devicetree/base/pcie-slot# ls
name pcie@1a pcie@2a pcie@4 pcie@6
root@xyz:/sys/firmware/devicetree/base/pcie-slot# cd pcie\@4
root@xyz:/sys/firmware/devicetree/base/pcie-slot/pcie@4# ls
name slot-name
root@xyz:/sys/firmware/devicetree/base/pcie-slot/pcie@4# cat slot-name
slot4root@xyz:/sys/firmware/devicetree/base/pcie-slot/pcie@4#
Then the system can send commands to
1) Get the number of pcie slots.
2) Get information about which i2c bus is routed to which pcie slot.
Tested:
Yes;
1) Sending GetPCIeSlotsCount command; Getting pcie slots count as 4.
root@xyz:~# ipmitool -I dbus raw 0x2e 0x32 0x79 0x2b 0x00 0x04
79 2b 00 04 04
3) Sending GetPCIeSlotI2cBusMapping command with entry ID 0; expecting success;
received "slot5".
root@xyz:~# ipmitool -I dbus raw 0x2e 0x32 0x79 0x2b 0x00 0x05 0x00
79 2b 00 05 14 05 73 6c 6f 74 35
4) Sending GetPCIeSlotI2cBusMapping command with entry ID 1; expecting success;
received "slot1".
root@xyz:~# ipmitool -I dbus raw 0x2e 0x32 0x79 0x2b 0x00 0x05 0x01
79 2b 00 05 0e 05 73 6c 6f 74 31
5) Sending GetPCIeSlotI2cBusMapping command with entry ID 2; expecting success;
received "slot3".
root@xyz:~# ipmitool -I dbus raw 0x2e 0x32 0x79 0x2b 0x00 0x05 0x02
79 2b 00 05 12 05 73 6c 6f 74 33
6) Sending GetPCIeSlotI2cBusMapping command with entry ID 3; expecting success;
received "slot2".
root@xyz:~# ipmitool -I dbus raw 0x2e 0x32 0x79 0x2b 0x00 0x05 0x03
79 2b 00 05 10 05 73 6c 6f 74 32
7) Sending GetPCIeSlotI2cBusMapping command with entry ID 4; expecting failure
root@xyz:~# ipmitool -I dbus raw 0x2e 0x32 0x79 0x2b 0x00 0x05 0x04
Unable to send RAW command (channel=0x0 netfn=0x2e lun=0x0 cmd=0x32 rsp=0xc1): Invalid command
root@xyz:~#
Change-Id: Id6e514bb11e8d4a00c615cffea6c2fdb6f5df03e
Signed-off-by: Jaghathiswari Rankappagounder Natarajan <jaghu@google.com>
diff --git a/main.cpp b/main.cpp
index eaa82ab..f0c61a9 100644
--- a/main.cpp
+++ b/main.cpp
@@ -19,6 +19,7 @@
#include "cable.hpp"
#include "cpld.hpp"
#include "eth.hpp"
+#include "pcie_i2c.hpp"
#include "psu.hpp"
#include <host-ipmid/ipmid-api.h>
@@ -62,6 +63,10 @@
return GetEthDevice(reqBuf, replyCmdBuf, dataLen);
case SysPsuHardReset:
return PsuHardReset(reqBuf, replyCmdBuf, dataLen);
+ case SysPcieSlotCount:
+ return PcieSlotCount(reqBuf, replyCmdBuf, dataLen);
+ case SysPcieSlotI2cBusMapping:
+ return PcieSlotI2cBusMapping(reqBuf, replyCmdBuf, dataLen);
default:
std::fprintf(stderr, "Invalid subcommand: 0x%x\n", reqBuf[0]);
return IPMI_CC_INVALID;