diff options
Diffstat (limited to 'sdm/libs')
-rw-r--r-- | sdm/libs/core/comp_manager.cpp | 24 | ||||
-rw-r--r-- | sdm/libs/core/comp_manager.h | 2 | ||||
-rw-r--r-- | sdm/libs/core/display_base.h | 4 | ||||
-rw-r--r-- | sdm/libs/core/display_primary.cpp | 89 | ||||
-rw-r--r-- | sdm/libs/core/display_primary.h | 3 | ||||
-rw-r--r-- | sdm/libs/core/strategy.cpp | 7 | ||||
-rw-r--r-- | sdm/libs/core/strategy.h | 3 | ||||
-rw-r--r-- | sdm/libs/utils/debug.cpp | 12 |
8 files changed, 75 insertions, 69 deletions
diff --git a/sdm/libs/core/comp_manager.cpp b/sdm/libs/core/comp_manager.cpp index b070c41e..7a9c2930 100644 --- a/sdm/libs/core/comp_manager.cpp +++ b/sdm/libs/core/comp_manager.cpp @@ -397,6 +397,15 @@ void CompManager::Purge(Handle display_ctx) { display_comp_ctx->strategy->Purge(); } +DisplayError CompManager::SetIdleTimeoutMs(Handle display_ctx, uint32_t active_ms) { + SCOPE_LOCK(locker_); + + DisplayCompositionContext *display_comp_ctx = + reinterpret_cast<DisplayCompositionContext *>(display_ctx); + + return display_comp_ctx->strategy->SetIdleTimeoutMs(active_ms); +} + void CompManager::ProcessIdleTimeout(Handle display_ctx) { SCOPE_LOCK(locker_); @@ -506,21 +515,6 @@ DisplayError CompManager::SetMaxBandwidthMode(HWBwModes mode) { return resource_intf_->SetMaxBandwidthMode(mode); } -bool CompManager::CanSetIdleTimeout(Handle display_ctx) { - DisplayCompositionContext *display_comp_ctx = - reinterpret_cast<DisplayCompositionContext *>(display_ctx); - - if (!display_comp_ctx) { - return false; - } - - if (!display_comp_ctx->idle_fallback) { - return true; - } - - return false; -} - DisplayError CompManager::GetScaleLutConfig(HWScaleLutInfo *lut_info) { return resource_intf_->GetScaleLutConfig(lut_info); } diff --git a/sdm/libs/core/comp_manager.h b/sdm/libs/core/comp_manager.h index 37139712..11a4654a 100644 --- a/sdm/libs/core/comp_manager.h +++ b/sdm/libs/core/comp_manager.h @@ -59,6 +59,7 @@ class CompManager : public DumpImpl { DisplayError ReConfigure(Handle display_ctx, HWLayers *hw_layers); DisplayError PostCommit(Handle display_ctx, HWLayers *hw_layers); void Purge(Handle display_ctx); + DisplayError SetIdleTimeoutMs(Handle display_ctx, uint32_t active_ms); void ProcessIdleTimeout(Handle display_ctx); void ProcessThermalEvent(Handle display_ctx, int64_t thermal_level); DisplayError SetMaxMixerStages(Handle display_ctx, uint32_t max_mixer_stages); @@ -66,7 +67,6 @@ class CompManager : public DumpImpl { DisplayError ValidateScaling(const LayerRect &crop, const LayerRect &dst, bool rotate90); 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); diff --git a/sdm/libs/core/display_base.h b/sdm/libs/core/display_base.h index 64f8ab75..3b8a1f3c 100644 --- a/sdm/libs/core/display_base.h +++ b/sdm/libs/core/display_base.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: @@ -99,7 +99,7 @@ class DisplayBase : public DisplayInterface, DumpImpl { return kErrorNotSupported; } virtual DisplayError SetVSyncState(bool enable); - virtual void SetIdleTimeoutMs(uint32_t timeout_ms) {} + virtual void SetIdleTimeoutMs(uint32_t active_ms) {} virtual DisplayError SetMixerResolution(uint32_t width, uint32_t height); virtual DisplayError GetMixerResolution(uint32_t *width, uint32_t *height); virtual DisplayError SetFrameBufferConfig(const DisplayConfigVariableInfo &variable_info); diff --git a/sdm/libs/core/display_primary.cpp b/sdm/libs/core/display_primary.cpp index 409d6592..0c07266b 100644 --- a/sdm/libs/core/display_primary.cpp +++ b/sdm/libs/core/display_primary.cpp @@ -59,8 +59,6 @@ DisplayError DisplayPrimary::Init() { return error; } - idle_timeout_ms_ = Debug::GetIdleTimeoutMs(); - if (hw_panel_info_.mode == kModeCommand && Debug::IsVideoModeEnabled()) { error = hw_intf_->SetDisplayMode(kModeVideo); if (error != kErrorNone) { @@ -145,8 +143,6 @@ DisplayError DisplayPrimary::Commit(LayerStack *layer_stack) { } } - bool set_idle_timeout = comp_manager_->CanSetIdleTimeout(display_comp_ctx_); - error = DisplayBase::Commit(layer_stack); if (error != kErrorNone) { return error; @@ -154,13 +150,12 @@ DisplayError DisplayPrimary::Commit(LayerStack *layer_stack) { DisplayBase::ReconfigureDisplay(); - if (hw_panel_info_.mode == kModeVideo) { - if (set_idle_timeout && !layer_stack->flags.single_buffered_layer_present) { - hw_intf_->SetIdleTimeoutMs(idle_timeout_ms_); - } else { - hw_intf_->SetIdleTimeoutMs(0); - } - } else if (switch_to_cmd_) { + int idle_time_ms = hw_layers_.info.set_idle_time_ms; + if (idle_time_ms >= 0) { + hw_intf_->SetIdleTimeoutMs(UINT32(idle_time_ms)); + } + + if (switch_to_cmd_) { uint32_t pending; switch_to_cmd_ = false; ControlPartialUpdate(true /* enable */, &pending); @@ -185,53 +180,59 @@ DisplayError DisplayPrimary::SetDisplayState(DisplayState state) { return kErrorNone; } -void DisplayPrimary::SetIdleTimeoutMs(uint32_t timeout_ms) { +void DisplayPrimary::SetIdleTimeoutMs(uint32_t active_ms) { lock_guard<recursive_mutex> obj(recursive_mutex_); - // Idle fallback feature is supported only for video mode panel. - if (hw_panel_info_.mode == kModeVideo) { - hw_intf_->SetIdleTimeoutMs(timeout_ms); + if (comp_manager_->SetIdleTimeoutMs(display_comp_ctx_, active_ms) == kErrorNone) { + hw_intf_->SetIdleTimeoutMs(active_ms); } - idle_timeout_ms_ = timeout_ms; } DisplayError DisplayPrimary::SetDisplayMode(uint32_t mode) { - lock_guard<recursive_mutex> obj(recursive_mutex_); DisplayError error = kErrorNone; - HWDisplayMode hw_display_mode = static_cast<HWDisplayMode>(mode); - uint32_t pending = 0; - if (!active_) { - DLOGW("Invalid display state = %d. Panel must be on.", state_); - return kErrorNotSupported; - } + // Limit scope of mutex to this block + { + lock_guard<recursive_mutex> obj(recursive_mutex_); + HWDisplayMode hw_display_mode = static_cast<HWDisplayMode>(mode); + uint32_t pending = 0; - if (hw_display_mode != kModeCommand && hw_display_mode != kModeVideo) { - DLOGW("Invalid panel mode parameters. Requested = %d", hw_display_mode); - return kErrorParameters; - } + if (!active_) { + DLOGW("Invalid display state = %d. Panel must be on.", state_); + return kErrorNotSupported; + } - if (hw_display_mode == hw_panel_info_.mode) { - DLOGW("Same display mode requested. Current = %d, Requested = %d", hw_panel_info_.mode, - hw_display_mode); - return kErrorNone; - } + if (hw_display_mode != kModeCommand && hw_display_mode != kModeVideo) { + DLOGW("Invalid panel mode parameters. Requested = %d", hw_display_mode); + return kErrorParameters; + } - error = hw_intf_->SetDisplayMode(hw_display_mode); - if (error != kErrorNone) { - DLOGW("Retaining current display mode. Current = %d, Requested = %d", hw_panel_info_.mode, - hw_display_mode); - return error; - } + if (hw_display_mode == hw_panel_info_.mode) { + DLOGW("Same display mode requested. Current = %d, Requested = %d", hw_panel_info_.mode, + hw_display_mode); + return kErrorNone; + } - if (mode == kModeVideo) { - ControlPartialUpdate(false /* enable */, &pending); - hw_intf_->SetIdleTimeoutMs(idle_timeout_ms_); - } else if (mode == kModeCommand) { - switch_to_cmd_ = true; - hw_intf_->SetIdleTimeoutMs(0); + error = hw_intf_->SetDisplayMode(hw_display_mode); + if (error != kErrorNone) { + DLOGW("Retaining current display mode. Current = %d, Requested = %d", hw_panel_info_.mode, + hw_display_mode); + return error; + } + + if (mode == kModeVideo) { + ControlPartialUpdate(false /* enable */, &pending); + } else if (mode == kModeCommand) { + // Flush idle timeout value currently set. + hw_intf_->SetIdleTimeoutMs(0); + switch_to_cmd_ = true; + } } + // Request for a new draw cycle. New display mode will get applied on next draw cycle. + // New idle time will get configured as part of this. + event_handler_->Refresh(); + return error; } diff --git a/sdm/libs/core/display_primary.h b/sdm/libs/core/display_primary.h index 70c938ed..3e976707 100644 --- a/sdm/libs/core/display_primary.h +++ b/sdm/libs/core/display_primary.h @@ -45,7 +45,7 @@ class DisplayPrimary : public DisplayBase, HWEventHandler { virtual DisplayError ControlPartialUpdate(bool enable, uint32_t *pending); virtual DisplayError DisablePartialUpdateOneFrame(); virtual DisplayError SetDisplayState(DisplayState state); - virtual void SetIdleTimeoutMs(uint32_t timeout_ms); + virtual void SetIdleTimeoutMs(uint32_t active_ms); virtual DisplayError SetDisplayMode(uint32_t mode); virtual DisplayError GetRefreshRateRange(uint32_t *min_refresh_rate, uint32_t *max_refresh_rate); virtual DisplayError SetRefreshRate(uint32_t refresh_rate); @@ -62,7 +62,6 @@ class DisplayPrimary : public DisplayBase, HWEventHandler { private: bool NeedsAVREnable(); - uint32_t idle_timeout_ms_ = 0; std::vector<HWEvent> event_list_ = { HWEvent::VSYNC, HWEvent::EXIT, HWEvent::IDLE_NOTIFY, HWEvent::SHOW_BLANK_EVENT, HWEvent::THERMAL_LEVEL }; bool avr_prop_disabled_ = false; diff --git a/sdm/libs/core/strategy.cpp b/sdm/libs/core/strategy.cpp index a34c40c2..8398bbd4 100644 --- a/sdm/libs/core/strategy.cpp +++ b/sdm/libs/core/strategy.cpp @@ -254,5 +254,12 @@ DisplayError Strategy::Purge() { return kErrorNone; } +DisplayError Strategy::SetIdleTimeoutMs(uint32_t active_ms) { + if (strategy_intf_) { + return strategy_intf_->SetIdleTimeoutMs(active_ms); + } + + return kErrorNotSupported; +} } // namespace sdm diff --git a/sdm/libs/core/strategy.h b/sdm/libs/core/strategy.h index d69283fa..f05f66b6 100644 --- a/sdm/libs/core/strategy.h +++ b/sdm/libs/core/strategy.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: @@ -52,6 +52,7 @@ class Strategy { const DisplayConfigVariableInfo &fb_config); DisplayError SetCompositionState(LayerComposition composition_type, bool enable); DisplayError Purge(); + DisplayError SetIdleTimeoutMs(uint32_t active_ms); private: void GenerateROI(); diff --git a/sdm/libs/utils/debug.cpp b/sdm/libs/utils/debug.cpp index fc8567ac..69316b6a 100644 --- a/sdm/libs/utils/debug.cpp +++ b/sdm/libs/utils/debug.cpp @@ -54,11 +54,15 @@ int Debug::GetHDMIResolution() { return value; } -uint32_t Debug::GetIdleTimeoutMs() { - int value = IDLE_TIMEOUT_DEFAULT_MS; - debug_.debug_handler_->GetProperty("sdm.idle_time", &value); +void Debug::GetIdleTimeoutMs(uint32_t *active_ms, uint32_t *inactive_ms) { + int active_val = IDLE_TIMEOUT_ACTIVE_MS; + int inactive_val = IDLE_TIMEOUT_INACTIVE_MS; - return UINT32(value); + debug_.debug_handler_->GetProperty("sdm.idle_time", &active_val); + debug_.debug_handler_->GetProperty("sdm.idle_time.inactive", &inactive_val); + + *active_ms = UINT32(active_val); + *inactive_ms = UINT32(inactive_val); } int Debug::GetBootAnimLayerCount() { |