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