16a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul/*
26a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul * Copyright (C) 2015 The Android Open Source Project
36a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul *
46a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul * Licensed under the Apache License, Version 2.0 (the "License");
56a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul * you may not use this file except in compliance with the License.
66a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul * You may obtain a copy of the License at
76a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul *
86a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul *      http://www.apache.org/licenses/LICENSE-2.0
96a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul *
106a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul * Unless required by applicable law or agreed to in writing, software
116a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul * distributed under the License is distributed on an "AS IS" BASIS,
126a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul * See the License for the specific language governing permissions and
146a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul * limitations under the License.
156a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul */
166a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
176a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul#include "drmmode.h"
186a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul#include "drmresources.h"
196a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
206a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul#include <stdint.h>
216a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul#include <string>
226a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul#include <xf86drmMode.h>
236a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
246a55e9fb8e16c63c2e42bde31814f963205f722dSean Paulnamespace android {
256a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
266a55e9fb8e16c63c2e42bde31814f963205f722dSean PaulDrmMode::DrmMode(drmModeModeInfoPtr m)
276a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul    : id_(0),
286a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul      clock_(m->clock),
296a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul      h_display_(m->hdisplay),
306a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul      h_sync_start_(m->hsync_start),
316a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul      h_sync_end_(m->hsync_end),
326a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul      h_total_(m->htotal),
336a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul      h_skew_(m->hskew),
346a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul      v_display_(m->vdisplay),
356a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul      v_sync_start_(m->vsync_start),
366a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul      v_sync_end_(m->vsync_end),
376a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul      v_total_(m->vtotal),
386a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul      v_scan_(m->vscan),
39ad563d42f18fd4f8f99f489fa1b15fd709450025Sean Paul      v_refresh_(m->vrefresh),
406a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul      flags_(m->flags),
416a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul      type_(m->type),
426a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul      name_(m->name) {
436a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul}
446a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
456a55e9fb8e16c63c2e42bde31814f963205f722dSean Paulbool DrmMode::operator==(const drmModeModeInfo &m) const {
466a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  return clock_ == m.clock && h_display_ == m.hdisplay &&
476a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul         h_sync_start_ == m.hsync_start && h_sync_end_ == m.hsync_end &&
486a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul         h_total_ == m.htotal && h_skew_ == m.hskew &&
496a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul         v_display_ == m.vdisplay && v_sync_start_ == m.vsync_start &&
506a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul         v_sync_end_ == m.vsync_end && v_total_ == m.vtotal &&
51c6520e488fa82accb1882381bb5540ea419a0276Zach Reizner         v_scan_ == m.vscan && flags_ == m.flags && type_ == m.type;
526a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul}
536a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
54877be974a2d4fc518700be8ffe803a50cb716eadSean Paulvoid DrmMode::ToDrmModeModeInfo(drm_mode_modeinfo *m) const {
556a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  m->clock = clock_;
566a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  m->hdisplay = h_display_;
576a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  m->hsync_start = h_sync_start_;
586a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  m->hsync_end = h_sync_end_;
596a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  m->htotal = h_total_;
606a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  m->hskew = h_skew_;
616a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  m->vdisplay = v_display_;
626a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  m->vsync_start = v_sync_start_;
636a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  m->vsync_end = v_sync_end_;
646a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  m->vtotal = v_total_;
656a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  m->vscan = v_scan_;
66ad563d42f18fd4f8f99f489fa1b15fd709450025Sean Paul  m->vrefresh = v_refresh_;
676a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  m->flags = flags_;
686a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  m->type = type_;
696a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  strncpy(m->name, name_.c_str(), DRM_DISPLAY_MODE_LEN);
706a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul}
716a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
726a55e9fb8e16c63c2e42bde31814f963205f722dSean Pauluint32_t DrmMode::id() const {
736a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  return id_;
746a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul}
756a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
766a55e9fb8e16c63c2e42bde31814f963205f722dSean Paulvoid DrmMode::set_id(uint32_t id) {
776a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  id_ = id;
786a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul}
796a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
806a55e9fb8e16c63c2e42bde31814f963205f722dSean Pauluint32_t DrmMode::clock() const {
816a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  return clock_;
826a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul}
836a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
846a55e9fb8e16c63c2e42bde31814f963205f722dSean Pauluint32_t DrmMode::h_display() const {
856a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  return h_display_;
866a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul}
876a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
886a55e9fb8e16c63c2e42bde31814f963205f722dSean Pauluint32_t DrmMode::h_sync_start() const {
896a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  return h_sync_start_;
906a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul}
916a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
926a55e9fb8e16c63c2e42bde31814f963205f722dSean Pauluint32_t DrmMode::h_sync_end() const {
936a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  return h_sync_end_;
946a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul}
956a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
966a55e9fb8e16c63c2e42bde31814f963205f722dSean Pauluint32_t DrmMode::h_total() const {
976a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  return h_total_;
986a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul}
996a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
1006a55e9fb8e16c63c2e42bde31814f963205f722dSean Pauluint32_t DrmMode::h_skew() const {
1016a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  return h_skew_;
1026a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul}
1036a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
1046a55e9fb8e16c63c2e42bde31814f963205f722dSean Pauluint32_t DrmMode::v_display() const {
1056a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  return v_display_;
1066a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul}
1076a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
1086a55e9fb8e16c63c2e42bde31814f963205f722dSean Pauluint32_t DrmMode::v_sync_start() const {
1096a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  return v_sync_start_;
1106a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul}
1116a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
1126a55e9fb8e16c63c2e42bde31814f963205f722dSean Pauluint32_t DrmMode::v_sync_end() const {
1136a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  return v_sync_end_;
1146a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul}
1156a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
1166a55e9fb8e16c63c2e42bde31814f963205f722dSean Pauluint32_t DrmMode::v_total() const {
1176a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  return v_total_;
1186a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul}
1196a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
1206a55e9fb8e16c63c2e42bde31814f963205f722dSean Pauluint32_t DrmMode::v_scan() const {
1216a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  return v_scan_;
1226a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul}
1236a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
124b74e08cc80325883bf4561e11cec0e83f0863728Stéphane Marchesinfloat DrmMode::v_refresh() const {
125ad563d42f18fd4f8f99f489fa1b15fd709450025Sean Paul  return v_refresh_ ? v_refresh_ * 1.0f :
126ad563d42f18fd4f8f99f489fa1b15fd709450025Sean Paul                      clock_ / (float)(v_total_ * h_total_) * 1000.0f;
1276a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul}
1286a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
1296a55e9fb8e16c63c2e42bde31814f963205f722dSean Pauluint32_t DrmMode::flags() const {
1306a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  return flags_;
1316a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul}
1326a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
1336a55e9fb8e16c63c2e42bde31814f963205f722dSean Pauluint32_t DrmMode::type() const {
1346a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  return type_;
1356a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul}
1366a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
1376a55e9fb8e16c63c2e42bde31814f963205f722dSean Paulstd::string DrmMode::name() const {
1386a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  return name_;
1396a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul}
1406a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul}
141