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