blob: 252068cfcf376ca5801f05b420df6e6beff5b03b [file] [log] [blame]
Patrick Williams2544b412022-10-04 08:41:06 -05001extern "C"
2{
Jayanth Othayoth4d779b22021-06-03 05:45:13 -05003#include <libpdbg.h>
4}
5
6#include "fapi_data_process.hpp"
7
8#include <attributes_info.H>
Jayanth Othayoth417b88e2021-11-17 00:28:09 -06009#include <libphal.H>
10#include <phal_exception.H>
Jayanth Othayoth4d779b22021-06-03 05:45:13 -050011
Patrick Williams2544b412022-10-04 08:41:06 -050012#include <phosphor-logging/elog.hpp>
Arya K Padman5bc26532024-04-10 06:19:25 -050013#include <phosphor-logging/lg2.hpp>
Patrick Williams2544b412022-10-04 08:41:06 -050014
Jayanth Othayoth4d779b22021-06-03 05:45:13 -050015#include <algorithm>
16#include <cstdlib>
17#include <cstring>
Jayanth Othayoth1aa90d42023-09-13 04:25:45 -050018#include <format>
Jayanth Othayoth4d779b22021-06-03 05:45:13 -050019#include <iomanip>
20#include <list>
21#include <map>
Jayanth Othayoth4d779b22021-06-03 05:45:13 -050022#include <sstream>
23#include <string>
24
25namespace openpower
26{
27namespace pels
28{
29namespace phal
30{
31
Jayanth Othayoth417b88e2021-11-17 00:28:09 -060032using namespace openpower::phal::exception;
Jayanth Othayoth4d779b22021-06-03 05:45:13 -050033
34/**
35 * Used to pass buffer to pdbg callback api to get required target
36 * data (attributes) based on given data (attribute).
37 */
38struct TargetInfo
39{
40 ATTR_PHYS_BIN_PATH_Type physBinPath;
41 ATTR_LOCATION_CODE_Type locationCode;
42 ATTR_PHYS_DEV_PATH_Type physDevPath;
43 ATTR_MRU_ID_Type mruId;
44
45 bool deconfigure;
46
47 TargetInfo()
48 {
49 memset(&physBinPath, '\0', sizeof(physBinPath));
50 memset(&locationCode, '\0', sizeof(locationCode));
51 memset(&physDevPath, '\0', sizeof(physDevPath));
52 mruId = 0;
53 deconfigure = false;
54 }
55};
56
57/**
58 * Used to return in callback function which are used to get
59 * physical path value and it binary format value.
60 *
61 * The value for constexpr defined based on pdbg_target_traverse function usage.
62 */
63constexpr int continueTgtTraversal = 0;
64constexpr int requireAttrFound = 1;
65constexpr int requireAttrNotFound = 2;
66
67/**
68 * @brief Used to get target location code from phal device tree
69 *
70 * @param[in] target current device tree target
71 * @param[out] appPrivData used for accessing|storing from|to application
72 *
73 * @return 0 to continue traverse, non-zero to stop traverse
74 */
75int pdbgCallbackToGetTgtReqAttrsVal(struct pdbg_target* target,
76 void* appPrivData)
77{
Jayanth Othayoth417b88e2021-11-17 00:28:09 -060078 using namespace openpower::phal::pdbg;
79
Jayanth Othayoth4d779b22021-06-03 05:45:13 -050080 TargetInfo* targetInfo = static_cast<TargetInfo*>(appPrivData);
81
82 ATTR_PHYS_BIN_PATH_Type physBinPath;
83 /**
84 * TODO: Issue: phal/pdata#16
85 * Should not use direct pdbg api to read attribute. Need to use DT_GET_PROP
86 * macro for bmc app's and this will call libdt-api api but, it will print
87 * "pdbg_target_get_attribute failed" trace if attribute is not found and
88 * this callback will call recursively by using pdbg_target_traverse() until
89 * find expected attribute based on return code from this callback. Because,
90 * need to do target iteration to get actual attribute (ATTR_PHYS_BIN_PATH)
91 * value when device tree target info doesn't know to read attribute from
92 * device tree. So, Due to this error trace user will get confusion while
93 * looking traces. Hence using pdbg api to avoid trace until libdt-api
94 * provides log level setup.
95 */
96 if (!pdbg_target_get_attribute(
97 target, "ATTR_PHYS_BIN_PATH",
98 std::stoi(dtAttr::fapi2::ATTR_PHYS_BIN_PATH_Spec),
99 dtAttr::fapi2::ATTR_PHYS_BIN_PATH_ElementCount, physBinPath))
100 {
101 return continueTgtTraversal;
102 }
103
104 if (std::memcmp(physBinPath, targetInfo->physBinPath,
105 sizeof(physBinPath)) != 0)
106 {
107 return continueTgtTraversal;
108 }
109
Jayanth Othayoth363ac762021-11-17 00:38:24 -0600110 // Found Target, now collect the required attributes associated to the
111 // target. Incase of any attribute read failure, initialize the data with
112 // default value.
113
Jayanth Othayoth417b88e2021-11-17 00:28:09 -0600114 try
Jayanth Othayoth4d779b22021-06-03 05:45:13 -0500115 {
Jayanth Othayoth417b88e2021-11-17 00:28:09 -0600116 // Get location code information
117 openpower::phal::pdbg::getLocationCode(target,
118 targetInfo->locationCode);
119 }
120 catch (const std::exception& e)
121 {
122 // log message and continue with default data
Arya K Padman5bc26532024-04-10 06:19:25 -0500123 lg2::error("getLocationCode({TARGET_PATH}): Exception({EXCEPTION})",
124 "TARGET_PATH", pdbg_target_path(target), "EXCEPTION", e);
Jayanth Othayoth4d779b22021-06-03 05:45:13 -0500125 }
126
127 if (DT_GET_PROP(ATTR_PHYS_DEV_PATH, target, targetInfo->physDevPath))
128 {
Arya K Padman5bc26532024-04-10 06:19:25 -0500129 lg2::error("Could not read({TARGET_PATH}) PHYS_DEV_PATH attribute",
130 "TARGET_PATH", pdbg_target_path(target));
Jayanth Othayoth4d779b22021-06-03 05:45:13 -0500131 }
132
133 if (DT_GET_PROP(ATTR_MRU_ID, target, targetInfo->mruId))
134 {
Arya K Padman5bc26532024-04-10 06:19:25 -0500135 lg2::error("Could not read({TARGET_PATH}) ATTR_MRU_ID attribute",
136 "TARGET_PATH", pdbg_target_path(target));
Jayanth Othayoth4d779b22021-06-03 05:45:13 -0500137 }
138
Jayanth Othayoth4d779b22021-06-03 05:45:13 -0500139 return requireAttrFound;
140}
141
142/**
143 * @brief Used to get target info (attributes data)
144 *
145 * To get target required attributes value using another attribute value
146 * ("PHYS_BIN_PATH" which is present in same target attributes list) by using
147 * "ipdbg_target_traverse" api because, here we have attribute value only and
148 * doesn't have respective device tree target info to get required attributes
149 * values from it attributes list.
150 *
151 * @param[in] physBinPath to pass PHYS_BIN_PATH value
152 * @param[out] targetInfo to pas buufer to fill with required attributes
153 *
154 * @return true on success otherwise false
155 */
156bool getTgtReqAttrsVal(const std::vector<uint8_t>& physBinPath,
157 TargetInfo& targetInfo)
158{
159 std::memcpy(&targetInfo.physBinPath, physBinPath.data(),
160 sizeof(targetInfo.physBinPath));
161
162 int ret = pdbg_target_traverse(NULL, pdbgCallbackToGetTgtReqAttrsVal,
163 &targetInfo);
164 if (ret == 0)
165 {
Jayanth Othayoth1aa90d42023-09-13 04:25:45 -0500166 std::string fmt;
167 for (auto value : targetInfo.physBinPath)
168 {
169 fmt += std::format("{:02X} ", value);
170 }
171
Arya K Padman5bc26532024-04-10 06:19:25 -0500172 lg2::error(
173 "Given ATTR_PHYS_BIN_PATH value {ATTR_PHYS_BIN_PATH} not found in phal device tree",
174 "ATTR_PHYS_BIN_PATH", fmt);
Jayanth Othayoth4d779b22021-06-03 05:45:13 -0500175 return false;
176 }
177 else if (ret == requireAttrNotFound)
178 {
179 return false;
180 }
181
182 return true;
183}
184
185/**
186 * @brief GET PEL priority from pHAL priority
187 *
188 * The pHAL callout priority is in different format than PEL format
189 * so, this api is used to return current phal supported priority into
190 * PEL expected format.
191 *
192 * @param[in] phalPriority used to pass phal priority format string
193 *
194 * @return pel priority format string else empty if failure
195 *
196 * @note For "NONE" returning "L" (LOW)
197 */
198static std::string getPelPriority(const std::string& phalPriority)
199{
200 const std::map<std::string, std::string> priorityMap = {
201 {"HIGH", "H"}, {"MEDIUM", "M"}, {"LOW", "L"}, {"NONE", "L"}};
202
203 auto it = priorityMap.find(phalPriority);
204 if (it == priorityMap.end())
205 {
Arya K Padman5bc26532024-04-10 06:19:25 -0500206 lg2::error(
207 "Unsupported phal priority({PHAL_PRIORITY}) is given to get pel priority format",
208 "PHAL_PRIORITY", phalPriority);
Jayanth Othayoth4d779b22021-06-03 05:45:13 -0500209 return "H";
210 }
211
212 return it->second;
213}
214
rajerpp1f928c4a2021-11-27 05:55:21 -0600215/**
216 * @brief addPlanarCallout
217 *
218 * This function will add a json for planar callout in the input json list.
219 * The caller can pass this json list into createErrorPEL to apply the callout.
220 *
221 * @param[in,out] jsonCalloutDataList - json list where callout json will be
222 * emplaced
223 * @param[in] priority - string indicating priority.
224 */
225static void addPlanarCallout(json& jsonCalloutDataList,
226 const std::string& priority)
227{
228 json jsonCalloutData;
229
230 // Inventory path for planar
231 jsonCalloutData["InventoryPath"] =
232 "/xyz/openbmc_project/inventory/system/chassis/motherboard";
233 jsonCalloutData["Deconfigured"] = false;
234 jsonCalloutData["Guarded"] = false;
235 jsonCalloutData["Priority"] = priority;
236
237 jsonCalloutDataList.emplace_back(jsonCalloutData);
238}
239
Jayanth Othayothe98777d2022-06-30 04:11:07 -0500240/**
241 * @brief processClockInfoErrorHelper
242 *
243 * Creates informational PEL for spare clock failure
244 *
245 * @param[in] ffdc FFDC data capturd by the HWP
246 * @param[out] pelJSONFmtCalloutDataList used to store collected callout
247 * data into pel expected format
248 * @param[out] ffdcUserData used to store additional ffdc user data to
249 * provided by the SBE FFDC packet.
250 *
251 * @return NULL
252 *
253 **/
254void processClockInfoErrorHelper(const FFDC& ffdc,
255 json& pelJSONFmtCalloutDataList,
256 FFDCData& ffdcUserData)
257{
Arya K Padman5bc26532024-04-10 06:19:25 -0500258 lg2::info("processClockInfoErrorHelper: FFDC Message[{FFDC_MSG}]",
259 "FFDC_MSG", ffdc.message);
Jayanth Othayothe98777d2022-06-30 04:11:07 -0500260
261 // Adding hardware procedures return code details
262 ffdcUserData.emplace_back("HWP_RC", ffdc.hwp_errorinfo.rc);
263 ffdcUserData.emplace_back("HWP_RC_DESC", ffdc.hwp_errorinfo.rc_desc);
264
265 // Adding hardware procedures required ffdc data for debug
266 for_each(ffdc.hwp_errorinfo.ffdcs_data.cbegin(),
267 ffdc.hwp_errorinfo.ffdcs_data.cend(),
268 [&ffdcUserData](
269 const std::pair<std::string, std::string>& ele) -> void {
Patrick Williams5fb575a2023-10-20 11:18:21 -0500270 std::string keyWithPrefix("HWP_FFDC_");
271 keyWithPrefix.append(ele.first);
Jayanth Othayothe98777d2022-06-30 04:11:07 -0500272
Patrick Williams5fb575a2023-10-20 11:18:21 -0500273 ffdcUserData.emplace_back(keyWithPrefix, ele.second);
274 });
Jayanth Othayothe98777d2022-06-30 04:11:07 -0500275 // get clock position information
276 auto clk_pos = 0xFF; // Invalid position.
277 for (auto& hwCallout : ffdc.hwp_errorinfo.hwcallouts)
278 {
279 if ((hwCallout.hwid == "PROC_REF_CLOCK") ||
280 (hwCallout.hwid == "PCI_REF_CLOCK"))
281 {
282 clk_pos = hwCallout.clkPos;
283 break;
284 }
285 }
286 // Adding CDG (Only deconfigure) targets details
287 for_each(ffdc.hwp_errorinfo.cdg_targets.begin(),
288 ffdc.hwp_errorinfo.cdg_targets.end(),
289 [&ffdcUserData, &pelJSONFmtCalloutDataList,
290 clk_pos](const CDG_Target& cdg_tgt) -> void {
Patrick Williams5fb575a2023-10-20 11:18:21 -0500291 json jsonCalloutData;
292 std::string pelPriority = "H";
293 jsonCalloutData["Priority"] = pelPriority; // Not used
294 jsonCalloutData["SymbolicFRU"] = "REFCLK" + std::to_string(clk_pos);
295 jsonCalloutData["Deconfigured"] = cdg_tgt.deconfigure;
296 jsonCalloutData["EntityPath"] = cdg_tgt.target_entity_path;
297 pelJSONFmtCalloutDataList.emplace_back(jsonCalloutData);
298 });
Jayanth Othayothe98777d2022-06-30 04:11:07 -0500299}
300
Jayanth Othayoth4d779b22021-06-03 05:45:13 -0500301void convertFAPItoPELformat(FFDC& ffdc, json& pelJSONFmtCalloutDataList,
302 FFDCData& ffdcUserData)
303{
Jayanth Othayothe98777d2022-06-30 04:11:07 -0500304 if (ffdc.ffdc_type == FFDC_TYPE_SPARE_CLOCK_INFO)
305 {
306 processClockInfoErrorHelper(ffdc, pelJSONFmtCalloutDataList,
307 ffdcUserData);
308 return;
309 }
310
Jayanth Othayoth4d779b22021-06-03 05:45:13 -0500311 if (ffdc.ffdc_type == FFDC_TYPE_HWP)
312 {
313 // Adding hardware procedures return code details
314 ffdcUserData.emplace_back("HWP_RC", ffdc.hwp_errorinfo.rc);
315 ffdcUserData.emplace_back("HWP_RC_DESC", ffdc.hwp_errorinfo.rc_desc);
316
317 // Adding hardware procedures required ffdc data for debug
318 for_each(
319 ffdc.hwp_errorinfo.ffdcs_data.begin(),
320 ffdc.hwp_errorinfo.ffdcs_data.end(),
321 [&ffdcUserData](std::pair<std::string, std::string>& ele) -> void {
Patrick Williams5fb575a2023-10-20 11:18:21 -0500322 std::string keyWithPrefix("HWP_FFDC_");
323 keyWithPrefix.append(ele.first);
Jayanth Othayoth4d779b22021-06-03 05:45:13 -0500324
Patrick Williams5fb575a2023-10-20 11:18:21 -0500325 ffdcUserData.emplace_back(keyWithPrefix, ele.second);
326 });
Jayanth Othayoth4d779b22021-06-03 05:45:13 -0500327
328 // Adding hardware callout details
329 int calloutCount = 0;
Patrick Williams5fb575a2023-10-20 11:18:21 -0500330 for_each(ffdc.hwp_errorinfo.hwcallouts.begin(),
331 ffdc.hwp_errorinfo.hwcallouts.end(),
332 [&ffdcUserData, &calloutCount, &pelJSONFmtCalloutDataList](
333 const HWCallout& hwCallout) -> void {
334 calloutCount++;
335 std::stringstream keyPrefix;
336 keyPrefix << "HWP_HW_CO_" << std::setfill('0') << std::setw(2)
337 << calloutCount << "_";
Jayanth Othayoth4d779b22021-06-03 05:45:13 -0500338
Patrick Williams5fb575a2023-10-20 11:18:21 -0500339 ffdcUserData.emplace_back(
340 std::string(keyPrefix.str()).append("HW_ID"), hwCallout.hwid);
Jayanth Othayoth4d779b22021-06-03 05:45:13 -0500341
Patrick Williams5fb575a2023-10-20 11:18:21 -0500342 ffdcUserData.emplace_back(
343 std::string(keyPrefix.str()).append("PRIORITY"),
344 hwCallout.callout_priority);
Jayanth Othayoth4d779b22021-06-03 05:45:13 -0500345
Patrick Williams5fb575a2023-10-20 11:18:21 -0500346 phal::TargetInfo targetInfo;
347 phal::getTgtReqAttrsVal(hwCallout.target_entity_path, targetInfo);
Jayanth Othayoth4d779b22021-06-03 05:45:13 -0500348
Patrick Williams5fb575a2023-10-20 11:18:21 -0500349 std::string locationCode = std::string(targetInfo.locationCode);
350 ffdcUserData.emplace_back(
351 std::string(keyPrefix.str()).append("LOC_CODE"), locationCode);
Jayanth Othayoth4d779b22021-06-03 05:45:13 -0500352
Patrick Williams5fb575a2023-10-20 11:18:21 -0500353 std::string physPath = std::string(targetInfo.physDevPath);
354 ffdcUserData.emplace_back(
355 std::string(keyPrefix.str()).append("PHYS_PATH"), physPath);
Jayanth Othayoth4d779b22021-06-03 05:45:13 -0500356
Patrick Williams5fb575a2023-10-20 11:18:21 -0500357 ffdcUserData.emplace_back(
358 std::string(keyPrefix.str()).append("CLK_POS"),
359 std::to_string(hwCallout.clkPos));
rajerpp1f928c4a2021-11-27 05:55:21 -0600360
Patrick Williams5fb575a2023-10-20 11:18:21 -0500361 ffdcUserData.emplace_back(
362 std::string(keyPrefix.str()).append("CALLOUT_PLANAR"),
363 (hwCallout.isPlanarCallout == true ? "true" : "false"));
rajerpp1f928c4a2021-11-27 05:55:21 -0600364
Patrick Williams5fb575a2023-10-20 11:18:21 -0500365 std::string pelPriority =
366 getPelPriority(hwCallout.callout_priority);
rajerpp1f928c4a2021-11-27 05:55:21 -0600367
Patrick Williams5fb575a2023-10-20 11:18:21 -0500368 if (hwCallout.isPlanarCallout)
369 {
370 addPlanarCallout(pelJSONFmtCalloutDataList, pelPriority);
371 }
372 });
Jayanth Othayoth4d779b22021-06-03 05:45:13 -0500373
374 // Adding CDG (callout, deconfigure and guard) targets details
375 calloutCount = 0;
Patrick Williams5fb575a2023-10-20 11:18:21 -0500376 for_each(ffdc.hwp_errorinfo.cdg_targets.begin(),
377 ffdc.hwp_errorinfo.cdg_targets.end(),
378 [&ffdcUserData, &calloutCount, &pelJSONFmtCalloutDataList](
379 const CDG_Target& cdg_tgt) -> void {
380 calloutCount++;
381 std::stringstream keyPrefix;
382 keyPrefix << "HWP_CDG_TGT_" << std::setfill('0') << std::setw(2)
383 << calloutCount << "_";
Jayanth Othayoth4d779b22021-06-03 05:45:13 -0500384
Patrick Williams5fb575a2023-10-20 11:18:21 -0500385 phal::TargetInfo targetInfo;
386 targetInfo.deconfigure = cdg_tgt.deconfigure;
Jayanth Othayoth4d779b22021-06-03 05:45:13 -0500387
Patrick Williams5fb575a2023-10-20 11:18:21 -0500388 phal::getTgtReqAttrsVal(cdg_tgt.target_entity_path, targetInfo);
Jayanth Othayoth4d779b22021-06-03 05:45:13 -0500389
Patrick Williams5fb575a2023-10-20 11:18:21 -0500390 std::string locationCode = std::string(targetInfo.locationCode);
391 ffdcUserData.emplace_back(
392 std::string(keyPrefix.str()).append("LOC_CODE"), locationCode);
393 std::string physPath = std::string(targetInfo.physDevPath);
394 ffdcUserData.emplace_back(
395 std::string(keyPrefix.str()).append("PHYS_PATH"), physPath);
Jayanth Othayoth4d779b22021-06-03 05:45:13 -0500396
Patrick Williams5fb575a2023-10-20 11:18:21 -0500397 ffdcUserData.emplace_back(
398 std::string(keyPrefix.str()).append("CO_REQ"),
399 (cdg_tgt.callout == true ? "true" : "false"));
Jayanth Othayoth4d779b22021-06-03 05:45:13 -0500400
Patrick Williams5fb575a2023-10-20 11:18:21 -0500401 ffdcUserData.emplace_back(
402 std::string(keyPrefix.str()).append("CO_PRIORITY"),
403 cdg_tgt.callout_priority);
Jayanth Othayoth4d779b22021-06-03 05:45:13 -0500404
Patrick Williams5fb575a2023-10-20 11:18:21 -0500405 ffdcUserData.emplace_back(
406 std::string(keyPrefix.str()).append("DECONF_REQ"),
407 (cdg_tgt.deconfigure == true ? "true" : "false"));
Jayanth Othayoth4d779b22021-06-03 05:45:13 -0500408
Patrick Williams5fb575a2023-10-20 11:18:21 -0500409 ffdcUserData.emplace_back(
410 std::string(keyPrefix.str()).append("GUARD_REQ"),
411 (cdg_tgt.guard == true ? "true" : "false"));
Jayanth Othayoth4d779b22021-06-03 05:45:13 -0500412
Patrick Williams5fb575a2023-10-20 11:18:21 -0500413 ffdcUserData.emplace_back(
414 std::string(keyPrefix.str()).append("GUARD_TYPE"),
415 cdg_tgt.guard_type);
Jayanth Othayoth4d779b22021-06-03 05:45:13 -0500416
Patrick Williams5fb575a2023-10-20 11:18:21 -0500417 json jsonCalloutData;
418 jsonCalloutData["LocationCode"] = locationCode;
419 std::string pelPriority = getPelPriority(cdg_tgt.callout_priority);
420 jsonCalloutData["Priority"] = pelPriority;
Jayanth Othayoth4d779b22021-06-03 05:45:13 -0500421
Patrick Williams5fb575a2023-10-20 11:18:21 -0500422 if (targetInfo.mruId != 0)
423 {
424 jsonCalloutData["MRUs"] = json::array({
425 {{"ID", targetInfo.mruId}, {"Priority", pelPriority}},
426 });
427 }
428 jsonCalloutData["Deconfigured"] = cdg_tgt.deconfigure;
429 jsonCalloutData["Guarded"] = cdg_tgt.guard;
430 jsonCalloutData["GuardType"] = cdg_tgt.guard_type;
431 jsonCalloutData["EntityPath"] = cdg_tgt.target_entity_path;
Jayanth Othayoth4d779b22021-06-03 05:45:13 -0500432
Patrick Williams5fb575a2023-10-20 11:18:21 -0500433 pelJSONFmtCalloutDataList.emplace_back(jsonCalloutData);
434 });
Jayanth Othayoth9368b712021-11-17 01:03:42 -0600435
436 // Adding procedure callout
437 calloutCount = 0;
438 for_each(ffdc.hwp_errorinfo.procedures_callout.begin(),
439 ffdc.hwp_errorinfo.procedures_callout.end(),
440 [&ffdcUserData, &calloutCount, &pelJSONFmtCalloutDataList](
441 const ProcedureCallout& procCallout) -> void {
Patrick Williams5fb575a2023-10-20 11:18:21 -0500442 calloutCount++;
443 std::stringstream keyPrefix;
444 keyPrefix << "HWP_PROC_CO_" << std::setfill('0') << std::setw(2)
445 << calloutCount << "_";
446 ffdcUserData.emplace_back(
447 std::string(keyPrefix.str()).append("PRIORITY"),
448 procCallout.callout_priority);
449 ffdcUserData.emplace_back(
450 std::string(keyPrefix.str()).append("MAINT_PROCEDURE"),
451 procCallout.proc_callout);
452 json jsonCalloutData;
453 jsonCalloutData["Procedure"] = procCallout.proc_callout;
454 std::string pelPriority =
455 getPelPriority(procCallout.callout_priority);
456 jsonCalloutData["Priority"] = pelPriority;
457 pelJSONFmtCalloutDataList.emplace_back(jsonCalloutData);
458 });
Jayanth Othayoth4d779b22021-06-03 05:45:13 -0500459 }
460 else if ((ffdc.ffdc_type != FFDC_TYPE_NONE) &&
461 (ffdc.ffdc_type != FFDC_TYPE_UNSUPPORTED))
462 {
Arya K Padman5bc26532024-04-10 06:19:25 -0500463 lg2::error("Unsupported phal FFDC type to create PEL. MSG: {FFDC_MSG}",
464 "FFDC_MSG", ffdc.message);
Jayanth Othayoth4d779b22021-06-03 05:45:13 -0500465 }
466}
467
468} // namespace phal
469} // namespace pels
470} // namespace openpower