1d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/* 2d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* Copyright (c) 2014 - 2015, The Linux Foundation. All rights reserved. 3d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* 4d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* Redistribution and use in source and binary forms, with or without modification, are permitted 5d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* provided that the following conditions are met: 6d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* * Redistributions of source code must retain the above copyright notice, this list of 7d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* conditions and the following disclaimer. 8d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* * Redistributions in binary form must reproduce the above copyright notice, this list of 9d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* conditions and the following disclaimer in the documentation and/or other materials provided 10d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* with the distribution. 11d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* * Neither the name of The Linux Foundation nor the names of its contributors may be used to 12d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* endorse or promote products derived from this software without specific prior written 13d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* permission. 14d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* 15d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 16d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE 18d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 19d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 20d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 21d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 22d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 23d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin*/ 24d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 25d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <utils/constants.h> 26d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <utils/debug.h> 27d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 28d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include "display_primary.h" 29d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include "hw_interface.h" 30d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include "hw_info_interface.h" 31d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include "fb/hw_primary.h" 32d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 33d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#define __CLASS__ "DisplayPrimary" 34d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 35d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinnamespace sdm { 36d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 37d68a2e45260f864503d7bd6da93fd29589afd89ePatrick TjinDisplayPrimary::DisplayPrimary(DisplayEventHandler *event_handler, HWInfoInterface *hw_info_intf, 38d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin BufferSyncHandler *buffer_sync_handler, CompManager *comp_manager, 39d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin RotatorInterface *rotator_intf) 40d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin : DisplayBase(kPrimary, event_handler, kDevicePrimary, buffer_sync_handler, comp_manager, 41d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin rotator_intf, hw_info_intf) { 42d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 43d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 44d68a2e45260f864503d7bd6da93fd29589afd89ePatrick TjinDisplayError DisplayPrimary::Init() { 45d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin SCOPE_LOCK(locker_); 46d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 47d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin DisplayError error = HWPrimary::Create(&hw_intf_, hw_info_intf_, 48d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin DisplayBase::buffer_sync_handler_, this); 49d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 50d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (error != kErrorNone) { 51d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return error; 52d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 53d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 54d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin error = DisplayBase::Init(); 55d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (error != kErrorNone) { 56d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin HWPrimary::Destroy(hw_intf_); 57d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return error; 58d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 59d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 60d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin idle_timeout_ms_ = Debug::GetIdleTimeoutMs(); 61d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 62d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (hw_panel_info_.mode == kModeCommand && Debug::IsVideoModeEnabled()) { 63d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin error = hw_intf_->SetDisplayMode(kModeVideo); 64d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (error != kErrorNone) { 65d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin DLOGW("Retaining current display mode. Current = %d, Requested = %d", hw_panel_info_.mode, 66d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin kModeVideo); 67d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 68d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 69d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 70d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return error; 71d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 72d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 73d68a2e45260f864503d7bd6da93fd29589afd89ePatrick TjinDisplayError DisplayPrimary::Deinit() { 74d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin SCOPE_LOCK(locker_); 75d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 76d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin DisplayError error = DisplayBase::Deinit(); 77d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin HWPrimary::Destroy(hw_intf_); 78d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 79d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return error; 80d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 81d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 82d68a2e45260f864503d7bd6da93fd29589afd89ePatrick TjinDisplayError DisplayPrimary::Prepare(LayerStack *layer_stack) { 83d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin SCOPE_LOCK(locker_); 84d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return DisplayBase::Prepare(layer_stack); 85d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 86d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 87d68a2e45260f864503d7bd6da93fd29589afd89ePatrick TjinDisplayError DisplayPrimary::Commit(LayerStack *layer_stack) { 88d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin SCOPE_LOCK(locker_); 89d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin DisplayError error = kErrorNone; 90d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin HWPanelInfo panel_info; 91d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin HWDisplayAttributes display_attributes; 92d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin uint32_t active_index = 0; 93d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 94d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin // Enabling auto refresh is async and needs to happen before commit ioctl 95d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (hw_panel_info_.mode == kModeCommand) { 96d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin hw_intf_->SetAutoRefresh(layer_stack->flags.single_buffered_layer_present); 97d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 98d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 99d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin bool set_idle_timeout = comp_manager_->CanSetIdleTimeout(display_comp_ctx_); 100d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 101d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin error = DisplayBase::Commit(layer_stack); 102d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (error != kErrorNone) { 103d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return error; 104d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 105d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 106d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin hw_intf_->GetHWPanelInfo(&panel_info); 107d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin hw_intf_->GetActiveConfig(&active_index); 108d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin hw_intf_->GetDisplayAttributes(active_index, &display_attributes); 109d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 110d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (panel_info != hw_panel_info_) { 111d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin error = comp_manager_->ReconfigureDisplay(display_comp_ctx_, display_attributes, panel_info); 112d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin hw_panel_info_ = panel_info; 113d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 114d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 115d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (hw_panel_info_.mode == kModeVideo) { 116d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (set_idle_timeout && !layer_stack->flags.single_buffered_layer_present) { 117d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin hw_intf_->SetIdleTimeoutMs(idle_timeout_ms_); 118d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } else { 119d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin hw_intf_->SetIdleTimeoutMs(0); 120d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 121d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 122d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 123d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return error; 124d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 125d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 126d68a2e45260f864503d7bd6da93fd29589afd89ePatrick TjinDisplayError DisplayPrimary::Flush() { 127d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin SCOPE_LOCK(locker_); 128d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return DisplayBase::Flush(); 129d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 130d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 131d68a2e45260f864503d7bd6da93fd29589afd89ePatrick TjinDisplayError DisplayPrimary::GetDisplayState(DisplayState *state) { 132d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin SCOPE_LOCK(locker_); 133d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return DisplayBase::GetDisplayState(state); 134d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 135d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 136d68a2e45260f864503d7bd6da93fd29589afd89ePatrick TjinDisplayError DisplayPrimary::GetNumVariableInfoConfigs(uint32_t *count) { 137d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin SCOPE_LOCK(locker_); 138d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return DisplayBase::GetNumVariableInfoConfigs(count); 139d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 140d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 141d68a2e45260f864503d7bd6da93fd29589afd89ePatrick TjinDisplayError DisplayPrimary::GetConfig(uint32_t index, DisplayConfigVariableInfo *variable_info) { 142d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin SCOPE_LOCK(locker_); 143d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return DisplayBase::GetConfig(index, variable_info); 144d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 145d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 146d68a2e45260f864503d7bd6da93fd29589afd89ePatrick TjinDisplayError DisplayPrimary::GetActiveConfig(uint32_t *index) { 147d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin SCOPE_LOCK(locker_); 148d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return DisplayBase::GetActiveConfig(index); 149d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 150d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 151d68a2e45260f864503d7bd6da93fd29589afd89ePatrick TjinDisplayError DisplayPrimary::GetVSyncState(bool *enabled) { 152d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin SCOPE_LOCK(locker_); 153d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return DisplayBase::GetVSyncState(enabled); 154d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 155d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 156d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinbool DisplayPrimary::IsUnderscanSupported() { 157d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin SCOPE_LOCK(locker_); 158d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return DisplayBase::IsUnderscanSupported(); 159d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 160d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 161d68a2e45260f864503d7bd6da93fd29589afd89ePatrick TjinDisplayError DisplayPrimary::SetDisplayState(DisplayState state) { 162d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin SCOPE_LOCK(locker_); 163d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin DisplayError error = kErrorNone; 164d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin error = DisplayBase::SetDisplayState(state); 165d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (error != kErrorNone) { 166d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return error; 167d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 168d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 169d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin // Set vsync enable state to false, as driver disables vsync during display power off. 170d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (state == kStateOff) { 171d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin vsync_enable_ = false; 172d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 173d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 174d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return kErrorNone; 175d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 176d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 177d68a2e45260f864503d7bd6da93fd29589afd89ePatrick TjinDisplayError DisplayPrimary::SetActiveConfig(DisplayConfigVariableInfo *variable_info) { 178d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin SCOPE_LOCK(locker_); 179d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return kErrorNotSupported; 180d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 181d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 182d68a2e45260f864503d7bd6da93fd29589afd89ePatrick TjinDisplayError DisplayPrimary::SetActiveConfig(uint32_t index) { 183d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin SCOPE_LOCK(locker_); 184d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return DisplayBase::SetActiveConfig(index); 185d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 186d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 187d68a2e45260f864503d7bd6da93fd29589afd89ePatrick TjinDisplayError DisplayPrimary::SetVSyncState(bool enable) { 188d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin SCOPE_LOCK(locker_); 189d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin DisplayError error = kErrorNone; 190d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (vsync_enable_ != enable) { 191d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin error = hw_intf_->SetVSyncState(enable); 192d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (error == kErrorNone) { 193d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin vsync_enable_ = enable; 194d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 195d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 196d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 197d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return error; 198d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 199d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 200d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinvoid DisplayPrimary::SetIdleTimeoutMs(uint32_t timeout_ms) { 201d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin SCOPE_LOCK(locker_); 202d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 203d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin // Idle fallback feature is supported only for video mode panel. 204d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (hw_panel_info_.mode == kModeVideo) { 205d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin hw_intf_->SetIdleTimeoutMs(timeout_ms); 206d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 207d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin idle_timeout_ms_ = timeout_ms; 208d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 209d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 210d68a2e45260f864503d7bd6da93fd29589afd89ePatrick TjinDisplayError DisplayPrimary::SetMaxMixerStages(uint32_t max_mixer_stages) { 211d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin SCOPE_LOCK(locker_); 212d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return DisplayBase::SetMaxMixerStages(max_mixer_stages); 213d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 214d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 215d68a2e45260f864503d7bd6da93fd29589afd89ePatrick TjinDisplayError DisplayPrimary::SetDisplayMode(uint32_t mode) { 216d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin SCOPE_LOCK(locker_); 217d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin DisplayError error = kErrorNone; 218d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin HWDisplayMode hw_display_mode = kModeDefault; 219d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 220d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (!active_) { 221d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin DLOGW("Invalid display state = %d. Panel must be on.", state_); 222d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return kErrorNotSupported; 223d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 224d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 225d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin switch (mode) { 226d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case kModeVideo: 227d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin hw_display_mode = kModeVideo; 228d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin break; 229d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin case kModeCommand: 230d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin hw_display_mode = kModeCommand; 231d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin break; 232d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin default: 233d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin DLOGW("Invalid panel mode parameters. Requested = %d", mode); 234d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return kErrorParameters; 235d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 236d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 237d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (hw_display_mode == hw_panel_info_.mode) { 238d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin DLOGW("Same display mode requested. Current = %d, Requested = %d", hw_panel_info_.mode, 239d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin hw_display_mode); 240d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return kErrorNone; 241d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 242d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 243d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin error = hw_intf_->SetDisplayMode(hw_display_mode); 244d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (error != kErrorNone) { 245d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin DLOGW("Retaining current display mode. Current = %d, Requested = %d", hw_panel_info_.mode, 246d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin hw_display_mode); 247d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return error; 248d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 249d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 250d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin // Disable PU if the previous PU state is on when switching to video mode, and re-enable PU when 251d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin // switching back to command mode. 252d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin bool toggle_partial_update = !(hw_display_mode == kModeVideo); 253d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (partial_update_control_) { 254d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin comp_manager_->ControlPartialUpdate(display_comp_ctx_, toggle_partial_update); 255d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 256d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 257d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (hw_display_mode == kModeVideo) { 258d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin hw_intf_->SetIdleTimeoutMs(idle_timeout_ms_); 259d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } else if (hw_display_mode == kModeCommand) { 260d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin hw_intf_->SetIdleTimeoutMs(0); 261d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 262d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 263d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return error; 264d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 265d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 266d68a2e45260f864503d7bd6da93fd29589afd89ePatrick TjinDisplayError DisplayPrimary::SetPanelBrightness(int level) { 267d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin SCOPE_LOCK(locker_); 268d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return hw_intf_->SetPanelBrightness(level); 269d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 270d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 271d68a2e45260f864503d7bd6da93fd29589afd89ePatrick TjinDisplayError DisplayPrimary::IsScalingValid(const LayerRect &crop, const LayerRect &dst, 272d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin bool rotate90) { 273d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin SCOPE_LOCK(locker_); 274d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return DisplayBase::IsScalingValid(crop, dst, rotate90); 275d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 276d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 277d68a2e45260f864503d7bd6da93fd29589afd89ePatrick TjinDisplayError DisplayPrimary::GetRefreshRateRange(uint32_t *min_refresh_rate, 278d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin uint32_t *max_refresh_rate) { 279d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin SCOPE_LOCK(locker_); 280d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin DisplayError error = kErrorNone; 281d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 282d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (hw_panel_info_.min_fps && hw_panel_info_.max_fps) { 283d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin *min_refresh_rate = hw_panel_info_.min_fps; 284d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin *max_refresh_rate = hw_panel_info_.max_fps; 285d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } else { 286d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin error = DisplayBase::GetRefreshRateRange(min_refresh_rate, max_refresh_rate); 287d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 288d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 289d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return error; 290d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 291d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 292d68a2e45260f864503d7bd6da93fd29589afd89ePatrick TjinDisplayError DisplayPrimary::SetRefreshRate(uint32_t refresh_rate) { 293d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin SCOPE_LOCK(locker_); 294d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 295d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (!active_ || !hw_panel_info_.dynamic_fps) { 296d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return kErrorNotSupported; 297d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 298d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 299d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (refresh_rate < hw_panel_info_.min_fps || refresh_rate > hw_panel_info_.max_fps) { 300d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin DLOGE("Invalid Fps = %d request", refresh_rate); 301d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return kErrorParameters; 302d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 303d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 304d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin DisplayError error = hw_intf_->SetRefreshRate(refresh_rate); 305d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (error != kErrorNone) { 306d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return error; 307d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 308d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 309d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin HWDisplayAttributes display_attributes; 310d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin uint32_t active_index = 0; 311d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin error = hw_intf_->GetActiveConfig(&active_index); 312d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (error != kErrorNone) { 313d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return error; 314d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 315d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 316d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin error = hw_intf_->GetDisplayAttributes(active_index, &display_attributes); 317d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (error != kErrorNone) { 318d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return error; 319d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 320d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 321d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin comp_manager_->ReconfigureDisplay(display_comp_ctx_, display_attributes, hw_panel_info_); 322d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 323d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return kErrorNone; 324d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 325d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 326d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinvoid DisplayPrimary::AppendDump(char *buffer, uint32_t length) { 327d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin SCOPE_LOCK(locker_); 328d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin DisplayBase::AppendDump(buffer, length); 329d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 330d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 331d68a2e45260f864503d7bd6da93fd29589afd89ePatrick TjinDisplayError DisplayPrimary::VSync(int64_t timestamp) { 332d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin if (vsync_enable_) { 333d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin DisplayEventVSync vsync; 334d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin vsync.timestamp = timestamp; 335d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin event_handler_->VSync(vsync); 336d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin } 337d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 338d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return kErrorNone; 339d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 340d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 341d68a2e45260f864503d7bd6da93fd29589afd89ePatrick TjinDisplayError DisplayPrimary::SetCursorPosition(int x, int y) { 342d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin SCOPE_LOCK(locker_); 343d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return DisplayBase::SetCursorPosition(x, y); 344d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 345d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 346d68a2e45260f864503d7bd6da93fd29589afd89ePatrick TjinDisplayError DisplayPrimary::Blank(bool blank) { 347d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin SCOPE_LOCK(locker_); 348d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return kErrorNone; 349d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 350d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 351d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinvoid DisplayPrimary::IdleTimeout() { 352d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin event_handler_->Refresh(); 353d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin comp_manager_->ProcessIdleTimeout(display_comp_ctx_); 354d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 355d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 356d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinvoid DisplayPrimary::ThermalEvent(int64_t thermal_level) { 357d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin SCOPE_LOCK(locker_); 358d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin comp_manager_->ProcessThermalEvent(display_comp_ctx_, thermal_level); 359d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 360d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 361d68a2e45260f864503d7bd6da93fd29589afd89ePatrick TjinDisplayError DisplayPrimary::GetPanelBrightness(int *level) { 362d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin SCOPE_LOCK(locker_); 363d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin return hw_intf_->GetPanelBrightness(level); 364d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} 365d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 366d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin} // namespace sdm 367d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin 368