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/pcie_i2c.hpp b/pcie_i2c.hpp
new file mode 100644
index 0000000..6150226
--- /dev/null
+++ b/pcie_i2c.hpp
@@ -0,0 +1,21 @@
+#pragma once
+
+#include <host-ipmid/ipmid-api.h>
+
+namespace google
+{
+namespace ipmi
+{
+
+// Handle the pcie slot count command.
+// Sys can query the number of pcie slots.
+ipmi_ret_t PcieSlotCount(const uint8_t* reqBuf, uint8_t* replyBuf,
+ size_t* dataLen);
+
+// Handle the pcie slot to i2c bus mapping command.
+// Sys can query which i2c bus is routed to which pcie slot.
+ipmi_ret_t PcieSlotI2cBusMapping(const uint8_t* reqBuf, uint8_t* replyBuf,
+ size_t* dataLen);
+
+} // namespace ipmi
+} // namespace google