1/* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#include "drmproperty.h" 18#include "drmresources.h" 19 20#include <errno.h> 21#include <stdint.h> 22#include <string> 23 24#include <xf86drmMode.h> 25 26namespace android { 27 28DrmProperty::DrmPropertyEnum::DrmPropertyEnum(drm_mode_property_enum *e) 29 : value_(e->value), name_(e->name) { 30} 31 32DrmProperty::DrmPropertyEnum::~DrmPropertyEnum() { 33} 34 35DrmProperty::DrmProperty(drmModePropertyPtr p, uint64_t value) 36 : id_(0), type_(DRM_PROPERTY_TYPE_INVALID), flags_(0), name_("") { 37 Init(p, value); 38} 39 40DrmProperty::DrmProperty() 41 : id_(0), 42 type_(DRM_PROPERTY_TYPE_INVALID), 43 flags_(0), 44 name_(""), 45 value_(0) { 46} 47 48DrmProperty::~DrmProperty() { 49} 50 51void DrmProperty::Init(drmModePropertyPtr p, uint64_t value) { 52 id_ = p->prop_id; 53 flags_ = p->flags; 54 name_ = p->name; 55 value_ = value; 56 57 for (int i = 0; i < p->count_values; ++i) 58 values_.push_back(p->values[i]); 59 60 for (int i = 0; i < p->count_enums; ++i) 61 enums_.push_back(DrmPropertyEnum(&p->enums[i])); 62 63 for (int i = 0; i < p->count_blobs; ++i) 64 blob_ids_.push_back(p->blob_ids[i]); 65 66 if (flags_ & DRM_MODE_PROP_RANGE) 67 type_ = DRM_PROPERTY_TYPE_INT; 68 else if (flags_ & DRM_MODE_PROP_ENUM) 69 type_ = DRM_PROPERTY_TYPE_ENUM; 70 else if (flags_ & DRM_MODE_PROP_OBJECT) 71 type_ = DRM_PROPERTY_TYPE_OBJECT; 72 else if (flags_ & DRM_MODE_PROP_BLOB) 73 type_ = DRM_PROPERTY_TYPE_BLOB; 74} 75 76uint32_t DrmProperty::id() const { 77 return id_; 78} 79 80std::string DrmProperty::name() const { 81 return name_; 82} 83 84int DrmProperty::value(uint64_t *value) const { 85 if (type_ == DRM_PROPERTY_TYPE_BLOB) { 86 *value = value_; 87 return 0; 88 } 89 90 if (values_.size() == 0) 91 return -ENOENT; 92 93 switch (type_) { 94 case DRM_PROPERTY_TYPE_INT: 95 *value = value_; 96 return 0; 97 98 case DRM_PROPERTY_TYPE_ENUM: 99 if (value_ >= enums_.size()) 100 return -ENOENT; 101 102 *value = enums_[value_].value_; 103 return 0; 104 105 case DRM_PROPERTY_TYPE_OBJECT: 106 *value = value_; 107 return 0; 108 109 default: 110 return -EINVAL; 111 } 112} 113} 114