diff --git a/src/appcommands.cpp b/src/appcommands.cpp
index ecbc2b4..4c7b229 100644
--- a/src/appcommands.cpp
+++ b/src/appcommands.cpp
@@ -323,8 +323,8 @@
 //----------------------------------------------------------------------
 // Set Sys Info Params (IPMI/Sec 22.14a) (CMD_APP_SET_SYS_INFO_PARAMS)
 //----------------------------------------------------------------------
-ipmi::RspType<uint8_t> ipmiAppSetSysInfoParams(ipmi::Context::ptr ctx,
-                                               std::vector<uint8_t> req)
+ipmi::RspType<uint8_t>
+    ipmiAppSetSysInfoParams(ipmi::Context::ptr ctx, std::vector<uint8_t> req)
 {
     uint8_t param = req[0];
     uint8_t req_len = req.size();
@@ -401,9 +401,8 @@
 //----------------------------------------------------------------------
 // Get Sys Info Params (IPMI/Sec 22.14b) (CMD_APP_GET_SYS_INFO_PARAMS)
 //----------------------------------------------------------------------
-ipmi::RspType<std::vector<uint8_t>>
-    ipmiAppGetSysInfoParams(ipmi::Context::ptr ctx, uint8_t, uint8_t param,
-                            uint8_t, uint8_t)
+ipmi::RspType<std::vector<uint8_t>> ipmiAppGetSysInfoParams(
+    ipmi::Context::ptr ctx, uint8_t, uint8_t param, uint8_t, uint8_t)
 {
     int len;
     std::vector<uint8_t> respData;
@@ -459,10 +458,10 @@
             break;
         case SYS_INFO_PARAM_BIOS_CURRENT_BOOT_LIST:
             len = appData[KEY_BIOS_BOOT_LEN].get<uint8_t>();
-            respData.insert(respData.end(),
-                            std::begin(sysInfoParams.bios_current_boot_list),
-                            std::begin(sysInfoParams.bios_current_boot_list) +
-                                len);
+            respData.insert(
+                respData.end(),
+                std::begin(sysInfoParams.bios_current_boot_list),
+                std::begin(sysInfoParams.bios_current_boot_list) + len);
             break;
         case SYS_INFO_PARAM_BIOS_FIXED_BOOT_DEVICE:
             respData.insert(respData.end(),
diff --git a/src/biccommands.cpp b/src/biccommands.cpp
index 2220dfe..6da886e 100644
--- a/src/biccommands.cpp
+++ b/src/biccommands.cpp
@@ -154,10 +154,9 @@
 // netfn=0x38 and cmd=0x08 or 0x33 send the response back to the sender.
 //----------------------------------------------------------------------
 
-ipmi::RspType<IanaType> ipmiOemPostCodeHandler(ipmi::Context::ptr ctx,
-                                               IanaType reqIana,
-                                               uint8_t dataLen,
-                                               std::vector<uint8_t> data)
+ipmi::RspType<IanaType>
+    ipmiOemPostCodeHandler(ipmi::Context::ptr ctx, IanaType reqIana,
+                           uint8_t dataLen, std::vector<uint8_t> data)
 {
     // creating bus connection
     auto conn = getSdBus();
@@ -248,9 +247,8 @@
 // send the response back to the sender.
 //----------------------------------------------------------------------
 
-ipmi::RspType<IanaType> ipmiOemSetHostPowerState(ipmi::Context::ptr ctx,
-                                                 IanaType reqIana,
-                                                 uint8_t status)
+ipmi::RspType<IanaType> ipmiOemSetHostPowerState(
+    ipmi::Context::ptr ctx, IanaType reqIana, uint8_t status)
 {
     std::string targetUnit;
 
@@ -298,9 +296,8 @@
 // netfn=0x38 and cmd=0x19 send the response back to the sender.
 //----------------------------------------------------------------------
 
-ipmi::RspType<IanaType, flashSize>
-    ipmiOemGetBiosFlashSize(ipmi::Context::ptr ctx, IanaType ianaReq,
-                            uint8_t target)
+ipmi::RspType<IanaType, flashSize> ipmiOemGetBiosFlashSize(
+    ipmi::Context::ptr ctx, IanaType ianaReq, uint8_t target)
 {
     if (iana != ianaReq)
     {
diff --git a/src/commandutils.cpp b/src/commandutils.cpp
index 007bb09..06f9321 100644
--- a/src/commandutils.cpp
+++ b/src/commandutils.cpp
@@ -28,10 +28,10 @@
     }
 
     sdbusplus::bus_t dbus(ipmid_get_sd_bus_connection());
-    auto mapperCall = dbus.new_method_call("xyz.openbmc_project.ObjectMapper",
-                                           "/xyz/openbmc_project/object_mapper",
-                                           "xyz.openbmc_project.ObjectMapper",
-                                           "GetSubTreePaths");
+    auto mapperCall = dbus.new_method_call(
+        "xyz.openbmc_project.ObjectMapper",
+        "/xyz/openbmc_project/object_mapper",
+        "xyz.openbmc_project.ObjectMapper", "GetSubTreePaths");
     static constexpr int32_t depth = 0;
     static constexpr auto iface = "xyz.openbmc_project.Configuration.EEPROM";
     static constexpr auto entityManager = "xyz.openbmc_project.EntityManager";
diff --git a/src/oemcommands.cpp b/src/oemcommands.cpp
index 6d9af87..b8ea6f2 100644
--- a/src/oemcommands.cpp
+++ b/src/oemcommands.cpp
@@ -133,9 +133,9 @@
 
     for (auto& object : objectTree)
     {
-        auto variant = ipmi::getDbusProperty(bus, object.second.begin()->first,
-                                             object.first, IP_INTERFACE,
-                                             "Type");
+        auto variant =
+            ipmi::getDbusProperty(bus, object.second.begin()->first,
+                                  object.first, IP_INTERFACE, "Type");
         if (std::get<std::string>(variant) != protocol)
         {
             continue;
@@ -210,8 +210,8 @@
 std::tuple<std::string, std::string> objPath(size_t id)
 {
     std::string hostName = "host" + std::to_string(id);
-    std::string bootObjPath = "/xyz/openbmc_project/control/" + hostName +
-                              "/boot";
+    std::string bootObjPath =
+        "/xyz/openbmc_project/control/" + hostName + "/boot";
     return std::make_tuple(std::move(bootObjPath), std::move(hostName));
 }
 
@@ -237,8 +237,8 @@
     std::string bootOption =
         sdbusplus::message::convert_to_string<boot::BootMode>(bootValue);
 
-    std::string service = getService(*dbus, ipmi::boot::bootModeIntf,
-                                     bootObjPath);
+    std::string service =
+        getService(*dbus, ipmi::boot::bootModeIntf, bootObjPath);
     setDbusProperty(*dbus, service, bootObjPath, ipmi::boot::bootModeIntf,
                     ipmi::boot::bootModeProp, bootOption);
 
@@ -315,11 +315,11 @@
 
     // GETTING PROPERTY OF MODE INTERFACE
 
-    std::string service = getService(*dbus, ipmi::boot::bootModeIntf,
-                                     bootObjPath);
-    Value variant = getDbusProperty(*dbus, service, bootObjPath,
-                                    ipmi::boot::bootModeIntf,
-                                    ipmi::boot::bootModeProp);
+    std::string service =
+        getService(*dbus, ipmi::boot::bootModeIntf, bootObjPath);
+    Value variant =
+        getDbusProperty(*dbus, service, bootObjPath, ipmi::boot::bootModeIntf,
+                        ipmi::boot::bootModeProp);
 
     auto bootMode = sdbusplus::message::convert_from_string<boot::BootMode>(
         std::get<std::string>(variant));
@@ -329,18 +329,18 @@
     // GETTING PROPERTY OF TYPE INTERFACE
 
     service = getService(*dbus, ipmi::boot::bootTypeIntf, bootObjPath);
-    variant = getDbusProperty(*dbus, service, bootObjPath,
-                              ipmi::boot::bootTypeIntf,
-                              ipmi::boot::bootTypeProp);
+    variant =
+        getDbusProperty(*dbus, service, bootObjPath, ipmi::boot::bootTypeIntf,
+                        ipmi::boot::bootTypeProp);
 
     auto bootType = sdbusplus::message::convert_from_string<boot::BootType>(
         std::get<std::string>(variant));
 
     // Get the valid bit to boot enabled property
     service = getService(*dbus, ipmi::boot::bootEnableIntf, bootObjPath);
-    variant = getDbusProperty(*dbus, service, bootObjPath,
-                              ipmi::boot::bootEnableIntf,
-                              ipmi::boot::bootEnableProp);
+    variant =
+        getDbusProperty(*dbus, service, bootObjPath, ipmi::boot::bootEnableIntf,
+                        ipmi::boot::bootEnableProp);
 
     bool validFlag = std::get<bool>(variant);
 
@@ -541,10 +541,10 @@
         return -1;
     }
     sdbusplus::bus_t dbus(bus);
-    auto mapperCall = dbus.new_method_call("xyz.openbmc_project.ObjectMapper",
-                                           "/xyz/openbmc_project/object_mapper",
-                                           "xyz.openbmc_project.ObjectMapper",
-                                           "GetSubTreePaths");
+    auto mapperCall = dbus.new_method_call(
+        "xyz.openbmc_project.ObjectMapper",
+        "/xyz/openbmc_project/object_mapper",
+        "xyz.openbmc_project.ObjectMapper", "GetSubTreePaths");
     static constexpr std::array<const char*, 1> interface = {
         "xyz.openbmc_project.Inventory.Decorator.Asset"};
     mapperCall.append("/xyz/openbmc_project/inventory/", depth, interface);
@@ -745,10 +745,9 @@
 //----------------------------------------------------------------------
 // Get Debug Frame Info
 //----------------------------------------------------------------------
-ipmi_ret_t ipmiOemDbgGetFrameInfo(ipmi_netfn_t, ipmi_cmd_t,
-                                  ipmi_request_t request,
-                                  ipmi_response_t response,
-                                  ipmi_data_len_t data_len, ipmi_context_t)
+ipmi_ret_t ipmiOemDbgGetFrameInfo(
+    ipmi_netfn_t, ipmi_cmd_t, ipmi_request_t request, ipmi_response_t response,
+    ipmi_data_len_t data_len, ipmi_context_t)
 {
     uint8_t* req = reinterpret_cast<uint8_t*>(request);
     uint8_t* res = reinterpret_cast<uint8_t*>(response);
@@ -764,10 +763,9 @@
 //----------------------------------------------------------------------
 // Get Debug Updated Frames
 //----------------------------------------------------------------------
-ipmi_ret_t ipmiOemDbgGetUpdFrames(ipmi_netfn_t, ipmi_cmd_t,
-                                  ipmi_request_t request,
-                                  ipmi_response_t response,
-                                  ipmi_data_len_t data_len, ipmi_context_t)
+ipmi_ret_t ipmiOemDbgGetUpdFrames(
+    ipmi_netfn_t, ipmi_cmd_t, ipmi_request_t request, ipmi_response_t response,
+    ipmi_data_len_t data_len, ipmi_context_t)
 {
     uint8_t* req = reinterpret_cast<uint8_t*>(request);
     uint8_t* res = reinterpret_cast<uint8_t*>(response);
@@ -787,10 +785,9 @@
 //----------------------------------------------------------------------
 // Get Debug POST Description
 //----------------------------------------------------------------------
-ipmi_ret_t ipmiOemDbgGetPostDesc(ipmi_netfn_t, ipmi_cmd_t,
-                                 ipmi_request_t request,
-                                 ipmi_response_t response,
-                                 ipmi_data_len_t data_len, ipmi_context_t)
+ipmi_ret_t ipmiOemDbgGetPostDesc(
+    ipmi_netfn_t, ipmi_cmd_t, ipmi_request_t request, ipmi_response_t response,
+    ipmi_data_len_t data_len, ipmi_context_t)
 {
     uint8_t* req = reinterpret_cast<uint8_t*>(request);
     uint8_t* res = reinterpret_cast<uint8_t*>(response);
@@ -826,10 +823,9 @@
 //----------------------------------------------------------------------
 // Get Debug GPIO Description
 //----------------------------------------------------------------------
-ipmi_ret_t ipmiOemDbgGetGpioDesc(ipmi_netfn_t, ipmi_cmd_t,
-                                 ipmi_request_t request,
-                                 ipmi_response_t response,
-                                 ipmi_data_len_t data_len, ipmi_context_t)
+ipmi_ret_t ipmiOemDbgGetGpioDesc(
+    ipmi_netfn_t, ipmi_cmd_t, ipmi_request_t request, ipmi_response_t response,
+    ipmi_data_len_t data_len, ipmi_context_t)
 {
     uint8_t* req = reinterpret_cast<uint8_t*>(request);
     uint8_t* res = reinterpret_cast<uint8_t*>(response);
@@ -866,10 +862,9 @@
 //----------------------------------------------------------------------
 // Get Debug Frame Data
 //----------------------------------------------------------------------
-ipmi_ret_t ipmiOemDbgGetFrameData(ipmi_netfn_t, ipmi_cmd_t,
-                                  ipmi_request_t request,
-                                  ipmi_response_t response,
-                                  ipmi_data_len_t data_len, ipmi_context_t)
+ipmi_ret_t ipmiOemDbgGetFrameData(
+    ipmi_netfn_t, ipmi_cmd_t, ipmi_request_t request, ipmi_response_t response,
+    ipmi_data_len_t data_len, ipmi_context_t)
 {
     uint8_t* req = reinterpret_cast<uint8_t*>(request);
     uint8_t* res = reinterpret_cast<uint8_t*>(response);
@@ -903,10 +898,9 @@
 //----------------------------------------------------------------------
 // Get Debug Control Panel
 //----------------------------------------------------------------------
-ipmi_ret_t ipmiOemDbgGetCtrlPanel(ipmi_netfn_t, ipmi_cmd_t,
-                                  ipmi_request_t request,
-                                  ipmi_response_t response,
-                                  ipmi_data_len_t data_len, ipmi_context_t)
+ipmi_ret_t ipmiOemDbgGetCtrlPanel(
+    ipmi_netfn_t, ipmi_cmd_t, ipmi_request_t request, ipmi_response_t response,
+    ipmi_data_len_t data_len, ipmi_context_t)
 {
     uint8_t* req = reinterpret_cast<uint8_t*>(request);
     uint8_t* res = reinterpret_cast<uint8_t*>(response);
@@ -997,9 +991,9 @@
 
     auto conn = getSdBus();
     /* Get the post codes by calling GetPostCodes method */
-    auto msg = conn->new_method_call(postCodeService.c_str(),
-                                     postCodeObjPath.c_str(), postCodeInterface,
-                                     "GetPostCodes");
+    auto msg =
+        conn->new_method_call(postCodeService.c_str(), postCodeObjPath.c_str(),
+                              postCodeInterface, "GetPostCodes");
     msg.append(lastestPostCodeIndex);
 
     try
@@ -1569,10 +1563,9 @@
 // Byte 6..7 – Revision
 //
 
-ipmi::RspType<> ipmiOemQSetProcInfo(ipmi::Context::ptr ctx, uint8_t, uint8_t,
-                                    uint8_t, uint8_t procIndex,
-                                    uint8_t paramSel,
-                                    std::vector<uint8_t> request)
+ipmi::RspType<> ipmiOemQSetProcInfo(
+    ipmi::Context::ptr ctx, uint8_t, uint8_t, uint8_t, uint8_t procIndex,
+    uint8_t paramSel, std::vector<uint8_t> request)
 {
     uint8_t numParam = sizeof(cpuInfoKey) / sizeof(uint8_t*);
     std::stringstream ss;
@@ -1720,10 +1713,9 @@
 // Byte 1 - Module Manufacturer ID, LSB
 // Byte 2 - Module Manufacturer ID, MSB
 //
-ipmi::RspType<> ipmiOemQSetDimmInfo(ipmi::Context::ptr ctx, uint8_t, uint8_t,
-                                    uint8_t, uint8_t dimmIndex,
-                                    uint8_t paramSel,
-                                    std::vector<uint8_t> request)
+ipmi::RspType<> ipmiOemQSetDimmInfo(
+    ipmi::Context::ptr ctx, uint8_t, uint8_t, uint8_t, uint8_t dimmIndex,
+    uint8_t paramSel, std::vector<uint8_t> request)
 {
     uint8_t numParam = sizeof(dimmInfoKey) / sizeof(uint8_t*);
     std::stringstream ss;
@@ -1990,10 +1982,9 @@
 // Byte 2..N – Configuration parameter data (see Table_1415h Parameters of HDD
 // Information)
 //
-ipmi_ret_t ipmiOemQGetDriveInfo(ipmi_netfn_t, ipmi_cmd_t,
-                                ipmi_request_t request,
-                                ipmi_response_t response,
-                                ipmi_data_len_t data_len, ipmi_context_t)
+ipmi_ret_t ipmiOemQGetDriveInfo(
+    ipmi_netfn_t, ipmi_cmd_t, ipmi_request_t request, ipmi_response_t response,
+    ipmi_data_len_t data_len, ipmi_context_t)
 {
     qDriveInfo_t* req = reinterpret_cast<qDriveInfo_t*>(request);
     uint8_t numParam = sizeof(driveInfoKey) / sizeof(uint8_t*);
@@ -2073,38 +2064,33 @@
 
 /* DCMI Command handellers. */
 
-ipmi::RspType<std::vector<uint8_t>>
-    ipmiOemDCMIGetPowerReading(ipmi::Context::ptr ctx,
-                               std::vector<uint8_t> reqData)
+ipmi::RspType<std::vector<uint8_t>> ipmiOemDCMIGetPowerReading(
+    ipmi::Context::ptr ctx, std::vector<uint8_t> reqData)
 {
     return sendDCMICmd(ctx, ipmi::dcmi::cmdGetPowerReading, reqData);
 }
 
-ipmi::RspType<std::vector<uint8_t>>
-    ipmiOemDCMIGetPowerLimit(ipmi::Context::ptr ctx,
-                             std::vector<uint8_t> reqData)
+ipmi::RspType<std::vector<uint8_t>> ipmiOemDCMIGetPowerLimit(
+    ipmi::Context::ptr ctx, std::vector<uint8_t> reqData)
 {
     return sendDCMICmd(ctx, ipmi::dcmi::cmdGetPowerLimit, reqData);
 }
 
-ipmi::RspType<std::vector<uint8_t>>
-    ipmiOemDCMISetPowerLimit(ipmi::Context::ptr ctx,
-                             std::vector<uint8_t> reqData)
+ipmi::RspType<std::vector<uint8_t>> ipmiOemDCMISetPowerLimit(
+    ipmi::Context::ptr ctx, std::vector<uint8_t> reqData)
 {
     return sendDCMICmd(ctx, ipmi::dcmi::cmdSetPowerLimit, reqData);
 }
 
-ipmi::RspType<std::vector<uint8_t>>
-    ipmiOemDCMIApplyPowerLimit(ipmi::Context::ptr ctx,
-                               std::vector<uint8_t> reqData)
+ipmi::RspType<std::vector<uint8_t>> ipmiOemDCMIApplyPowerLimit(
+    ipmi::Context::ptr ctx, std::vector<uint8_t> reqData)
 {
     return sendDCMICmd(ctx, ipmi::dcmi::cmdActDeactivatePwrLimit, reqData);
 }
 
 // Https Boot related functions
-ipmi::RspType<std::vector<uint8_t>>
-    ipmiOemGetHttpsData([[maybe_unused]] ipmi::Context::ptr ctx,
-                        std::vector<uint8_t> reqData)
+ipmi::RspType<std::vector<uint8_t>> ipmiOemGetHttpsData(
+    [[maybe_unused]] ipmi::Context::ptr ctx, std::vector<uint8_t> reqData)
 {
     if (reqData.size() < sizeof(HttpsDataReq))
         return ipmi::responseReqDataLenInvalid();
@@ -2131,9 +2117,8 @@
     return ipmi::responseSuccess(resData);
 }
 
-ipmi::RspType<std::vector<uint8_t>>
-    ipmiOemGetHttpsAttr([[maybe_unused]] ipmi::Context::ptr ctx,
-                        std::vector<uint8_t> reqData)
+ipmi::RspType<std::vector<uint8_t>> ipmiOemGetHttpsAttr(
+    [[maybe_unused]] ipmi::Context::ptr ctx, std::vector<uint8_t> reqData)
 {
     if (reqData.size() < sizeof(HttpsBootAttr))
         return ipmi::responseReqDataLenInvalid();
@@ -2307,9 +2292,9 @@
 }
 
 template <size_t N>
-static ipmi_ret_t handleHwAssertBank(const char* name,
-                                     std::span<const uint8_t> data,
-                                     CrdState& currState, std::stringstream& ss)
+static ipmi_ret_t
+    handleHwAssertBank(const char* name, std::span<const uint8_t> data,
+                       CrdState& currState, std::stringstream& ss)
 {
     if (data.size() < sizeof(CrdHwAssertBank<N>))
         return IPMI_CC_REQ_DATA_LEN_INVALID;
@@ -2523,9 +2508,8 @@
     return IPMI_CC_OK;
 }
 
-ipmi::RspType<std::vector<uint8_t>>
-    ipmiOemCrashdump([[maybe_unused]] ipmi::Context::ptr ctx,
-                     std::vector<uint8_t> reqData)
+ipmi::RspType<std::vector<uint8_t>> ipmiOemCrashdump(
+    [[maybe_unused]] ipmi::Context::ptr ctx, std::vector<uint8_t> reqData)
 {
     static CrdState dumpState = CrdState::free;
     static std::stringstream ss;
@@ -2692,25 +2676,25 @@
                          PRIVILEGE_USER); // Get Drive Info
 
     /* FB OEM DCMI Commands as per DCMI spec 1.5 Section 6 */
-    ipmi::registerGroupHandler(ipmi::prioOpenBmcBase, groupDCMI,
-                               ipmi::dcmi::cmdGetPowerReading,
-                               ipmi::Privilege::User,
-                               ipmiOemDCMIGetPowerReading); // Get Power Reading
+    ipmi::registerGroupHandler(
+        ipmi::prioOpenBmcBase, groupDCMI, ipmi::dcmi::cmdGetPowerReading,
+        ipmi::Privilege::User,
+        ipmiOemDCMIGetPowerReading); // Get Power Reading
 
-    ipmi::registerGroupHandler(ipmi::prioOpenBmcBase, groupDCMI,
-                               ipmi::dcmi::cmdGetPowerLimit,
-                               ipmi::Privilege::User,
-                               ipmiOemDCMIGetPowerLimit); // Get Power Limit
+    ipmi::registerGroupHandler(
+        ipmi::prioOpenBmcBase, groupDCMI, ipmi::dcmi::cmdGetPowerLimit,
+        ipmi::Privilege::User,
+        ipmiOemDCMIGetPowerLimit); // Get Power Limit
 
-    ipmi::registerGroupHandler(ipmi::prioOpenBmcBase, groupDCMI,
-                               ipmi::dcmi::cmdSetPowerLimit,
-                               ipmi::Privilege::Operator,
-                               ipmiOemDCMISetPowerLimit); // Set Power Limit
+    ipmi::registerGroupHandler(
+        ipmi::prioOpenBmcBase, groupDCMI, ipmi::dcmi::cmdSetPowerLimit,
+        ipmi::Privilege::Operator,
+        ipmiOemDCMISetPowerLimit); // Set Power Limit
 
-    ipmi::registerGroupHandler(ipmi::prioOpenBmcBase, groupDCMI,
-                               ipmi::dcmi::cmdActDeactivatePwrLimit,
-                               ipmi::Privilege::Operator,
-                               ipmiOemDCMIApplyPowerLimit); // Apply Power Limit
+    ipmi::registerGroupHandler(
+        ipmi::prioOpenBmcBase, groupDCMI, ipmi::dcmi::cmdActDeactivatePwrLimit,
+        ipmi::Privilege::Operator,
+        ipmiOemDCMIApplyPowerLimit); // Apply Power Limit
 
     /* FB OEM BOOT ORDER COMMANDS */
     ipmi::registerHandler(ipmi::prioOpenBmcBase, ipmi::netFnOemOne,
diff --git a/src/selcommands.cpp b/src/selcommands.cpp
index 51c1d15..9d5afe5 100644
--- a/src/selcommands.cpp
+++ b/src/selcommands.cpp
@@ -712,18 +712,19 @@
 
 static void logPCHThermal(uint8_t* data, std::string& errLog)
 {
-    const std::vector<std::string> thresEvtName = {"Lower Non-critical",
-                                                   "Unknown",
-                                                   "Lower Critical",
-                                                   "Unknown",
-                                                   "Lower Non-recoverable",
-                                                   "Unknown",
-                                                   "Unknown",
-                                                   "Upper Non-critical",
-                                                   "Unknown",
-                                                   "Upper Critical",
-                                                   "Unknown",
-                                                   "Upper Non-recoverable"};
+    const std::vector<std::string> thresEvtName = {
+        "Lower Non-critical",
+        "Unknown",
+        "Lower Critical",
+        "Unknown",
+        "Lower Non-recoverable",
+        "Unknown",
+        "Unknown",
+        "Upper Non-critical",
+        "Unknown",
+        "Upper Critical",
+        "Unknown",
+        "Upper Non-recoverable"};
 
     if ((data[0] & 0x0f) < 12)
     {
@@ -771,9 +772,8 @@
         errLog = "Unknown";
     }
 
-    errLog += ", Domain:" + nmDomName[domIdx] +
-              ", ErrType:" + nmErrType[errIdx] + ", Err:0x" +
-              byteToStr(data[2]);
+    errLog += ", Domain:" + nmDomName[domIdx] + ", ErrType:" +
+              nmErrType[errIdx] + ", Err:0x" + byteToStr(data[2]);
 }
 
 static void logNmCap(uint8_t* data, std::string& errLog)
@@ -860,35 +860,36 @@
 static const boost::container::flat_map<
     uint8_t,
     std::pair<std::string, std::function<void(uint8_t*, std::string&)>>>
-    sensorNameTable = {{0xE9, {"SYSTEM_EVENT", logSysEvent}},
-                       {0x7D, {"THERM_THRESH_EVT", logThermalEvent}},
-                       {0xAA, {"BUTTON", logDefault}},
-                       {0xAB, {"POWER_STATE", logDefault}},
-                       {0xEA, {"CRITICAL_IRQ", logCritIrq}},
-                       {0x2B, {"POST_ERROR", logPostErr}},
-                       {0x40, {"MACHINE_CHK_ERR", logMchChkErr}},
-                       {0x41, {"PCIE_ERR", logPcieErr}},
-                       {0x43, {"IIO_ERR", logIioErr}},
-                       {0X63, {"MEMORY_ECC_ERR", logDefault}},
-                       {0X87, {"MEMORY_ERR_LOG_DIS", logDefault}},
-                       {0X51, {"PROCHOT_EXT", logDefault}},
-                       {0X56, {"PWR_ERR", logPwrErr}},
-                       {0xE6, {"CATERR_A", logCatErr}},
-                       {0xEB, {"CATERR_B", logCatErr}},
-                       {0xB3, {"CPU_DIMM_HOT", logDimmHot}},
-                       {0x90, {"SOFTWARE_NMI", logSwNMI}},
-                       {0x1C, {"CPU0_THERM_STATUS", logCPUThermalSts}},
-                       {0x1D, {"CPU1_THERM_STATUS", logCPUThermalSts}},
-                       {0x16, {"ME_POWER_STATE", logMEPwrState}},
-                       {0x17, {"SPS_FW_HEALTH", logSPSFwHealth}},
-                       {0x18, {"NM_EXCEPTION_A", logNmExcA}},
-                       {0x08, {"PCH_THERM_THRESHOLD", logPCHThermal}},
-                       {0x19, {"NM_HEALTH", logNmHealth}},
-                       {0x1A, {"NM_CAPABILITIES", logNmCap}},
-                       {0x1B, {"NM_THRESHOLD", logNmThreshold}},
-                       {0x3B, {"PWR_THRESH_EVT", logPwrThreshold}},
-                       {0xE7, {"MSMI", logMSMI}},
-                       {0xC5, {"HPR_WARNING", logHprWarn}}};
+    sensorNameTable = {
+        {0xE9, {"SYSTEM_EVENT", logSysEvent}},
+        {0x7D, {"THERM_THRESH_EVT", logThermalEvent}},
+        {0xAA, {"BUTTON", logDefault}},
+        {0xAB, {"POWER_STATE", logDefault}},
+        {0xEA, {"CRITICAL_IRQ", logCritIrq}},
+        {0x2B, {"POST_ERROR", logPostErr}},
+        {0x40, {"MACHINE_CHK_ERR", logMchChkErr}},
+        {0x41, {"PCIE_ERR", logPcieErr}},
+        {0x43, {"IIO_ERR", logIioErr}},
+        {0X63, {"MEMORY_ECC_ERR", logDefault}},
+        {0X87, {"MEMORY_ERR_LOG_DIS", logDefault}},
+        {0X51, {"PROCHOT_EXT", logDefault}},
+        {0X56, {"PWR_ERR", logPwrErr}},
+        {0xE6, {"CATERR_A", logCatErr}},
+        {0xEB, {"CATERR_B", logCatErr}},
+        {0xB3, {"CPU_DIMM_HOT", logDimmHot}},
+        {0x90, {"SOFTWARE_NMI", logSwNMI}},
+        {0x1C, {"CPU0_THERM_STATUS", logCPUThermalSts}},
+        {0x1D, {"CPU1_THERM_STATUS", logCPUThermalSts}},
+        {0x16, {"ME_POWER_STATE", logMEPwrState}},
+        {0x17, {"SPS_FW_HEALTH", logSPSFwHealth}},
+        {0x18, {"NM_EXCEPTION_A", logNmExcA}},
+        {0x08, {"PCH_THERM_THRESHOLD", logPCHThermal}},
+        {0x19, {"NM_HEALTH", logNmHealth}},
+        {0x1A, {"NM_CAPABILITIES", logNmCap}},
+        {0x1B, {"NM_THRESHOLD", logNmThreshold}},
+        {0x3B, {"PWR_THRESH_EVT", logPwrThreshold}},
+        {0xE7, {"MSMI", logMSMI}},
+        {0xC5, {"HPR_WARNING", logHprWarn}}};
 
 static void parseSelHelper(StdSELEntry* data, std::string& errStr)
 {
@@ -1180,13 +1181,14 @@
     std::vector<std::string> certErr = {
         "No certificate at BMC", "IPMI transaction fail",
         "Certificate data corrupted", "Reserved"};
-    std::vector<std::string> pcieEvent = {"PCIe DPC Event",
-                                          "PCIe LER Event",
-                                          "PCIe Link Retraining and Recovery",
-                                          "PCIe Link CRC Error Check and Retry",
-                                          "PCIe Corrupt Data Containment",
-                                          "PCIe Express ECRC",
-                                          "Reserved"};
+    std::vector<std::string> pcieEvent = {
+        "PCIe DPC Event",
+        "PCIe LER Event",
+        "PCIe Link Retraining and Recovery",
+        "PCIe Link CRC Error Check and Retry",
+        "PCIe Corrupt Data Containment",
+        "PCIe Express ECRC",
+        "Reserved"};
     std::vector<std::string> memEvent = {
         "Memory PPR event",
         "Memory Correctable Error logging limit reached",
@@ -1201,9 +1203,9 @@
                                            "Run time", "Reserved"};
     std::vector<std::string> memPpr = {"PPR success", "PPR fail", "PPR request",
                                        "Reserved"};
-    std::vector<std::string> memAdddc = {"Bank VLS", "r-Bank VLS + re-buddy",
-                                         "r-Bank VLS + Rank VLS",
-                                         "r-Rank VLS + re-buddy", "Reserved"};
+    std::vector<std::string> memAdddc = {
+        "Bank VLS", "r-Bank VLS + re-buddy", "r-Bank VLS + Rank VLS",
+        "r-Rank VLS + re-buddy", "Reserved"};
     std::vector<std::string> pprEvent = {"PPR disable", "Soft PPR", "Hard PPR",
                                          "Reserved"};
 
@@ -1293,13 +1295,13 @@
             break;
         case unifiedMemEvt:
             eventType = ptr[9] & 0xf;
-            tmpStream << std::format("GeneralInfo: MemEvent(0x{:02X})", genInfo)
-                      << (static_cast<MemEvtType>(eventType) !=
-                                  MemEvtType::noDimm
-                              ? std::format(", {}", dimmLocationStr(
-                                                        ptr[5], ptr[6], ptr[7]))
-                              : "")
-                      << ", DIMM Failure Event: ";
+            tmpStream
+                << std::format("GeneralInfo: MemEvent(0x{:02X})", genInfo)
+                << (static_cast<MemEvtType>(eventType) != MemEvtType::noDimm
+                        ? std::format(", {}",
+                                      dimmLocationStr(ptr[5], ptr[6], ptr[7]))
+                        : "")
+                << ", DIMM Failure Event: ";
 
             switch (static_cast<MemEvtType>(eventType))
             {
@@ -1597,8 +1599,8 @@
     }
 }
 
-ipmi::RspType<uint16_t> ipmiStorageAddSELEntry(ipmi::Context::ptr ctx,
-                                               std::vector<uint8_t> data)
+ipmi::RspType<uint16_t>
+    ipmiStorageAddSELEntry(ipmi::Context::ptr ctx, std::vector<uint8_t> data)
 {
     /* Per the IPMI spec, need to cancel any reservation when a
      * SEL entry is added
@@ -1617,8 +1619,8 @@
     fb_oem::ipmi::sel::parseSelData((ctx->hostIdx + 1), data, logErr);
 
     static const std::string openBMCMessageRegistryVersion("0.1");
-    std::string messageID = "OpenBMC." + openBMCMessageRegistryVersion +
-                            ".SELEntryAdded";
+    std::string messageID =
+        "OpenBMC." + openBMCMessageRegistryVersion + ".SELEntryAdded";
 
     /* Log the Raw SEL message to the journal */
     std::string journalMsg = "SEL Entry Added: " + ipmiRaw;
diff --git a/src/storagecommands.cpp b/src/storagecommands.cpp
index 346171c..84801ba 100644
--- a/src/storagecommands.cpp
+++ b/src/storagecommands.cpp
@@ -304,10 +304,9 @@
     return IPMI_CC_OK;
 }
 
-ipmi_ret_t ipmiStorageReadFRUData(ipmi_netfn_t, ipmi_cmd_t,
-                                  ipmi_request_t request,
-                                  ipmi_response_t response,
-                                  ipmi_data_len_t dataLen, ipmi_context_t)
+ipmi_ret_t ipmiStorageReadFRUData(
+    ipmi_netfn_t, ipmi_cmd_t, ipmi_request_t request, ipmi_response_t response,
+    ipmi_data_len_t dataLen, ipmi_context_t)
 {
     if (*dataLen != 4)
     {
@@ -355,10 +354,9 @@
     return IPMI_CC_OK;
 }
 
-ipmi_ret_t ipmiStorageWriteFRUData(ipmi_netfn_t, ipmi_cmd_t,
-                                   ipmi_request_t request,
-                                   ipmi_response_t response,
-                                   ipmi_data_len_t dataLen, ipmi_context_t)
+ipmi_ret_t ipmiStorageWriteFRUData(
+    ipmi_netfn_t, ipmi_cmd_t, ipmi_request_t request, ipmi_response_t response,
+    ipmi_data_len_t dataLen, ipmi_context_t)
 {
     if (*dataLen < 4 ||
         *dataLen >=
@@ -481,31 +479,33 @@
         return IPMI_CC_RESPONSE_ERROR;
     }
     boost::container::flat_map<std::string, DbusVariant>* fruData = nullptr;
-    auto fru = std::find_if(frus.begin(), frus.end(),
-                            [bus, address, &fruData](ManagedEntry& entry) {
-        auto findFruDevice = entry.second.find("xyz.openbmc_project.FruDevice");
-        if (findFruDevice == entry.second.end())
-        {
-            return false;
-        }
-        fruData = &(findFruDevice->second);
-        auto findBus = findFruDevice->second.find("BUS");
-        auto findAddress = findFruDevice->second.find("ADDRESS");
-        if (findBus == findFruDevice->second.end() ||
-            findAddress == findFruDevice->second.end())
-        {
-            return false;
-        }
-        if (std::get<uint32_t>(findBus->second) != bus)
-        {
-            return false;
-        }
-        if (std::get<uint32_t>(findAddress->second) != address)
-        {
-            return false;
-        }
-        return true;
-    });
+    auto fru = std::find_if(
+        frus.begin(), frus.end(),
+        [bus, address, &fruData](ManagedEntry& entry) {
+            auto findFruDevice =
+                entry.second.find("xyz.openbmc_project.FruDevice");
+            if (findFruDevice == entry.second.end())
+            {
+                return false;
+            }
+            fruData = &(findFruDevice->second);
+            auto findBus = findFruDevice->second.find("BUS");
+            auto findAddress = findFruDevice->second.find("ADDRESS");
+            if (findBus == findFruDevice->second.end() ||
+                findAddress == findFruDevice->second.end())
+            {
+                return false;
+            }
+            if (std::get<uint32_t>(findBus->second) != bus)
+            {
+                return false;
+            }
+            if (std::get<uint32_t>(findAddress->second) != address)
+            {
+                return false;
+            }
+            return true;
+        });
     if (fru == frus.end())
     {
         return IPMI_CC_RESPONSE_ERROR;
@@ -968,10 +968,9 @@
         return -1;
 }
 
-ipmi_ret_t ipmiStorageGetFRUInvAreaInfo(ipmi_netfn_t, ipmi_cmd_t,
-                                        ipmi_request_t request,
-                                        ipmi_response_t response,
-                                        ipmi_data_len_t dataLen, ipmi_context_t)
+ipmi_ret_t ipmiStorageGetFRUInvAreaInfo(
+    ipmi_netfn_t, ipmi_cmd_t, ipmi_request_t request, ipmi_response_t response,
+    ipmi_data_len_t dataLen, ipmi_context_t)
 {
     if (*dataLen != 1)
     {
diff --git a/src/transportcommands.cpp b/src/transportcommands.cpp
index 6e334d1..77f9ba5 100644
--- a/src/transportcommands.cpp
+++ b/src/transportcommands.cpp
@@ -46,10 +46,9 @@
 //----------------------------------------------------------------------
 // Get SoL Config (IPMI/Section 26.3) (CMD_TRANSPORT_GET_SOL_CONFIG)
 //----------------------------------------------------------------------
-ipmi_ret_t ipmiTransGetSolConfig(ipmi_netfn_t, ipmi_cmd_t,
-                                 ipmi_request_t request,
-                                 ipmi_response_t response,
-                                 ipmi_data_len_t data_len, ipmi_context_t)
+ipmi_ret_t ipmiTransGetSolConfig(
+    ipmi_netfn_t, ipmi_cmd_t, ipmi_request_t request, ipmi_response_t response,
+    ipmi_data_len_t data_len, ipmi_context_t)
 {
     uint8_t* req = reinterpret_cast<uint8_t*>(request);
     uint8_t* res = reinterpret_cast<uint8_t*>(response);
diff --git a/src/usb-dbg.cpp b/src/usb-dbg.cpp
index d2f9f05..d47a0a1 100644
--- a/src/usb-dbg.cpp
+++ b/src/usb-dbg.cpp
@@ -57,11 +57,11 @@
     try
     {
         std::shared_ptr<sdbusplus::asio::connection> dbus = getSdBus();
-        std::string service = getService(*dbus, ipmi::selector::interface,
-                                         ipmi::selector::path);
-        Value variant = getDbusProperty(*dbus, service, ipmi::selector::path,
-                                        ipmi::selector::interface,
-                                        "MaxPosition");
+        std::string service =
+            getService(*dbus, ipmi::selector::interface, ipmi::selector::path);
+        Value variant =
+            getDbusProperty(*dbus, service, ipmi::selector::path,
+                            ipmi::selector::interface, "MaxPosition");
         maxPosition = std::get<size_t>(variant);
     }
     catch (const std::exception& e)
@@ -77,8 +77,8 @@
     try
     {
         std::shared_ptr<sdbusplus::asio::connection> dbus = getSdBus();
-        std::string service = getService(*dbus, ipmi::selector::interface,
-                                         ipmi::selector::path);
+        std::string service =
+            getService(*dbus, ipmi::selector::interface, ipmi::selector::path);
         Value variant = getDbusProperty(*dbus, service, ipmi::selector::path,
                                         ipmi::selector::interface, "Position");
         hostPosition = std::get<size_t>(variant);
@@ -516,8 +516,8 @@
             {
                 if (postObj.size() != phase)
                 {
-                    std::string nextPhaseStr = "Phase" +
-                                               std::to_string(phase + 1);
+                    std::string nextPhaseStr =
+                        "Phase" + std::to_string(phase + 1);
                     postCode = postObj[nextPhaseStr][0][0];
                     *next = stoul(postCode, nullptr, 16);
                     *end = 0;
@@ -1007,8 +1007,8 @@
     }
 
     // '*': boot flags valid, BIOS has not yet read
-    bootOrderPanel.item_str[0] = std::string("Boot Order") +
-                                 ((bootMode & bootValid) ? "*" : "");
+    bootOrderPanel.item_str[0] =
+        std::string("Boot Order") + ((bootMode & bootValid) ? "*" : "");
 
     static const std::unordered_map<uint8_t, const char*>
         bootOrderMappingTable = {
