SDM: Set safemode on resume.
Display Resources are purged on suspend.
Safemode needs to be triggered on resume in the
presence of multiple displays.
CRs-Fixed: 1078534
Change-Id: I4b748b51bc5e2b4110aa37348a16bece566372b2
diff --git a/sdm/libs/core/comp_manager.cpp b/sdm/libs/core/comp_manager.cpp
index be5cb75..0592ba4 100644
--- a/sdm/libs/core/comp_manager.cpp
+++ b/sdm/libs/core/comp_manager.cpp
@@ -1,5 +1,5 @@
/*
-* Copyright (c) 2014 - 2016, The Linux Foundation. All rights reserved.
+* Copyright (c) 2014 - 2017, 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 met:
@@ -548,4 +548,29 @@
return kErrorNone;
}
+bool CompManager::SetDisplayState(Handle display_ctx,
+ DisplayState state, DisplayType display_type) {
+ display_state_[display_type] = state;
+
+ switch (state) {
+ case kStateOff:
+ Purge(display_ctx);
+ configured_displays_.reset(display_type);
+ DLOGV_IF(kTagCompManager, "configured_displays_ = 0x%x", configured_displays_);
+ break;
+
+ case kStateOn:
+ if (registered_displays_.count() > 1) {
+ safe_mode_ = true;
+ DLOGV_IF(kTagCompManager, "safe_mode = %d", safe_mode_);
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return true;
+}
+
} // namespace sdm
diff --git a/sdm/libs/core/comp_manager.h b/sdm/libs/core/comp_manager.h
index 2bcc6b9..f0044ec 100644
--- a/sdm/libs/core/comp_manager.h
+++ b/sdm/libs/core/comp_manager.h
@@ -1,5 +1,5 @@
/*
-* Copyright (c) 2014 - 2016, The Linux Foundation. All rights reserved.
+* Copyright (c) 2014 - 2017, 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 met:
@@ -67,6 +67,7 @@
DisplayError ValidateCursorPosition(Handle display_ctx, HWLayers *hw_layers, int x, int y);
bool SupportLayerAsCursor(Handle display_ctx, HWLayers *hw_layers);
bool CanSetIdleTimeout(Handle display_ctx);
+ bool SetDisplayState(Handle display_ctx, DisplayState state, DisplayType display_type);
DisplayError SetMaxBandwidthMode(HWBwModes mode);
DisplayError GetScaleLutConfig(HWScaleLutInfo *lut_info);
DisplayError SetDetailEnhancerData(Handle display_ctx, const DisplayDetailEnhancerData &de_data);
@@ -104,6 +105,7 @@
ResourceInterface *resource_intf_ = NULL;
std::bitset<kDisplayMax> registered_displays_; // Bit mask of registered displays
std::bitset<kDisplayMax> configured_displays_; // Bit mask of sucessfully configured displays
+ uint32_t display_state_[kDisplayMax] = {};
bool safe_mode_ = false; // Flag to notify all displays to be in resource crunch
// mode, where strategy manager chooses the best strategy
// that uses optimal number of pipes for each display
diff --git a/sdm/libs/core/display_base.cpp b/sdm/libs/core/display_base.cpp
index 025c583..31c852e 100644
--- a/sdm/libs/core/display_base.cpp
+++ b/sdm/libs/core/display_base.cpp
@@ -1,5 +1,5 @@
/*
-* Copyright (c) 2014 - 2016, The Linux Foundation. All rights reserved.
+* Copyright (c) 2014 - 2017, 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 met:
@@ -415,7 +415,6 @@
hw_layers_.info.hw_layers.clear();
error = hw_intf_->Flush();
if (error == kErrorNone) {
- comp_manager_->Purge(display_comp_ctx_);
error = hw_intf_->PowerOff();
}
break;
@@ -456,6 +455,7 @@
if (error == kErrorNone) {
active_ = active;
state_ = state;
+ comp_manager_->SetDisplayState(display_comp_ctx_, state, display_type_);
}
return error;