Change the CapabilitiesFlags property into booleans

Each bit in CapabilitiesFlags dbus property is a chassis
capability. Setting a capability overwrites other capabilities.
Read-and-update of the property results in race condition/confusion.
To tackle this, added a boolean property for each of chassis
capability. The new properties will be read and updated in ipmi
command handling code.

The original CapabilitiesFlags property will be deprecated once the
changes are made to use new boolean properties in all the repos.

The phosphor-dbus-interfaces change is in review
https://gerrit.openbmc-project.xyz/c/openbmc/phosphor-dbus-interfaces/+/27592

Tested:

Tested this code along with the changes in settings deamon where the
new boolean dbus properties were added and default values have
been intialized.

root@intel-obmc:~# ipmitool raw 0x00 0x00
 07 22 44 66 88 aa

Signed-off-by: Karthick Sundarrajan <karthick.sundarrajan@intel.com>
Change-Id: I487a37b50bfe7d6555ff7b257b49cdb6dde781f6
diff --git a/chassishandler.cpp b/chassishandler.cpp
index 6e1341c..734ccde 100644
--- a/chassishandler.cpp
+++ b/chassishandler.cpp
@@ -93,7 +93,12 @@
 static constexpr auto match = "chassis0";
 const static constexpr char chassisCapIntf[] =
     "xyz.openbmc_project.Control.ChassisCapabilities";
-const static constexpr char chassisCapFlagsProp[] = "CapabilitiesFlags";
+const static constexpr char chassisIntrusionProp[] = "ChassisIntrusionEnabled";
+const static constexpr char chassisFrontPanelLockoutProp[] =
+    "ChassisFrontPanelLockoutEnabled";
+const static constexpr char chassisNMIProp[] = "ChassisNMIEnabled";
+const static constexpr char chassisPowerInterlockProp[] =
+    "ChassisPowerInterlockEnabled";
 const static constexpr char chassisFRUDevAddrProp[] = "FRUDeviceAddress";
 const static constexpr char chassisSDRDevAddrProp[] = "SDRDeviceAddress";
 const static constexpr char chassisSELDevAddrProp[] = "SELDeviceAddress";
@@ -507,7 +512,11 @@
  *  chassisSMDevAddr       - chassis system management device address
  *  chassisBridgeDevAddr   - chassis bridge device address
  */
-ipmi::RspType<uint8_t, // chassis capabilities flag
+ipmi::RspType<bool,    // chassis intrusion sensor
+              bool,    // chassis Front panel lockout
+              bool,    // chassis NMI
+              bool,    // chassis power interlock
+              uint4_t, // reserved
               uint8_t, // chassis FRU info Device Address
               uint8_t, // chassis SDR device address
               uint8_t, // chassis SEL device address
@@ -547,11 +556,31 @@
         return ipmi::responseUnspecifiedError();
     }
 
-    uint8_t* chassisCapFlags =
-        std::get_if<uint8_t>(&properties[chassisCapFlagsProp]);
-    if (chassisCapFlags == nullptr)
+    bool* chassisIntrusionFlag =
+        std::get_if<bool>(&properties[chassisIntrusionProp]);
+    if (chassisIntrusionFlag == nullptr)
     {
-        log<level::ERR>("Error to get chassis capability flags");
+        log<level::ERR>("Error to get chassis Intrusion flags");
+        return ipmi::responseUnspecifiedError();
+    }
+    bool* chassisFrontPanelFlag =
+        std::get_if<bool>(&properties[chassisFrontPanelLockoutProp]);
+    if (chassisFrontPanelFlag == nullptr)
+    {
+        log<level::ERR>("Error to get chassis intrusion flags");
+        return ipmi::responseUnspecifiedError();
+    }
+    bool* chassisNMIFlag = std::get_if<bool>(&properties[chassisNMIProp]);
+    if (chassisNMIFlag == nullptr)
+    {
+        log<level::ERR>("Error to get chassis NMI flags");
+        return ipmi::responseUnspecifiedError();
+    }
+    bool* chassisPowerInterlockFlag =
+        std::get_if<bool>(&properties[chassisPowerInterlockProp]);
+    if (chassisPowerInterlockFlag == nullptr)
+    {
+        log<level::ERR>("Error to get chassis power interlock flags");
         return ipmi::responseUnspecifiedError();
     }
     uint8_t* chassisFRUInfoDevAddr =
@@ -590,9 +619,11 @@
         return ipmi::responseUnspecifiedError();
     }
 
-    return ipmi::responseSuccess(*chassisCapFlags, *chassisFRUInfoDevAddr,
-                                 *chassisSDRDevAddr, *chassisSELDevAddr,
-                                 *chassisSMDevAddr, *chassisBridgeDevAddr);
+    return ipmi::responseSuccess(*chassisIntrusionFlag, *chassisFrontPanelFlag,
+                                 *chassisNMIFlag, *chassisPowerInterlockFlag, 0,
+                                 *chassisFRUInfoDevAddr, *chassisSDRDevAddr,
+                                 *chassisSELDevAddr, *chassisSMDevAddr,
+                                 *chassisBridgeDevAddr);
 }
 
 /** @brief implements set chassis capalibities command
@@ -662,8 +693,6 @@
         return ipmi::responseInvalidFieldRequest();
     }
 
-    uint8_t capFlags = (static_cast<uint8_t>(intrusion)) |
-                       ((static_cast<uint8_t>(fpLockout)) << 1);
     try
     {
         sdbusplus::bus::bus bus(ipmid_get_sd_bus_connection());
@@ -672,7 +701,11 @@
 
         ipmi::setDbusProperty(bus, chassisCapObject.second,
                               chassisCapObject.first, chassisCapIntf,
-                              chassisCapFlagsProp, capFlags);
+                              chassisIntrusionProp, intrusion);
+
+        ipmi::setDbusProperty(bus, chassisCapObject.second,
+                              chassisCapObject.first, chassisCapIntf,
+                              chassisFrontPanelLockoutProp, fpLockout);
 
         ipmi::setDbusProperty(bus, chassisCapObject.second,
                               chassisCapObject.first, chassisCapIntf,