diff --git a/redfish-core/lib/processor.hpp b/redfish-core/lib/processor.hpp
index 19b059a..90938c9 100644
--- a/redfish-core/lib/processor.hpp
+++ b/redfish-core/lib/processor.hpp
@@ -19,6 +19,7 @@
 #include "dbus_singleton.hpp"
 #include "dbus_utility.hpp"
 #include "error_messages.hpp"
+#include "generated/enums/processor.hpp"
 #include "health.hpp"
 #include "query.hpp"
 #include "registries/privilege_registry.hpp"
@@ -292,6 +293,100 @@
         "org.freedesktop.DBus.ObjectManager", "GetManagedObjects");
 }
 
+/**
+ * @brief Translates throttle cause DBUS property to redfish.
+ *
+ * @param[in] dbusSource    The throttle cause from DBUS
+ *
+ * @return Returns as a string, the throttle cause in Redfish terms. If
+ * translation cannot be done, returns "Unknown" throttle reason.
+ */
+inline processor::ThrottleCause
+    dbusToRfThrottleCause(const std::string& dbusSource)
+{
+    if (dbusSource ==
+        "xyz.openbmc_project.Control.Power.Throttle.ThrottleReasons.ClockLimit")
+    {
+        return processor::ThrottleCause::ClockLimit;
+    }
+    if (dbusSource ==
+        "xyz.openbmc_project.Control.Power.Throttle.ThrottleReasons.ManagementDetectedFault")
+    {
+        return processor::ThrottleCause::ManagementDetectedFault;
+    }
+    if (dbusSource ==
+        "xyz.openbmc_project.Control.Power.Throttle.ThrottleReasons.PowerLimit")
+    {
+        return processor::ThrottleCause::PowerLimit;
+    }
+    if (dbusSource ==
+        "xyz.openbmc_project.Control.Power.Throttle.ThrottleReasons.ThermalLimit")
+    {
+        return processor::ThrottleCause::ThermalLimit;
+    }
+    if (dbusSource ==
+        "xyz.openbmc_project.Control.Power.Throttle.ThrottleReasons.Unknown")
+    {
+        return processor::ThrottleCause::Unknown;
+    }
+    return processor::ThrottleCause::Invalid;
+}
+
+inline void
+    readThrottleProperties(const std::shared_ptr<bmcweb::AsyncResp>& aResp,
+                           const boost::system::error_code& ec,
+                           const dbus::utility::DBusPropertiesMap& properties)
+{
+    if (ec)
+    {
+        BMCWEB_LOG_ERROR << "Processor Throttle getAllProperties error " << ec;
+        messages::internalError(aResp->res);
+        return;
+    }
+
+    const bool* status = nullptr;
+    const std::vector<std::string>* causes = nullptr;
+
+    if (!sdbusplus::unpackPropertiesNoThrow(dbus_utils::UnpackErrorPrinter(),
+                                            properties, "Throttled", status,
+                                            "ThrottleCauses", causes))
+    {
+        messages::internalError(aResp->res);
+        return;
+    }
+
+    aResp->res.jsonValue["Throttled"] = *status;
+    nlohmann::json::array_t rCauses;
+    for (const std::string& cause : *causes)
+    {
+        processor::ThrottleCause rfCause = dbusToRfThrottleCause(cause);
+        if (rfCause == processor::ThrottleCause::Invalid)
+        {
+            messages::internalError(aResp->res);
+            return;
+        }
+
+        rCauses.emplace_back(rfCause);
+    }
+    aResp->res.jsonValue["ThrottleCauses"] = std::move(rCauses);
+}
+
+inline void
+    getThrottleProperties(const std::shared_ptr<bmcweb::AsyncResp>& aResp,
+                          const std::string& service,
+                          const std::string& objectPath)
+{
+    BMCWEB_LOG_DEBUG << "Get processor throttle resources";
+
+    sdbusplus::asio::getAllProperties(
+        *crow::connections::systemBus, service, objectPath,
+        "xyz.openbmc_project.Control.Power.Throttle",
+        [aResp](const boost::system::error_code& ec,
+                const dbus::utility::DBusPropertiesMap& properties) {
+        readThrottleProperties(aResp, ec, properties);
+        });
+}
+
 inline void getCpuAssetData(std::shared_ptr<bmcweb::AsyncResp> aResp,
                             const std::string& service,
                             const std::string& objPath)
@@ -684,7 +779,7 @@
     BMCWEB_LOG_DEBUG << "Get available system processor resources.";
 
     // GetSubTree on all interfaces which provide info about a Processor
-    constexpr std::array<std::string_view, 8> interfaces = {
+    constexpr std::array<std::string_view, 9> interfaces = {
         "xyz.openbmc_project.Common.UUID",
         "xyz.openbmc_project.Inventory.Decorator.Asset",
         "xyz.openbmc_project.Inventory.Decorator.Revision",
@@ -692,7 +787,8 @@
         "xyz.openbmc_project.Inventory.Decorator.LocationCode",
         "xyz.openbmc_project.Inventory.Item.Accelerator",
         "xyz.openbmc_project.Control.Processor.CurrentOperatingConfig",
-        "xyz.openbmc_project.Inventory.Decorator.UniqueIdentifier"};
+        "xyz.openbmc_project.Inventory.Decorator.UniqueIdentifier",
+        "xyz.openbmc_project.Control.Power.Throttle"};
     dbus::utility::getSubTree(
         "/xyz/openbmc_project/inventory", 0, interfaces,
         [resp, processorId, handler = std::forward<Handler>(handler)](
@@ -794,6 +890,10 @@
             {
                 getCpuUniqueId(aResp, serviceName, objectPath);
             }
+            else if (interface == "xyz.openbmc_project.Control.Power.Throttle")
+            {
+                getThrottleProperties(aResp, serviceName, objectPath);
+            }
         }
     }
 }
@@ -1260,7 +1360,7 @@
             boost::beast::http::field::link,
             "</redfish/v1/JsonSchemas/Processor/Processor.json>; rel=describedby");
         asyncResp->res.jsonValue["@odata.type"] =
-            "#Processor.v1_11_0.Processor";
+            "#Processor.v1_18_0.Processor";
         asyncResp->res.jsonValue["@odata.id"] = boost::urls::format(
             "/redfish/v1/Systems/system/Processors/{}", processorId);
 
