blob: d490fe3ac984b84411dfa5682d485dcabfe18170 [file] [log] [blame]
Alexander Hansen8c4b1d92024-11-04 14:06:24 +01001/*
2 * SPDX-FileCopyrightText: Copyright (c) 2022-2024. All rights
3 * reserved. SPDX-License-Identifier: Apache-2.0
4 */
5#pragma once
6
7#include "config_provider.hpp"
8#include "device_presence.hpp"
9#include "sdbusplus/async/fdio.hpp"
10
11#include <gpiod.hpp>
12
13#include <string>
14#include <unordered_map>
15
16namespace gpio_presence
17{
18
19constexpr auto service = "xyz.openbmc_project.gpiopresence";
20
21class GPIOPresenceManager
22{
23 public:
24 explicit GPIOPresenceManager(sdbusplus::async::context& ctx);
25
26 // spawns the initialization function
27 auto start() -> void;
28
29 // @param[in] name name of device, e.g. 'cable0'
30 // @returns true if present
31 auto getPresence(const std::string& name) -> bool;
32
33 // request our dbus name
34 // @returns our dbus name
35 auto setupBusName() const -> std::string;
36
37 // add the configuration for object at path 'obj'
38 // @param[in] obj object path for the new config
39 // @param[in] config configuration for the new object
40 auto addConfig(const sdbusplus::message::object_path& obj,
41 std::unique_ptr<DevicePresence> config) -> void;
42
43 // update presence information based on new gpio state
44 // @param[in] gpioLine name of the gpio line
45 // @param[in] state new state of the gpio line
46 auto updatePresence(const std::string& gpioLine, bool state) -> void;
47
48 // maps gpio names to cached gpio state
49 // true <=> High
50 std::unordered_map<std::string, bool> gpioState;
51
52 private:
53 // fetch our configuration from dbus
54 // @param[in] obj object path of the configuration
55 auto addConfigFromDbusAsync(sdbusplus::message::object_path obj)
56 -> sdbusplus::async::task<void>;
57
58 // delete our configuration for the object at 'objPath'
59 // @param[in] objPath path of the object we want to forget
60 auto removeConfig(const std::string& objPath) -> void;
61
62 // fetch configuration from dbus via object mapper
63 // and register dbus matches for configuration
64 auto initialize() -> sdbusplus::async::task<void>;
65
66 // handle config interface added
67 // @param[in] obj object path of the configuration
68 auto addConfigHandler(sdbusplus::message::object_path obj) -> void;
69
70 // async block on fdio gpio event and handle it
71 // @param[in] gpioLine name of the gpio to watch for events
72 auto readGPIOAsyncEvent(std::string gpioLine)
73 -> sdbusplus::async::task<void>;
74
75 // maps dbus object paths to configurations
76 // e.g. /xyz/openbmc_project/inventory/system/board/My_Baseboard/cable0
77 std::unordered_map<std::string, std::unique_ptr<DevicePresence>>
78 presenceMap;
79
80 // maps gpio names to fdios
81 std::unordered_map<std::string, std::unique_ptr<sdbusplus::async::fdio>>
82 fdios;
83 // maps gpio names to libgpiod lines
84 std::unordered_map<std::string, ::gpiod::line> gpioLines;
85
86 sdbusplus::async::context& ctx;
87 sdbusplus::server::manager_t manager;
88
89 ConfigProvider configProvider;
90};
91
92} // namespace gpio_presence