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