Merge "sdm: Remove duplicate bit clock rates."
diff --git a/composer/display_null.h b/composer/display_null.h
index 7222faa..bcc8dbb 100644
--- a/composer/display_null.h
+++ b/composer/display_null.h
@@ -64,6 +64,7 @@
   virtual string Dump() { return ""; }
   virtual bool IsSupportSsppTonemap() { return false; }
   virtual bool CanSkipValidate() { return true; }
+  virtual bool GameEnhanceSupported() { return false; }
 
   MAKE_NO_OP(TeardownConcurrentWriteback(void))
   MAKE_NO_OP(Commit(LayerStack *))
diff --git a/composer/hwc_display.cpp b/composer/hwc_display.cpp
index 94bce1f..be7e039 100644
--- a/composer/hwc_display.cpp
+++ b/composer/hwc_display.cpp
@@ -525,7 +525,9 @@
   HWCDebugHandler::Get()->GetProperty(DISABLE_FAST_PATH, &disable_fast_path);
   fast_path_enabled_ = !(disable_fast_path == 1);
 
-  DLOGI("Display created with id: %d", id_);
+  game_supported_ = display_intf_->GameEnhanceSupported();
+
+  DLOGI("Display created with id: %d, game_supported_: %d", id_, game_supported_);
 
   return 0;
 }
@@ -785,7 +787,7 @@
       layer->update_mask.set(kClientCompRequest);
     }
 
-    if (hwc_layer->GetType() == kLayerGame) {
+    if (game_supported_ && (hwc_layer->GetType() == kLayerGame)) {
       layer->flags.is_game = true;
       layer->input_buffer.flags.game = true;
     }
diff --git a/composer/hwc_display.h b/composer/hwc_display.h
index 6323847..fa09cfa 100644
--- a/composer/hwc_display.h
+++ b/composer/hwc_display.h
@@ -482,6 +482,7 @@
   int fbt_release_fence_ = -1;
   int release_fence_ = -1;
   hwc2_config_t pending_config_index_ = 0;
+  bool game_supported_ = false;
 };
 
 inline int HWCDisplay::Perform(uint32_t operation, ...) {
diff --git a/composer/hwc_session.cpp b/composer/hwc_session.cpp
index 82836ce..b91d229 100644
--- a/composer/hwc_session.cpp
+++ b/composer/hwc_session.cpp
@@ -495,6 +495,21 @@
   return HWC2_ERROR_NONE;
 }
 
+int32_t HWCSession::GetVirtualDisplayId() {
+  HWDisplaysInfo hw_displays_info = {};
+  core_intf_->GetDisplaysStatus(&hw_displays_info);
+  for (auto &iter : hw_displays_info) {
+    auto &info = iter.second;
+    if (info.display_type != kVirtual) {
+      continue;
+    }
+
+    return info.display_id;
+  }
+
+  return -1;
+}
+
 void HWCSession::Dump(uint32_t *out_size, char *out_buffer) {
   if (!out_size) {
     return;
@@ -518,7 +533,7 @@
 }
 
 uint32_t HWCSession::GetMaxVirtualDisplayCount() {
-  return 1;
+  return map_info_virtual_.size();
 }
 
 int32_t HWCSession::GetActiveConfig(hwc2_display_t display, hwc2_config_t *out_config) {
@@ -1125,50 +1140,37 @@
     }
   }
 
-  HWDisplaysInfo hw_displays_info = {};
-  DisplayError error = core_intf_->GetDisplaysStatus(&hw_displays_info);
-  if (error != kErrorNone) {
-    DLOGE("Failed to get connected display list. Error = %d", error);
-    return HWC2::Error::BadDisplay;
-  }
-
   // Lock confined to this scope
   int status = -EINVAL;
-  for (auto &iter : hw_displays_info) {
-    auto &info = iter.second;
-    if (info.display_type != kVirtual) {
-      continue;
-    }
-
-    for (auto &map_info : map_info_virtual_) {
-      client_id = map_info.client_id;
-      {
-        SCOPE_LOCK(locker_[client_id]);
-        auto &hwc_display = hwc_display_[client_id];
-        if (hwc_display) {
-          continue;
-        }
-
-        status = virtual_display_factory_.Create(core_intf_, &buffer_allocator_, &callbacks_,
-                                                 client_id, info.display_id, width, height,
-                                                 format, set_min_lum_, set_max_lum_, &hwc_display);
-        // TODO(user): validate width and height support
-        if (status) {
-          return HWC2::Error::NoResources;
-        }
-
-        {
-          SCOPE_LOCK(hdr_locker_[client_id]);
-          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;
-        map_info.disp_type = info.display_type;
-        map_info.sdm_id = info.display_id;
-        break;
+  for (auto &map_info : map_info_virtual_) {
+    client_id = map_info.client_id;
+    {
+      SCOPE_LOCK(locker_[client_id]);
+      auto &hwc_display = hwc_display_[client_id];
+      if (hwc_display) {
+        continue;
       }
+
+      int32_t display_id = GetVirtualDisplayId();
+      status = virtual_display_factory_.Create(core_intf_, &buffer_allocator_, &callbacks_,
+                                               client_id, display_id, width, height,
+                                               format, set_min_lum_, set_max_lum_, &hwc_display);
+      // TODO(user): validate width and height support
+      if (status) {
+        return HWC2::Error::NoResources;
+      }
+
+      {
+        SCOPE_LOCK(hdr_locker_[client_id]);
+        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;
+      map_info.disp_type = kVirtual;
+      map_info.sdm_id = display_id;
+      break;
     }
   }
 
diff --git a/composer/hwc_session.h b/composer/hwc_session.h
index aabf77a..0bfa281 100644
--- a/composer/hwc_session.h
+++ b/composer/hwc_session.h
@@ -459,6 +459,7 @@
   hwc2_display_t GetActiveBuiltinDisplay();
   void HandlePendingRefresh();
   void NotifyClientStatus(bool connected);
+  int32_t GetVirtualDisplayId();
 
   CoreInterface *core_intf_ = nullptr;
   HWCDisplay *hwc_display_[HWCCallbacks::kNumDisplays] = {nullptr};
diff --git a/config/display-product.mk b/config/display-product.mk
index 6d661ca..5ede20e 100644
--- a/config/display-product.mk
+++ b/config/display-product.mk
@@ -68,13 +68,21 @@
     debug.mdpcomp.logs=0 \
     vendor.gralloc.disable_ubwc=0 \
     vendor.display.disable_scaler=0 \
-    vendor.display.disable_offline_rotator=1 \
     vendor.display.disable_excl_rect=0 \
     vendor.display.comp_mask=0 \
     vendor.display.enable_posted_start_dyn=1 \
     vendor.display.enable_optimize_refresh=1 \
     vendor.display.use_smooth_motion=1
 
+# Enable offline rotator for Bengal.
+ifneq ($(TARGET_BOARD_PLATFORM),bengal)
+PRODUCT_PROPERTY_OVERRIDES += \
+    vendor.display.disable_offline_rotator=1
+else
+PRODUCT_PROPERTY_OVERRIDES += \
+    vendor.display.disable_rotator_ubwc=1
+endif
+
 ifeq ($(TARGET_BOARD_PLATFORM),kona)
 PRODUCT_PROPERTY_OVERRIDES += \
     debug.sf.enable_gl_backpressure=1 \
diff --git a/sdm/include/core/display_interface.h b/sdm/include/core/display_interface.h
index c1dc190..db9d961 100644
--- a/sdm/include/core/display_interface.h
+++ b/sdm/include/core/display_interface.h
@@ -903,12 +903,19 @@
     @return \link DisplayError \endlink
   */
   virtual DisplayError SetBLScale(uint32_t level) = 0;
+
   /*! @brief Method to check if the Default resources are freed for display
 
     @return \link bool \endlink
   */
   virtual bool CheckResourceState() = 0;
 
+  /*! @brief Method to check if game enhance feature is supported for display
+
+    @return \link bool \endlink
+  */
+  virtual bool GameEnhanceSupported() = 0;
+
  protected:
   virtual ~DisplayInterface() { }
 };
diff --git a/sdm/include/private/color_interface.h b/sdm/include/private/color_interface.h
index 46d1715..b3a744f 100644
--- a/sdm/include/private/color_interface.h
+++ b/sdm/include/private/color_interface.h
@@ -99,6 +99,7 @@
   virtual DisplayError ColorIntfConvertToPPFeature(PPFeaturesConfig *out_features,
                                                   uint32_t disp_id, bool enable,
                                                   const std::string &hw_asset, void *in_data) = 0;
+  virtual DisplayError ColorIntfGameEnhancementSupported(bool *supported) = 0;
 
  protected:
   virtual ~ColorInterface() {}
diff --git a/sdm/libs/core/color_manager.cpp b/sdm/libs/core/color_manager.cpp
index b9a33e8..671fdea 100644
--- a/sdm/libs/core/color_manager.cpp
+++ b/sdm/libs/core/color_manager.cpp
@@ -490,6 +490,16 @@
   return support_stc_tonemap_;
 }
 
+bool ColorManagerProxy::GameEnhanceSupported() {
+  bool supported = false;
+
+  if (color_intf_) {
+    color_intf_->ColorIntfGameEnhancementSupported(&supported);
+  }
+
+  return supported;
+}
+
 DisplayError ColorManagerProxy::ConvertToPPFeatures(HwConfigOutputParams *params,
                                                     PPFeaturesConfig *out_data) {
   if (!params || !out_data) {
diff --git a/sdm/libs/core/color_manager.h b/sdm/libs/core/color_manager.h
index c8f47e9..c8464ad 100644
--- a/sdm/libs/core/color_manager.h
+++ b/sdm/libs/core/color_manager.h
@@ -152,6 +152,7 @@
                                                uint32_t intent);
   DisplayError Validate(HWLayers *hw_layers);
   bool IsSupportStcTonemap();
+  bool GameEnhanceSupported();
 
  protected:
   ColorManagerProxy() {}
diff --git a/sdm/libs/core/display_base.cpp b/sdm/libs/core/display_base.cpp
index 8f60f08..f9d33db 100644
--- a/sdm/libs/core/display_base.cpp
+++ b/sdm/libs/core/display_base.cpp
@@ -438,6 +438,7 @@
     return error;
   }
 
+  comp_manager_->SetSafeMode(false);
 
   DLOGI_IF(kTagDisplay, "Exiting commit for display: %d-%d", display_id_, display_type_);
 
@@ -2062,4 +2063,11 @@
   return comp_manager_->CheckResourceState(display_comp_ctx_);
 }
 
+bool DisplayBase::GameEnhanceSupported() {
+  if (color_mgr_) {
+    return color_mgr_->GameEnhanceSupported();
+  }
+  return false;
+}
+
 }  // namespace sdm
diff --git a/sdm/libs/core/display_base.h b/sdm/libs/core/display_base.h
index 00d1799..691d2b4 100644
--- a/sdm/libs/core/display_base.h
+++ b/sdm/libs/core/display_base.h
@@ -160,6 +160,7 @@
   virtual bool CanSkipValidate();
   virtual DisplayError SetBLScale(uint32_t level) { return kErrorNotSupported; }
   virtual bool CheckResourceState();
+  virtual bool GameEnhanceSupported();
 
  protected:
   const char *kBt2020Pq = "bt2020_pq";
diff --git a/sdm/libs/core/display_builtin.cpp b/sdm/libs/core/display_builtin.cpp
index 7228049..076e2ef 100644
--- a/sdm/libs/core/display_builtin.cpp
+++ b/sdm/libs/core/display_builtin.cpp
@@ -626,7 +626,7 @@
       }
       ret = dpps_pu_lock_.WaitFinite(kPuTimeOutMs);
       if (ret) {
-        DLOGE("failed to %s partial update ret %d", ((enable) ? "enable" : "disable"), ret);
+        DLOGW("failed to %s partial update ret %d", ((enable) ? "enable" : "disable"), ret);
         error = kErrorTimeOut;
       }
       break;
diff --git a/sdm/libs/core/drm/hw_events_drm.cpp b/sdm/libs/core/drm/hw_events_drm.cpp
index 25bad21..16a7249 100644
--- a/sdm/libs/core/drm/hw_events_drm.cpp
+++ b/sdm/libs/core/drm/hw_events_drm.cpp
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+* Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
@@ -332,6 +332,11 @@
   prctl(PR_SET_NAME, event_thread_name_.c_str(), 0, 0, 0);
   setpriority(PRIO_PROCESS, 0, kThreadPriorityUrgent);
 
+  // Real Time task with lowest priority.
+  struct sched_param param = {0};
+  param.sched_priority = sched_get_priority_min(SCHED_FIFO);
+  sched_setscheduler(0, SCHED_FIFO, &param);
+
   while (!exit_threads_) {
     int error = Sys::poll_(poll_fds_.data(), UINT32(poll_fds_.size()), -1);
     if (error <= 0) {