Enable dynamic presence detect of FRUs
This commit enables presence detect of FRUs at runtime.
Anytime any FRU can get attached or de-attached,
this code will detect it and will enable/disable the corresponding
output I2C pin respectively.
Right now we have only one FRU- op-panel, which is attachable or
de-attachable at runtime.
Test- Tested on Simics:
>> 2timers keep running, as part of vpd-manager-
./vpd-manager
keep checking for event occurance...
hasEventOccurred ?
keep checking for event occurance...
hasEventOccurred ?
>> changed signal at presence-pin of FRU2
keep checking for event occurance...
hasEventOccurred ?
keep checking for event occurance...
hasEventOccurred ?
Yes, togggle the gpio <---------------------event on 2nd timer
>> Again, changed signal at presence-pin of FRU2
keep checking for event occurance...
hasEventOccurred ?
keep checking for event occurance...
hasEventOccurred ?
Yes, togggle the gpio <---------------------event on 2nd timer
>> changed signal at presence-pin of FRU1
keep checking for event occurance...
hasEventOccurred ?
Yes, togggle the gpio <---------------------event on 1st timer
keep checking for event occurance...
hasEventOccurred ?
>> Again changed signal at presence-pin of FRU1
keep checking for event occurance...
hasEventOccurred ?
Yes, togggle the gpio <---------------------event on 1st timer
keep checking for event occurance...
hasEventOccurred ?
>> Noticed change on output gpio after every signal change.
As of now for testing, output gpio is same for both of these FRUs-
>> Effects on i2c-
i2cdetect -y 7
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: 20 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
50: UU UU UU -- -- -- -- -- -- -- 5a -- -- -- -- --
60: UU UU UU -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- UU --
i2cdetect -y 7
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: 20 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
50: UU 51 UU -- -- -- -- -- -- -- 5a -- -- -- -- --
60: UU UU UU -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- UU --
Also tested for write functionality, shouldn't be affected due to this change
It looks fine.
root@p10bmc:~# busctl introspect xyz.openbmc_project.Inventory.Manager /xyz/openbmc_project/inventory/system/chassis/motherboard |grep PN
.PN property ay 7 48 50 87 71 54 55 56 emits-change writable
root@p10bmc:~# busctl call com.ibm.VPD.Manager /com/ibm/VPD/Manager com.ibm.VPD.Manager WriteKeyword ossay "/system/chassis/motherboard" "VINI" "PN" 1 80
root@p10bmc:~# busctl introspect xyz.openbmc_project.Inventory.Manager /xyz/openbmc_project/inventory/system/chassis/motherboard |grep PN
.PN property ay 7 80 50 87 71 54 55 56 emits-change writable
root@p10bmc:~# busctl call com.ibm.VPD.Manager /com/ibm/VPD/Manager com.ibm.VPD.Manager WriteKeyword ossay "/system/chassis/motherboard" "VINI" "PN" 1 48
root@p10bmc:~# busctl introspect xyz.openbmc_project.Inventory.Manager /xyz/openbmc_project/inventory/system/chassis/motherboard |grep PN
.PN property ay 7 48 50 87 71 54 55 56 emits-change writable
Change-Id: If7d311d36bf56ece751afe393a9ba2d83be5df11
Signed-off-by: Alpana Kumari <alpankum@in.ibm.com>
diff --git a/vpd-manager/manager.cpp b/vpd-manager/manager.cpp
index 829dce8..edef56b 100644
--- a/vpd-manager/manager.cpp
+++ b/vpd-manager/manager.cpp
@@ -3,6 +3,7 @@
#include "manager.hpp"
#include "editor_impl.hpp"
+#include "gpioMonitor.hpp"
#include "ibm_vpd_utils.hpp"
#include "ipz_parser.hpp"
#include "reader_impl.hpp"
@@ -10,6 +11,7 @@
#include <phosphor-logging/elog-errors.hpp>
+using namespace openpower::vpd::manager;
using namespace openpower::vpd::constants;
using namespace openpower::vpd::inventory;
using namespace openpower::vpd::manager::editor;
@@ -38,19 +40,18 @@
try
{
processJSON();
+
+ auto event = sdeventplus::Event::get_default();
+ GpioMonitor gpioMon1(jsonFile, event);
+
+ _bus.attach_event(event.get(), SD_EVENT_PRIORITY_IMPORTANT);
+ cout << "VPD manager event loop started\n";
+ event.loop();
}
catch (const std::exception& e)
{
std::cerr << e.what() << "\n";
}
-
- while (true)
- {
- _bus.process_discard();
-
- // wait for event
- _bus.wait();
- }
}
void Manager::processJSON()
@@ -233,15 +234,14 @@
}
else
{
- string cmd = str + deviceAddress + " > /sys/bus/" + busType +
- "/drivers/" + driverType;
-
- executeCmd(cmd + "/unbind");
- executeCmd(cmd + "/bind");
+ executeCmd(createBindUnbindDriverCmnd(deviceAddress, busType,
+ driverType, "/unbind"));
+ executeCmd(createBindUnbindDriverCmnd(deviceAddress, busType,
+ driverType, "/bind"));
}
}
}
} // namespace manager
} // namespace vpd
-} // namespace openpower
+} // namespace openpower
\ No newline at end of file