sdm: Add support for HWC2_ATTRIBUTE_CONFIG_GROUP

Add support for HWC2_ATTRIBUTE_CONFIG_GROUP display attribute.

CRs-Fixed: 2624293
Change-Id: I2000747023da237053aa29bd8645575ab4e924f3
diff --git a/composer/hwc_display.cpp b/composer/hwc_display.cpp
index 72a22c6..802105b 100644
--- a/composer/hwc_display.cpp
+++ b/composer/hwc_display.cpp
@@ -1071,6 +1071,9 @@
     case HWC2::Attribute::DpiY:
       *out_value = INT32(variable_config.y_dpi * 1000.0f);
       break;
+    case HWC2::Attribute::ConfigGroup:
+      *out_value = GetDisplayConfigGroup(variable_config);
+      break;
     default:
       DLOGW("Spurious attribute type = %s", to_string(attribute).c_str());
       *out_value = -1;
@@ -2474,4 +2477,15 @@
   pending_config_ = false;
 }
 
+int32_t HWCDisplay::GetDisplayConfigGroup(DisplayConfigGroupInfo variable_config) {
+  for (auto &config : variable_config_map_) {
+    DisplayConfigGroupInfo const &group_info = config.second;
+    if (group_info == variable_config) {
+      return INT32(config.first);
+    }
+  }
+
+  return -1;
+}
+
 }  // namespace sdm
diff --git a/composer/hwc_display.h b/composer/hwc_display.h
index e951a51..c53b38a 100644
--- a/composer/hwc_display.h
+++ b/composer/hwc_display.h
@@ -429,6 +429,7 @@
   virtual void GetUnderScanConfig() { }
   int32_t SetClientTargetDataSpace(int32_t dataspace);
   int SetFrameBufferConfig(uint32_t x_pixels, uint32_t y_pixels);
+  int32_t GetDisplayConfigGroup(DisplayConfigGroupInfo variable_config);
 
   bool validated_ = false;
   bool layer_stack_invalid_ = true;
diff --git a/composer/hwc_session.cpp b/composer/hwc_session.cpp
index 570d205..4583e56 100644
--- a/composer/hwc_session.cpp
+++ b/composer/hwc_session.cpp
@@ -670,7 +670,7 @@
 int32_t HWCSession::GetDisplayAttribute(hwc2_display_t display, hwc2_config_t config,
                                         int32_t int_attribute, int32_t *out_value) {
   if (out_value == nullptr || int_attribute < HWC2_ATTRIBUTE_INVALID ||
-      int_attribute > HWC2_ATTRIBUTE_DPI_Y) {
+      int_attribute > HWC2_ATTRIBUTE_CONFIG_GROUP) {
     return HWC2_ERROR_BAD_PARAMETER;
   }
   auto attribute = static_cast<HWC2::Attribute>(int_attribute);
diff --git a/sdm/include/core/display_interface.h b/sdm/include/core/display_interface.h
index 0cd7c14..0178941 100644
--- a/sdm/include/core/display_interface.h
+++ b/sdm/include/core/display_interface.h
@@ -208,16 +208,24 @@
   @sa DisplayInterface::GetConfig
   @sa DisplayInterface::SetConfig
 */
-struct DisplayConfigVariableInfo {
+struct DisplayConfigGroupInfo {
   uint32_t x_pixels = 0;          //!< Total number of pixels in X-direction on the display panel.
   uint32_t y_pixels = 0;          //!< Total number of pixels in Y-direction on the display panel.
   float x_dpi = 0.0f;             //!< Dots per inch in X-direction.
   float y_dpi = 0.0f;             //!< Dots per inch in Y-direction.
-  uint32_t fps = 0;               //!< Frame rate per second.
-  uint32_t vsync_period_ns = 0;   //!< VSync period in nanoseconds.
   bool is_yuv = false;            //!< If the display output is in YUV format.
   bool smart_panel = false;       //!< If the display config has smart panel.
 
+  bool operator==(const DisplayConfigGroupInfo& info) const {
+    return ((x_pixels == info.x_pixels) && (y_pixels == info.y_pixels) && (x_dpi == info.x_dpi) &&
+            (y_dpi == info.y_dpi) && (is_yuv == info.is_yuv) && (smart_panel == info.smart_panel));
+  }
+};
+
+struct DisplayConfigVariableInfo : public DisplayConfigGroupInfo {
+  uint32_t fps = 0;               //!< Frame rate per second.
+  uint32_t vsync_period_ns = 0;   //!< VSync period in nanoseconds.
+
   bool operator==(const DisplayConfigVariableInfo& info) const {
     return ((x_pixels == info.x_pixels) && (y_pixels == info.y_pixels) && (x_dpi == info.x_dpi) &&
             (y_dpi == info.y_dpi) && (fps == info.fps) && (vsync_period_ns == info.vsync_period_ns)