1d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/*
28089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch* Copyright (c) 2014-2016, 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#ifndef __DISPLAY_BASE_H__
26d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#define __DISPLAY_BASE_H__
27d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
28d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <core/display_interface.h>
29d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <private/strategy_interface.h>
30d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <private/rotator_interface.h>
31d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <private/color_interface.h>
32d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
3352af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch#include <map>
3488cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmed#include <mutex>
3552af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch#include <string>
3652af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch#include <vector>
3752af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch
38d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include "hw_interface.h"
39d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include "comp_manager.h"
40d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include "color_manager.h"
418089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch#include "hw_events_interface.h"
42d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
43d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinnamespace sdm {
44d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
4588cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmedusing std::recursive_mutex;
4688cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmedusing std::lock_guard;
4788cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmed
48d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinclass RotatorCtrl;
49d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinclass HWInfoInterface;
50d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
5188cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmedclass DisplayBase : public DisplayInterface, DumpImpl {
52d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin public:
53d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  DisplayBase(DisplayType display_type, DisplayEventHandler *event_handler,
54d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin              HWDeviceType hw_device_type, BufferSyncHandler *buffer_sync_handler,
55d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin              CompManager *comp_manager, RotatorInterface *rotator_intf,
56d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin              HWInfoInterface *hw_info_intf);
57d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  virtual ~DisplayBase() { }
58d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  virtual DisplayError Init();
59d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  virtual DisplayError Deinit();
6088cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmed  DisplayError Prepare(LayerStack *layer_stack);
6188cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmed  DisplayError Commit(LayerStack *layer_stack);
62d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  virtual DisplayError Flush();
63d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  virtual DisplayError GetDisplayState(DisplayState *state);
64d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  virtual DisplayError GetNumVariableInfoConfigs(uint32_t *count);
65d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  virtual DisplayError GetConfig(uint32_t index, DisplayConfigVariableInfo *variable_info);
66d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  virtual DisplayError GetActiveConfig(uint32_t *index);
67d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  virtual DisplayError GetVSyncState(bool *enabled);
68d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  virtual DisplayError SetDisplayState(DisplayState state);
6988cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmed  virtual DisplayError SetActiveConfig(uint32_t index);
7088cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmed  virtual DisplayError SetActiveConfig(DisplayConfigVariableInfo *variable_info) {
7188cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmed    return kErrorNotSupported;
7288cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmed  }
73d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  virtual DisplayError SetMaxMixerStages(uint32_t max_mixer_stages);
7488cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmed  virtual DisplayError ControlPartialUpdate(bool enable, uint32_t *pending) {
7588cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmed    return kErrorNotSupported;
7688cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmed  }
7788cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmed  virtual DisplayError DisablePartialUpdateOneFrame() {
7888cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmed    return kErrorNotSupported;
7988cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmed  }
8088cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmed  virtual DisplayError SetDisplayMode(uint32_t mode) {
8188cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmed    return kErrorNotSupported;
8288cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmed  }
8388cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmed  virtual bool IsUnderscanSupported() {
8488cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmed    return false;
8588cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmed  }
8688cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmed  virtual DisplayError SetPanelBrightness(int level) {
8788cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmed    return kErrorNotSupported;
8888cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmed  }
8988cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmed  virtual DisplayError OnMinHdcpEncryptionLevelChange(uint32_t min_enc_level) {
9088cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmed    return kErrorNotSupported;
9188cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmed  }
92d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  virtual DisplayError ColorSVCRequestRoute(const PPDisplayAPIPayload &in_payload,
93d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                                            PPDisplayAPIPayload *out_payload,
94d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                                            PPPendingParams *pending_action);
9552af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  virtual DisplayError GetColorModeCount(uint32_t *mode_count);
9652af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  virtual DisplayError GetColorModes(uint32_t *mode_count, std::vector<std::string> *color_modes);
9752af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  virtual DisplayError SetColorMode(const std::string &color_mode);
9852af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  virtual DisplayError SetColorTransform(const uint32_t length, const double *color_transform);
99d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  virtual DisplayError ApplyDefaultDisplayMode(void);
100d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  virtual DisplayError SetCursorPosition(int x, int y);
101d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  virtual DisplayError GetRefreshRateRange(uint32_t *min_refresh_rate, uint32_t *max_refresh_rate);
10288cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmed  virtual DisplayError GetPanelBrightness(int *level) {
103fc811a3e18140740eaf6bb70a48e12f1f176e17bSteve Pfetsch    return kErrorNotSupported;
104fc811a3e18140740eaf6bb70a48e12f1f176e17bSteve Pfetsch  }
10588cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmed  virtual DisplayError SetVSyncState(bool enable);
10688cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmed  virtual void SetIdleTimeoutMs(uint32_t timeout_ms) {}
10788cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmed  virtual DisplayError SetMixerResolution(uint32_t width, uint32_t height);
10888cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmed  virtual DisplayError GetMixerResolution(uint32_t *width, uint32_t *height);
10988cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmed  virtual DisplayError SetFrameBufferConfig(const DisplayConfigVariableInfo &variable_info);
11088cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmed  virtual DisplayError GetFrameBufferConfig(DisplayConfigVariableInfo *variable_info);
11188cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmed  virtual DisplayError SetDetailEnhancerData(const DisplayDetailEnhancerData &de_data);
112fc811a3e18140740eaf6bb70a48e12f1f176e17bSteve Pfetsch
11388cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmed protected:
114d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  // DumpImpl method
115d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  void AppendDump(char *buffer, uint32_t length);
116d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
117d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  bool IsRotationRequired(HWLayers *hw_layers);
118d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  const char *GetName(const LayerComposition &composition);
119d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  DisplayError ValidateGPUTarget(LayerStack *layer_stack);
120fc811a3e18140740eaf6bb70a48e12f1f176e17bSteve Pfetsch  DisplayError ReconfigureDisplay();
12129e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed  bool NeedsMixerReconfiguration(LayerStack *layer_stack, uint32_t *new_mixer_width,
12229e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed                                 uint32_t *new_mixer_height);
12329e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed  DisplayError ReconfigureMixer(uint32_t width, uint32_t height);
124503cff39e91695866f06b40f07e5f664f57ee4f4Naseer Ahmed  void AllDisplaysNeedValidate();
12529e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed
126503cff39e91695866f06b40f07e5f664f57ee4f4Naseer Ahmed  static std::bitset<kDisplayMax> registered_displays_;
127503cff39e91695866f06b40f07e5f664f57ee4f4Naseer Ahmed  static std::bitset<kDisplayMax> needs_validate_;
12888cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmed  recursive_mutex recursive_mutex_;
129d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  DisplayType display_type_;
130d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  DisplayEventHandler *event_handler_ = NULL;
131d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  HWDeviceType hw_device_type_;
132d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  HWInterface *hw_intf_ = NULL;
133d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  HWPanelInfo hw_panel_info_;
134d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  BufferSyncHandler *buffer_sync_handler_ = NULL;
135d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  CompManager *comp_manager_ = NULL;
136d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  RotatorInterface *rotator_intf_ = NULL;
137d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  DisplayState state_ = kStateOff;
138d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  bool active_ = false;
139d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  Handle hw_device_ = 0;
140d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  Handle display_comp_ctx_ = 0;
141d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  Handle display_rotator_ctx_ = 0;
142d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  HWLayers hw_layers_;
143d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  bool pending_commit_ = false;
144d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  bool vsync_enable_ = false;
145d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  uint32_t max_mixer_stages_ = 0;
146d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  HWInfoInterface *hw_info_intf_ = NULL;
147d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  ColorManagerProxy *color_mgr_ = NULL;  // each display object owns its ColorManagerProxy
148d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  bool partial_update_control_ = true;
1498089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  HWEventsInterface *hw_events_intf_ = NULL;
150fc811a3e18140740eaf6bb70a48e12f1f176e17bSteve Pfetsch  bool disable_pu_one_frame_ = false;
15152af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  uint32_t num_color_modes_ = 0;
15288cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmed  std::vector<SDEDisplayMode> color_modes_;
15352af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  typedef std::map<std::string, SDEDisplayMode *> ColorModeMap;
15452af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  ColorModeMap color_mode_map_ = {};
155fc811a3e18140740eaf6bb70a48e12f1f176e17bSteve Pfetsch  HWDisplayAttributes display_attributes_ = {};
156fc811a3e18140740eaf6bb70a48e12f1f176e17bSteve Pfetsch  HWMixerAttributes mixer_attributes_ = {};
157fc811a3e18140740eaf6bb70a48e12f1f176e17bSteve Pfetsch  DisplayConfigVariableInfo fb_config_ = {};
158d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
159d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin private:
160d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  // Unused
161d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  virtual DisplayError GetConfig(DisplayConfigFixedInfo *variable_info) {
162d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    return kErrorNone;
163d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin  }
164d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin};
165d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
166d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin}  // namespace sdm
167d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
168d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#endif  // __DISPLAY_BASE_H__
169