14a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh/* 24a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* Copyright (c) 2014 - 2017, The Linux Foundation. All rights reserved. 34a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* 44a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* Redistribution and use in source and binary forms, with or without modification, are permitted 54a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* provided that the following conditions are met: 64a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* * Redistributions of source code must retain the above copyright notice, this list of 74a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* conditions and the following disclaimer. 84a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* * Redistributions in binary form must reproduce the above copyright notice, this list of 94a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* conditions and the following disclaimer in the documentation and/or other materials provided 104a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* with the distribution. 114a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* * Neither the name of The Linux Foundation nor the names of its contributors may be used to 124a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* endorse or promote products derived from this software without specific prior written 134a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* permission. 144a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* 154a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 164a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 174a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE 184a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 194a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 204a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 214a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 224a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 234a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh*/ 244a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 254a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#ifndef __RESOURCE_DEFAULT_H__ 264a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#define __RESOURCE_DEFAULT_H__ 274a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 284a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#include <core/display_interface.h> 294a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#include <private/resource_interface.h> 304a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#include <utils/locker.h> 314a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#include <vector> 324a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 334a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#include "hw_interface.h" 344a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 354a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanhnamespace sdm { 364a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 374a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanhclass ResourceDefault : public ResourceInterface { 384a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh public: 394a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh static DisplayError CreateResourceDefault(const HWResourceInfo &hw_resource_info, 404a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh ResourceInterface **resource_intf); 414a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh static DisplayError DestroyResourceDefault(ResourceInterface *resource_intf); 424a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh virtual DisplayError RegisterDisplay(DisplayType type, 434a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh const HWDisplayAttributes &display_attributes, 444a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh const HWPanelInfo &hw_panel_info, 454a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh const HWMixerAttributes &mixer_attributes, 464a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh Handle *display_ctx); 474a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh virtual DisplayError UnregisterDisplay(Handle display_ctx); 484a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh virtual DisplayError ReconfigureDisplay(Handle display_ctx, 494a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh const HWDisplayAttributes &display_attributes, 504a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh const HWPanelInfo &hw_panel_info, 514a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh const HWMixerAttributes &mixer_attributes); 524a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh virtual DisplayError Start(Handle display_ctx); 534a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh virtual DisplayError Stop(Handle display_ctx, HWLayers *hw_layers); 544a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh virtual DisplayError Prepare(Handle display_ctx, HWLayers *hw_layers); 554a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh virtual DisplayError PostPrepare(Handle display_ctx, HWLayers *hw_layers); 564a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh virtual DisplayError Commit(Handle display_ctx, HWLayers *hw_layers); 574a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh virtual DisplayError PostCommit(Handle display_ctx, HWLayers *hw_layers); 584a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh virtual void Purge(Handle display_ctx); 594a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh virtual DisplayError SetMaxMixerStages(Handle display_ctx, uint32_t max_mixer_stages); 604a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh virtual DisplayError ValidateScaling(const LayerRect &crop, const LayerRect &dst, bool rotate90, 614a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh BufferLayout layout, bool use_rotator_downscale); 624a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh DisplayError ValidateCursorConfig(Handle display_ctx, const Layer *layer, bool is_top); 634a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh DisplayError ValidateAndSetCursorPosition(Handle display_ctx, HWLayers *hw_layers, int x, int y, 644a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh DisplayConfigVariableInfo *fb_config); 654a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh DisplayError SetMaxBandwidthMode(HWBwModes mode); 664a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh virtual DisplayError SetDetailEnhancerData(Handle display_ctx, 674a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh const DisplayDetailEnhancerData &de_data); 684a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh virtual DisplayError Perform(int cmd, ...) { return kErrorNone; } 694a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 704a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh private: 714a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh enum PipeOwner { 724a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh kPipeOwnerUserMode, // Pipe state when it is available for reservation 734a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh kPipeOwnerKernelMode, // Pipe state when pipe is owned by kernel 744a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh }; 754a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 764a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh // todo: retrieve all these from kernel 774a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh enum { 784a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh kMaxDecimationDownScaleRatio = 16, 794a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh }; 804a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 814a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh struct SourcePipe { 824a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh PipeType type; 834a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh PipeOwner owner; 844a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh uint32_t mdss_pipe_id; 854a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh uint32_t index; 864a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh HWBlockType hw_block_id; 874a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh int priority; 884a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 894a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh SourcePipe() : type(kPipeTypeUnused), owner(kPipeOwnerUserMode), mdss_pipe_id(0), 904a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh index(0), hw_block_id(kHWBlockMax), priority(0) { } 914a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 924a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh inline void ResetState() { hw_block_id = kHWBlockMax;} 934a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh }; 944a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 954a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh struct DisplayResourceContext { 964a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh HWDisplayAttributes display_attributes; 974a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh HWBlockType hw_block_id; 984a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh uint64_t frame_count; 994a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh HWMixerAttributes mixer_attributes; 1004a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 1014a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh DisplayResourceContext() : hw_block_id(kHWBlockMax), frame_count(0) { } 1024a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh }; 1034a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 1044a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh struct HWBlockContext { 1054a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh bool is_in_use; 1064a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh HWBlockContext() : is_in_use(false) { } 1074a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh }; 1084a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 1094a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh explicit ResourceDefault(const HWResourceInfo &hw_res_info); 1104a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh DisplayError Init(); 1114a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh DisplayError Deinit(); 1124a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh uint32_t NextPipe(PipeType pipe_type, HWBlockType hw_block_id); 1134a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh uint32_t SearchPipe(HWBlockType hw_block_id, SourcePipe *src_pipes, uint32_t num_pipe); 1144a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh uint32_t GetPipe(HWBlockType hw_block_id, bool need_scale); 1154a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh bool IsScalingNeeded(const HWPipeInfo *pipe_info); 1164a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh DisplayError Config(DisplayResourceContext *display_resource_ctx, HWLayers *hw_layers); 1174a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh DisplayError DisplaySplitConfig(DisplayResourceContext *display_resource_ctx, 1184a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh const LayerRect &src_rect, const LayerRect &dst_rect, 1194a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh HWLayerConfig *layer_config); 1204a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh DisplayError SrcSplitConfig(DisplayResourceContext *display_resource_ctx, 1214a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh const LayerRect &src_rect, const LayerRect &dst_rect, 1224a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh HWLayerConfig *layer_config); 1234a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh bool CalculateCropRects(const LayerRect &scissor, LayerRect *crop, LayerRect *dst); 1244a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh DisplayError ValidateLayerParams(const Layer *layer); 1254a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh DisplayError ValidateDimensions(const LayerRect &crop, const LayerRect &dst); 1264a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh DisplayError ValidatePipeParams(HWPipeInfo *pipe_info, LayerBufferFormat format); 1274a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh DisplayError ValidateDownScaling(float scale_x, float scale_y, bool ubwc_tiled); 1284a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh DisplayError ValidateUpScaling(float scale_x, float scale_y); 1294a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh DisplayError GetScaleFactor(const LayerRect &crop, const LayerRect &dst, float *scale_x, 1304a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh float *scale_y); 1314a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh DisplayError SetDecimationFactor(HWPipeInfo *pipe); 1324a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh void SplitRect(const LayerRect &src_rect, const LayerRect &dst_rect, LayerRect *src_left, 1334a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh LayerRect *dst_left, LayerRect *src_right, LayerRect *dst_right); 1344a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh DisplayError AlignPipeConfig(const Layer *layer, HWPipeInfo *left_pipe, 1354a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh HWPipeInfo *right_pipe); 1364a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh void ResourceStateLog(void); 1374a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh DisplayError CalculateDecimation(float downscale, uint8_t *decimation); 1384a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh DisplayError GetScaleLutConfig(HWScaleLutInfo *lut_info); 1394a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 1404a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh Locker locker_; 1414a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh HWResourceInfo hw_res_info_; 1424a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh HWBlockContext hw_block_ctx_[kHWBlockMax]; 1434a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh std::vector<SourcePipe> src_pipes_; 1444a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh uint32_t num_pipe_ = 0; 1454a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh}; 1464a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 1474a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh} // namespace sdm 1484a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 1494a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#endif // __RESOURCE_DEFAULT_H__ 1504a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh 151