12ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel/* 2cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry 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 __RESOURCE_DEFAULT_H__ 262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#define __RESOURCE_DEFAULT_H__ 272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <core/display_interface.h> 292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <private/resource_interface.h> 302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <utils/locker.h> 312ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <vector> 322ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 332ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include "hw_interface.h" 342ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 352ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelnamespace sdm { 362ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 372ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelclass ResourceDefault : public ResourceInterface { 382ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel public: 39eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel static DisplayError CreateResourceDefault(const HWResourceInfo &hw_resource_info, 40eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel ResourceInterface **resource_intf); 41eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel static DisplayError DestroyResourceDefault(ResourceInterface *resource_intf); 422ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel virtual DisplayError RegisterDisplay(DisplayType type, 432ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel const HWDisplayAttributes &display_attributes, 442ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel const HWPanelInfo &hw_panel_info, 452ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel const HWMixerAttributes &mixer_attributes, 462ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Handle *display_ctx); 472ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel virtual DisplayError UnregisterDisplay(Handle display_ctx); 482ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel virtual DisplayError ReconfigureDisplay(Handle display_ctx, 492ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel const HWDisplayAttributes &display_attributes, 502ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel const HWPanelInfo &hw_panel_info, 512ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel const HWMixerAttributes &mixer_attributes); 522ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel virtual DisplayError Start(Handle display_ctx); 532ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel virtual DisplayError Stop(Handle display_ctx); 54eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel virtual DisplayError Prepare(Handle display_ctx, HWLayers *hw_layers); 552ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel virtual DisplayError PostPrepare(Handle display_ctx, HWLayers *hw_layers); 56eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel virtual DisplayError Commit(Handle display_ctx, HWLayers *hw_layers); 572ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel virtual DisplayError PostCommit(Handle display_ctx, HWLayers *hw_layers); 582ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel virtual void Purge(Handle display_ctx); 592ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel virtual DisplayError SetMaxMixerStages(Handle display_ctx, uint32_t max_mixer_stages); 60051dfd82677c3ad0bb124eb403b75e243650234eThierry Strudel virtual DisplayError ValidateScaling(const LayerRect &crop, const LayerRect &dst, bool rotate90, 61051dfd82677c3ad0bb124eb403b75e243650234eThierry Strudel BufferLayout layout, bool use_rotator_downscale); 622ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayError ValidateCursorConfig(Handle display_ctx, const Layer *layer, bool is_top); 632ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayError ValidateCursorPosition(Handle display_ctx, HWLayers *hw_layers, int x, int y); 642ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayError SetMaxBandwidthMode(HWBwModes mode); 652ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel virtual DisplayError SetDetailEnhancerData(Handle display_ctx, 662ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel const DisplayDetailEnhancerData &de_data); 67cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel virtual DisplayError Perform(int cmd, ...) { return kErrorNone; } 682ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 692ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel private: 702ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel enum PipeOwner { 712ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel kPipeOwnerUserMode, // Pipe state when it is available for reservation 722ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel kPipeOwnerKernelMode, // Pipe state when pipe is owned by kernel 732ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel }; 742ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 752ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel // todo: retrieve all these from kernel 762ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel enum { 772ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel kMaxDecimationDownScaleRatio = 16, 782ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel }; 792ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 802ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel struct SourcePipe { 812ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel PipeType type; 822ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel PipeOwner owner; 832ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel uint32_t mdss_pipe_id; 842ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel uint32_t index; 852ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel HWBlockType hw_block_id; 862ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel int priority; 872ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 882ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel SourcePipe() : type(kPipeTypeUnused), owner(kPipeOwnerUserMode), mdss_pipe_id(0), 892ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel index(0), hw_block_id(kHWBlockMax), priority(0) { } 902ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 912ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel inline void ResetState() { hw_block_id = kHWBlockMax;} 922ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel }; 932ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 942ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel struct DisplayResourceContext { 952ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel HWDisplayAttributes display_attributes; 962ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel HWBlockType hw_block_id; 972ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel uint64_t frame_count; 982ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel HWMixerAttributes mixer_attributes; 992ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1002ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayResourceContext() : hw_block_id(kHWBlockMax), frame_count(0) { } 1012ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel }; 1022ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1032ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel struct HWBlockContext { 1042ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel bool is_in_use; 1052ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel HWBlockContext() : is_in_use(false) { } 1062ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel }; 1072ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 108eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel explicit ResourceDefault(const HWResourceInfo &hw_res_info); 109eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel DisplayError Init(); 110eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel DisplayError Deinit(); 1112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel uint32_t NextPipe(PipeType pipe_type, HWBlockType hw_block_id); 1122ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel uint32_t SearchPipe(HWBlockType hw_block_id, SourcePipe *src_pipes, uint32_t num_pipe); 1132ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel uint32_t GetPipe(HWBlockType hw_block_id, bool need_scale); 1142ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel bool IsScalingNeeded(const HWPipeInfo *pipe_info); 1152ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayError Config(DisplayResourceContext *display_resource_ctx, HWLayers *hw_layers); 1162ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayError DisplaySplitConfig(DisplayResourceContext *display_resource_ctx, 1172ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel const LayerRect &src_rect, const LayerRect &dst_rect, 1182ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel HWLayerConfig *layer_config); 1192ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayError SrcSplitConfig(DisplayResourceContext *display_resource_ctx, 1202ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel const LayerRect &src_rect, const LayerRect &dst_rect, 1212ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel HWLayerConfig *layer_config); 1222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel bool CalculateCropRects(const LayerRect &scissor, LayerRect *crop, LayerRect *dst); 1232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayError ValidateLayerParams(const Layer *layer); 1242ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayError ValidateDimensions(const LayerRect &crop, const LayerRect &dst); 125051dfd82677c3ad0bb124eb403b75e243650234eThierry Strudel DisplayError ValidatePipeParams(HWPipeInfo *pipe_info, LayerBufferFormat format); 1262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayError ValidateDownScaling(float scale_x, float scale_y, bool ubwc_tiled); 1272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayError ValidateUpScaling(float scale_x, float scale_y); 1282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayError GetScaleFactor(const LayerRect &crop, const LayerRect &dst, float *scale_x, 1292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel float *scale_y); 1302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayError SetDecimationFactor(HWPipeInfo *pipe); 1312ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel void SplitRect(const LayerRect &src_rect, const LayerRect &dst_rect, LayerRect *src_left, 1322ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel LayerRect *dst_left, LayerRect *src_right, LayerRect *dst_right); 1332ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayError AlignPipeConfig(const Layer *layer, HWPipeInfo *left_pipe, 1342ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel HWPipeInfo *right_pipe); 1352ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel void ResourceStateLog(void); 1362ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayError CalculateDecimation(float downscale, uint8_t *decimation); 1372ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayError GetScaleLutConfig(HWScaleLutInfo *lut_info); 1382ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1392ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Locker locker_; 1402ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel HWResourceInfo hw_res_info_; 1412ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel HWBlockContext hw_block_ctx_[kHWBlockMax]; 1422ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel std::vector<SourcePipe> src_pipes_; 1432ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel uint32_t num_pipe_ = 0; 1442ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}; 1452ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1462ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} // namespace sdm 1472ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1482ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#endif // __RESOURCE_DEFAULT_H__ 1492ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 150