Fru-device : Extended support for 16bit logic bus
The uint8_t bus of getFruInfo() restricted the number of logical I2C
buses that we could implement in the sysfs interface, and it was
unfortunately static_cast'ed to uint_8.which limit on busses to 255.
while Linux kernel can extend the logical I2C bus number to more than
512 without any issues.
This commit add the support of 16 bit logical bus.
reference Link :-
https://lore.kernel.org/all/CACWQX82=MuAavxCqOerxi-Sdywh0xatb-f+1YzGyVSg74oNGqA@mail.gmail.com/T/
Tested :
fru-device successfully recognizes all 8 and 16 bit logic bus.
dependent commit:-
https://gerrit.openbmc.org/c/openbmc/phosphor-host-ipmid/+/58635
Signed-off-by: krishnar4 <krishnar@ami.com>
Change-Id: I4cea81999dc194a1b6915681eeefc846580de15f
diff --git a/include/fru_utils.hpp b/include/fru_utils.hpp
index f1d8e94..d1784cd 100644
--- a/include/fru_utils.hpp
+++ b/include/fru_utils.hpp
@@ -123,7 +123,7 @@
formatIPMIFRU(const std::vector<uint8_t>& fruBytes,
boost::container::flat_map<std::string, std::string>& result);
-std::vector<uint8_t>& getFRUInfo(const uint8_t& bus, const uint8_t& address);
+std::vector<uint8_t>& getFRUInfo(const uint16_t& bus, const uint8_t& address);
uint8_t calculateChecksum(std::vector<uint8_t>::const_iterator iter,
std::vector<uint8_t>::const_iterator end);
diff --git a/src/fru_device.cpp b/src/fru_device.cpp
index d2af2a2..446d5c4 100644
--- a/src/fru_device.cpp
+++ b/src/fru_device.cpp
@@ -928,7 +928,7 @@
}
void rescanOneBus(
- BusMap& busmap, uint8_t busNum,
+ BusMap& busmap, uint16_t busNum,
boost::container::flat_map<
std::pair<size_t, size_t>,
std::shared_ptr<sdbusplus::asio::dbus_interface>>& dbusInterfaceMap,
@@ -1091,7 +1091,7 @@
std::vector<uint8_t> fruData;
try
{
- fruData = getFRUInfo(static_cast<uint8_t>(bus),
+ fruData = getFRUInfo(static_cast<uint16_t>(bus),
static_cast<uint8_t>(address));
}
catch (const std::invalid_argument& e)
@@ -1302,14 +1302,14 @@
objServer, systemBus);
});
- iface->register_method("ReScanBus", [&](uint8_t bus) {
+ iface->register_method("ReScanBus", [&](uint16_t bus) {
rescanOneBus(busMap, bus, dbusInterfaceMap, true, unknownBusObjectCount,
powerIsOn, objServer, systemBus);
});
iface->register_method("GetRawFru", getFRUInfo);
- iface->register_method("WriteFru", [&](const uint8_t bus,
+ iface->register_method("WriteFru", [&](const uint16_t bus,
const uint8_t address,
const std::vector<uint8_t>& data) {
if (!writeFRU(bus, address, data))
@@ -1389,7 +1389,7 @@
<< "\n";
continue;
}
- rescanOneBus(busMap, static_cast<uint8_t>(bus),
+ rescanOneBus(busMap, static_cast<uint16_t>(bus),
dbusInterfaceMap, false,
unknownBusObjectCount, powerIsOn,
objServer, systemBus);
diff --git a/src/fru_utils.cpp b/src/fru_utils.cpp
index e030ac8..4199439 100644
--- a/src/fru_utils.cpp
+++ b/src/fru_utils.cpp
@@ -768,7 +768,7 @@
return static_cast<unsigned int>(area) + 1;
}
-std::vector<uint8_t>& getFRUInfo(const uint8_t& bus, const uint8_t& address)
+std::vector<uint8_t>& getFRUInfo(const uint16_t& bus, const uint8_t& address)
{
auto deviceMap = busMap.find(bus);
if (deviceMap == busMap.end())