1*0a9764feSAndroid Build Coastguard Worker /* 2*0a9764feSAndroid Build Coastguard Worker * Copyright (C) 2015 The Android Open Source Project 3*0a9764feSAndroid Build Coastguard Worker * 4*0a9764feSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*0a9764feSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*0a9764feSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*0a9764feSAndroid Build Coastguard Worker * 8*0a9764feSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*0a9764feSAndroid Build Coastguard Worker * 10*0a9764feSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*0a9764feSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*0a9764feSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*0a9764feSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*0a9764feSAndroid Build Coastguard Worker * limitations under the License. 15*0a9764feSAndroid Build Coastguard Worker */ 16*0a9764feSAndroid Build Coastguard Worker 17*0a9764feSAndroid Build Coastguard Worker #pragma once 18*0a9764feSAndroid Build Coastguard Worker 19*0a9764feSAndroid Build Coastguard Worker #include <xf86drmMode.h> 20*0a9764feSAndroid Build Coastguard Worker 21*0a9764feSAndroid Build Coastguard Worker #include <cstdint> 22*0a9764feSAndroid Build Coastguard Worker #include <map> 23*0a9764feSAndroid Build Coastguard Worker #include <optional> 24*0a9764feSAndroid Build Coastguard Worker #include <string> 25*0a9764feSAndroid Build Coastguard Worker #include <vector> 26*0a9764feSAndroid Build Coastguard Worker 27*0a9764feSAndroid Build Coastguard Worker namespace android { 28*0a9764feSAndroid Build Coastguard Worker 29*0a9764feSAndroid Build Coastguard Worker class DrmProperty { 30*0a9764feSAndroid Build Coastguard Worker public: 31*0a9764feSAndroid Build Coastguard Worker DrmProperty() = default; 32*0a9764feSAndroid Build Coastguard Worker DrmProperty(uint32_t obj_id, drmModePropertyPtr p, uint64_t value); 33*0a9764feSAndroid Build Coastguard Worker DrmProperty(const DrmProperty &) = delete; 34*0a9764feSAndroid Build Coastguard Worker DrmProperty &operator=(const DrmProperty &) = delete; 35*0a9764feSAndroid Build Coastguard Worker 36*0a9764feSAndroid Build Coastguard Worker auto Init(uint32_t obj_id, drmModePropertyPtr p, uint64_t value) -> void; 37*0a9764feSAndroid Build Coastguard Worker std::tuple<uint64_t, int> GetEnumValueWithName(const std::string &name) const; 38*0a9764feSAndroid Build Coastguard Worker GetId()39*0a9764feSAndroid Build Coastguard Worker auto GetId() const { 40*0a9764feSAndroid Build Coastguard Worker return id_; 41*0a9764feSAndroid Build Coastguard Worker } 42*0a9764feSAndroid Build Coastguard Worker GetName()43*0a9764feSAndroid Build Coastguard Worker auto GetName() const { 44*0a9764feSAndroid Build Coastguard Worker return name_; 45*0a9764feSAndroid Build Coastguard Worker } 46*0a9764feSAndroid Build Coastguard Worker 47*0a9764feSAndroid Build Coastguard Worker auto GetValue() const -> std::optional<uint64_t>; 48*0a9764feSAndroid Build Coastguard Worker IsImmutable()49*0a9764feSAndroid Build Coastguard Worker bool IsImmutable() const { 50*0a9764feSAndroid Build Coastguard Worker return id_ != 0 && (flags_ & DRM_MODE_PROP_IMMUTABLE) != 0; 51*0a9764feSAndroid Build Coastguard Worker } 52*0a9764feSAndroid Build Coastguard Worker IsRange()53*0a9764feSAndroid Build Coastguard Worker bool IsRange() const { 54*0a9764feSAndroid Build Coastguard Worker return id_ != 0 && (flags_ & DRM_MODE_PROP_RANGE) != 0; 55*0a9764feSAndroid Build Coastguard Worker } 56*0a9764feSAndroid Build Coastguard Worker 57*0a9764feSAndroid Build Coastguard Worker auto RangeMin() const -> std::tuple<int, uint64_t>; 58*0a9764feSAndroid Build Coastguard Worker auto RangeMax() const -> std::tuple<int, uint64_t>; 59*0a9764feSAndroid Build Coastguard Worker 60*0a9764feSAndroid Build Coastguard Worker [[nodiscard]] auto AtomicSet(drmModeAtomicReq &pset, uint64_t value) const 61*0a9764feSAndroid Build Coastguard Worker -> bool; 62*0a9764feSAndroid Build Coastguard Worker 63*0a9764feSAndroid Build Coastguard Worker template <class E> 64*0a9764feSAndroid Build Coastguard Worker auto AddEnumToMap(const std::string &name, E key, std::map<E, uint64_t> &map) 65*0a9764feSAndroid Build Coastguard Worker -> bool; 66*0a9764feSAndroid Build Coastguard Worker 67*0a9764feSAndroid Build Coastguard Worker template <class E> 68*0a9764feSAndroid Build Coastguard Worker auto AddEnumToMapReverse(const std::string &name, E value, 69*0a9764feSAndroid Build Coastguard Worker std::map<uint64_t, E> &map) -> bool; 70*0a9764feSAndroid Build Coastguard Worker 71*0a9764feSAndroid Build Coastguard Worker explicit operator bool() const { 72*0a9764feSAndroid Build Coastguard Worker return id_ != 0; 73*0a9764feSAndroid Build Coastguard Worker } 74*0a9764feSAndroid Build Coastguard Worker 75*0a9764feSAndroid Build Coastguard Worker auto GetEnumNameFromValue(uint64_t value) const -> std::optional<std::string>; 76*0a9764feSAndroid Build Coastguard Worker 77*0a9764feSAndroid Build Coastguard Worker private: 78*0a9764feSAndroid Build Coastguard Worker class DrmPropertyEnum { 79*0a9764feSAndroid Build Coastguard Worker public: 80*0a9764feSAndroid Build Coastguard Worker explicit DrmPropertyEnum(drm_mode_property_enum *e); 81*0a9764feSAndroid Build Coastguard Worker ~DrmPropertyEnum() = default; 82*0a9764feSAndroid Build Coastguard Worker 83*0a9764feSAndroid Build Coastguard Worker uint64_t value; 84*0a9764feSAndroid Build Coastguard Worker std::string name; 85*0a9764feSAndroid Build Coastguard Worker }; 86*0a9764feSAndroid Build Coastguard Worker 87*0a9764feSAndroid Build Coastguard Worker uint32_t obj_id_ = 0; 88*0a9764feSAndroid Build Coastguard Worker uint32_t id_ = 0; 89*0a9764feSAndroid Build Coastguard Worker 90*0a9764feSAndroid Build Coastguard Worker uint32_t flags_ = 0; 91*0a9764feSAndroid Build Coastguard Worker std::string name_; 92*0a9764feSAndroid Build Coastguard Worker uint64_t value_ = 0; 93*0a9764feSAndroid Build Coastguard Worker 94*0a9764feSAndroid Build Coastguard Worker std::vector<uint64_t> values_; 95*0a9764feSAndroid Build Coastguard Worker std::vector<DrmPropertyEnum> enums_; 96*0a9764feSAndroid Build Coastguard Worker std::vector<uint32_t> blob_ids_; 97*0a9764feSAndroid Build Coastguard Worker }; 98*0a9764feSAndroid Build Coastguard Worker 99*0a9764feSAndroid Build Coastguard Worker template <class E> 100*0a9764feSAndroid Build Coastguard Worker auto DrmProperty::AddEnumToMap(const std::string &name, E key, 101*0a9764feSAndroid Build Coastguard Worker std::map<E, uint64_t> &map) -> bool { 102*0a9764feSAndroid Build Coastguard Worker uint64_t enum_value = UINT64_MAX; 103*0a9764feSAndroid Build Coastguard Worker int err = 0; 104*0a9764feSAndroid Build Coastguard Worker std::tie(enum_value, err) = GetEnumValueWithName(name); 105*0a9764feSAndroid Build Coastguard Worker if (err == 0) { 106*0a9764feSAndroid Build Coastguard Worker map[key] = enum_value; 107*0a9764feSAndroid Build Coastguard Worker return true; 108*0a9764feSAndroid Build Coastguard Worker } 109*0a9764feSAndroid Build Coastguard Worker 110*0a9764feSAndroid Build Coastguard Worker return false; 111*0a9764feSAndroid Build Coastguard Worker } 112*0a9764feSAndroid Build Coastguard Worker 113*0a9764feSAndroid Build Coastguard Worker template <class E> 114*0a9764feSAndroid Build Coastguard Worker auto DrmProperty::AddEnumToMapReverse(const std::string &name, E value, 115*0a9764feSAndroid Build Coastguard Worker std::map<uint64_t, E> &map) -> bool { 116*0a9764feSAndroid Build Coastguard Worker uint64_t enum_value = UINT64_MAX; 117*0a9764feSAndroid Build Coastguard Worker int err = 0; 118*0a9764feSAndroid Build Coastguard Worker std::tie(enum_value, err) = GetEnumValueWithName(name); 119*0a9764feSAndroid Build Coastguard Worker if (err == 0) { 120*0a9764feSAndroid Build Coastguard Worker map[enum_value] = value; 121*0a9764feSAndroid Build Coastguard Worker return true; 122*0a9764feSAndroid Build Coastguard Worker } 123*0a9764feSAndroid Build Coastguard Worker 124*0a9764feSAndroid Build Coastguard Worker return false; 125*0a9764feSAndroid Build Coastguard Worker } 126*0a9764feSAndroid Build Coastguard Worker 127*0a9764feSAndroid Build Coastguard Worker } // namespace android 128