/* * Copyright (c) 2019, The Linux Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of The Linux Foundation nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef __DRM_PROPERTY_H__ #define __DRM_PROPERTY_H__ #include #include #include #include #include namespace sde_drm { enum struct DRMProperty { INVALID, TYPE, FB_ID, CRTC_ID, CRTC_X, CRTC_Y, CRTC_W, CRTC_H, SRC_X, SRC_Y, SRC_W, SRC_H, ZPOS, ALPHA, EXCL_RECT, H_DECIMATE, V_DECIMATE, INPUT_FENCE, ROTATION, BLEND_OP, SRC_CONFIG, SCALER_V1, SCALER_V2, CSC_V1, CAPABILITIES, MODE_PROPERTIES, LUT_ED, LUT_CIR, LUT_SEP, ROTATOR_CAPS_V1, TRUE_INLINE_ROT_REV, FB_TRANSLATION_MODE, ACTIVE, MODE_ID, OUTPUT_FENCE_OFFSET, OUTPUT_FENCE, ROI_V1, CORE_CLK, CORE_AB, CORE_IB, LLCC_AB, LLCC_IB, DRAM_AB, DRAM_IB, ROT_PREFILL_BW, ROT_CLK, SECURITY_LEVEL, DIM_STAGES_V1, IDLE_TIME, RETIRE_FENCE, DST_X, DST_Y, DST_W, DST_H, LP, HDR_PROPERTIES, DEST_SCALER, DS_LUT_ED, DS_LUT_CIR, DS_LUT_SEP, SDE_DSPP_GAMUT_V3, SDE_DSPP_GAMUT_V4, SDE_DSPP_GAMUT_V5, SDE_DSPP_GC_V1, SDE_DSPP_GC_V2, SDE_DSPP_IGC_V2, SDE_DSPP_IGC_V3, SDE_DSPP_IGC_V4, SDE_DSPP_PCC_V3, SDE_DSPP_PCC_V4, SDE_DSPP_PCC_V5, SDE_DSPP_PA_HSIC_V1, SDE_DSPP_PA_HSIC_V2, SDE_DSPP_PA_SIXZONE_V1, SDE_DSPP_PA_SIXZONE_V2, SDE_DSPP_PA_MEMCOL_SKIN_V1, SDE_DSPP_PA_MEMCOL_SKIN_V2, SDE_DSPP_PA_MEMCOL_SKY_V1, SDE_DSPP_PA_MEMCOL_SKY_V2, SDE_DSPP_PA_MEMCOL_FOLIAGE_V1, SDE_DSPP_PA_MEMCOL_FOLIAGE_V2, SDE_DSPP_PA_MEMCOL_PROT_V1, SDE_DSPP_PA_MEMCOL_PROT_V2, AUTOREFRESH, EXT_HDR_PROPERTIES, HDR_METADATA, MULTIRECT_MODE, ROT_FB_ID, SDE_DSPP_PA_DITHER_V1, SDE_DSPP_PA_DITHER_V2, SDE_PP_DITHER_V1, SDE_PP_DITHER_V2, INVERSE_PMA, CSC_DMA_V1, SDE_DGM_1D_LUT_IGC_V5, SDE_DGM_1D_LUT_GC_V5, SDE_VIG_1D_LUT_IGC_V5, SDE_VIG_1D_LUT_IGC_V6, SDE_VIG_3D_LUT_GAMUT_V5, SDE_VIG_3D_LUT_GAMUT_V6, SDE_DSPP_AD4_MODE, SDE_DSPP_AD4_INIT, SDE_DSPP_AD4_CFG, SDE_DSPP_AD4_INPUT, SDE_DSPP_AD4_BACKLIGHT, SDE_DSPP_AD4_ROI, SDE_DSPP_AD4_ASSERTIVENESS, SDE_DSPP_AD4_STRENGTH, SDE_DSPP_ABA_HIST_CTRL, SDE_DSPP_ABA_HIST_IRQ, SDE_DSPP_ABA_LUT, SDE_DSPP_SV_BL_SCALE, SDE_DSPP_BL_SCALE, CAPTURE_MODE, QSYNC_MODE, IDLE_PC_STATE, TOPOLOGY_CONTROL, EDID, SDE_LTM_VERSION, SDE_LTM_INIT, SDE_LTM_CFG, SDE_LTM_NOISE_THRESH, SDE_LTM_HIST_CTRL, SDE_LTM_BUFFER_CTRL, SDE_LTM_QUEUE_BUFFER, SDE_LTM_QUEUE_BUFFER2, SDE_LTM_QUEUE_BUFFER3, SDE_LTM_VLUT, FRAME_TRIGGER, COLORSPACE, SUPPORTED_COLORSPACES, SDE_SSPP_LAYOUT, // Insert above MAX }; struct DRMPropertyManager { DRMProperty GetPropertyEnum(const std::string &name) const; void SetPropertyId(DRMProperty prop_enum, uint32_t prop_id) { properties_[(uint32_t)prop_enum] = prop_id; } uint32_t GetPropertyId(DRMProperty prop_enum) const { return properties_[(uint32_t)prop_enum]; } bool IsPropertyAvailable(DRMProperty prop_enum) const { return !!properties_[(uint32_t)prop_enum]; } private: uint32_t properties_[(uint32_t)DRMProperty::MAX] {}; }; struct DRMObject { virtual ~DRMObject() = default; virtual uint32_t GetObjectId() = 0; void Dump() {}; void AddProperty(DRMProperty prop, uint64_t value, bool force_dirty = false); void RemoveProperty(DRMProperty prop); size_t ApplyDirtyProperties(drmModeAtomicReq *req); void DiscardDirtyProperties() { dirty_values_.clear(); } void ClearProperties(); void CommitProperties(); protected: explicit DRMObject(DRMPropertyManager &pm); private: std::unordered_map property_values_ {}; // store properties ordered by prop_id to avoid re-sort in libdrm std::map> dirty_values_ {}; DRMPropertyManager& property_manager_; }; template struct DRMObjectManager { virtual ~DRMObjectManager() = default; void DumpById(uint32_t id) { object_pool_.at(id)->Dump(); } void DumpAll() { for (auto &obj : object_pool_) obj.second->Dump(); } size_t ApplyDirtyProperties(drmModeAtomicReq *req) { size_t dirty_count = 0; for (auto &obj : object_pool_) dirty_count += obj.second->ApplyDirtyProperties(req); return dirty_count; } void ClearProperties() { for (auto &obj : object_pool_) obj.second->ClearProperties(); } T* GetObject(uint32_t obj_id) { auto it = object_pool_.find(obj_id); if (it == object_pool_.end()) return nullptr; return it->second.get(); } protected: // store objects ordered by obj_id to avoid re-sort in libdrm std::map> object_pool_{}; }; } // namespace sde_drm #endif // __DRM_PROPERTY_H__