blob: 3f52275c9d71e9a4e534ea070507629d54d3a46c [file] [log] [blame]
Kumar Thangavel0269eaf2021-08-11 15:45:18 +05301#pragma once
2
3#include "lpcsnoop/snoop.hpp"
4
5#include <boost/asio.hpp>
Kumar Thangavel0269eaf2021-08-11 15:45:18 +05306#include <gpiod.hpp>
Kumar Thangavel0269eaf2021-08-11 15:45:18 +05307#include <sdbusplus/asio/connection.hpp>
8#include <sdbusplus/asio/object_server.hpp>
9#include <sdbusplus/asio/property.hpp>
10#include <sdbusplus/bus.hpp>
11#include <sdbusplus/server.hpp>
12#include <xyz/openbmc_project/Chassis/Buttons/HostSelector/server.hpp>
13#include <xyz/openbmc_project/State/Boot/Raw/server.hpp>
14
Patrick Williams0ea73572023-05-10 07:50:44 -050015#include <filesystem>
16#include <iostream>
Jonathan Domande7a6dd2023-05-03 10:54:08 -070017#include <span>
Patrick Williams0ea73572023-05-10 07:50:44 -050018
Kumar Thangavel0269eaf2021-08-11 15:45:18 +053019const std::string ipmiSnoopObject = "/xyz/openbmc_project/state/boot/raw";
20
21const int hostParseIdx = 3;
Kumar Thangavel0269eaf2021-08-11 15:45:18 +053022const int maxPosition = 4;
23
Jonathan Domande7a6dd2023-05-03 10:54:08 -070024extern bool sevenSegmentLedEnabled;
Kumar Thangavelaee65402022-08-09 17:21:48 +053025
Jonathan Domande7a6dd2023-05-03 10:54:08 -070026extern std::vector<gpiod::line> led_lines;
Kumar Thangavel0269eaf2021-08-11 15:45:18 +053027
28using Selector =
29 sdbusplus::xyz::openbmc_project::Chassis::Buttons::server::HostSelector;
30
Kumar Thangavel0269eaf2021-08-11 15:45:18 +053031const std::string selectorService = "xyz.openbmc_project.Chassis.Buttons";
32const std::string selectorObject =
33 "/xyz/openbmc_project/Chassis/Buttons/HostSelector";
34const std::string selectorIface =
35 "xyz.openbmc_project.Chassis.Buttons.HostSelector";
36
37const std::string rawObject = "/xyz/openbmc_project/state/boot";
38const std::string rawIface = "xyz.openbmc_project.State.Boot.Raw";
39const std::string rawService = "xyz.openbmc_project.State.Boot.Raw";
40
Jonathan Domande7a6dd2023-05-03 10:54:08 -070041int postCodeIpmiHandler(const std::string& snoopObject,
42 const std::string& snoopDbus, sdbusplus::bus_t& bus,
43 std::span<std::string> host);
Kumar Thangavel0269eaf2021-08-11 15:45:18 +053044
Jonathan Domande7a6dd2023-05-03 10:54:08 -070045uint32_t getSelectorPosition(sdbusplus::bus_t& bus);
Kumar Thangavel0269eaf2021-08-11 15:45:18 +053046
47struct IpmiPostReporter : PostObject
48{
Patrick Williamsaebf87c2022-07-22 19:26:54 -050049 IpmiPostReporter(sdbusplus::bus_t& bus, const char* objPath) :
Kumar Thangavel0269eaf2021-08-11 15:45:18 +053050 PostObject(bus, objPath), bus(bus),
51 propertiesChangedSignalRaw(
52 bus,
53 sdbusplus::bus::match::rules::propertiesChanged(objPath, rawIface),
54
Patrick Williamsaebf87c2022-07-22 19:26:54 -050055 [this, &bus](sdbusplus::message_t& msg) {
Cosmo Choufe514952024-09-05 01:08:58 +080056 using primarycode_t = std::vector<uint8_t>;
Patrick Williamsd62ef552024-08-16 15:20:42 -040057 using secondarycode_t = std::vector<uint8_t>;
58 using postcode_t = std::tuple<primarycode_t, secondarycode_t>;
Kumar Thangavel0269eaf2021-08-11 15:45:18 +053059
Patrick Williamsd62ef552024-08-16 15:20:42 -040060 /* sevenSegmentLedEnabled flag is set when GPIO pins are not
61 there 7 seg display for fewer platforms. So, the code for
62 postcode display and Get Selector position can be skipped in
63 those platforms.
64 */
65 if (!sevenSegmentLedEnabled)
Kumar Thangavelaee65402022-08-09 17:21:48 +053066 {
Patrick Williamsd62ef552024-08-16 15:20:42 -040067 return;
Kumar Thangavelaee65402022-08-09 17:21:48 +053068 }
Patrick Williamsd62ef552024-08-16 15:20:42 -040069
70 std::string objectName;
71 std::string InterfaceName;
72 std::map<std::string, std::variant<postcode_t>> msgData;
73 msg.read(InterfaceName, msgData);
74
75 std::filesystem::path name(msg.get_path());
76 objectName = name.filename();
77
78 std::string hostNumStr = objectName.substr(hostParseIdx);
79 size_t hostNum = std::stoi(hostNumStr);
80
81 size_t position = getSelectorPosition(bus);
82
83 if (position > maxPosition)
84 {
85 std::cerr << "Invalid position. Position should be 1 to 4 "
86 "for all hosts "
87 << std::endl;
88 }
89
90 // Check if it was the Value property that changed.
91 auto valPropMap = msgData.find("Value");
92 if (valPropMap == msgData.end())
93 {
94 std::cerr << "Value property is not found " << std::endl;
95 return;
96 }
Cosmo Choufe514952024-09-05 01:08:58 +080097 auto postcode =
Patrick Williamsd62ef552024-08-16 15:20:42 -040098 std::get<0>(std::get<postcode_t>(valPropMap->second));
99
Cosmo Choufe514952024-09-05 01:08:58 +0800100 if (postcode.size() == 1)
Patrick Williamsd62ef552024-08-16 15:20:42 -0400101 {
102 if (position == hostNum)
103 {
Patrick Williamsd62ef552024-08-16 15:20:42 -0400104 // write postcode into seven segment display
Cosmo Choufe514952024-09-05 01:08:58 +0800105 if (postCodeDisplay(postcode[0]) < 0)
Patrick Williamsd62ef552024-08-16 15:20:42 -0400106 {
107 fprintf(stderr, "Error in display the postcode\n");
108 }
109 }
110 else
111 {
112 fprintf(stderr, "Host Selector Position and host "
113 "number is not matched..\n");
114 }
115 }
116 else
117 {
118 fprintf(stderr, "invalid postcode value \n");
119 }
120 })
Patrick Williams0ea73572023-05-10 07:50:44 -0500121 {}
Kumar Thangavel0269eaf2021-08-11 15:45:18 +0530122
Patrick Williamsaebf87c2022-07-22 19:26:54 -0500123 sdbusplus::bus_t& bus;
Kumar Thangavel0269eaf2021-08-11 15:45:18 +0530124 sdbusplus::bus::match_t propertiesChangedSignalRaw;
125 int postCodeDisplay(uint8_t);
Patrick Williamsaebf87c2022-07-22 19:26:54 -0500126 void getSelectorPositionSignal(sdbusplus::bus_t& bus);
Kumar Thangavel0269eaf2021-08-11 15:45:18 +0530127};