summaryrefslogtreecommitdiff
path: root/meta-amd/meta-ethanolx/recipes-x86/chassis/x86-power-control/0001-Amd-power-control-modifications-for-EthanolX.patch
blob: eb1f62cd524019aef3aeca52e3f15c61ada6edbc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
From 707a3a52d5884078e2173571d421829449b54225 Mon Sep 17 00:00:00 2001
From: Supreeth Venkatesh <supreeth.venkatesh@amd.com>
Date: Tue, 18 Aug 2020 13:47:55 -0500
Subject: [PATCH 1/1] Amd power control modifications for EthanolX
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit

This patch modifies recipes-x86 chassis manager code to support AMD
EthanolX customer reference board.
The configuration Json file is updated with the GPIO signals present on
AMD EthanolX file.
The Service file is updated to indicate this is modified version of x86
power control suitable for AMD platforms.
The source file is modified to remove Intel specific SIO signals and
functions, modify it to support AMD specific GPIO signals.

Further, Beep() is replaced by lighting up Fault LED, as AMD CRBs does
not have a beeper.

Signed-off-by: Supreeth Venkatesh <supreeth.venkatesh@amd.com>
---
 .../config/power-config-host0.json            |  23 +-
 ...nbmc_project.Chassis.Control.Power.service |   2 +-
 power-control-x86/src/power_control.cpp       | 335 ++----------------
 3 files changed, 44 insertions(+), 316 deletions(-)

diff --git a/power-control-x86/config/power-config-host0.json b/power-control-x86/config/power-config-host0.json
index 567f419..9e1a54a 100644
--- a/power-control-x86/config/power-config-host0.json
+++ b/power-control-x86/config/power-config-host0.json
@@ -1,15 +1,14 @@
 {
-  "IdButton": "ID_BUTTON",
-  "NMIButton": "NMI_BUTTON",
-  "NMIOut": "NMI_OUT",
-  "PostComplete": "POST_COMPLETE",
-  "PwrButton": "POWER_BUTTON",
-  "PwrOK": "PS_PWROK",
-  "PwrOut": "POWER_OUT",
-  "RstButton": "RESET_BUTTON",
-  "RstOut": "RESET_OUT",
-  "SIOOnCtl": "SIO_ONCONTROL",
-  "SIOPwrGd": "SIO_POWER_GOOD",
-  "SIOS5": "SIO_S5"
+  "IdButton": "CHASSIS_ID_BTN",
+  "NMIButton": "MON_P0_NMI_BTN",
+  "NMIOut": "ASSERT_NMI_BTN",
+  "PostComplete": "MON_PWROK",
+  "PwrButton": "MON_P0_PWR_BTN",
+  "PwrOK": "MON_P0_PWR_GOOD",
+  "PwrOut": "ASSERT_PWR_BTN",
+  "RstButton": "MON_P0_RST_BTN",
+  "RstOut": "ASSERT_RST_BTN",
+  "BmcReady": "ASSERT_BMC_READY",
+  "FaultLed": "FAULT_LED"
 }
 
diff --git a/power-control-x86/service_files/xyz.openbmc_project.Chassis.Control.Power.service b/power-control-x86/service_files/xyz.openbmc_project.Chassis.Control.Power.service
index a80235e..43cf1a7 100644
--- a/power-control-x86/service_files/xyz.openbmc_project.Chassis.Control.Power.service
+++ b/power-control-x86/service_files/xyz.openbmc_project.Chassis.Control.Power.service
@@ -1,5 +1,5 @@
 [Unit]
-Description=Intel Power Control
+Description=Amd Power Control
 
 [Service]
 Restart=always
diff --git a/power-control-x86/src/power_control.cpp b/power-control-x86/src/power_control.cpp
index b8bb313..73ddf71 100644
--- a/power-control-x86/src/power_control.cpp
+++ b/power-control-x86/src/power_control.cpp
@@ -42,9 +42,8 @@ static std::string powerOutName;
 static std::string powerOkName;
 static std::string resetOutName;
 static std::string nmiOutName;
-static std::string sioPwrGoodName;
-static std::string sioOnControlName;
-static std::string sioS5Name;
+static std::string bmcReadyName;
+static std::string faultLedName;
 static std::string postCompleteName;
 static std::string powerButtonName;
 static std::string resetButtonName;
@@ -70,11 +69,9 @@ const static constexpr int powerPulseTimeMs = 200;
 const static constexpr int forceOffPulseTimeMs = 15000;
 const static constexpr int resetPulseTimeMs = 500;
 const static constexpr int powerCycleTimeMs = 5000;
-const static constexpr int sioPowerGoodWatchdogTimeMs = 1000;
 const static constexpr int psPowerOKWatchdogTimeMs = 8000;
 const static constexpr int gracefulPowerOffTimeMs = 60000;
 const static constexpr int warmResetCheckTimeMs = 500;
-const static constexpr int buttonMaskTimeMs = 60000;
 const static constexpr int powerOffSaveTimeMs = 7000;
 
 const static std::filesystem::path powerControlDir = "/var/lib/power-control";
@@ -93,24 +90,14 @@ static boost::asio::steady_timer gracefulPowerOffTimer(io);
 static boost::asio::steady_timer warmResetCheckTimer(io);
 // Time power supply power OK assertion on power-on
 static boost::asio::steady_timer psPowerOKWatchdogTimer(io);
-// Time SIO power good assertion on power-on
-static boost::asio::steady_timer sioPowerGoodWatchdogTimer(io);
 // Time power-off state save for power loss tracking
 static boost::asio::steady_timer powerStateSaveTimer(io);
 // POH timer
 static boost::asio::steady_timer pohCounterTimer(io);
-// Time when to allow restart cause updates
-static boost::asio::steady_timer restartCauseTimer(io);
 
 // GPIO Lines and Event Descriptors
 static gpiod::line psPowerOKLine;
 static boost::asio::posix::stream_descriptor psPowerOKEvent(io);
-static gpiod::line sioPowerGoodLine;
-static boost::asio::posix::stream_descriptor sioPowerGoodEvent(io);
-static gpiod::line sioOnControlLine;
-static boost::asio::posix::stream_descriptor sioOnControlEvent(io);
-static gpiod::line sioS5Line;
-static boost::asio::posix::stream_descriptor sioS5Event(io);
 static gpiod::line powerButtonLine;
 static boost::asio::posix::stream_descriptor powerButtonEvent(io);
 static gpiod::line resetButtonLine;
@@ -123,31 +110,10 @@ static gpiod::line postCompleteLine;
 static boost::asio::posix::stream_descriptor postCompleteEvent(io);
 static gpiod::line nmiOutLine;
 
-static constexpr uint8_t beepPowerFail = 8;
-
-static void beep(const uint8_t& beepPriority)
-{
-    std::cerr << "Beep with priority: " << (unsigned)beepPriority << "\n";
-
-    conn->async_method_call(
-        [](boost::system::error_code ec) {
-            if (ec)
-            {
-                std::cerr << "beep returned error with "
-                             "async_method_call (ec = "
-                          << ec << ")\n";
-                return;
-            }
-        },
-        "xyz.openbmc_project.BeepCode", "/xyz/openbmc_project/BeepCode",
-        "xyz.openbmc_project.BeepCode", "Beep", uint8_t(beepPriority));
-}
-
 enum class PowerState
 {
     on,
     waitForPSPowerOK,
-    waitForSIOPowerGood,
     off,
     transitionToOff,
     gracefulTransitionToOff,
@@ -167,9 +133,6 @@ static std::string getPowerStateName(PowerState state)
         case PowerState::waitForPSPowerOK:
             return "Wait for Power Supply Power OK";
             break;
-        case PowerState::waitForSIOPowerGood:
-            return "Wait for SIO Power Good";
-            break;
         case PowerState::off:
             return "Off";
             break;
@@ -210,17 +173,12 @@ enum class Event
 {
     psPowerOKAssert,
     psPowerOKDeAssert,
-    sioPowerGoodAssert,
-    sioPowerGoodDeAssert,
-    sioS5Assert,
-    sioS5DeAssert,
     postCompleteAssert,
     postCompleteDeAssert,
     powerButtonPressed,
     resetButtonPressed,
     powerCycleTimerExpired,
     psPowerOKWatchdogTimerExpired,
-    sioPowerGoodWatchdogTimerExpired,
     gracefulPowerOffTimerExpired,
     powerOnRequest,
     powerOffRequest,
@@ -240,18 +198,6 @@ static std::string getEventName(Event event)
         case Event::psPowerOKDeAssert:
             return "power supply power OK de-assert";
             break;
-        case Event::sioPowerGoodAssert:
-            return "SIO power good assert";
-            break;
-        case Event::sioPowerGoodDeAssert:
-            return "SIO power good de-assert";
-            break;
-        case Event::sioS5Assert:
-            return "SIO S5 assert";
-            break;
-        case Event::sioS5DeAssert:
-            return "SIO S5 de-assert";
-            break;
         case Event::postCompleteAssert:
             return "POST Complete assert";
             break;
@@ -270,9 +216,6 @@ static std::string getEventName(Event event)
         case Event::psPowerOKWatchdogTimerExpired:
             return "power supply power OK watchdog timer expired";
             break;
-        case Event::sioPowerGoodWatchdogTimerExpired:
-            return "SIO power good watchdog timer expired";
-            break;
         case Event::gracefulPowerOffTimerExpired:
             return "graceful power-off timer expired";
             break;
@@ -314,7 +257,6 @@ static void logEvent(const std::string_view stateHandler, const Event event)
 // Power state handlers
 static void powerStateOn(const Event event);
 static void powerStateWaitForPSPowerOK(const Event event);
-static void powerStateWaitForSIOPowerGood(const Event event);
 static void powerStateOff(const Event event);
 static void powerStateTransitionToOff(const Event event);
 static void powerStateGracefulTransitionToOff(const Event event);
@@ -333,9 +275,6 @@ static std::function<void(const Event)> getPowerStateHandler(PowerState state)
         case PowerState::waitForPSPowerOK:
             return powerStateWaitForPSPowerOK;
             break;
-        case PowerState::waitForSIOPowerGood:
-            return powerStateWaitForSIOPowerGood;
-            break;
         case PowerState::off:
             return powerStateOff;
             break;
@@ -399,7 +338,6 @@ static constexpr std::string_view getHostState(const PowerState state)
             return "xyz.openbmc_project.State.Host.HostState.Running";
             break;
         case PowerState::waitForPSPowerOK:
-        case PowerState::waitForSIOPowerGood:
         case PowerState::off:
         case PowerState::transitionToOff:
         case PowerState::transitionToCycleOff:
@@ -425,7 +363,6 @@ static constexpr std::string_view getChassisState(const PowerState state)
             return "xyz.openbmc_project.State.Chassis.PowerState.On";
             break;
         case PowerState::waitForPSPowerOK:
-        case PowerState::waitForSIOPowerGood:
         case PowerState::off:
         case PowerState::cycleOff:
             return "xyz.openbmc_project.State.Chassis.PowerState.Off";
@@ -593,7 +530,7 @@ static void systemPowerGoodFailedLog()
         "MESSAGE=PowerControl: system power good failed to assert (VR failure)",
         "PRIORITY=%i", LOG_INFO, "REDFISH_MESSAGE_ID=%s",
         "OpenBMC.0.1.SystemPowerGoodFailed", "REDFISH_MESSAGE_ARGS=%d",
-        sioPowerGoodWatchdogTimeMs, NULL);
+        psPowerOKWatchdogTimeMs, NULL);
 }
 
 static void psPowerOKFailedLog()
@@ -1081,54 +1018,24 @@ static int setGPIOOutputForMs(const std::string& name, const int value,
 
 static void powerOn()
 {
-    setGPIOOutputForMs(power_control::powerOutName, 0, powerPulseTimeMs);
+    setGPIOOutputForMs(power_control::powerOutName, 1, powerPulseTimeMs);
 }
 
 static void gracefulPowerOff()
 {
-    setGPIOOutputForMs(power_control::powerOutName, 0, powerPulseTimeMs);
+    setGPIOOutputForMs(power_control::powerOutName, 1, powerPulseTimeMs);
 }
 
 static void forcePowerOff()
 {
-    if (setGPIOOutputForMs(power_control::powerOutName, 0,
-                           forceOffPulseTimeMs) < 0)
-    {
-        return;
-    }
+    setGPIOOutputForMs(power_control::powerOutName, 1, forceOffPulseTimeMs);
 
-    // If the force off timer expires, then the PCH power-button override
-    // failed, so attempt the Unconditional Powerdown SMBus command.
-    gpioAssertTimer.async_wait([](const boost::system::error_code ec) {
-        if (ec)
-        {
-            // operation_aborted is expected if timer is canceled before
-            // completion.
-            if (ec != boost::asio::error::operation_aborted)
-            {
-                std::cerr << "Force power off async_wait failed: "
-                          << ec.message() << "\n";
-            }
-            return;
-        }
-        std::cerr << "PCH Power-button override failed. Issuing Unconditional "
-                     "Powerdown SMBus command.\n";
-        const static constexpr size_t pchDevBusAddress = 3;
-        const static constexpr size_t pchDevSlaveAddress = 0x44;
-        const static constexpr size_t pchCmdReg = 0;
-        const static constexpr size_t pchPowerDownCmd = 0x02;
-        if (i2cSet(pchDevBusAddress, pchDevSlaveAddress, pchCmdReg,
-                   pchPowerDownCmd) < 0)
-        {
-            std::cerr << "Unconditional Powerdown command failed! Not sure "
-                         "what to do now.\n";
-        }
-    });
+    return;
 }
 
 static void reset()
 {
-    setGPIOOutputForMs(power_control::resetOutName, 0, resetPulseTimeMs);
+    setGPIOOutputForMs(power_control::resetOutName, 1, resetPulseTimeMs);
 }
 
 static void gracefulPowerOffTimerStart()
@@ -1373,43 +1280,16 @@ static void currentHostStateMonitor()
         });
 }
 
-static void sioPowerGoodWatchdogTimerStart()
-{
-    std::cerr << "SIO power good watchdog timer started\n";
-    sioPowerGoodWatchdogTimer.expires_after(
-        std::chrono::milliseconds(sioPowerGoodWatchdogTimeMs));
-    sioPowerGoodWatchdogTimer.async_wait(
-        [](const boost::system::error_code ec) {
-            if (ec)
-            {
-                // operation_aborted is expected if timer is canceled before
-                // completion.
-                if (ec != boost::asio::error::operation_aborted)
-                {
-                    std::cerr << "SIO power good watchdog async_wait failed: "
-                              << ec.message() << "\n";
-                }
-                std::cerr << "SIO power good watchdog timer canceled\n";
-                return;
-            }
-            std::cerr << "SIO power good watchdog timer completed\n";
-            sendPowerControlEvent(Event::sioPowerGoodWatchdogTimerExpired);
-        });
-}
-
 static void powerStateOn(const Event event)
 {
+    gpiod::line line;
     logEvent(__FUNCTION__, event);
     switch (event)
     {
         case Event::psPowerOKDeAssert:
             setPowerState(PowerState::off);
-            // DC power is unexpectedly lost, beep
-            beep(beepPowerFail);
-            break;
-        case Event::sioS5Assert:
-            setPowerState(PowerState::transitionToOff);
-            addRestartCause(RestartCause::softReset);
+            // DC power is unexpectedly lost, Light Up fault LED
+            power_control::setGPIOOutput(power_control::faultLedName, 1, line);
             break;
         case Event::postCompleteDeAssert:
             setPowerState(PowerState::checkForWarmReset);
@@ -1461,37 +1341,12 @@ static void powerStateWaitForPSPowerOK(const Event event)
             // Cancel any GPIO assertions held during the transition
             gpioAssertTimer.cancel();
             psPowerOKWatchdogTimer.cancel();
-            sioPowerGoodWatchdogTimerStart();
-            setPowerState(PowerState::waitForSIOPowerGood);
+            setPowerState(PowerState::on);
             break;
         case Event::psPowerOKWatchdogTimerExpired:
             setPowerState(PowerState::off);
             psPowerOKFailedLog();
             break;
-        case Event::sioPowerGoodAssert:
-            psPowerOKWatchdogTimer.cancel();
-            setPowerState(PowerState::on);
-            break;
-        default:
-            phosphor::logging::log<phosphor::logging::level::INFO>(
-                "No action taken.");
-            break;
-    }
-}
-
-static void powerStateWaitForSIOPowerGood(const Event event)
-{
-    logEvent(__FUNCTION__, event);
-    switch (event)
-    {
-        case Event::sioPowerGoodAssert:
-            sioPowerGoodWatchdogTimer.cancel();
-            setPowerState(PowerState::on);
-            break;
-        case Event::sioPowerGoodWatchdogTimerExpired:
-            setPowerState(PowerState::off);
-            systemPowerGoodFailedLog();
-            break;
         default:
             phosphor::logging::log<phosphor::logging::level::INFO>(
                 "No action taken.");
@@ -1505,12 +1360,6 @@ static void powerStateOff(const Event event)
     switch (event)
     {
         case Event::psPowerOKAssert:
-            setPowerState(PowerState::waitForSIOPowerGood);
-            break;
-        case Event::sioS5DeAssert:
-            setPowerState(PowerState::waitForPSPowerOK);
-            break;
-        case Event::sioPowerGoodAssert:
             setPowerState(PowerState::on);
             break;
         case Event::powerButtonPressed:
@@ -1572,11 +1421,11 @@ static void powerStateCycleOff(const Event event)
     {
         case Event::psPowerOKAssert:
             powerCycleTimer.cancel();
-            setPowerState(PowerState::waitForSIOPowerGood);
+            setPowerState(PowerState::on);
             break;
-        case Event::sioS5DeAssert:
+        case Event::psPowerOKDeAssert:
             powerCycleTimer.cancel();
-            setPowerState(PowerState::waitForPSPowerOK);
+            setPowerState(PowerState::off);
             break;
         case Event::powerButtonPressed:
             powerCycleTimer.cancel();
@@ -1635,21 +1484,18 @@ static void powerStateGracefulTransitionToCycleOff(const Event event)
 
 static void powerStateCheckForWarmReset(const Event event)
 {
+    gpiod::line line;
     logEvent(__FUNCTION__, event);
     switch (event)
     {
-        case Event::sioS5Assert:
-            warmResetCheckTimer.cancel();
-            setPowerState(PowerState::transitionToOff);
-            break;
         case Event::warmResetDetected:
             setPowerState(PowerState::on);
             break;
         case Event::psPowerOKDeAssert:
             warmResetCheckTimer.cancel();
             setPowerState(PowerState::off);
-            // DC power is unexpectedly lost, beep
-            beep(beepPowerFail);
+            // DC power is unexpectedly lost, Light up Fault LED
+            power_control::setGPIOOutput(power_control::faultLedName, 1, line);
             break;
         default:
             phosphor::logging::log<phosphor::logging::level::INFO>(
@@ -1681,71 +1527,6 @@ static void psPowerOKHandler()
         });
 }
 
-static void sioPowerGoodHandler()
-{
-    gpiod::line_event gpioLineEvent = sioPowerGoodLine.event_read();
-
-    Event powerControlEvent =
-        gpioLineEvent.event_type == gpiod::line_event::RISING_EDGE
-            ? Event::sioPowerGoodAssert
-            : Event::sioPowerGoodDeAssert;
-
-    sendPowerControlEvent(powerControlEvent);
-    sioPowerGoodEvent.async_wait(
-        boost::asio::posix::stream_descriptor::wait_read,
-        [](const boost::system::error_code ec) {
-            if (ec)
-            {
-                std::cerr << "SIO power good handler error: " << ec.message()
-                          << "\n";
-                return;
-            }
-            sioPowerGoodHandler();
-        });
-}
-
-static void sioOnControlHandler()
-{
-    gpiod::line_event gpioLineEvent = sioOnControlLine.event_read();
-
-    bool sioOnControl =
-        gpioLineEvent.event_type == gpiod::line_event::RISING_EDGE;
-    std::cerr << "SIO_ONCONTROL value changed: " << sioOnControl << "\n";
-    sioOnControlEvent.async_wait(
-        boost::asio::posix::stream_descriptor::wait_read,
-        [](const boost::system::error_code ec) {
-            if (ec)
-            {
-                std::cerr << "SIO ONCONTROL handler error: " << ec.message()
-                          << "\n";
-                return;
-            }
-            sioOnControlHandler();
-        });
-}
-
-static void sioS5Handler()
-{
-    gpiod::line_event gpioLineEvent = sioS5Line.event_read();
-
-    Event powerControlEvent =
-        gpioLineEvent.event_type == gpiod::line_event::FALLING_EDGE
-            ? Event::sioS5Assert
-            : Event::sioS5DeAssert;
-
-    sendPowerControlEvent(powerControlEvent);
-    sioS5Event.async_wait(boost::asio::posix::stream_descriptor::wait_read,
-                          [](const boost::system::error_code ec) {
-                              if (ec)
-                              {
-                                  std::cerr << "SIO S5 handler error: "
-                                            << ec.message() << "\n";
-                                  return;
-                              }
-                              sioS5Handler();
-                          });
-}
-
 static void powerButtonHandler()
 {
     gpiod::line_event gpioLineEvent = powerButtonLine.event_read();
@@ -2007,7 +1788,7 @@ static void postCompleteHandler()
     gpiod::line_event gpioLineEvent = postCompleteLine.event_read();
 
     bool postComplete =
-        gpioLineEvent.event_type == gpiod::line_event::FALLING_EDGE;
+        gpioLineEvent.event_type == gpiod::line_event::RISING_EDGE;
     if (postComplete)
     {
         sendPowerControlEvent(Event::postCompleteAssert);
@@ -2095,19 +1876,14 @@ static int loadConfigValues()
         resetOutName = data["RstOut"];
     }
 
-    if (data.contains("SIOOnCtl"))
-    {
-        sioOnControlName = data["SIOOnCtl"];
-    }
-
-    if (data.contains("SIOPwrGd"))
+    if (data.contains("BmcReady"))
     {
-        sioPwrGoodName = data["SIOPwrGd"];
+        bmcReadyName = data["BmcReady"];
     }
 
-    if (data.contains("SIOS5"))
+    if (data.contains("FaultLed"))
     {
-        sioS5Name = data["SIOS5"];
+        faultLedName = data["FaultLed"];
     }
 
     return 0;
@@ -2155,60 +1931,6 @@ int main(int argc, char* argv[])
         return -1;
     }
 
-    // Request SIO_POWER_GOOD GPIO events
-    if (!power_control::sioPwrGoodName.empty())
-    {
-        if (!power_control::requestGPIOEvents(
-                power_control::sioPwrGoodName,
-                power_control::sioPowerGoodHandler,
-                power_control::sioPowerGoodLine,
-                power_control::sioPowerGoodEvent))
-        {
-            return -1;
-        }
-    }
-    else
-    {
-        std::cerr
-            << "sioPwrGood name should be configured from json config file\n";
-        return -1;
-    }
-
-    // Request SIO_ONCONTROL GPIO events
-    if (!power_control::sioOnControlName.empty())
-    {
-        if (!power_control::requestGPIOEvents(
-                power_control::sioOnControlName,
-                power_control::sioOnControlHandler,
-                power_control::sioOnControlLine,
-                power_control::sioOnControlEvent))
-        {
-            return -1;
-        }
-    }
-    else
-    {
-        std::cerr
-            << "sioOnControl name should be configured from json config file\n";
-        return -1;
-    }
-
-    // Request SIO_S5 GPIO events
-    if (!power_control::sioS5Name.empty())
-    {
-        if (!power_control::requestGPIOEvents(
-                power_control::sioS5Name, power_control::sioS5Handler,
-                power_control::sioS5Line, power_control::sioS5Event))
-        {
-            return -1;
-        }
-    }
-    else
-    {
-        std::cerr << "sioS5 name should be configured from json config file\n";
-        return -1;
-    }
-
     // Request POWER_BUTTON GPIO events
     if (!power_control::powerButtonName.empty())
     {
@@ -2286,12 +2008,12 @@ int main(int argc, char* argv[])
 
     // Initialize POWER_OUT and RESET_OUT GPIO.
     gpiod::line line;
-    if (!power_control::setGPIOOutput(power_control::powerOutName, 1, line))
+    if (!power_control::setGPIOOutput(power_control::powerOutName, 0, line))
     {
         return -1;
     }
 
-    if (!power_control::setGPIOOutput(power_control::resetOutName, 1, line))
+    if (!power_control::setGPIOOutput(power_control::resetOutName, 0, line))
     {
         return -1;
     }
@@ -2299,6 +2021,13 @@ int main(int argc, char* argv[])
     // Release line
     line.reset();
 
+    // DRIVE BMC_READY HIGH
+    gpiod::line bmcReadyline;
+    if (!power_control::setGPIOOutput(power_control::bmcReadyName, 1, bmcReadyline))
+    {
+        return -1;
+    }
+
     // Initialize the power state
     power_control::powerState = power_control::PowerState::off;
     // Check power good
-- 
2.17.1