Systems: Add support for new eco power modes

Add support for the following new power modes:
- Efficiency Favor Performance
- Efficiency Favor Power
- Balanced Performance

New modes were added in ComputerSystem schema to v1.22

Tested on Rainier and passed Validator

'''
GET /redfish/v1/Systems/system:
    "@odata.type": "#ComputerSystem.v1_22_0.ComputerSystem",
    ...
    "PowerMode": "EfficiencyFavorPerformance",
    "PowerMode@Redfish.AllowableValues": [
        "Static",
        "MaximumPerformance",
        "PowerSaving"
    ],

PATCH -d '{ "PowerMode":"BalancedPerformance"}' https://$bmc/redfish/v1/Systems/system
  "PowerMode": "BalancedPerformance",

PATCH -d '{ "PowerMode":"EfficiencyFavorPerformance"}' https://$bmc/redfish/v1/Systems/system
  "PowerMode": "EfficiencyFavorPerformance",

PATCH -d '{ "PowerMode":"EfficiencyFavorPower"}' https://$bmc/redfish/v1/Systems/system
  "PowerMode": "EfficiencyFavorPower",

PATCH -d '{ "PowerMode":"MaximumPerformance"}' https://$bmc/redfish/v1/Systems/system
  "PowerMode": "MaximumPerformance",

PATCH -d '{ "PowerMode":"NotARealMode"}' https://$bmc/redfish/v1/Systems/system
{
  "PowerMode@Message.ExtendedInfo": [
    {
      "@odata.type": "#Message.v1_1_1.Message",
      "Message": "The value '\"NotARealMode\"' for the property PowerMode is not in the list of acceptable values.",
      "MessageArgs": [
        "\"NotARealMode\"",
        "PowerMode"
      ],
      "MessageId": "Base.1.13.0.PropertyValueNotInList",
      "MessageSeverity": "Warning",
      "Resolution": "Choose a value from the enumeration list that the implementation can support and resubmit the request if the operation failed."
    }
  ]
'''

Validator Results:
'''
  Type (ComputerSystem.v1_22_0.ComputerSystem), GET SUCCESS (time: 0:00:00.107269)
...
 PASS
...
  Elapsed time: 0:15:07
  invalidPropertyValue: 62
  metadataNamespaces: 4324
  pass: 14323
  passAction: 20
  passGet: 1051
  passRedfishUri: 1002
  skipNoSchema: 3
  skipOptional: 25582
  unverifiedAdditional.complex: 21
  warnDeprecated: 8
  warningPresent: 83
  warnings: 67
  Validation has succeeded.
'''

Change-Id: I56296a524b01d64adccad2d3da1757056900b6db
Signed-off-by: Chris Cain <cjcain@us.ibm.com>
diff --git a/redfish-core/lib/systems.hpp b/redfish-core/lib/systems.hpp
index 5f6cd87..2d62763 100644
--- a/redfish-core/lib/systems.hpp
+++ b/redfish-core/lib/systems.hpp
@@ -37,6 +37,7 @@
 #include <boost/container/flat_map.hpp>
 #include <boost/system/error_code.hpp>
 #include <boost/url/format.hpp>
+#include <generated/enums/computer_system.hpp>
 #include <sdbusplus/asio/property.hpp>
 #include <sdbusplus/message.hpp>
 #include <sdbusplus/unpack_properties.hpp>
@@ -2176,25 +2177,46 @@
     translatePowerMode(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
                        const std::string& modeValue)
 {
+    using PowerMode = computer_system::PowerMode;
+
     if (modeValue == "xyz.openbmc_project.Control.Power.Mode.PowerMode.Static")
     {
-        asyncResp->res.jsonValue["PowerMode"] = "Static";
+        asyncResp->res.jsonValue["PowerMode"] = PowerMode::Static;
     }
     else if (
         modeValue ==
         "xyz.openbmc_project.Control.Power.Mode.PowerMode.MaximumPerformance")
     {
-        asyncResp->res.jsonValue["PowerMode"] = "MaximumPerformance";
+        asyncResp->res.jsonValue["PowerMode"] = PowerMode::MaximumPerformance;
     }
     else if (modeValue ==
              "xyz.openbmc_project.Control.Power.Mode.PowerMode.PowerSaving")
     {
-        asyncResp->res.jsonValue["PowerMode"] = "PowerSaving";
+        asyncResp->res.jsonValue["PowerMode"] = PowerMode::PowerSaving;
+    }
+    else if (
+        modeValue ==
+        "xyz.openbmc_project.Control.Power.Mode.PowerMode.BalancedPerformance")
+    {
+        asyncResp->res.jsonValue["PowerMode"] = PowerMode::BalancedPerformance;
+    }
+    else if (
+        modeValue ==
+        "xyz.openbmc_project.Control.Power.Mode.PowerMode.EfficiencyFavorPerformance")
+    {
+        asyncResp->res.jsonValue["PowerMode"] =
+            PowerMode::EfficiencyFavorPerformance;
+    }
+    else if (
+        modeValue ==
+        "xyz.openbmc_project.Control.Power.Mode.PowerMode.EfficiencyFavorPower")
+    {
+        asyncResp->res.jsonValue["PowerMode"] = PowerMode::EfficiencyFavorPower;
     }
     else if (modeValue ==
              "xyz.openbmc_project.Control.Power.Mode.PowerMode.OEM")
     {
-        asyncResp->res.jsonValue["PowerMode"] = "OEM";
+        asyncResp->res.jsonValue["PowerMode"] = PowerMode::OEM;
     }
     else
     {
@@ -2288,32 +2310,48 @@
  * name associated with that string
  *
  * @param[in] asyncResp   Shared pointer for generating response message.
- * @param[in] modeString  String representing the desired PowerMode
+ * @param[in] modeValue   String representing the desired PowerMode
  *
  * @return PowerMode value or empty string if mode is not valid
  */
 inline std::string
     validatePowerMode(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
-                      const std::string& modeString)
+                      const nlohmann::json& modeValue)
 {
+    using PowerMode = computer_system::PowerMode;
     std::string mode;
 
-    if (modeString == "Static")
+    if (modeValue == PowerMode::Static)
     {
         mode = "xyz.openbmc_project.Control.Power.Mode.PowerMode.Static";
     }
-    else if (modeString == "MaximumPerformance")
+    else if (modeValue == PowerMode::MaximumPerformance)
     {
         mode =
             "xyz.openbmc_project.Control.Power.Mode.PowerMode.MaximumPerformance";
     }
-    else if (modeString == "PowerSaving")
+    else if (modeValue == PowerMode::PowerSaving)
     {
         mode = "xyz.openbmc_project.Control.Power.Mode.PowerMode.PowerSaving";
     }
+    else if (modeValue == PowerMode::BalancedPerformance)
+    {
+        mode =
+            "xyz.openbmc_project.Control.Power.Mode.PowerMode.BalancedPerformance";
+    }
+    else if (modeValue == PowerMode::EfficiencyFavorPerformance)
+    {
+        mode =
+            "xyz.openbmc_project.Control.Power.Mode.PowerMode.EfficiencyFavorPerformance";
+    }
+    else if (modeValue == PowerMode::EfficiencyFavorPower)
+    {
+        mode =
+            "xyz.openbmc_project.Control.Power.Mode.PowerMode.EfficiencyFavorPower";
+    }
     else
     {
-        messages::propertyValueNotInList(asyncResp->res, modeString,
+        messages::propertyValueNotInList(asyncResp->res, modeValue.dump(),
                                          "PowerMode");
     }
     return mode;
@@ -3233,7 +3271,7 @@
         boost::beast::http::field::link,
         "</redfish/v1/JsonSchemas/ComputerSystem/ComputerSystem.json>; rel=describedby");
     asyncResp->res.jsonValue["@odata.type"] =
-        "#ComputerSystem.v1_16_0.ComputerSystem";
+        "#ComputerSystem.v1_22_0.ComputerSystem";
     asyncResp->res.jsonValue["Name"] = "system";
     asyncResp->res.jsonValue["Id"] = "system";
     asyncResp->res.jsonValue["SystemType"] = "Physical";