hwc: Populate doze mode support for command mode panels alone.

-- In case doze is not supported, doze functionality will be
   applied in ON state.
-- Disable async power mode.
CRs-Fixed: 2593633
Change-Id: I9b48e7a4767a5ad421970ad97aada49f79e03911
diff --git a/composer/hwc_session.cpp b/composer/hwc_session.cpp
index ac312a1..b4c94c7 100644
--- a/composer/hwc_session.cpp
+++ b/composer/hwc_session.cpp
@@ -181,7 +181,7 @@
     g_hwc_uevent_.Register(this);
   }
 
-  int value = 1;  // Default value when property is not present.
+  int value = 0;  // Default value when property is not present.
   Debug::Get()->GetProperty(ENABLE_ASYNC_POWERMODE, &value);
   async_powermode_ = (value == 1);
   DLOGI("builtin_powermode_override: %d", async_powermode_);
@@ -1127,13 +1127,27 @@
   }
 
   *out_support = 0;
-  if (hwc_display_[display]->GetDisplayClass() == DISPLAY_CLASS_BUILTIN) {
-    *out_support = 1;
-  }
+  uint32_t config = 0;
+  GetActiveConfigIndex(display, &config);
+  *out_support = isSmartPanelConfig(display, config) ? 1 : 0;
 
   return HWC2_ERROR_NONE;
 }
 
+bool HWCSession::isSmartPanelConfig(uint32_t disp_id, uint32_t config_id) {
+  if (disp_id != qdutils::DISPLAY_PRIMARY) {
+    return false;
+  }
+
+  SCOPE_LOCK(locker_[disp_id]);
+  if (!hwc_display_[disp_id]) {
+    DLOGE("Display %d is not created yet.", disp_id);
+    return false;
+  }
+
+  return hwc_display_[disp_id]->IsSmartPanelConfig(config_id);
+}
+
 int32_t HWCSession::ValidateDisplay(hwc2_display_t display, uint32_t *out_num_types,
                                     uint32_t *out_num_requests) {
   //  out_num_types and out_num_requests will be non-NULL
@@ -3214,12 +3228,22 @@
   }
 
   bool isBuiltin = (hwc_display_[display]->GetDisplayClass() == DISPLAY_CLASS_BUILTIN);
+  int32_t has_doze_support = 0;
+  GetDozeSupport(display, &has_doze_support);
   if (isBuiltin) {
     capabilities->resize(4);
     // TODO(user): Handle SKIP_CLIENT_COLOR_TRANSFORM based on DSPP availability
-    std::vector<HwcDisplayCapability> caps{
-        HwcDisplayCapability::SKIP_CLIENT_COLOR_TRANSFORM, HwcDisplayCapability::DOZE,
-        HwcDisplayCapability::BRIGHTNESS, HwcDisplayCapability::PROTECTED_CONTENTS};
+    std::vector<HwcDisplayCapability> caps;
+    if (has_doze_support) {
+      caps = {
+          HwcDisplayCapability::SKIP_CLIENT_COLOR_TRANSFORM, HwcDisplayCapability::DOZE,
+          HwcDisplayCapability::BRIGHTNESS, HwcDisplayCapability::PROTECTED_CONTENTS};
+    }
+    else {
+      caps = {
+          HwcDisplayCapability::SKIP_CLIENT_COLOR_TRANSFORM,
+          HwcDisplayCapability::BRIGHTNESS, HwcDisplayCapability::PROTECTED_CONTENTS};
+    }
     capabilities->setToExternal(caps.data(), caps.size());
   }
   return HWC2_ERROR_NONE;
diff --git a/composer/hwc_session.h b/composer/hwc_session.h
index 9079a91..680e54a 100644
--- a/composer/hwc_session.h
+++ b/composer/hwc_session.h
@@ -494,6 +494,7 @@
   void NotifyClientStatus(bool connected);
   int32_t GetVirtualDisplayId();
   void PerformQsyncCallback(hwc2_display_t display);
+  bool isSmartPanelConfig(uint32_t disp_id, uint32_t config_id);
 
   CoreInterface *core_intf_ = nullptr;
   HWCDisplay *hwc_display_[HWCCallbacks::kNumDisplays] = {nullptr};