| George Liu | a287072 | 2020-02-11 11:09:30 +0800 | [diff] [blame] | 1 | #pragma once | 
|  | 2 |  | 
| Sampa Misra | 12afe11 | 2020-05-25 11:40:44 -0500 | [diff] [blame] | 3 | #include "pdr.hpp" | 
|  | 4 | #include "pdr_utils.hpp" | 
| George Liu | 6492f52 | 2020-06-16 10:34:05 +0800 | [diff] [blame] | 5 |  | 
| George Liu | c453e16 | 2022-12-21 17:16:23 +0800 | [diff] [blame] | 6 | #include <libpldm/platform.h> | 
| Manojkiran Eda | cc5f158 | 2021-09-29 17:03:06 +0530 | [diff] [blame] | 7 |  | 
| Riya Dixit | 49cfb13 | 2023-03-02 04:26:53 -0600 | [diff] [blame] | 8 | #include <phosphor-logging/lg2.hpp> | 
|  | 9 |  | 
|  | 10 | PHOSPHOR_LOG2_USING; | 
|  | 11 |  | 
| George Liu | a287072 | 2020-02-11 11:09:30 +0800 | [diff] [blame] | 12 | namespace pldm | 
|  | 13 | { | 
| George Liu | a287072 | 2020-02-11 11:09:30 +0800 | [diff] [blame] | 14 | namespace responder | 
|  | 15 | { | 
| George Liu | a287072 | 2020-02-11 11:09:30 +0800 | [diff] [blame] | 16 | namespace pdr_state_effecter | 
|  | 17 | { | 
| George Liu | a287072 | 2020-02-11 11:09:30 +0800 | [diff] [blame] | 18 | using Json = nlohmann::json; | 
|  | 19 |  | 
|  | 20 | static const Json empty{}; | 
|  | 21 |  | 
|  | 22 | /** @brief Parse PDR JSON file and generate state effecter PDR structure | 
|  | 23 | * | 
|  | 24 | *  @param[in] json - the JSON Object with the state effecter PDR | 
|  | 25 | *  @param[out] handler - the Parser of PLDM command handler | 
|  | 26 | *  @param[out] repo - pdr::RepoInterface | 
|  | 27 | * | 
|  | 28 | */ | 
| George Liu | 36e8135 | 2020-07-01 14:40:30 +0800 | [diff] [blame] | 29 | template <class DBusInterface, class Handler> | 
|  | 30 | void generateStateEffecterPDR(const DBusInterface& dBusIntf, const Json& json, | 
|  | 31 | Handler& handler, pdr_utils::RepoInterface& repo) | 
| George Liu | a287072 | 2020-02-11 11:09:30 +0800 | [diff] [blame] | 32 | { | 
|  | 33 | static const std::vector<Json> emptyList{}; | 
|  | 34 | auto entries = json.value("entries", emptyList); | 
|  | 35 | for (const auto& e : entries) | 
|  | 36 | { | 
|  | 37 | size_t pdrSize = 0; | 
|  | 38 | auto effecters = e.value("effecters", emptyList); | 
|  | 39 | for (const auto& effecter : effecters) | 
|  | 40 | { | 
|  | 41 | auto set = effecter.value("set", empty); | 
|  | 42 | auto statesSize = set.value("size", 0); | 
|  | 43 | if (!statesSize) | 
|  | 44 | { | 
| Riya Dixit | 49cfb13 | 2023-03-02 04:26:53 -0600 | [diff] [blame] | 45 | error( | 
|  | 46 | "Malformed PDR JSON return pdrEntry;- no state set info, TYPE={STATE_EFFECTER_PDR}", | 
|  | 47 | "STATE_EFFECTER_PDR", | 
|  | 48 | static_cast<unsigned>(PLDM_STATE_EFFECTER_PDR)); | 
| George Liu | a287072 | 2020-02-11 11:09:30 +0800 | [diff] [blame] | 49 | throw InternalFailure(); | 
|  | 50 | } | 
|  | 51 | pdrSize += sizeof(state_effecter_possible_states) - | 
|  | 52 | sizeof(bitfield8_t) + (sizeof(bitfield8_t) * statesSize); | 
|  | 53 | } | 
|  | 54 | pdrSize += sizeof(pldm_state_effecter_pdr) - sizeof(uint8_t); | 
|  | 55 |  | 
|  | 56 | std::vector<uint8_t> entry{}; | 
|  | 57 | entry.resize(pdrSize); | 
|  | 58 |  | 
|  | 59 | pldm_state_effecter_pdr* pdr = | 
|  | 60 | reinterpret_cast<pldm_state_effecter_pdr*>(entry.data()); | 
| Manojkiran Eda | bcf91ac | 2021-03-14 13:50:48 +0530 | [diff] [blame] | 61 | if (!pdr) | 
|  | 62 | { | 
| Riya Dixit | 49cfb13 | 2023-03-02 04:26:53 -0600 | [diff] [blame] | 63 | error("Failed to get state effecter PDR."); | 
| Manojkiran Eda | bcf91ac | 2021-03-14 13:50:48 +0530 | [diff] [blame] | 64 | continue; | 
|  | 65 | } | 
| George Liu | a287072 | 2020-02-11 11:09:30 +0800 | [diff] [blame] | 66 | pdr->hdr.record_handle = 0; | 
|  | 67 | pdr->hdr.version = 1; | 
|  | 68 | pdr->hdr.type = PLDM_STATE_EFFECTER_PDR; | 
|  | 69 | pdr->hdr.record_change_num = 0; | 
|  | 70 | pdr->hdr.length = pdrSize - sizeof(pldm_pdr_hdr); | 
|  | 71 |  | 
| Manojkiran Eda | cc5f158 | 2021-09-29 17:03:06 +0530 | [diff] [blame] | 72 | pdr->terminus_handle = TERMINUS_HANDLE; | 
| George Liu | c4ea6a9 | 2020-07-14 15:48:44 +0800 | [diff] [blame] | 73 |  | 
|  | 74 | try | 
|  | 75 | { | 
|  | 76 | std::string entity_path = e.value("entity_path", ""); | 
|  | 77 | auto& associatedEntityMap = handler.getAssociateEntityMap(); | 
| Sagar Srinivas | 06f9b29 | 2024-03-31 11:35:28 -0500 | [diff] [blame] | 78 | if (entity_path != "" && associatedEntityMap.contains(entity_path)) | 
| George Liu | c4ea6a9 | 2020-07-14 15:48:44 +0800 | [diff] [blame] | 79 | { | 
|  | 80 | pdr->entity_type = | 
|  | 81 | associatedEntityMap.at(entity_path).entity_type; | 
|  | 82 | pdr->entity_instance = | 
|  | 83 | associatedEntityMap.at(entity_path).entity_instance_num; | 
|  | 84 | pdr->container_id = | 
|  | 85 | associatedEntityMap.at(entity_path).entity_container_id; | 
|  | 86 | } | 
|  | 87 | else | 
|  | 88 | { | 
|  | 89 | pdr->entity_type = e.value("type", 0); | 
|  | 90 | pdr->entity_instance = e.value("instance", 0); | 
|  | 91 | pdr->container_id = e.value("container", 0); | 
| Pavithra Barithaya | 5f21347 | 2022-08-29 02:20:19 -0500 | [diff] [blame] | 92 |  | 
|  | 93 | // do not create the PDR when the FRU or the entity path is not | 
|  | 94 | // present | 
|  | 95 | if (!pdr->entity_type) | 
|  | 96 | { | 
| Pavithra Barithaya | 5f21347 | 2022-08-29 02:20:19 -0500 | [diff] [blame] | 97 | continue; | 
|  | 98 | } | 
| George Liu | c4ea6a9 | 2020-07-14 15:48:44 +0800 | [diff] [blame] | 99 | } | 
|  | 100 | } | 
| Kamalkumar Patel | 58cbcaf | 2023-10-06 03:48:25 -0500 | [diff] [blame] | 101 | catch (const std::exception&) | 
| George Liu | c4ea6a9 | 2020-07-14 15:48:44 +0800 | [diff] [blame] | 102 | { | 
|  | 103 | pdr->entity_type = e.value("type", 0); | 
|  | 104 | pdr->entity_instance = e.value("instance", 0); | 
|  | 105 | pdr->container_id = e.value("container", 0); | 
|  | 106 | } | 
|  | 107 |  | 
| George Liu | a287072 | 2020-02-11 11:09:30 +0800 | [diff] [blame] | 108 | pdr->effecter_semantic_id = 0; | 
|  | 109 | pdr->effecter_init = PLDM_NO_INIT; | 
|  | 110 | pdr->has_description_pdr = false; | 
|  | 111 | pdr->composite_effecter_count = effecters.size(); | 
|  | 112 |  | 
| Brad Bishop | 5079ac4 | 2021-08-19 18:35:06 -0400 | [diff] [blame] | 113 | pldm::responder::pdr_utils::DbusMappings dbusMappings{}; | 
|  | 114 | pldm::responder::pdr_utils::DbusValMaps dbusValMaps{}; | 
| Patrick Williams | 6da4f91 | 2023-05-10 07:50:53 -0500 | [diff] [blame] | 115 | uint8_t* start = entry.data() + sizeof(pldm_state_effecter_pdr) - | 
|  | 116 | sizeof(uint8_t); | 
| George Liu | a287072 | 2020-02-11 11:09:30 +0800 | [diff] [blame] | 117 | for (const auto& effecter : effecters) | 
|  | 118 | { | 
|  | 119 | auto set = effecter.value("set", empty); | 
|  | 120 | state_effecter_possible_states* possibleStates = | 
|  | 121 | reinterpret_cast<state_effecter_possible_states*>(start); | 
|  | 122 | possibleStates->state_set_id = set.value("id", 0); | 
|  | 123 | possibleStates->possible_states_size = set.value("size", 0); | 
|  | 124 |  | 
|  | 125 | start += sizeof(possibleStates->state_set_id) + | 
|  | 126 | sizeof(possibleStates->possible_states_size); | 
|  | 127 | static const std::vector<uint8_t> emptyStates{}; | 
| Brad Bishop | 5079ac4 | 2021-08-19 18:35:06 -0400 | [diff] [blame] | 128 | pldm::responder::pdr_utils::PossibleValues stateValues; | 
| George Liu | a287072 | 2020-02-11 11:09:30 +0800 | [diff] [blame] | 129 | auto states = set.value("states", emptyStates); | 
|  | 130 | for (const auto& state : states) | 
|  | 131 | { | 
|  | 132 | auto index = state / 8; | 
|  | 133 | auto bit = state - (index * 8); | 
|  | 134 | bitfield8_t* bf = reinterpret_cast<bitfield8_t*>(start + index); | 
|  | 135 | bf->byte |= 1 << bit; | 
| George Liu | adbe172 | 2020-05-09 19:20:19 +0800 | [diff] [blame] | 136 | stateValues.emplace_back(state); | 
| George Liu | a287072 | 2020-02-11 11:09:30 +0800 | [diff] [blame] | 137 | } | 
|  | 138 | start += possibleStates->possible_states_size; | 
|  | 139 |  | 
|  | 140 | auto dbusEntry = effecter.value("dbus", empty); | 
|  | 141 | auto objectPath = dbusEntry.value("path", ""); | 
|  | 142 | auto interface = dbusEntry.value("interface", ""); | 
|  | 143 | auto propertyName = dbusEntry.value("property_name", ""); | 
|  | 144 | auto propertyType = dbusEntry.value("property_type", ""); | 
| George Liu | 36e8135 | 2020-07-01 14:40:30 +0800 | [diff] [blame] | 145 |  | 
| Brad Bishop | 5079ac4 | 2021-08-19 18:35:06 -0400 | [diff] [blame] | 146 | pldm::responder::pdr_utils::StatestoDbusVal dbusIdToValMap{}; | 
| George Liu | 821ebc4 | 2021-01-26 14:36:11 +0800 | [diff] [blame] | 147 | pldm::utils::DBusMapping dbusMapping{}; | 
| George Liu | 36e8135 | 2020-07-01 14:40:30 +0800 | [diff] [blame] | 148 | try | 
|  | 149 | { | 
| Patrick Williams | 6da4f91 | 2023-05-10 07:50:53 -0500 | [diff] [blame] | 150 | auto service = dBusIntf.getService(objectPath.c_str(), | 
|  | 151 | interface.c_str()); | 
| George Liu | 821ebc4 | 2021-01-26 14:36:11 +0800 | [diff] [blame] | 152 |  | 
|  | 153 | dbusMapping = pldm::utils::DBusMapping{ | 
|  | 154 | objectPath, interface, propertyName, propertyType}; | 
| Brad Bishop | 5079ac4 | 2021-08-19 18:35:06 -0400 | [diff] [blame] | 155 | dbusIdToValMap = pldm::responder::pdr_utils::populateMapping( | 
| George Liu | 821ebc4 | 2021-01-26 14:36:11 +0800 | [diff] [blame] | 156 | propertyType, dbusEntry["property_values"], stateValues); | 
| George Liu | 36e8135 | 2020-07-01 14:40:30 +0800 | [diff] [blame] | 157 | } | 
|  | 158 | catch (const std::exception& e) | 
|  | 159 | { | 
| Riya Dixit | 49cfb13 | 2023-03-02 04:26:53 -0600 | [diff] [blame] | 160 | error( | 
| Manojkiran Eda | c81d112 | 2024-02-21 20:17:34 +0530 | [diff] [blame] | 161 | "Failed to create effecter PDR, D-Bus object '{PATH}' returned {ERROR}", | 
|  | 162 | "PATH", objectPath, "ERROR", e); | 
| Manojkiran Eda | 3daf7a1 | 2024-04-17 20:33:44 +0530 | [diff] [blame^] | 163 | break; | 
| George Liu | 36e8135 | 2020-07-01 14:40:30 +0800 | [diff] [blame] | 164 | } | 
| George Liu | a287072 | 2020-02-11 11:09:30 +0800 | [diff] [blame] | 165 | dbusMappings.emplace_back(std::move(dbusMapping)); | 
| George Liu | 821ebc4 | 2021-01-26 14:36:11 +0800 | [diff] [blame] | 166 | dbusValMaps.emplace_back(std::move(dbusIdToValMap)); | 
| George Liu | a287072 | 2020-02-11 11:09:30 +0800 | [diff] [blame] | 167 | } | 
| Manojkiran Eda | 3daf7a1 | 2024-04-17 20:33:44 +0530 | [diff] [blame^] | 168 | if (!(dbusMappings.empty() && dbusValMaps.empty())) | 
|  | 169 | { | 
|  | 170 | pdr->effecter_id = handler.getNextEffecterId(); | 
|  | 171 | handler.addDbusObjMaps(pdr->effecter_id, | 
|  | 172 | std::make_tuple(std::move(dbusMappings), | 
|  | 173 | std::move(dbusValMaps))); | 
|  | 174 | pldm::responder::pdr_utils::PdrEntry pdrEntry{}; | 
|  | 175 | pdrEntry.data = entry.data(); | 
|  | 176 | pdrEntry.size = pdrSize; | 
|  | 177 | repo.addRecord(pdrEntry); | 
|  | 178 | } | 
| George Liu | a287072 | 2020-02-11 11:09:30 +0800 | [diff] [blame] | 179 | } | 
|  | 180 | } | 
|  | 181 |  | 
|  | 182 | } // namespace pdr_state_effecter | 
|  | 183 | } // namespace responder | 
|  | 184 | } // namespace pldm |