1d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema/*
2d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema* Copyright (c) 2014 - 2017, The Linux Foundation. All rights reserved.
3d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema*
4d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema* Redistribution and use in source and binary forms, with or without modification, are permitted
5d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema* provided that the following conditions are met:
6d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema*    * Redistributions of source code must retain the above copyright notice, this list of
7d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema*      conditions and the following disclaimer.
8d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema*    * Redistributions in binary form must reproduce the above copyright notice, this list of
9d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema*      conditions and the following disclaimer in the documentation and/or other materials provided
10d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema*      with the distribution.
11d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema*    * Neither the name of The Linux Foundation nor the names of its contributors may be used to
12d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema*      endorse or promote products derived from this software without specific prior written
13d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema*      permission.
14d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema*
15d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
16d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema* NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
18d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
19d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
20d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
21d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
22d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema*/
24d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
25d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#ifndef __RESOURCE_DEFAULT_H__
26d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#define __RESOURCE_DEFAULT_H__
27d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
28d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#include <core/display_interface.h>
29d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#include <private/resource_interface.h>
30d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#include <utils/locker.h>
31d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#include <vector>
32d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
33d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#include "hw_interface.h"
34d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
35d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennemanamespace sdm {
36d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
37d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennemaclass ResourceDefault : public ResourceInterface {
38d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema public:
39d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  static DisplayError CreateResourceDefault(const HWResourceInfo &hw_resource_info,
40d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema                                            ResourceInterface **resource_intf);
41d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  static DisplayError DestroyResourceDefault(ResourceInterface *resource_intf);
42d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  virtual DisplayError RegisterDisplay(DisplayType type,
43d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema                                       const HWDisplayAttributes &display_attributes,
44d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema                                       const HWPanelInfo &hw_panel_info,
45d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema                                       const HWMixerAttributes &mixer_attributes,
46d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema                                       Handle *display_ctx);
47d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  virtual DisplayError UnregisterDisplay(Handle display_ctx);
48d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  virtual DisplayError ReconfigureDisplay(Handle display_ctx,
49d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema                                          const HWDisplayAttributes &display_attributes,
50d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema                                          const HWPanelInfo &hw_panel_info,
51d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema                                          const HWMixerAttributes &mixer_attributes);
52d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  virtual DisplayError Start(Handle display_ctx);
53d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  virtual DisplayError Stop(Handle display_ctx, HWLayers *hw_layers);
54d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  virtual DisplayError Prepare(Handle display_ctx, HWLayers *hw_layers);
55d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  virtual DisplayError PostPrepare(Handle display_ctx, HWLayers *hw_layers);
56d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  virtual DisplayError Commit(Handle display_ctx, HWLayers *hw_layers);
57d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  virtual DisplayError PostCommit(Handle display_ctx, HWLayers *hw_layers);
58d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  virtual void Purge(Handle display_ctx);
59d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  virtual DisplayError SetMaxMixerStages(Handle display_ctx, uint32_t max_mixer_stages);
60d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  virtual DisplayError ValidateScaling(const LayerRect &crop, const LayerRect &dst, bool rotate90,
61d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema                                       BufferLayout layout, bool use_rotator_downscale);
62d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DisplayError ValidateCursorConfig(Handle display_ctx, const Layer *layer, bool is_top);
63d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DisplayError ValidateAndSetCursorPosition(Handle display_ctx, HWLayers *hw_layers, int x, int y,
64d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema                                            DisplayConfigVariableInfo *fb_config);
65d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DisplayError SetMaxBandwidthMode(HWBwModes mode);
66d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  virtual DisplayError SetDetailEnhancerData(Handle display_ctx,
67d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema                                             const DisplayDetailEnhancerData &de_data);
68d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  virtual DisplayError Perform(int cmd, ...) { return kErrorNone; }
69d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
70d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema private:
71d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  enum PipeOwner {
72d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    kPipeOwnerUserMode,       // Pipe state when it is available for reservation
73d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    kPipeOwnerKernelMode,  // Pipe state when pipe is owned by kernel
74d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  };
75d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
76d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  // todo: retrieve all these from kernel
77d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  enum {
78d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    kMaxDecimationDownScaleRatio = 16,
79d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  };
80d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
81d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  struct SourcePipe {
82d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    PipeType type;
83d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    PipeOwner owner;
84d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    uint32_t mdss_pipe_id;
85d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    uint32_t index;
86d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    HWBlockType hw_block_id;
87d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    int priority;
88d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
89d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    SourcePipe() : type(kPipeTypeUnused), owner(kPipeOwnerUserMode), mdss_pipe_id(0),
90d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema                  index(0), hw_block_id(kHWBlockMax), priority(0) { }
91d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
92d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    inline void ResetState() { hw_block_id = kHWBlockMax;}
93d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  };
94d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
95d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  struct DisplayResourceContext {
96d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    HWDisplayAttributes display_attributes;
97d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    HWBlockType hw_block_id;
98d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    uint64_t frame_count;
99d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    HWMixerAttributes mixer_attributes;
100d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
101d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    DisplayResourceContext() : hw_block_id(kHWBlockMax), frame_count(0) { }
102d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  };
103d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
104d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  struct HWBlockContext {
105d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    bool is_in_use;
106d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    HWBlockContext() : is_in_use(false) { }
107d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  };
108d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
109d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  explicit ResourceDefault(const HWResourceInfo &hw_res_info);
110d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DisplayError Init();
111d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DisplayError Deinit();
112d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  uint32_t NextPipe(PipeType pipe_type, HWBlockType hw_block_id);
113d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  uint32_t SearchPipe(HWBlockType hw_block_id, SourcePipe *src_pipes, uint32_t num_pipe);
114d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  uint32_t GetPipe(HWBlockType hw_block_id, bool need_scale);
115d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  bool IsScalingNeeded(const HWPipeInfo *pipe_info);
116d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DisplayError Config(DisplayResourceContext *display_resource_ctx, HWLayers *hw_layers);
117d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DisplayError DisplaySplitConfig(DisplayResourceContext *display_resource_ctx,
118d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema                                 const LayerRect &src_rect, const LayerRect &dst_rect,
119d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema                                 HWLayerConfig *layer_config);
120d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DisplayError SrcSplitConfig(DisplayResourceContext *display_resource_ctx,
121d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema                             const LayerRect &src_rect, const LayerRect &dst_rect,
122d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema                             HWLayerConfig *layer_config);
123d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  bool CalculateCropRects(const LayerRect &scissor, LayerRect *crop, LayerRect *dst);
124d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DisplayError ValidateLayerParams(const Layer *layer);
125d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DisplayError ValidateDimensions(const LayerRect &crop, const LayerRect &dst);
126d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DisplayError ValidatePipeParams(HWPipeInfo *pipe_info, LayerBufferFormat format);
127d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DisplayError ValidateDownScaling(float scale_x, float scale_y, bool ubwc_tiled);
128d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DisplayError ValidateUpScaling(float scale_x, float scale_y);
129d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DisplayError GetScaleFactor(const LayerRect &crop, const LayerRect &dst, float *scale_x,
130d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema                             float *scale_y);
131d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DisplayError SetDecimationFactor(HWPipeInfo *pipe);
132d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  void SplitRect(const LayerRect &src_rect, const LayerRect &dst_rect, LayerRect *src_left,
133d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema                LayerRect *dst_left, LayerRect *src_right, LayerRect *dst_right);
134d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DisplayError AlignPipeConfig(const Layer *layer, HWPipeInfo *left_pipe,
135d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema                               HWPipeInfo *right_pipe);
136d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  void ResourceStateLog(void);
137d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DisplayError CalculateDecimation(float downscale, uint8_t *decimation);
138d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DisplayError GetScaleLutConfig(HWScaleLutInfo *lut_info);
139d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
140d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  Locker locker_;
141d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  HWResourceInfo hw_res_info_;
142d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  HWBlockContext hw_block_ctx_[kHWBlockMax];
143d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  std::vector<SourcePipe> src_pipes_;
144d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  uint32_t num_pipe_ = 0;
145d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema};
146d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
147d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema}  // namespace sdm
148d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
149d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#endif  // __RESOURCE_DEFAULT_H__
150d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
151