diff --git a/.clang-format b/.clang-format
index ef6f54e..d92a3f1 100755
--- a/.clang-format
+++ b/.clang-format
@@ -6,12 +6,14 @@
 AlignConsecutiveAssignments: false
 AlignConsecutiveDeclarations: false
 AlignEscapedNewlines: Right
-AlignOperands:   true
-AlignTrailingComments: true
+AlignOperands:  Align
+AlignTrailingComments:
+  Kind: Always
+  OverEmptyLines: 1
 AllowAllParametersOfDeclarationOnNextLine: true
-AllowShortBlocksOnASingleLine: false
+AllowShortBlocksOnASingleLine: Empty
 AllowShortCaseLabelsOnASingleLine: false
-AllowShortFunctionsOnASingleLine: None
+AllowShortFunctionsOnASingleLine: Empty
 AllowShortIfStatementsOnASingleLine: false
 AllowShortLoopsOnASingleLine: false
 AlwaysBreakAfterReturnType: None
@@ -36,12 +38,13 @@
   SplitEmptyFunction:   false
   SplitEmptyRecord:     false
   SplitEmptyNamespace:  false
+BreakAfterAttributes: Never
 BreakBeforeBinaryOperators: None
 BreakBeforeBraces: Custom
 BreakBeforeTernaryOperators: true
 BreakConstructorInitializers: AfterColon
 BreakInheritanceList: AfterColon
-BreakStringLiterals: true
+BreakStringLiterals: false
 ColumnLimit:     80
 CommentPragmas:  '^ IWYU pragma:'
 CompactNamespaces: false
@@ -49,6 +52,7 @@
 ConstructorInitializerIndentWidth: 4
 ContinuationIndentWidth: 4
 Cpp11BracedListStyle: true
+DeriveLineEnding: false
 DerivePointerAlignment: false
 PointerAlignment: Left
 DisableFormat:   false
@@ -74,9 +78,13 @@
   - Regex:           '.*'
     Priority:        6
 IndentCaseLabels: true
+IndentRequiresClause: true
 IndentWidth:     4
 IndentWrappedFunctionNames: true
-KeepEmptyLinesAtTheStartOfBlocks: true
+InsertNewlineAtEOF: true
+KeepEmptyLinesAtTheStartOfBlocks: false
+LambdaBodyIndentation: OuterScope
+LineEnding: LF
 MacroBlockBegin: ''
 MacroBlockEnd:   ''
 MaxEmptyLinesToKeep: 1
@@ -84,13 +92,19 @@
 ObjCBlockIndentWidth: 2
 ObjCSpaceAfterProperty: false
 ObjCSpaceBeforeProtocolList: true
+PenaltyBreakAssignment: 25
 PenaltyBreakBeforeFirstCallParameter: 19
 PenaltyBreakComment: 300
 PenaltyBreakFirstLessLess: 120
 PenaltyBreakString: 1000
 PenaltyExcessCharacter: 1000000
 PenaltyReturnTypeOnItsOwnLine: 60
+PenaltyIndentedWhitespace: 0
+QualifierAlignment: Left
+ReferenceAlignment: Left
 ReflowComments:  true
+RequiresClausePosition: OwnLine
+RequiresExpressionIndentation: Keyword
 SortIncludes:    true
 SortUsingDeclarations: true
 SpaceAfterCStyleCast: false
@@ -108,7 +122,7 @@
 SpacesInCStyleCastParentheses: false
 SpacesInParentheses: false
 SpacesInSquareBrackets: false
-Standard:        Cpp11
+Standard:        Latest
 TabWidth:        4
 UseTab:          Never
 ...
diff --git a/include/cpuinfo.hpp b/include/cpuinfo.hpp
index 2ac5b37..200041b 100644
--- a/include/cpuinfo.hpp
+++ b/include/cpuinfo.hpp
@@ -23,9 +23,9 @@
 
 namespace cpu_info
 {
-static constexpr char const* cpuInfoObject = "xyz.openbmc_project.CPUInfo";
-static constexpr char const* cpuInfoPath = "/xyz/openbmc_project/CPUInfo";
-static constexpr char const* cpuInfoInterface = "xyz.openbmc_project.CPUInfo";
+static constexpr const char* cpuInfoObject = "xyz.openbmc_project.CPUInfo";
+static constexpr const char* cpuInfoPath = "/xyz/openbmc_project/CPUInfo";
+static constexpr const char* cpuInfoInterface = "xyz.openbmc_project.CPUInfo";
 static constexpr const char* cpuPath =
     "/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu";
 
diff --git a/include/mdrv2.hpp b/include/mdrv2.hpp
index c9396e2..e53545f 100644
--- a/include/mdrv2.hpp
+++ b/include/mdrv2.hpp
@@ -78,7 +78,6 @@
         bus(bus), timer(io), smbiosInterface(getObjectServer().add_interface(
                                  smbiosPath, smbiosInterfaceName))
     {
-
         smbiosDir.agentVersion = smbiosAgentVersion;
         smbiosDir.dirVersion = 1;
         smbiosDir.dirEntries = 1;
diff --git a/include/smbios_mdrv2.hpp b/include/smbios_mdrv2.hpp
index 0ac77b9..0b4638a 100644
--- a/include/smbios_mdrv2.hpp
+++ b/include/smbios_mdrv2.hpp
@@ -229,7 +229,6 @@
         uint32_t len = *(smbiosData + 1);
         if (*smbiosData != typeId)
         {
-
             smbiosData += len;
             while ((*smbiosData != '\0') || (*(smbiosData + 1) != '\0'))
             {
diff --git a/include/speed_select.hpp b/include/speed_select.hpp
index 9cdc450..1c6944f 100644
--- a/include/speed_select.hpp
+++ b/include/speed_select.hpp
@@ -66,8 +66,7 @@
 class SSTInterface
 {
   public:
-    virtual ~SSTInterface()
-    {}
+    virtual ~SSTInterface() {}
 
     /**
      * Whether the interface is ready to be used, or we need to wait longer. The
diff --git a/src/cpu.cpp b/src/cpu.cpp
index 7c10a09..7e52bd4 100644
--- a/src/cpu.cpp
+++ b/src/cpu.cpp
@@ -159,8 +159,8 @@
     // this class is for type CPU  //offset 5h
     family(cpuInfo->family, cpuInfo->family2); // offset 6h and 28h
     manufacturer(cpuInfo->manufacturer, cpuInfo->length,
-                 dataIn); // offset 7h
-    id(cpuInfo->id);      // offset 8h
+                 dataIn);                      // offset 7h
+    id(cpuInfo->id);                           // offset 8h
 
     // Step, EffectiveFamily, EffectiveModel computation for Intel processors.
     std::map<uint8_t, const char*>::const_iterator it =
@@ -208,10 +208,10 @@
     version(cpuInfo->version, cpuInfo->length, dataIn); // offset 10h
     maxSpeedInMhz(cpuInfo->maxSpeed);                   // offset 14h
     serialNumber(cpuInfo->serialNum, cpuInfo->length,
-                 dataIn); // offset 20h
+                 dataIn);                               // offset 20h
     partNumber(cpuInfo->partNum, cpuInfo->length,
-               dataIn);                          // offset 22h
-    if (cpuInfo->coreCount < maxOldVersionCount) // offset 23h or 2Ah
+               dataIn);                                 // offset 22h
+    if (cpuInfo->coreCount < maxOldVersionCount)        // offset 23h or 2Ah
     {
         coreCount(cpuInfo->coreCount);
     }
diff --git a/src/cpuinfo_main.cpp b/src/cpuinfo_main.cpp
index 85a2302..ca3058a 100644
--- a/src/cpuinfo_main.cpp
+++ b/src/cpuinfo_main.cpp
@@ -235,12 +235,12 @@
         conn->get_io_context(), std::chrono::seconds(retrySeconds));
     sspecTimer->async_wait(
         [sspecTimer, conn, cpuInfo](boost::system::error_code ec) {
-            if (ec)
-            {
-                return;
-            }
-            tryReadSSpec(conn, cpuInfo);
-        });
+        if (ec)
+        {
+            return;
+        }
+        tryReadSSpec(conn, cpuInfo);
+    });
 }
 
 /**
@@ -284,12 +284,12 @@
     createCpuUpdatedMatch(conn, cpu);
     conn->async_method_call(
         [](const boost::system::error_code ec) {
-            if (ec)
-            {
-                phosphor::logging::log<phosphor::logging::level::ERR>(
-                    "Cannot set CPU property!");
-                return;
-            }
+        if (ec)
+        {
+            phosphor::logging::log<phosphor::logging::level::ERR>(
+                "Cannot set CPU property!");
+            return;
+        }
         },
         cpuProcessName, newProp.object.c_str(),
         "org.freedesktop.DBus.Properties", "Set", newProp.interface,
@@ -325,25 +325,23 @@
             sdbusplus::bus::match::rules::interfacesAdded() +
                 sdbusplus::bus::match::rules::argNpath(0, objectPath.c_str()),
             [conn, cpu](sdbusplus::message_t& msg) {
-                sdbusplus::message::object_path objectName;
-                boost::container::flat_map<
-                    std::string,
-                    boost::container::flat_map<
-                        std::string, std::variant<std::string, uint64_t>>>
-                    msgData;
+        sdbusplus::message::object_path objectName;
+        boost::container::flat_map<
+            std::string, boost::container::flat_map<
+                             std::string, std::variant<std::string, uint64_t>>>
+            msgData;
 
-                msg.read(objectName, msgData);
+        msg.read(objectName, msgData);
 
-                // Go through all the property changes, and retry all of them
-                // targeting this object/interface which was just added.
-                for (const CpuProperty& prop : propertiesToSet)
-                {
-                    if (prop.object == objectName &&
-                        msgData.contains(prop.interface))
-                    {
-                        setDbusProperty(conn, cpu, prop);
-                    }
-                }
+        // Go through all the property changes, and retry all of them
+        // targeting this object/interface which was just added.
+        for (const CpuProperty& prop : propertiesToSet)
+        {
+            if (prop.object == objectName && msgData.contains(prop.interface))
+            {
+                setDbusProperty(conn, cpu, prop);
+            }
+        }
             }));
 }
 
@@ -385,20 +383,20 @@
 
         waitTimer->async_wait(
             [waitTimer, &io, conn, cpu](const boost::system::error_code& ec) {
-                if (ec)
+            if (ec)
+            {
+                // operation_aborted is expected if timer is canceled
+                // before completion.
+                if (ec != boost::asio::error::operation_aborted)
                 {
-                    // operation_aborted is expected if timer is canceled
-                    // before completion.
-                    if (ec != boost::asio::error::operation_aborted)
-                    {
-                        phosphor::logging::log<phosphor::logging::level::ERR>(
-                            "info update timer async_wait failed ",
-                            phosphor::logging::entry("EC=0x%x", ec.value()));
-                    }
-                    return;
+                    phosphor::logging::log<phosphor::logging::level::ERR>(
+                        "info update timer async_wait failed ",
+                        phosphor::logging::entry("EC=0x%x", ec.value()));
                 }
-                getProcessorInfo(io, conn, cpu);
-            });
+                return;
+            }
+            getProcessorInfo(io, conn, cpu);
+        });
         return;
     }
 
@@ -419,9 +417,9 @@
             uint64_t cpuPPIN = 0;
             uint32_t u32PkgValue = 0;
 
-            int ret =
-                peci_RdPkgConfig(cpuAddr, u8PPINPkgIndex, u16PPINPkgParamLow,
-                                 u8Size, (uint8_t*)&u32PkgValue, &cc);
+            int ret = peci_RdPkgConfig(cpuAddr, u8PPINPkgIndex,
+                                       u16PPINPkgParamLow, u8Size,
+                                       (uint8_t*)&u32PkgValue, &cc);
             if (0 != ret)
             {
                 phosphor::logging::log<phosphor::logging::level::ERR>(
@@ -485,71 +483,71 @@
                         std::string,
                         std::variant<std::string, uint64_t, uint32_t, uint16_t,
                                      std::vector<std::string>>>& properties) {
-            const uint64_t* value = nullptr;
-            uint8_t peciAddress = 0;
-            uint8_t i2cBus = defaultI2cBus;
-            uint8_t i2cDevice;
-            bool i2cDeviceFound = false;
-            size_t cpu = 0;
+        const uint64_t* value = nullptr;
+        uint8_t peciAddress = 0;
+        uint8_t i2cBus = defaultI2cBus;
+        uint8_t i2cDevice;
+        bool i2cDeviceFound = false;
+        size_t cpu = 0;
 
-            if (ec)
-            {
-                std::cerr << "DBUS response error " << ec.value() << ": "
-                          << ec.message() << "\n";
-                return;
-            }
+        if (ec)
+        {
+            std::cerr << "DBUS response error " << ec.value() << ": "
+                      << ec.message() << "\n";
+            return;
+        }
 
-            for (const auto& property : properties)
+        for (const auto& property : properties)
+        {
+            std::cerr << "property " << property.first << "\n";
+            if (property.first == "Address")
             {
-                std::cerr << "property " << property.first << "\n";
-                if (property.first == "Address")
+                value = std::get_if<uint64_t>(&property.second);
+                if (value != nullptr)
                 {
-                    value = std::get_if<uint64_t>(&property.second);
-                    if (value != nullptr)
-                    {
-                        peciAddress = static_cast<uint8_t>(*value);
-                    }
-                }
-                if (property.first == "CpuID")
-                {
-                    value = std::get_if<uint64_t>(&property.second);
-                    if (value != nullptr)
-                    {
-                        cpu = static_cast<size_t>(*value);
-                    }
-                }
-                if (property.first == "PiromI2cAddress")
-                {
-                    value = std::get_if<uint64_t>(&property.second);
-                    if (value != nullptr)
-                    {
-                        i2cDevice = static_cast<uint8_t>(*value);
-                        i2cDeviceFound = true;
-                    }
-                }
-                if (property.first == "PiromI2cBus")
-                {
-                    value = std::get_if<uint64_t>(&property.second);
-                    if (value != nullptr)
-                    {
-                        i2cBus = static_cast<uint8_t>(*value);
-                    }
+                    peciAddress = static_cast<uint8_t>(*value);
                 }
             }
-
-            ///\todo replace this with present + power state
-            if (cpu != 0 && peciAddress != 0)
+            if (property.first == "CpuID")
             {
-                if (!i2cDeviceFound)
+                value = std::get_if<uint64_t>(&property.second);
+                if (value != nullptr)
                 {
-                    i2cDevice = defaultI2cSlaveAddr0 + cpu - 1;
+                    cpu = static_cast<size_t>(*value);
                 }
-                cpuInfoMap.insert_or_assign(
-                    cpu, std::make_shared<CPUInfo>(*conn, cpu, peciAddress,
-                                                   i2cBus, i2cDevice));
-
-                getProcessorInfo(io, conn, cpu);
             }
+            if (property.first == "PiromI2cAddress")
+            {
+                value = std::get_if<uint64_t>(&property.second);
+                if (value != nullptr)
+                {
+                    i2cDevice = static_cast<uint8_t>(*value);
+                    i2cDeviceFound = true;
+                }
+            }
+            if (property.first == "PiromI2cBus")
+            {
+                value = std::get_if<uint64_t>(&property.second);
+                if (value != nullptr)
+                {
+                    i2cBus = static_cast<uint8_t>(*value);
+                }
+            }
+        }
+
+        ///\todo replace this with present + power state
+        if (cpu != 0 && peciAddress != 0)
+        {
+            if (!i2cDeviceFound)
+            {
+                i2cDevice = defaultI2cSlaveAddr0 + cpu - 1;
+            }
+            cpuInfoMap.insert_or_assign(
+                cpu, std::make_shared<CPUInfo>(*conn, cpu, peciAddress, i2cBus,
+                                               i2cDevice));
+
+            getProcessorInfo(io, conn, cpu);
+        }
         },
         service, object, "org.freedesktop.DBus.Properties", "GetAll",
         interface);
@@ -572,25 +570,23 @@
             "PropertiesChanged',arg0='xyz.openbmc_project."
             "Configuration.XeonCPU'",
             [&io, conn, &objServer](sdbusplus::message_t& msg) {
-                std::cerr << "get cpu configuration match\n";
-                static boost::asio::steady_timer filterTimer(io);
-                filterTimer.expires_after(
-                    std::chrono::seconds(configCheckInterval));
+        std::cerr << "get cpu configuration match\n";
+        static boost::asio::steady_timer filterTimer(io);
+        filterTimer.expires_after(std::chrono::seconds(configCheckInterval));
 
-                filterTimer.async_wait(
-                    [&io, conn,
-                     &objServer](const boost::system::error_code& ec) {
-                        if (ec == boost::asio::error::operation_aborted)
-                        {
-                            return; // we're being canceled
-                        }
-                        else if (ec)
-                        {
-                            std::cerr << "Error: " << ec.message() << "\n";
-                            return;
-                        }
-                        getCpuConfiguration(io, conn, objServer);
-                    });
+        filterTimer.async_wait(
+            [&io, conn, &objServer](const boost::system::error_code& ec) {
+            if (ec == boost::asio::error::operation_aborted)
+            {
+                return; // we're being canceled
+            }
+            else if (ec)
+            {
+                std::cerr << "Error: " << ec.message() << "\n";
+                return;
+            }
+            getCpuConfiguration(io, conn, objServer);
+        });
             });
 
     conn->async_method_call(
@@ -600,32 +596,32 @@
                 std::string,
                 std::vector<std::pair<std::string, std::vector<std::string>>>>>&
                 subtree) {
-            if constexpr (debug)
-                std::cerr << "async_method_call callback\n";
+        if constexpr (debug)
+            std::cerr << "async_method_call callback\n";
 
-            if (ec)
-            {
-                std::cerr << "error with async_method_call\n";
-                return;
-            }
-            if (subtree.empty())
-            {
-                // No config data yet, so wait for the match
-                return;
-            }
-
-            for (const auto& object : subtree)
-            {
-                for (const auto& service : object.second)
-                {
-                    getCpuAddress(io, conn, service.first, object.first,
-                                  "xyz.openbmc_project.Configuration.XeonCPU");
-                }
-            }
-            if constexpr (debug)
-                std::cerr << "getCpuConfiguration callback complete\n";
-
+        if (ec)
+        {
+            std::cerr << "error with async_method_call\n";
             return;
+        }
+        if (subtree.empty())
+        {
+            // No config data yet, so wait for the match
+            return;
+        }
+
+        for (const auto& object : subtree)
+        {
+            for (const auto& service : object.second)
+            {
+                getCpuAddress(io, conn, service.first, object.first,
+                              "xyz.openbmc_project.Configuration.XeonCPU");
+            }
+        }
+        if constexpr (debug)
+            std::cerr << "getCpuConfiguration callback complete\n";
+
+        return;
         },
         "xyz.openbmc_project.ObjectMapper",
         "/xyz/openbmc_project/object_mapper",
diff --git a/src/cpuinfo_utils.cpp b/src/cpuinfo_utils.cpp
index 51136bb..c291718 100644
--- a/src/cpuinfo_utils.cpp
+++ b/src/cpuinfo_utils.cpp
@@ -174,13 +174,13 @@
         *dbusConn, service, object, interface, propertyName,
         [handler, propertyName = std::string(propertyName)](
             boost::system::error_code ec, const PropertyType& newValue) {
-            if (ec)
-            {
-                std::cerr << "Failed to read property " << propertyName << ": "
-                          << ec << "\n";
-                return;
-            }
-            handler(newValue);
+        if (ec)
+        {
+            std::cerr << "Failed to read property " << propertyName << ": "
+                      << ec << "\n";
+            return;
+        }
+        handler(newValue);
         });
 
     using ChangedPropertiesType =
@@ -218,12 +218,12 @@
         sdbusplus::bus::match::rules::sender(service) +
             sdbusplus::bus::match::rules::propertiesChanged(object, interface),
         [commonPropHandler](sdbusplus::message_t& reply) {
-            ChangedPropertiesType changedProps;
-            // ignore first param (interface name), it has to be correct
-            reply.read(std::string(), changedProps);
+        ChangedPropertiesType changedProps;
+        // ignore first param (interface name), it has to be correct
+        reply.read(std::string(), changedProps);
 
-            DEBUG_PRINT << "PropertiesChanged handled\n";
-            commonPropHandler(changedProps);
+        DEBUG_PRINT << "PropertiesChanged handled\n";
+        commonPropHandler(changedProps);
         });
 
     // Set up a match for the InterfacesAdded signal from the service's
@@ -236,28 +236,27 @@
             sdbusplus::bus::match::rules::interfacesAdded(),
         [object = std::string(object), interface = std::string(interface),
          commonPropHandler](sdbusplus::message_t& reply) {
-            sdbusplus::message::object_path changedObject;
-            reply.read(changedObject);
-            if (changedObject != object)
+        sdbusplus::message::object_path changedObject;
+        reply.read(changedObject);
+        if (changedObject != object)
+        {
+            return;
+        }
+
+        std::vector<std::pair<std::string, ChangedPropertiesType>>
+            changedInterfaces;
+        reply.read(changedInterfaces);
+
+        for (const auto& [changedInterface, changedProps] : changedInterfaces)
+        {
+            if (changedInterface != interface)
             {
-                return;
+                continue;
             }
 
-            std::vector<std::pair<std::string, ChangedPropertiesType>>
-                changedInterfaces;
-            reply.read(changedInterfaces);
-
-            for (const auto& [changedInterface, changedProps] :
-                 changedInterfaces)
-            {
-                if (changedInterface != interface)
-                {
-                    continue;
-                }
-
-                DEBUG_PRINT << "InterfacesAdded handled\n";
-                commonPropHandler(changedProps);
-            }
+            DEBUG_PRINT << "InterfacesAdded handled\n";
+            commonPropHandler(changedProps);
+        }
         });
 
     if (propertiesChangedMatch != nullptr)
diff --git a/src/dimm.cpp b/src/dimm.cpp
index bb68d13..d106d47 100644
--- a/src/dimm.cpp
+++ b/src/dimm.cpp
@@ -180,10 +180,10 @@
                              const uint8_t deviceLocatorPositionNum,
                              const uint8_t structLen, uint8_t* dataIn)
 {
-    std::string deviceLocator =
-        positionToString(deviceLocatorPositionNum, structLen, dataIn);
-    std::string bankLocator =
-        positionToString(bankLocatorPositionNum, structLen, dataIn);
+    std::string deviceLocator = positionToString(deviceLocatorPositionNum,
+                                                 structLen, dataIn);
+    std::string bankLocator = positionToString(bankLocatorPositionNum,
+                                               structLen, dataIn);
 
     std::string result;
     if (bankLocator.empty() || onlyDimmLocationCode)
diff --git a/src/mdrv2.cpp b/src/mdrv2.cpp
index 373978a..dd1d8e3 100644
--- a/src/mdrv2.cpp
+++ b/src/mdrv2.cpp
@@ -420,18 +420,17 @@
                                 0,
                                 "/xyz/openbmc_project/inventory/system/board/"),
                         [this, systemInterface](sdbusplus::message_t& msg) {
-                            sdbusplus::message::object_path objectName;
-                            boost::container::flat_map<
-                                std::string,
-                                boost::container::flat_map<
-                                    std::string,
-                                    std::variant<std::string, uint64_t>>>
-                                msgData;
-                            msg.read(objectName, msgData);
-                            if (msgData.contains(systemInterface))
-                            {
-                                this->systemInfoUpdate();
-                            }
+                sdbusplus::message::object_path objectName;
+                boost::container::flat_map<
+                    std::string,
+                    boost::container::flat_map<
+                        std::string, std::variant<std::string, uint64_t>>>
+                    msgData;
+                msg.read(objectName, msgData);
+                if (msgData.contains(systemInterface))
+                {
+                    this->systemInfoUpdate();
+                }
                         });
         }
         else
@@ -675,12 +674,12 @@
     lg2::info("SMBIOS VERSION - {MAJOR}.{MINOR}", "MAJOR", foundMajorVersion,
               "MINOR", foundMinorVersion);
 
-    auto itr = std::find_if(
-        std::begin(supportedSMBIOSVersions), std::end(supportedSMBIOSVersions),
-        [&](SMBIOSVersion versionItr) {
-            return versionItr.majorVersion == foundMajorVersion &&
-                   versionItr.minorVersion == foundMinorVersion;
-        });
+    auto itr = std::find_if(std::begin(supportedSMBIOSVersions),
+                            std::end(supportedSMBIOSVersions),
+                            [&](SMBIOSVersion versionItr) {
+        return versionItr.majorVersion == foundMajorVersion &&
+               versionItr.minorVersion == foundMinorVersion;
+    });
     if (itr == std::end(supportedSMBIOSVersions))
     {
         return false;
@@ -744,11 +743,9 @@
 std::vector<boost::container::flat_map<std::string, RecordVariant>>
     MDRV2::getRecordType(size_t type)
 {
-
     std::vector<boost::container::flat_map<std::string, RecordVariant>> ret;
     if (type == memoryDeviceType)
     {
-
         uint8_t* dataIn = smbiosDir.dir[smbiosDirIndex].dataStorage;
 
         if (dataIn == nullptr)
@@ -758,8 +755,8 @@
 
         do
         {
-            dataIn =
-                getSMBIOSTypePtr(dataIn, memoryDeviceType, sizeof(MemoryInfo));
+            dataIn = getSMBIOSTypePtr(dataIn, memoryDeviceType,
+                                      sizeof(MemoryInfo));
             if (dataIn == nullptr)
             {
                 break;
diff --git a/src/sst_mailbox.cpp b/src/sst_mailbox.cpp
index 0c35d55..418f3fe 100644
--- a/src/sst_mailbox.cpp
+++ b/src/sst_mailbox.cpp
@@ -79,9 +79,9 @@
     void setWakeOnPECI(bool enable)
     {
         uint8_t completionCode;
-        EPECIStatus libStatus =
-            peci_WrPkgConfig(peciAddress, 5, enable ? 1 : 0, 0,
-                             sizeof(uint32_t), &completionCode);
+        EPECIStatus libStatus = peci_WrPkgConfig(peciAddress, 5, enable ? 1 : 0,
+                                                 0, sizeof(uint32_t),
+                                                 &completionCode);
         if (!checkPECIStatus(libStatus, completionCode))
         {
             throw PECIError("Failed to set Wake-On-PECI mode bit");
@@ -277,8 +277,8 @@
     {
         DEBUG_PRINT << "Running OS Mailbox command "
                     << static_cast<int>(subcommand) << '\n';
-        PECIManager::MailboxStatus* callStatus =
-            errorPolicy == Throw ? nullptr : &status;
+        PECIManager::MailboxStatus* callStatus = errorPolicy == Throw ? nullptr
+                                                                      : &status;
         uint32_t param = (static_cast<uint32_t>(param4) << 24) |
                          (static_cast<uint32_t>(param3) << 16) |
                          (static_cast<uint32_t>(param2) << 8) | param1;
@@ -401,8 +401,7 @@
         address(_address), model(_model),
         pm(static_cast<uint8_t>(address), model)
     {}
-    ~SSTMailbox()
-    {}
+    ~SSTMailbox() {}
 
     bool ready() override
     {
@@ -529,12 +528,12 @@
     std::vector<unsigned int>
         bfHighPriorityCoreList(unsigned int level) override
     {
-        uint64_t coreMaskLo =
-            PbfGetCoreMaskInfo(pm, static_cast<uint8_t>(level), 0)
-                .p1HiCoreMask();
-        uint64_t coreMaskHi =
-            PbfGetCoreMaskInfo(pm, static_cast<uint8_t>(level), 1)
-                .p1HiCoreMask();
+        uint64_t coreMaskLo = PbfGetCoreMaskInfo(pm,
+                                                 static_cast<uint8_t>(level), 0)
+                                  .p1HiCoreMask();
+        uint64_t coreMaskHi = PbfGetCoreMaskInfo(pm,
+                                                 static_cast<uint8_t>(level), 1)
+                                  .p1HiCoreMask();
         std::bitset<64> hiFreqCoreList = (coreMaskHi << 32) | coreMaskLo;
         return convertMaskToList(hiFreqCoreList);
     }
diff --git a/src/system.cpp b/src/system.cpp
index 1ebaf2c..3e4b69c 100644
--- a/src/system.cpp
+++ b/src/system.cpp
@@ -73,10 +73,10 @@
                               const std::string& objectPath,
                               const std::string& interface)
 {
-    auto method =
-        bus.new_method_call("xyz.openbmc_project.ObjectMapper",
-                            "/xyz/openbmc_project/object_mapper",
-                            "xyz.openbmc_project.ObjectMapper", "GetObject");
+    auto method = bus.new_method_call("xyz.openbmc_project.ObjectMapper",
+                                      "/xyz/openbmc_project/object_mapper",
+                                      "xyz.openbmc_project.ObjectMapper",
+                                      "GetObject");
 
     method.append(objectPath);
     method.append(std::vector<std::string>({interface}));
@@ -129,8 +129,8 @@
     {
         auto biosInfo = reinterpret_cast<struct BIOSInfo*>(dataIn);
         uint8_t biosVerByte = biosInfo->biosVersion;
-        std::string tempS =
-            positionToString(biosInfo->biosVersion, biosInfo->length, dataIn);
+        std::string tempS = positionToString(biosInfo->biosVersion,
+                                             biosInfo->length, dataIn);
         if (std::find_if(tempS.begin(), tempS.end(),
                          [](char ch) { return !isprint(ch); }) != tempS.end())
         {
