Merge "display/config: Add libdisplayconfig in PRODUCT_PACKAGES"
diff --git a/config/display-product.mk b/config/display-product.mk
index f0c5afc..141cd74 100644
--- a/config/display-product.mk
+++ b/config/display-product.mk
@@ -28,9 +28,15 @@
 #QDCM calibration xml file for 2k panel
 PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_nt35597_cmd_mode_dsi_truly_panel_with_DSC.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_nt35597_cmd_mode_dsi_truly_panel_with_DSC.xml
 PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_nt35597_cmd_mode_dsi_truly_panel_with_DSC.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_nt35597_video_mode_dsi_truly_panel_with_DSC.xml
+
+#QDCM calibration xml file for 2k dual dsi panel
+PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_nt35597_cmd_mode_dsi_truly_panel_with_DSC.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_Dual_nt35597_cmd_mode_dsi_truly_panel_without_DSC.xml.xml
+PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_nt35597_cmd_mode_dsi_truly_panel_with_DSC.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_Dual_nt35597_video_mode_dsi_truly_panel_without_DSC.xml.xml
+
 #QDCM calibration xml file for 4k panel
 PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_Sharp_4k_cmd_mode_dsc_dsi_panel.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_Sharp_4k_cmd_mode_dsc_dsi_panel.xml
 PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_Sharp_4k_cmd_mode_dsc_dsi_panel.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_Sharp_4k_video_mode_dsc_dsi_panel.xml
+
 #QDCM calibration xml file for amoled panel
 PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_sw43404_amoled_cmd_mode_dsi_boe_panel_with_DSC.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_sw43404_amoled_cmd_mode_dsi_boe_panel_with_DSC.xml
 PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_sw43404_amoled_cmd_mode_dsi_boe_panel_with_DSC.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_sw43404_amoled_video_mode_dsi_boe_panel_with_DSC.xml
@@ -42,16 +48,32 @@
 PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_default.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_nt35695b_truly_fhd_command_mode_dsi_panel.xml
 PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_default.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_nt35695b_truly_fhd_video_mode_dsi_panel.xml
 
-#QDCM calibration xml file for 2k dual dsi panel
-PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_nt35597_cmd_mode_dsi_truly_panel_with_DSC.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_Dual_nt35597_cmd_mode_dsi_truly_panel_without_DSC.xml.xml
-PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_nt35597_cmd_mode_dsi_truly_panel_with_DSC.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_Dual_nt35597_video_mode_dsi_truly_panel_without_DSC.xml.xml
+#QDCM calibration xml file base on Talos panel type hx83112a
+PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_talos_default.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_hx83112a_video_mode_dsi_truly_panel.xml
+
+#QDCM calibration xml file base on Talos panel type td4328
+PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_talos_default.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_td4328_cmd_mode_dsi_truly_panel.xml
+PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_talos_default.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_td4328_video_mode_dsi_truly_panel.xml
+
+#QDCM calibration xml file base on Moorea panel type fhd+
+PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_default.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_sw43404_amoled_boe_fhd+_panel_with_DSC.xml
+
+#QDCM calibration xml file base on td4330
+PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_trinket_default.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_td4330_cmd_mode_dsi_truly_panel.xml
+PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_trinket_default.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_td4330_video_mode_dsi_truly_panel.xml
+
+#QDCM calibration xml file base on Moorea panel type wqhd
+PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_default.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_Dual_Sharp_WQHD_cmd_mode_dsi_panel.xml
+PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_default.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_Dual_Sharp_wqhd_video_mode_dsi_panel.xml
+
+#QDCM calibration xml file base on nt36672
+PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_trinket_default.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_nt36672_truly_fhd_video_mode_dsi_panel.xml
 
 PRODUCT_PROPERTY_OVERRIDES += \
     persist.demo.hdmirotationlock=false \
     persist.sys.sf.color_saturation=1.0 \
     debug.sf.hw=0 \
     debug.egl.hw=0 \
-    debug.sf.latch_unsignaled=1 \
     debug.mdpcomp.logs=0 \
     vendor.gralloc.disable_ubwc=0 \
     vendor.display.disable_scaler=0 \
diff --git a/gralloc/QtiMapper.cpp b/gralloc/QtiMapper.cpp
index dc1b40c..dba446a 100644
--- a/gralloc/QtiMapper.cpp
+++ b/gralloc/QtiMapper.cpp
@@ -266,30 +266,30 @@
 Return<void> QtiMapper::getMapSecureBufferFlag(void *buffer, getMapSecureBufferFlag_cb hidl_cb) {
   auto err = Error::BAD_BUFFER;
   auto hnd = static_cast<private_handle_t *>(buffer);
-  int *map_secure_buffer = 0;
+  int map_secure_buffer = 0;
   if (buffer != nullptr && private_handle_t::validate(hnd) == 0) {
-    if (getMetaData(hnd, GET_MAP_SECURE_BUFFER, map_secure_buffer) != 0) {
-      *map_secure_buffer = 0;
+    if (getMetaData(hnd, GET_MAP_SECURE_BUFFER, &map_secure_buffer) != 0) {
+      map_secure_buffer = 0;
     } else {
       err = Error::NONE;
     }
   }
-  hidl_cb(err, *map_secure_buffer != 0);
+  hidl_cb(err, map_secure_buffer != 0);
   return Void();
 }
 
 Return<void> QtiMapper::getInterlacedFlag(void *buffer, getInterlacedFlag_cb hidl_cb) {
   auto err = Error::BAD_BUFFER;
   auto hnd = static_cast<private_handle_t *>(buffer);
-  int *interlaced_flag = nullptr;
+  int interlaced_flag = 0;
   if (buffer != nullptr && private_handle_t::validate(hnd) == 0) {
-    if (getMetaData(hnd, GET_PP_PARAM_INTERLACED, interlaced_flag) != 0) {
-      *interlaced_flag = 0;
+    if (getMetaData(hnd, GET_PP_PARAM_INTERLACED, &interlaced_flag) != 0) {
+      interlaced_flag = 0;
     } else {
       err = Error::NONE;
     }
   }
-  hidl_cb(err, *interlaced_flag != 0);
+  hidl_cb(err, interlaced_flag != 0);
   return Void();
 }
 
diff --git a/gralloc/gr_utils.cpp b/gralloc/gr_utils.cpp
index eb455ff..656ddec 100644
--- a/gralloc/gr_utils.cpp
+++ b/gralloc/gr_utils.cpp
@@ -1166,6 +1166,8 @@
     } else if (usage & BufferUsage::VIDEO_ENCODER) {
       if (usage & GRALLOC_USAGE_PRIVATE_VIDEO_NV21_ENCODER) {
         gr_format = HAL_PIXEL_FORMAT_NV21_ENCODEABLE;  // NV21
+      } else if (usage & GRALLOC_USAGE_PRIVATE_HEIF) {
+        gr_format = HAL_PIXEL_FORMAT_NV12_HEIF;
       } else if (format == HAL_PIXEL_FORMAT_YCbCr_420_888) {
         gr_format = HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS;
       } else {
diff --git a/sdm/include/core/display_interface.h b/sdm/include/core/display_interface.h
index c744fea..922d7ba 100644
--- a/sdm/include/core/display_interface.h
+++ b/sdm/include/core/display_interface.h
@@ -625,12 +625,6 @@
   */
   virtual DisplayError GetDefaultColorMode(std::string *color_mode) = 0;
 
-  /*! @brief Method to request applying default display mode.
-
-    @return \link DisplayError \endlink
-  */
-  virtual DisplayError ApplyDefaultDisplayMode() = 0;
-
   /*! @brief Method to set the position of the hw cursor.
 
     @param[in] x \link x position \endlink
diff --git a/sdm/include/private/color_interface.h b/sdm/include/private/color_interface.h
index b9e287d..d7b5e5f 100644
--- a/sdm/include/private/color_interface.h
+++ b/sdm/include/private/color_interface.h
@@ -74,8 +74,6 @@
                                             PPFeaturesConfig *out_features,
                                             PPPendingParams *pending_action) = 0;
 
-  virtual DisplayError ApplyDefaultDisplayMode(PPFeaturesConfig *out_features) = 0;
-
   virtual DisplayError ColorIntfSetColorTransform(PPFeaturesConfig *out_features,
                                                 uint32_t disp_id, uint32_t length,
                                                 const double *trans_data) = 0;
@@ -84,12 +82,11 @@
                                              uint32_t disp_id, int32_t mode_id) = 0;
 
   virtual DisplayError ColorIntfGetNumDisplayModes(PPFeaturesConfig *out_features,
-                                                 uint32_t disp_id, bool enum_user_modes,
-                                                 uint32_t *mode_cnt) = 0;
+                                                 uint32_t disp_id, uint32_t *mode_cnt) = 0;
 
   virtual DisplayError ColorIntfEnumerateDisplayModes(PPFeaturesConfig *out_features,
-                                                uint32_t disp_id, bool enum_user_modes,
-                                                SDEDisplayMode *modes, uint32_t *mode_cnt) = 0;
+                                                uint32_t disp_id, SDEDisplayMode *modes,
+                                                uint32_t *mode_cnt) = 0;
   virtual DisplayError ColorIntfGetModeInfo(PPFeaturesConfig *out_features,
                                             uint32_t disp_id, int32_t mode_id,
                                             AttrVal *query) = 0;
diff --git a/sdm/libs/core/color_manager.cpp b/sdm/libs/core/color_manager.cpp
index ed80e2c..fe42556 100644
--- a/sdm/libs/core/color_manager.cpp
+++ b/sdm/libs/core/color_manager.cpp
@@ -168,15 +168,6 @@
   return ret;
 }
 
-DisplayError ColorManagerProxy::ApplyDefaultDisplayMode(void) {
-  DisplayError ret = kErrorNone;
-
-  // On POR, will be invoked from prepare<> request once bootanimation is done.
-  ret = color_intf_->ApplyDefaultDisplayMode(&pp_features_);
-
-  return ret;
-}
-
 bool ColorManagerProxy::NeedsPartialUpdateDisable() {
   Locker &locker(pp_features_.GetLocker());
   SCOPE_LOCK(locker);
@@ -224,15 +215,13 @@
   }
 }
 
-DisplayError ColorManagerProxy::ColorMgrGetNumOfModes(bool enum_user_modes,
-                                                      uint32_t *mode_cnt) {
-  return color_intf_->ColorIntfGetNumDisplayModes(&pp_features_, 0, enum_user_modes, mode_cnt);
+DisplayError ColorManagerProxy::ColorMgrGetNumOfModes(uint32_t *mode_cnt) {
+  return color_intf_->ColorIntfGetNumDisplayModes(&pp_features_, 0, mode_cnt);
 }
 
-DisplayError ColorManagerProxy::ColorMgrGetModes(bool enum_user_modes, uint32_t *mode_cnt,
+DisplayError ColorManagerProxy::ColorMgrGetModes(uint32_t *mode_cnt,
                                                  SDEDisplayMode *modes) {
-  return color_intf_->ColorIntfEnumerateDisplayModes(&pp_features_, 0, enum_user_modes,
-                                                     modes, mode_cnt);
+  return color_intf_->ColorIntfEnumerateDisplayModes(&pp_features_, 0, modes, mode_cnt);
 }
 
 DisplayError ColorManagerProxy::ColorMgrSetMode(int32_t color_mode_id) {
diff --git a/sdm/libs/core/color_manager.h b/sdm/libs/core/color_manager.h
index 24237f8..5b604b7 100644
--- a/sdm/libs/core/color_manager.h
+++ b/sdm/libs/core/color_manager.h
@@ -65,9 +65,8 @@
   DisplayError ColorSVCRequestRoute(const PPDisplayAPIPayload &in_payload,
                                     PPDisplayAPIPayload *out_payload,
                                     PPPendingParams *pending_action);
-  DisplayError ApplyDefaultDisplayMode();
-  DisplayError ColorMgrGetNumOfModes(bool enum_user_modes, uint32_t *mode_cnt);
-  DisplayError ColorMgrGetModes(bool enum_user_modes, uint32_t *mode_cnt, SDEDisplayMode *modes);
+  DisplayError ColorMgrGetNumOfModes(uint32_t *mode_cnt);
+  DisplayError ColorMgrGetModes(uint32_t *mode_cnt, SDEDisplayMode *modes);
   DisplayError ColorMgrSetMode(int32_t color_mode_id);
   DisplayError ColorMgrGetModeInfo(int32_t mode_id, AttrVal *query);
   DisplayError ColorMgrSetColorTransform(uint32_t length, const double *trans_data);
diff --git a/sdm/libs/core/comp_manager.cpp b/sdm/libs/core/comp_manager.cpp
index b0322f1..4780370 100644
--- a/sdm/libs/core/comp_manager.cpp
+++ b/sdm/libs/core/comp_manager.cpp
@@ -568,8 +568,8 @@
 
   case kStateOn:
   case kStateDoze:
-    // Get active display count.
-    if (powered_on_displays_.size()) {
+    // Setting safe mode if there are multiple displays and one of display is already active.
+    if ((registered_displays_.size() > 1) && powered_on_displays_.size()) {
       safe_mode_ = true;
       DLOGV_IF(kTagCompManager, "safe_mode = %d", safe_mode_);
     }
diff --git a/sdm/libs/core/display_base.cpp b/sdm/libs/core/display_base.cpp
old mode 100644
new mode 100755
index f9aa06b..ea48884
--- a/sdm/libs/core/display_base.cpp
+++ b/sdm/libs/core/display_base.cpp
@@ -135,7 +135,7 @@
                                                             display_attributes_, hw_panel_info_);
 
     if (color_mgr_) {
-      if (InitializeColorModes(false) != kErrorNone) {
+      if (InitializeColorModes() != kErrorNone) {
         DLOGW("InitColorModes failed for display %d-%d", display_id_, display_type_);
       }
       color_mgr_->ColorMgrCombineColorModes();
@@ -1056,38 +1056,6 @@
   return kErrorNotSupported;
 }
 
-DisplayError DisplayBase::ApplyDefaultDisplayMode() {
-  lock_guard<recursive_mutex> obj(recursive_mutex_);
-  DisplayError error = kErrorNone;
-  if (color_mgr_) {
-    error = color_mgr_->ApplyDefaultDisplayMode();
-    // Apply default mode failed
-    if (error != kErrorNone) {
-      DLOGI("default mode not found");
-      return error;
-    }
-    DeInitializeColorModes();
-    // Default mode apply is called during first frame, if file system
-    // where mode files is present, ColorManager will not find any modes.
-    // Once boot animation is complete we re-try to apply the modes, since
-    // file system should be mounted. InitColorModes needs to called again
-    error = InitializeColorModes(true);
-    if (error != kErrorNone) {
-      DLOGE("failed to initial modes\n");
-      return error;
-    }
-    if (color_modes_cs_.size() > 0) {
-      error = comp_manager_->SetColorModesInfo(display_comp_ctx_, color_modes_cs_);
-      if (error) {
-        DLOGW("SetColorModesInfo failed on display = %d", display_type_);
-      }
-    }
-  } else {
-    return kErrorParameters;
-  }
-  return kErrorNone;
-}
-
 DisplayError DisplayBase::SetCursorPosition(int x, int y) {
   lock_guard<recursive_mutex> obj(recursive_mutex_);
   if (state_ != kStateOn) {
@@ -1549,12 +1517,12 @@
   return;
 }
 
-DisplayError DisplayBase::InitializeColorModes(bool enum_user_modes) {
+DisplayError DisplayBase::InitializeColorModes() {
   if (!color_mgr_) {
     return kErrorNotSupported;
   }
 
-  DisplayError error = color_mgr_->ColorMgrGetNumOfModes(enum_user_modes, &num_color_modes_);
+  DisplayError error = color_mgr_->ColorMgrGetNumOfModes(&num_color_modes_);
   if (error != kErrorNone || !num_color_modes_) {
     DLOGV_IF(kTagQDCM, "GetNumModes failed = %d count = %d", error, num_color_modes_);
     return kErrorNotSupported;
@@ -1564,8 +1532,7 @@
   if (!color_modes_.size()) {
     color_modes_.resize(num_color_modes_);
 
-    DisplayError error = color_mgr_->ColorMgrGetModes(enum_user_modes,
-                                         &num_color_modes_, color_modes_.data());
+    DisplayError error = color_mgr_->ColorMgrGetModes(&num_color_modes_, color_modes_.data());
     if (error != kErrorNone) {
       color_modes_.clear();
       DLOGE("Failed");
diff --git a/sdm/libs/core/display_base.h b/sdm/libs/core/display_base.h
old mode 100644
new mode 100755
index 47c872d..9039aff
--- a/sdm/libs/core/display_base.h
+++ b/sdm/libs/core/display_base.h
@@ -111,7 +111,6 @@
   virtual DisplayError GetColorModeName(int32_t mode_id, std::string *mode_name);
   virtual DisplayError SetColorTransform(const uint32_t length, const double *color_transform);
   virtual DisplayError GetDefaultColorMode(std::string *color_mode);
-  virtual DisplayError ApplyDefaultDisplayMode(void);
   virtual DisplayError SetCursorPosition(int x, int y);
   virtual DisplayError GetRefreshRateRange(uint32_t *min_refresh_rate, uint32_t *max_refresh_rate);
   virtual DisplayError GetPanelBrightness(int *level) {
@@ -140,7 +139,7 @@
   }
   virtual DisplayError SetQSyncMode(QSyncMode qsync_mode) { return kErrorNotSupported; }
   virtual std::string Dump();
-  virtual DisplayError InitializeColorModes(bool enum_user_modes);
+  virtual DisplayError InitializeColorModes();
   virtual DisplayError ControlIdlePowerCollapse(bool enable, bool synchronous) {
     return kErrorNotSupported;
   }
diff --git a/sdm/libs/core/display_pluggable.cpp b/sdm/libs/core/display_pluggable.cpp
index 54bb497..5bed20a 100644
--- a/sdm/libs/core/display_pluggable.cpp
+++ b/sdm/libs/core/display_pluggable.cpp
@@ -126,7 +126,7 @@
     DLOGE("Failed to create hardware events interface. Error = %d", error);
   }
 
-  InitializeColorModes(false);
+  InitializeColorModes();
 
   current_refresh_rate_ = hw_panel_info_.max_fps;
 
@@ -316,7 +316,7 @@
   return kErrorNone;
 }
 
-DisplayError DisplayPluggable::InitializeColorModes(bool enum_user_modes) {
+DisplayError DisplayPluggable::InitializeColorModes() {
   PrimariesTransfer pt = {};
   AttrVal var;
   if (!hw_panel_info_.hdr_enabled) {
diff --git a/sdm/libs/core/display_pluggable.h b/sdm/libs/core/display_pluggable.h
index 92bb890..c75388a 100644
--- a/sdm/libs/core/display_pluggable.h
+++ b/sdm/libs/core/display_pluggable.h
@@ -48,7 +48,7 @@
   virtual DisplayError SetRefreshRate(uint32_t refresh_rate, bool final_rate);
   virtual bool IsUnderscanSupported();
   virtual DisplayError OnMinHdcpEncryptionLevelChange(uint32_t min_enc_level);
-  virtual DisplayError InitializeColorModes(bool enum_user_modes);
+  virtual DisplayError InitializeColorModes();
   virtual DisplayError SetColorMode(const std::string &color_mode);
   virtual DisplayError GetColorModeCount(uint32_t *mode_count);
   virtual DisplayError GetColorModes(uint32_t *mode_count, std::vector<std::string> *color_modes);
diff --git a/sdm/libs/core/drm/hw_device_drm.cpp b/sdm/libs/core/drm/hw_device_drm.cpp
index aa6d28c..2d9a8c8 100644
--- a/sdm/libs/core/drm/hw_device_drm.cpp
+++ b/sdm/libs/core/drm/hw_device_drm.cpp
@@ -833,6 +833,18 @@
     return kErrorParameters;
   }
 
+  drmModeModeInfo to_set = connector_info_.modes[index].mode;
+  uint64_t current_bit_clk = connector_info_.modes[current_mode_index_].bit_clk_rate;
+  for (uint32_t mode_index = 0; mode_index < connector_info_.modes.size(); mode_index++) {
+    if ((to_set.vdisplay == connector_info_.modes[mode_index].mode.vdisplay) &&
+        (to_set.hdisplay == connector_info_.modes[mode_index].mode.hdisplay) &&
+        (to_set.vrefresh == connector_info_.modes[mode_index].mode.vrefresh) &&
+        (current_bit_clk == connector_info_.modes[mode_index].bit_clk_rate)) {
+      index = mode_index;
+      break;
+    }
+  }
+
   current_mode_index_ = index;
   PopulateHWPanelInfo();
   UpdateMixerAttributes();
diff --git a/sdm/libs/hwc2/display_null.h b/sdm/libs/hwc2/display_null.h
index 1d54f65..7d31c6b 100644
--- a/sdm/libs/hwc2/display_null.h
+++ b/sdm/libs/hwc2/display_null.h
@@ -89,7 +89,6 @@
   MAKE_NO_OP(GetColorModeName(int32_t, string *))
   MAKE_NO_OP(SetColorTransform(const uint32_t, const double *))
   MAKE_NO_OP(GetDefaultColorMode(string *))
-  MAKE_NO_OP(ApplyDefaultDisplayMode())
   MAKE_NO_OP(SetCursorPosition(int, int))
   MAKE_NO_OP(SetRefreshRate(uint32_t, bool))
   MAKE_NO_OP(GetPanelBrightness(int *))
@@ -113,7 +112,7 @@
  protected:
   DisplayConfigVariableInfo default_variable_config_ = {};
   DisplayConfigFixedInfo default_fixed_config_ = {};
-  // 1920x1080 60fps panel of name Null Display with PnPID QCM for Qualcomm
+  // 1920x1080 60fps panel of name Null Display with PnPID QCM
   // Contains many 'don't-care' fields and valid checksum bytes
   const vector<uint8_t> edid_{
     0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x44, 0x6D, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
diff --git a/sdm/libs/hwc2/hwc_display.cpp b/sdm/libs/hwc2/hwc_display.cpp
index a118c32..8c88a1c 100644
--- a/sdm/libs/hwc2/hwc_display.cpp
+++ b/sdm/libs/hwc2/hwc_display.cpp
@@ -183,6 +183,10 @@
   std::string mode_string = preferred_mode_[current_color_mode_][curr_dynamic_range_];
   if (mode_string.empty()) {
     mode_string = color_mode_map_[current_color_mode_][current_render_intent_][curr_dynamic_range_];
+    if (mode_string.empty() && hdr_present) {
+      // Use the colorimetric HDR mode, if an HDR mode with the current render intent is not present
+      mode_string = color_mode_map_[current_color_mode_][RenderIntent::COLORIMETRIC][kHdrType];
+    }
     if (mode_string.empty() &&
       current_color_mode_ == ColorMode::DISPLAY_P3 &&
       curr_dynamic_range_ == kHdrType) {
@@ -407,40 +411,6 @@
   }
 }
 
-HWC2::Error HWCColorMode::ApplyDefaultColorMode() {
-  auto color_mode = ColorMode::NATIVE;
-  if (color_mode_map_.size() == 1U) {
-    color_mode = color_mode_map_.begin()->first;
-  } else if (color_mode_map_.size() > 1U) {
-    std::string default_color_mode;
-    bool found = false;
-    DisplayError error = display_intf_->GetDefaultColorMode(&default_color_mode);
-    if (error == kErrorNone) {
-      // get the default mode corresponding android_color_mode_t
-      for (auto &it_mode : color_mode_map_) {
-        for (auto &it : it_mode.second) {
-          for (auto &it_range : it.second) {
-            if (it_range.second == default_color_mode) {
-              found = true;
-              break;
-            }
-          }
-        }
-        if (found) {
-          color_mode = it_mode.first;
-          break;
-        }
-      }
-    }
-
-    // return the first color mode we encounter if not found
-    if (!found) {
-      color_mode = color_mode_map_.begin()->first;
-    }
-  }
-  return SetColorModeWithRenderIntent(color_mode, RenderIntent::COLORIMETRIC);
-}
-
 void HWCColorMode::Dump(std::ostringstream* os) {
   *os << "color modes supported: \n";
   for (auto it : color_mode_map_) {
@@ -2122,7 +2092,6 @@
 
   validated_ = false;
   display_intf_->SetActiveConfig(config);
-  callbacks_->Refresh(id_);
 
   return 0;
 }
diff --git a/sdm/libs/hwc2/hwc_display.h b/sdm/libs/hwc2/hwc_display.h
index 53eccae..b1951ef 100644
--- a/sdm/libs/hwc2/hwc_display.h
+++ b/sdm/libs/hwc2/hwc_display.h
@@ -94,7 +94,6 @@
       output_matrix[i] = static_cast<double>(input_matrix[i]);
     }
   }
-  HWC2::Error ApplyDefaultColorMode();
   HWC2::Error ValidateColorModeWithRenderIntent(ColorMode mode, RenderIntent intent);
   HWC2::Error SetPreferredColorModeInternal(const std::string &mode_string, bool from_client,
     ColorMode *color_mode, DynamicRangeType *dynamic_range);
diff --git a/sdm/libs/hwc2/hwc_display_builtin.h b/sdm/libs/hwc2/hwc_display_builtin.h
index 2cca040..0b5cd99 100644
--- a/sdm/libs/hwc2/hwc_display_builtin.h
+++ b/sdm/libs/hwc2/hwc_display_builtin.h
@@ -102,7 +102,6 @@
   void SetMetaDataRefreshRateFlag(bool enable);
   virtual DisplayError SetDisplayMode(uint32_t mode);
   virtual DisplayError DisablePartialUpdateOneFrame();
-  void ProcessBootAnimCompleted(void);
   void SetQDCMSolidFillInfo(bool enable, const LayerSolidFill &color);
   void ToggleCPUHint(bool set);
   void ForceRefreshRate(uint32_t refresh_rate);
diff --git a/sdm/libs/hwc2/hwc_session.cpp b/sdm/libs/hwc2/hwc_session.cpp
index 83afed5..1c1ea99 100644
--- a/sdm/libs/hwc2/hwc_session.cpp
+++ b/sdm/libs/hwc2/hwc_session.cpp
@@ -341,6 +341,9 @@
   for (auto &map_info : map_info_virtual_) {
     map_info.client_id = base_id++;
   }
+
+  // resize HDR supported map to total number of displays.
+  is_hdr_display_.resize(UINT32(base_id));
 }
 
 int HWCSession::GetDisplayIndex(int dpy) {
@@ -1206,6 +1209,10 @@
     case HWC2::FunctionDescriptor::GetDisplayIdentificationData:
       return AsFP<HWC2_PFN_GET_DISPLAY_IDENTIFICATION_DATA>
              (HWCSession::GetDisplayIdentificationData);
+    case HWC2::FunctionDescriptor::GetDisplayCapabilities:
+      return AsFP<HWC2_PFN_GET_DISPLAY_CAPABILITIES>(HWCSession::GetDisplayCapabilities);
+    case HWC2::FunctionDescriptor::GetDisplayBrightnessSupport:
+      return AsFP<HWC2_PFN_GET_DISPLAY_BRIGHTNESS_SUPPORT>(HWCSession::GetDisplayBrightnessSupport);
     default:
       DLOGD("Unknown/Unimplemented function descriptor: %d (%s)", int_descriptor,
             to_string(descriptor).c_str());
@@ -1275,6 +1282,7 @@
           return HWC2::Error::NoResources;
         }
 
+        is_hdr_display_[UINT32(client_id)] = HasHDRSupport(hwc_display);
         DLOGI("Created virtual display id:% " PRIu64 " with res: %dx%d", client_id, width, height);
 
         *out_display_id = client_id;
@@ -2419,6 +2427,7 @@
     }
 
     if (!status) {
+      is_hdr_display_[UINT32(client_id)] = HasHDRSupport(*hwc_display);
       DLOGI("Primary display created.");
       map_info_primary_.disp_type = info.display_type;
       map_info_primary_.sdm_id = info.display_id;
@@ -2478,6 +2487,7 @@
           DLOGE("Builtin display creation failed.");
           break;
         }
+        is_hdr_display_[UINT32(client_id)] = HasHDRSupport(hwc_display_[client_id]);
         DLOGI("Builtin display created: sdm id = %d, client id = %d", info.display_id, client_id);
         map_info.disp_type = info.display_type;
         map_info.sdm_id = info.display_id;
@@ -2627,6 +2637,7 @@
           break;
         }
 
+        is_hdr_display_[UINT32(client_id)] = HasHDRSupport(hwc_display);
         DLOGI("Created pluggable display successfully: sdm id = %d, client id = %d",
               info.display_id, client_id);
       }
@@ -2673,6 +2684,21 @@
   return status;
 }
 
+bool HWCSession::HasHDRSupport(HWCDisplay *hwc_display) {
+  // query number of hdr types
+  uint32_t out_num_types = 0;
+  float out_max_luminance = 0.0f;
+  float out_max_average_luminance = 0.0f;
+  float out_min_luminance = 0.0f;
+  if (hwc_display->GetHdrCapabilities(&out_num_types, nullptr, &out_max_luminance,
+                                      &out_max_average_luminance, &out_min_luminance)
+                                      != HWC2::Error::None) {
+    return false;
+  }
+
+  return (out_num_types > 0);
+}
+
 int HWCSession::HandleDisconnectedDisplays(HWDisplaysInfo *hw_displays_info) {
   // Destroy pluggable displays which were connected earlier but got disconnected now.
   for (auto &map_info : map_info_pluggable_) {
@@ -2730,6 +2756,7 @@
     DLOGI("Destroy display %d-%d, client id = %d", map_info->sdm_id, map_info->disp_type,
          client_id);
 
+    is_hdr_display_[UINT32(client_id)] = false;
     if (!map_info->test_pattern) {
       HWCDisplayPluggable::Destroy(hwc_display);
     } else {
@@ -2751,6 +2778,7 @@
   }
   DLOGI("Destroy display %d-%d, client id = %d", map_info->sdm_id, map_info->disp_type,
         client_id);
+  is_hdr_display_[UINT32(client_id)] = false;
   switch (map_info->disp_type) {
     case kBuiltIn:
       HWCDisplayBuiltIn::Destroy(hwc_display);
@@ -3062,6 +3090,63 @@
                              outDataSize, outData);
 }
 
+int32_t HWCSession::GetDisplayCapabilities(hwc2_device_t *device, hwc2_display_t display,
+                                           uint32_t *outNumCapabilities,
+                                           uint32_t *outCapabilities) {
+  if (!outNumCapabilities || !device) {
+    return HWC2_ERROR_BAD_PARAMETER;
+  }
+
+  if (display >= HWCCallbacks::kNumDisplays) {
+    return HWC2_ERROR_BAD_DISPLAY;
+  }
+
+  HWCSession *hwc_session = static_cast<HWCSession *>(device);
+  HWCDisplay *hwc_display = hwc_session->hwc_display_[display];
+  if (!hwc_display) {
+    DLOGE("Expected valid hwc_display");
+    return HWC2_ERROR_BAD_PARAMETER;
+  }
+  bool isBuiltin = (hwc_display->GetDisplayClass() == DISPLAY_CLASS_BUILTIN);
+  if (!outCapabilities) {
+    *outNumCapabilities = 0;
+    if (isBuiltin) {
+      *outNumCapabilities = 2;
+    }
+    return HWC2_ERROR_NONE;
+  } else {
+    if (isBuiltin) {
+      // TODO(user): Handle SKIP_CLIENT_COLOR_TRANSFORM based on DSPP availability
+      outCapabilities[0] = HWC2_DISPLAY_CAPABILITY_SKIP_CLIENT_COLOR_TRANSFORM;
+      outCapabilities[1] = HWC2_DISPLAY_CAPABILITY_DOZE;
+      *outNumCapabilities = 2;
+    }
+    return HWC2_ERROR_NONE;
+  }
+}
+
+int32_t HWCSession::GetDisplayBrightnessSupport(hwc2_device_t *device, hwc2_display_t display,
+                                                bool *outSupport) {
+  if (!device || !outSupport) {
+    return HWC2_ERROR_BAD_PARAMETER;
+  }
+
+  if (display >= HWCCallbacks::kNumDisplays) {
+    return HWC2_ERROR_BAD_DISPLAY;
+  }
+
+  HWCSession *hwc_session = static_cast<HWCSession *>(device);
+  HWCDisplay *hwc_display = hwc_session->hwc_display_[display];
+  if (!hwc_display) {
+    DLOGE("Expected valid hwc_display");
+    return HWC2_ERROR_BAD_PARAMETER;
+  }
+  // This function isn't actually used in the framework
+  // The capability is used instead
+  *outSupport = false;
+  return HWC2_ERROR_NONE;
+}
+
 android::status_t HWCSession::SetQSyncMode(const android::Parcel *input_parcel) {
   auto mode = input_parcel->readInt32();
   auto device = static_cast<hwc2_device_t *>(this);
diff --git a/sdm/libs/hwc2/hwc_session.h b/sdm/libs/hwc2/hwc_session.h
index c82cc12..1d546cc 100644
--- a/sdm/libs/hwc2/hwc_session.h
+++ b/sdm/libs/hwc2/hwc_session.h
@@ -218,6 +218,10 @@
   static int32_t GetDisplayIdentificationData(hwc2_device_t *device, hwc2_display_t display,
                                               uint8_t *outPort, uint32_t *outDataSize,
                                               uint8_t *outData);
+  static int32_t GetDisplayCapabilities(hwc2_device_t *device, hwc2_display_t display,
+                                        uint32_t *outNumCapabilities, uint32_t *outCapabilities);
+  static int32_t GetDisplayBrightnessSupport(hwc2_device_t *device, hwc2_display_t display,
+                                             bool *outSupport);
 
   // HWCDisplayEventHandler
   virtual void DisplayPowerReset();
@@ -279,6 +283,7 @@
   int32_t MinHdcpEncryptionLevelChanged(int disp_id, uint32_t min_enc_level);
   int32_t IsWbUbwcSupported(int *value);
   int32_t SetDynamicDSIClock(int64_t disp_id, uint32_t bitrate);
+  bool HasHDRSupport(HWCDisplay *hwc_display);
 
   // service methods
   void StartServices();
@@ -404,6 +409,7 @@
   std::vector<DisplayMapInfo> map_info_builtin_;    // Builtin displays excluding primary
   std::vector<DisplayMapInfo> map_info_pluggable_;  // Pluggable displays excluding primary
   std::vector<DisplayMapInfo> map_info_virtual_;    // Virtual displays
+  std::vector<bool> is_hdr_display_;    // info on HDR supported
   bool reset_panel_ = false;
   bool client_connected_ = false;
   bool new_bw_mode_ = false;
diff --git a/sdm/libs/hwc2/hwc_session_services.cpp b/sdm/libs/hwc2/hwc_session_services.cpp
index a1eec83..2a8d631 100644
--- a/sdm/libs/hwc2/hwc_session_services.cpp
+++ b/sdm/libs/hwc2/hwc_session_services.cpp
@@ -675,25 +675,11 @@
 }
 
 Return<bool> HWCSession::isHDRSupported(uint32_t disp_id) {
-  SCOPE_LOCK(locker_[disp_id]);
-  HWCDisplay *hwc_display = hwc_display_[disp_id];
-  if (!hwc_display) {
-    DLOGW("Display = %d is not connected.", disp_id);
+  if (disp_id < 0 || disp_id >= HWCCallbacks::kNumDisplays) {
+    DLOGE("Not valid display");
     return false;
   }
-
-  // query number of hdr types
-  uint32_t out_num_types = 0;
-  float out_max_luminance = 0.0f;
-  float out_max_average_luminance = 0.0f;
-  float out_min_luminance = 0.0f;
-  if (hwc_display->GetHdrCapabilities(&out_num_types, nullptr, &out_max_luminance,
-                                      &out_max_average_luminance, &out_min_luminance)
-                                      != HWC2::Error::None) {
-    return false;
-  }
-
-  return (out_num_types > 0);
+  return static_cast<bool>(is_hdr_display_[disp_id]);
 }
 
 Return<bool> HWCSession::isWCGSupported(uint32_t disp_id) {