diff --git a/libpldmresponder/base.hpp b/libpldmresponder/base.hpp
index e46b32c..c9ac56c 100644
--- a/libpldmresponder/base.hpp
+++ b/libpldmresponder/base.hpp
@@ -88,8 +88,8 @@
      *
      * @param[in] handler - oem platform handler
      */
-    inline void
-        setOemPlatformHandler(pldm::responder::oem_platform::Handler* handler)
+    inline void setOemPlatformHandler(
+        pldm::responder::oem_platform::Handler* handler)
     {
         oemPlatformHandler = handler;
     }
diff --git a/libpldmresponder/bios_attribute.hpp b/libpldmresponder/bios_attribute.hpp
index fb593e4..8dd21aa 100644
--- a/libpldmresponder/bios_attribute.hpp
+++ b/libpldmresponder/bios_attribute.hpp
@@ -48,10 +48,10 @@
      *                         attribute value entry
      *  @param[in] stringTable - The string table
      */
-    virtual void
-        setAttrValueOnDbus(const pldm_bios_attr_val_table_entry* attrValueEntry,
-                           const pldm_bios_attr_table_entry* attrEntry,
-                           const BIOSStringTable& stringTable) = 0;
+    virtual void setAttrValueOnDbus(
+        const pldm_bios_attr_val_table_entry* attrValueEntry,
+        const pldm_bios_attr_table_entry* attrEntry,
+        const BIOSStringTable& stringTable) = 0;
 
     /** @brief Construct corresponding entries at the end of the attribute table
      *         and attribute value tables
diff --git a/libpldmresponder/bios_enum_attribute.hpp b/libpldmresponder/bios_enum_attribute.hpp
index e26a32a..4b641df 100644
--- a/libpldmresponder/bios_enum_attribute.hpp
+++ b/libpldmresponder/bios_enum_attribute.hpp
@@ -38,10 +38,10 @@
      *                         attribute value entry
      *  @param[in] stringTable - The string table
      */
-    void
-        setAttrValueOnDbus(const pldm_bios_attr_val_table_entry* attrValueEntry,
-                           const pldm_bios_attr_table_entry* attrEntry,
-                           const BIOSStringTable& stringTable) override;
+    void setAttrValueOnDbus(
+        const pldm_bios_attr_val_table_entry* attrValueEntry,
+        const pldm_bios_attr_table_entry* attrEntry,
+        const BIOSStringTable& stringTable) override;
 
     /** @brief Construct corresponding entries at the end of the attribute table
      *         and attribute value tables
@@ -85,9 +85,9 @@
      *  @param[in] pVs - The possible values
      *  @return The handles
      */
-    std::vector<uint16_t>
-        getPossibleValuesHandle(const BIOSStringTable& stringTable,
-                                const std::vector<std::string>& pVs);
+    std::vector<uint16_t> getPossibleValuesHandle(
+        const BIOSStringTable& stringTable,
+        const std::vector<std::string>& pVs);
 
     /** @brief Method to populate the valueDisplayNamesMap
      *  @param[in] attrHandle - attribute handle
diff --git a/libpldmresponder/bios_integer_attribute.hpp b/libpldmresponder/bios_integer_attribute.hpp
index 114b24a..6ed9c6b 100644
--- a/libpldmresponder/bios_integer_attribute.hpp
+++ b/libpldmresponder/bios_integer_attribute.hpp
@@ -34,10 +34,10 @@
      *                         attribute value entry
      *  @param[in] stringTable - The string table
      */
-    void
-        setAttrValueOnDbus(const pldm_bios_attr_val_table_entry* attrValueEntry,
-                           const pldm_bios_attr_table_entry* attrEntry,
-                           const BIOSStringTable& stringTable) override;
+    void setAttrValueOnDbus(
+        const pldm_bios_attr_val_table_entry* attrValueEntry,
+        const pldm_bios_attr_table_entry* attrEntry,
+        const BIOSStringTable& stringTable) override;
 
     /** @brief Construct corresponding entries at the end of the attribute table
      *         and attribute value tables
diff --git a/libpldmresponder/bios_string_attribute.hpp b/libpldmresponder/bios_string_attribute.hpp
index 33726d5..5e65595 100644
--- a/libpldmresponder/bios_string_attribute.hpp
+++ b/libpldmresponder/bios_string_attribute.hpp
@@ -57,10 +57,10 @@
      *                         attribute value entry
      *  @param[in] stringTable - The string table
      */
-    void
-        setAttrValueOnDbus(const pldm_bios_attr_val_table_entry* attrValueEntry,
-                           const pldm_bios_attr_table_entry* attrEntry,
-                           const BIOSStringTable& stringTable) override;
+    void setAttrValueOnDbus(
+        const pldm_bios_attr_val_table_entry* attrValueEntry,
+        const pldm_bios_attr_table_entry* attrEntry,
+        const BIOSStringTable& stringTable) override;
 
     /** @brief Construct corresponding entries at the end of the attribute table
      *         and attribute value tables
diff --git a/libpldmresponder/bios_table.cpp b/libpldmresponder/bios_table.cpp
index 17bb79b..9aab3e8 100644
--- a/libpldmresponder/bios_table.cpp
+++ b/libpldmresponder/bios_table.cpp
@@ -106,8 +106,8 @@
                                                buffer.size());
     return std::string(buffer.data(), buffer.data() + strLength);
 }
-const pldm_bios_string_table_entry*
-    constructEntry(Table& table, const std::string& str)
+const pldm_bios_string_table_entry* constructEntry(Table& table,
+                                                   const std::string& str)
 {
     auto tableSize = table.size();
     auto entryLength = pldm_bios_table_string_entry_encode_length(str.length());
@@ -131,15 +131,15 @@
     return {attrHandle, attrType, stringHandle};
 }
 
-const pldm_bios_attr_table_entry*
-    findByHandle(const Table& table, uint16_t handle)
+const pldm_bios_attr_table_entry* findByHandle(const Table& table,
+                                               uint16_t handle)
 {
     return pldm_bios_table_attr_find_by_handle(table.data(), table.size(),
                                                handle);
 }
 
-const pldm_bios_attr_table_entry*
-    findByStringHandle(const Table& table, uint16_t handle)
+const pldm_bios_attr_table_entry* findByStringHandle(const Table& table,
+                                                     uint16_t handle)
 {
     return pldm_bios_table_attr_find_by_string_handle(table.data(),
                                                       table.size(), handle);
@@ -219,8 +219,8 @@
     return {lower, upper, scalar, def};
 }
 
-const pldm_bios_attr_table_entry*
-    constructEnumEntry(Table& table, pldm_bios_table_attr_entry_enum_info* info)
+const pldm_bios_attr_table_entry* constructEnumEntry(
+    Table& table, pldm_bios_table_attr_entry_enum_info* info)
 {
     auto entryLength = pldm_bios_table_attr_entry_enum_encode_length(
         info->pv_num, info->def_num);
@@ -285,8 +285,8 @@
     return pldm_bios_table_attr_value_entry_integer_decode_cv(entry);
 }
 
-std::vector<uint8_t>
-    decodeEnumEntry(const pldm_bios_attr_val_table_entry* entry)
+std::vector<uint8_t> decodeEnumEntry(
+    const pldm_bios_attr_val_table_entry* entry)
 {
     auto number = pldm_bios_table_attr_value_entry_enum_decode_number(entry);
     std::vector<uint8_t> currHdls(number, 0);
@@ -339,9 +339,9 @@
         table.data() + tableSize);
 }
 
-const pldm_bios_attr_val_table_entry*
-    constructEnumEntry(Table& table, uint16_t attrHandle, uint8_t attrType,
-                       const std::vector<uint8_t>& handleIndices)
+const pldm_bios_attr_val_table_entry* constructEnumEntry(
+    Table& table, uint16_t attrHandle, uint8_t attrType,
+    const std::vector<uint8_t>& handleIndices)
 {
     auto entryLength = pldm_bios_table_attr_value_entry_encode_enum_length(
         handleIndices.size());
diff --git a/libpldmresponder/bios_table.hpp b/libpldmresponder/bios_table.hpp
index 40839ae..61af79d 100644
--- a/libpldmresponder/bios_table.hpp
+++ b/libpldmresponder/bios_table.hpp
@@ -164,8 +164,8 @@
  *  @param[in] str - string itself
  *  @return pointer to the constructed entry
  */
-const pldm_bios_string_table_entry*
-    constructEntry(Table& table, const std::string& str);
+const pldm_bios_string_table_entry* constructEntry(Table& table,
+                                                   const std::string& str);
 
 } // namespace string
 
@@ -193,16 +193,16 @@
  *  @param[in] handle - attribute handle
  *  @return Pointer to the attribute table entry
  */
-const pldm_bios_attr_table_entry*
-    findByHandle(const Table& table, uint16_t handle);
+const pldm_bios_attr_table_entry* findByHandle(const Table& table,
+                                               uint16_t handle);
 
 /** @brief Find attribute entry by string handle
  *  @param[in] table - attribute table
  *  @param[in] handle - string handle
  *  @return Pointer to the attribute table entry
  */
-const pldm_bios_attr_table_entry*
-    findByStringHandle(const Table& table, uint16_t handle);
+const pldm_bios_attr_table_entry* findByStringHandle(const Table& table,
+                                                     uint16_t handle);
 
 /** @struct StringField
  *  @brief String field of attribute table
@@ -317,8 +317,8 @@
  *  @param[in] entry - Pointer to an attribute value table entry
  *  @return Current value string handle indices
  */
-std::vector<uint8_t>
-    decodeEnumEntry(const pldm_bios_attr_val_table_entry* entry);
+std::vector<uint8_t> decodeEnumEntry(
+    const pldm_bios_attr_val_table_entry* entry);
 
 /** @brief Construct string entry of attribute value table at the end of the
  *         given table
@@ -328,9 +328,9 @@
  *  @param[in] str - The string
  *  @return Pointer to the constructed entry
  */
-const pldm_bios_attr_val_table_entry*
-    constructStringEntry(Table& table, uint16_t attrHandle, uint8_t attrType,
-                         const std::string& str);
+const pldm_bios_attr_val_table_entry* constructStringEntry(
+    Table& table, uint16_t attrHandle, uint8_t attrType,
+    const std::string& str);
 
 /** @brief Construct integer entry of attribute value table at the end of
  *         the given table
@@ -351,9 +351,9 @@
  *  @param[in] handleIndices -  handle indices
  *  @return Pointer to the constructed entry
  */
-const pldm_bios_attr_val_table_entry*
-    constructEnumEntry(Table& table, uint16_t attrHandle, uint8_t attrType,
-                       const std::vector<uint8_t>& handleIndices);
+const pldm_bios_attr_val_table_entry* constructEnumEntry(
+    Table& table, uint16_t attrHandle, uint8_t attrType,
+    const std::vector<uint8_t>& handleIndices);
 
 /** @brief construct a table with an new entry
  *  @param[in] table - the table need to be updated
diff --git a/libpldmresponder/fru.cpp b/libpldmresponder/fru.cpp
index 19909b1..5a5cec9 100644
--- a/libpldmresponder/fru.cpp
+++ b/libpldmresponder/fru.cpp
@@ -22,8 +22,8 @@
 
 constexpr auto root = "/xyz/openbmc_project/inventory/";
 
-std::optional<pldm_entity>
-    FruImpl::getEntityByObjectPath(const dbus::InterfaceMap& intfMaps)
+std::optional<pldm_entity> FruImpl::getEntityByObjectPath(
+    const dbus::InterfaceMap& intfMaps)
 {
     for (const auto& intfMap : intfMaps)
     {
diff --git a/libpldmresponder/fru.hpp b/libpldmresponder/fru.hpp
index af55f92..490f5d1 100644
--- a/libpldmresponder/fru.hpp
+++ b/libpldmresponder/fru.hpp
@@ -156,8 +156,8 @@
      *
      *  @return pldm_entity
      */
-    std::optional<pldm_entity>
-        getEntityByObjectPath(const dbus::InterfaceMap& intfMaps);
+    std::optional<pldm_entity> getEntityByObjectPath(
+        const dbus::InterfaceMap& intfMaps);
 
     /** @brief Update pldm entity to association tree
      *
@@ -320,8 +320,8 @@
      *
      *  @return std::map<ObjectPath, pldm_entity>
      */
-    const pldm::responder::dbus::AssociatedEntityMap&
-        getAssociateEntityMap() const
+    const pldm::responder::dbus::AssociatedEntityMap& getAssociateEntityMap()
+        const
     {
         return impl.getAssociateEntityMap();
     }
diff --git a/libpldmresponder/fru_parser.hpp b/libpldmresponder/fru_parser.hpp
index 9e59f11..828bb52 100644
--- a/libpldmresponder/fru_parser.hpp
+++ b/libpldmresponder/fru_parser.hpp
@@ -96,14 +96,14 @@
      *  @return return the info create the PLDM FRU records from inventory D-Bus
      *          objects
      */
-    const FruRecordInfos&
-        getRecordInfo(const pldm::responder::dbus::Interface& intf) const
+    const FruRecordInfos& getRecordInfo(
+        const pldm::responder::dbus::Interface& intf) const
     {
         return recordMap.at(intf);
     }
 
-    pldm::responder::dbus::EntityType
-        getEntityType(const pldm::responder::dbus::Interface& intf) const
+    pldm::responder::dbus::EntityType getEntityType(
+        const pldm::responder::dbus::Interface& intf) const
     {
         return intfToEntityType.at(intf);
     }
diff --git a/libpldmresponder/pdr.hpp b/libpldmresponder/pdr.hpp
index edd8810..18fd6a6 100644
--- a/libpldmresponder/pdr.hpp
+++ b/libpldmresponder/pdr.hpp
@@ -34,10 +34,10 @@
  *
  *  @return pldm_pdr_record - Instance of pdr::RepoInterface
  */
-const pldm_pdr_record*
-    getRecordByHandle(const pldm::responder::pdr_utils::RepoInterface& pdrRepo,
-                      pldm::responder::pdr_utils::RecordHandle recordHandle,
-                      pldm::responder::pdr_utils::PdrEntry& pdrEntry);
+const pldm_pdr_record* getRecordByHandle(
+    const pldm::responder::pdr_utils::RepoInterface& pdrRepo,
+    pldm::responder::pdr_utils::RecordHandle recordHandle,
+    pldm::responder::pdr_utils::PdrEntry& pdrEntry);
 
 } // namespace pdr
 } // namespace responder
diff --git a/libpldmresponder/pdr_utils.cpp b/libpldmresponder/pdr_utils.cpp
index 7d87c67..5a1d08c 100644
--- a/libpldmresponder/pdr_utils.cpp
+++ b/libpldmresponder/pdr_utils.cpp
@@ -158,8 +158,8 @@
     return valueMap;
 }
 
-std::tuple<TerminusHandle, SensorID, SensorInfo>
-    parseStateSensorPDR(const std::vector<uint8_t>& stateSensorPdr)
+std::tuple<TerminusHandle, SensorID, SensorInfo> parseStateSensorPDR(
+    const std::vector<uint8_t>& stateSensorPdr)
 {
     auto pdr =
         reinterpret_cast<const pldm_state_sensor_pdr*>(stateSensorPdr.data());
@@ -209,8 +209,8 @@
                            std::move(sensorInfo));
 }
 
-std::vector<FruRecordDataFormat>
-    parseFruRecordTable(const uint8_t* fruData, size_t fruLen)
+std::vector<FruRecordDataFormat> parseFruRecordTable(const uint8_t* fruData,
+                                                     size_t fruLen)
 {
     // Refer: DSP0257_1.0.0 Table 2
     // 7: uint16_t(FRU Record Set Identifier), uint8_t(FRU Record Type),
diff --git a/libpldmresponder/pdr_utils.hpp b/libpldmresponder/pdr_utils.hpp
index e56cc24..8167ea7 100644
--- a/libpldmresponder/pdr_utils.hpp
+++ b/libpldmresponder/pdr_utils.hpp
@@ -238,8 +238,8 @@
  *  @return std::vector<FruRecordDataFormat> - the vector of the FRU record data
  *          format structure
  */
-std::vector<FruRecordDataFormat>
-    parseFruRecordTable(const uint8_t* fruData, size_t fruLen);
+std::vector<FruRecordDataFormat> parseFruRecordTable(const uint8_t* fruData,
+                                                     size_t fruLen);
 
 /** @brief Return the size of data type based on the effecterDataSize enum value
  *
diff --git a/libpldmresponder/platform.hpp b/libpldmresponder/platform.hpp
index 9c45ef8..2422e3c 100644
--- a/libpldmresponder/platform.hpp
+++ b/libpldmresponder/platform.hpp
@@ -213,8 +213,8 @@
      *
      * @param[in] handler - oem platform handler
      */
-    inline void
-        setOemPlatformHandler(pldm::responder::oem_platform::Handler* handler)
+    inline void setOemPlatformHandler(
+        pldm::responder::oem_platform::Handler* handler)
     {
         oemPlatformHandler = handler;
     }
diff --git a/libpldmresponder/platform_numeric_effecter.hpp b/libpldmresponder/platform_numeric_effecter.hpp
index 79a746f..a38863b 100644
--- a/libpldmresponder/platform_numeric_effecter.hpp
+++ b/libpldmresponder/platform_numeric_effecter.hpp
@@ -32,9 +32,9 @@
  *          failure, PropertyValue: The value to be set
  */
 template <typename T>
-std::pair<int, std::optional<pldm::utils::PropertyValue>>
-    getEffecterRawValue(const pldm_numeric_effecter_value_pdr* pdr,
-                        T& effecterValue, std::string propertyType)
+std::pair<int, std::optional<pldm::utils::PropertyValue>> getEffecterRawValue(
+    const pldm_numeric_effecter_value_pdr* pdr, T& effecterValue,
+    std::string propertyType)
 {
     // X = Round [ (Y - B) / m ]
     // refer to DSP0248_1.2.0 27.8
