hwc2: add support to enforce pipe split for built-in display
Add support to enforce pipe split when there is only one
built-in display connected when the panel fps is above 60.
This is needed to keep MDP clock down for high fps
use-cases.
Change-Id: Ie8cdd8eb45df98684d04ac8c96552fa33484d93b
CRs-Fixed: 2512607
diff --git a/include/display_properties.h b/include/display_properties.h
index a5c1378..5096591 100644
--- a/include/display_properties.h
+++ b/include/display_properties.h
@@ -128,5 +128,6 @@
#define ENABLE_ASYNC_POWERMODE DISPLAY_PROP("enable_async_powermode")
#define DISABLE_UI_3D_TONEMAP DISPLAY_PROP("disable_ui_3d_tonemap")
#define DISABLE_PARALLEL_CACHE DISPLAY_PROP("disable_parallel_cache")
+#define ENABLE_FORCE_SPLIT DISPLAY_PROP("enable_force_split")
#endif // __DISPLAY_PROPERTIES_H__
diff --git a/sdm/include/private/resource_interface.h b/sdm/include/private/resource_interface.h
index 03a797b..338af95 100644
--- a/sdm/include/private/resource_interface.h
+++ b/sdm/include/private/resource_interface.h
@@ -38,6 +38,7 @@
kCmdDisableRotatorOneFrame,
kCmdSetDisplayState,
kCmdUpdateSyncHandle,
+ kCmdCheckEnforceSplit,
kCmdMax,
};
diff --git a/sdm/libs/core/comp_manager.cpp b/sdm/libs/core/comp_manager.cpp
index fa15c9f..5f6db7e 100644
--- a/sdm/libs/core/comp_manager.cpp
+++ b/sdm/libs/core/comp_manager.cpp
@@ -186,6 +186,18 @@
return kErrorNone;
}
+DisplayError CompManager::CheckEnforceSplit(Handle comp_handle,
+ uint32_t new_refresh_rate) {
+ SCOPE_LOCK(locker_);
+ DisplayError error = kErrorNone;
+ DisplayCompositionContext *display_comp_ctx =
+ reinterpret_cast<DisplayCompositionContext *>(comp_handle);
+
+ error = resource_intf_->Perform(ResourceInterface::kCmdCheckEnforceSplit,
+ display_comp_ctx->display_resource_ctx, new_refresh_rate);
+ return error;
+}
+
DisplayError CompManager::ReconfigureDisplay(Handle comp_handle,
const HWDisplayAttributes &display_attributes,
const HWPanelInfo &hw_panel_info,
@@ -211,6 +223,12 @@
return error;
}
+ error = resource_intf_->Perform(ResourceInterface::kCmdCheckEnforceSplit,
+ display_comp_ctx->display_resource_ctx, display_attributes.fps);
+ if (error != kErrorNone) {
+ return error;
+ }
+
if (display_comp_ctx->strategy) {
error = display_comp_ctx->strategy->Reconfigure(hw_panel_info, display_attributes,
mixer_attributes, fb_config);
diff --git a/sdm/libs/core/comp_manager.h b/sdm/libs/core/comp_manager.h
index 30b100f..86117c5 100644
--- a/sdm/libs/core/comp_manager.h
+++ b/sdm/libs/core/comp_manager.h
@@ -86,6 +86,7 @@
bool IsSafeMode() { return safe_mode_; }
void GenerateROI(Handle display_ctx, HWLayers *hw_layers);
bool CanSkipValidate(Handle display_ctx);
+ DisplayError CheckEnforceSplit(Handle comp_handle, uint32_t new_refresh_rate);
private:
static const int kMaxThermalLevel = 3;
diff --git a/sdm/libs/core/display_builtin.cpp b/sdm/libs/core/display_builtin.cpp
index 153b018..14adcd1 100644
--- a/sdm/libs/core/display_builtin.cpp
+++ b/sdm/libs/core/display_builtin.cpp
@@ -335,6 +335,11 @@
handle_idle_timeout_ = false;
return error;
}
+
+ error = comp_manager_->CheckEnforceSplit(display_comp_ctx_, refresh_rate);
+ if (error != kErrorNone) {
+ return error;
+ }
}
// On success, set current refresh rate to new refresh rate