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 #define LOG_TAG "hwc-drm-connector"
18 
19 #include "drmconnector.h"
20 #include "drmresources.h"
21 
22 #include <errno.h>
23 #include <stdint.h>
24 
25 #include <cutils/log.h>
26 #include <xf86drmMode.h>
27 
28 namespace android {
29 
DrmConnector(DrmResources * drm,drmModeConnectorPtr c,DrmEncoder * current_encoder,std::vector<DrmEncoder * > & possible_encoders)30 DrmConnector::DrmConnector(DrmResources *drm, drmModeConnectorPtr c,
31                            DrmEncoder *current_encoder,
32                            std::vector<DrmEncoder *> &possible_encoders)
33     : drm_(drm),
34       id_(c->connector_id),
35       encoder_(current_encoder),
36       display_(-1),
37       type_(c->connector_type),
38       state_(c->connection),
39       mm_width_(c->mmWidth),
40       mm_height_(c->mmHeight),
41       possible_encoders_(possible_encoders) {
42 }
43 
Init()44 int DrmConnector::Init() {
45   int ret = drm_->GetConnectorProperty(*this, "DPMS", &dpms_property_);
46   if (ret) {
47     ALOGE("Could not get DPMS property\n");
48     return ret;
49   }
50   ret = drm_->GetConnectorProperty(*this, "CRTC_ID", &crtc_id_property_);
51   if (ret) {
52     ALOGE("Could not get CRTC_ID property\n");
53     return ret;
54   }
55   return 0;
56 }
57 
id() const58 uint32_t DrmConnector::id() const {
59   return id_;
60 }
61 
display() const62 int DrmConnector::display() const {
63   return display_;
64 }
65 
set_display(int display)66 void DrmConnector::set_display(int display) {
67   display_ = display;
68 }
69 
built_in() const70 bool DrmConnector::built_in() const {
71   return type_ == DRM_MODE_CONNECTOR_LVDS || type_ == DRM_MODE_CONNECTOR_eDP ||
72          type_ == DRM_MODE_CONNECTOR_DSI;
73 }
74 
UpdateModes()75 int DrmConnector::UpdateModes() {
76   int fd = drm_->fd();
77 
78   drmModeConnectorPtr c = drmModeGetConnector(fd, id_);
79   if (!c) {
80     ALOGE("Failed to get connector %d", id_);
81     return -ENODEV;
82   }
83 
84   state_ = c->connection;
85 
86   std::vector<DrmMode> new_modes;
87   for (int i = 0; i < c->count_modes; ++i) {
88     bool exists = false;
89     for (const DrmMode &mode : modes_) {
90       if (mode == c->modes[i]) {
91         new_modes.push_back(mode);
92         exists = true;
93         break;
94       }
95     }
96     if (exists)
97       continue;
98 
99     DrmMode m(&c->modes[i]);
100     m.set_id(drm_->next_mode_id());
101     new_modes.push_back(m);
102   }
103   modes_.swap(new_modes);
104   return 0;
105 }
106 
active_mode() const107 const DrmMode &DrmConnector::active_mode() const {
108   return active_mode_;
109 }
110 
set_active_mode(const DrmMode & mode)111 void DrmConnector::set_active_mode(const DrmMode &mode) {
112   active_mode_ = mode;
113 }
114 
dpms_property() const115 const DrmProperty &DrmConnector::dpms_property() const {
116   return dpms_property_;
117 }
118 
crtc_id_property() const119 const DrmProperty &DrmConnector::crtc_id_property() const {
120   return crtc_id_property_;
121 }
122 
encoder() const123 DrmEncoder *DrmConnector::encoder() const {
124   return encoder_;
125 }
126 
set_encoder(DrmEncoder * encoder)127 void DrmConnector::set_encoder(DrmEncoder *encoder) {
128   encoder_ = encoder;
129 }
130 
state() const131 drmModeConnection DrmConnector::state() const {
132   return state_;
133 }
134 
mm_width() const135 uint32_t DrmConnector::mm_width() const {
136   return mm_width_;
137 }
138 
mm_height() const139 uint32_t DrmConnector::mm_height() const {
140   return mm_height_;
141 }
142 }
143