12ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel/*
26e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudel* Copyright (c) 2014 - 2017, The Linux Foundation. All rights reserved.
32ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*
42ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* Redistribution and use in source and binary forms, with or without modification, are permitted
52ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* provided that the following conditions are met:
62ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*    * Redistributions of source code must retain the above copyright notice, this list of
72ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*      conditions and the following disclaimer.
82ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*    * Redistributions in binary form must reproduce the above copyright notice, this list of
92ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*      conditions and the following disclaimer in the documentation and/or other materials provided
102ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*      with the distribution.
112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*    * Neither the name of The Linux Foundation nor the names of its contributors may be used to
122ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*      endorse or promote products derived from this software without specific prior written
132ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*      permission.
142ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*
152ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
162ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
172ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
182ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
192ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
202ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
212ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*/
242ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
252ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#ifndef __COMP_MANAGER_H__
262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#define __COMP_MANAGER_H__
272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <core/display_interface.h>
292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <private/extension_interface.h>
302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <utils/locker.h>
312ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <bitset>
322ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
332ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include "strategy.h"
342ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include "resource_default.h"
352ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include "hw_interface.h"
362ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include "dump_impl.h"
372ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
382ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelnamespace sdm {
392ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
402ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelclass CompManager : public DumpImpl {
412ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel public:
422ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DisplayError Init(const HWResourceInfo &hw_res_info_, ExtensionInterface *extension_intf,
43b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel                    BufferAllocator *buffer_allocator, BufferSyncHandler *buffer_sync_handler,
44b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel                    SocketHandler *socket_handler);
452ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DisplayError Deinit();
462ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DisplayError RegisterDisplay(DisplayType type, const HWDisplayAttributes &display_attributes,
472ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                               const HWPanelInfo &hw_panel_info,
482ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                               const HWMixerAttributes &mixer_attributes,
49eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel                               const DisplayConfigVariableInfo &fb_config, Handle *display_ctx);
50eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel  DisplayError UnregisterDisplay(Handle display_ctx);
512ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DisplayError ReconfigureDisplay(Handle display_ctx, const HWDisplayAttributes &display_attributes,
522ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                                  const HWPanelInfo &hw_panel_info,
532ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                                  const HWMixerAttributes &mixer_attributes,
542ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                                  const DisplayConfigVariableInfo &fb_config);
552ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  void PrePrepare(Handle display_ctx, HWLayers *hw_layers);
562ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DisplayError Prepare(Handle display_ctx, HWLayers *hw_layers);
57eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel  DisplayError Commit(Handle display_ctx, HWLayers *hw_layers);
582ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DisplayError PostPrepare(Handle display_ctx, HWLayers *hw_layers);
592ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DisplayError ReConfigure(Handle display_ctx, HWLayers *hw_layers);
602ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DisplayError PostCommit(Handle display_ctx, HWLayers *hw_layers);
612ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  void Purge(Handle display_ctx);
622ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  void ProcessIdleTimeout(Handle display_ctx);
632ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  void ProcessThermalEvent(Handle display_ctx, int64_t thermal_level);
642ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DisplayError SetMaxMixerStages(Handle display_ctx, uint32_t max_mixer_stages);
652ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  void ControlPartialUpdate(Handle display_ctx, bool enable);
662ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DisplayError ValidateScaling(const LayerRect &crop, const LayerRect &dst, bool rotate90);
672ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DisplayError ValidateCursorPosition(Handle display_ctx, HWLayers *hw_layers, int x, int y);
682ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  bool SupportLayerAsCursor(Handle display_ctx, HWLayers *hw_layers);
692ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  bool CanSetIdleTimeout(Handle display_ctx);
706e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudel  bool SetDisplayState(Handle display_ctx, DisplayState state, DisplayType display_type);
712ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DisplayError SetMaxBandwidthMode(HWBwModes mode);
722ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DisplayError GetScaleLutConfig(HWScaleLutInfo *lut_info);
732ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DisplayError SetDetailEnhancerData(Handle display_ctx, const DisplayDetailEnhancerData &de_data);
74eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel  DisplayError SetCompositionState(Handle display_ctx, LayerComposition composition_type,
75eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel                                   bool enable);
76b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel  DisplayError ControlDpps(bool enable);
772ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
782ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  // DumpImpl method
792ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  virtual void AppendDump(char *buffer, uint32_t length);
802ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
812ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel private:
822ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  static const int kMaxThermalLevel = 3;
83051dfd82677c3ad0bb124eb403b75e243650234eThierry Strudel  static const int kSafeModeThreshold = 4;
842ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
852ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  void PrepareStrategyConstraints(Handle display_ctx, HWLayers *hw_layers);
862ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
872ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  struct DisplayCompositionContext {
882ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    Strategy *strategy = NULL;
892ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    StrategyConstraints constraints;
902ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    Handle display_resource_ctx = NULL;
912ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    DisplayType display_type = kPrimary;
922ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    uint32_t max_strategies = 0;
932ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    uint32_t remaining_strategies = 0;
942ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    bool idle_fallback = false;
956e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudel    bool thermal_fallback_ = false;
962ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    // Using primary panel flag of hw panel to configure Constraints. We do not need other hw
972ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    // panel parameters for now.
982ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    bool is_primary_panel = false;
9972adb432f6bdb99433ebb261d8e55395d10783deThierry Strudel    bool valid_cursor = false;
10072adb432f6bdb99433ebb261d8e55395d10783deThierry Strudel    PUConstraints pu_constraints = {};
101051dfd82677c3ad0bb124eb403b75e243650234eThierry Strudel    bool scaled_composition = false;
1022ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  };
1032ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1042ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  Locker locker_;
1052ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  ResourceInterface *resource_intf_ = NULL;
1062ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  std::bitset<kDisplayMax> registered_displays_;  // Bit mask of registered displays
1072ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  std::bitset<kDisplayMax> configured_displays_;  // Bit mask of sucessfully configured displays
1086e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudel  uint32_t display_state_[kDisplayMax] = {};
1092ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  bool safe_mode_ = false;              // Flag to notify all displays to be in resource crunch
1102ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                                        // mode, where strategy manager chooses the best strategy
1112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                                        // that uses optimal number of pipes for each display
1122ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  HWResourceInfo hw_res_info_;
113b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel  BufferAllocator *buffer_allocator_ = NULL;
1142ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  ExtensionInterface *extension_intf_ = NULL;
1152ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  uint32_t max_layers_ = kMaxSDELayers;
116d62c8a289ff6b4838e543e82b655dc436f387574Thierry Strudel  uint32_t max_sde_ext_layers_ = 0;
117b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel  DppsControlInterface *dpps_ctrl_intf_ = NULL;
1182ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel};
1192ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1202ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}  // namespace sdm
1212ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#endif  // __COMP_MANAGER_H__
1232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
124