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#define LOG_TAG "hwc-drm-plane"
186a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
196a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul#include "drmplane.h"
206a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul#include "drmresources.h"
216a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
226a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul#include <errno.h>
236a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul#include <stdint.h>
246a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
256a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul#include <cutils/log.h>
266a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul#include <xf86drmMode.h>
276a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
286a55e9fb8e16c63c2e42bde31814f963205f722dSean Paulnamespace android {
296a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
306a55e9fb8e16c63c2e42bde31814f963205f722dSean PaulDrmPlane::DrmPlane(DrmResources *drm, drmModePlanePtr p)
316a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul    : drm_(drm), id_(p->plane_id), possible_crtc_mask_(p->possible_crtcs) {
326a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul}
336a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
346a55e9fb8e16c63c2e42bde31814f963205f722dSean PaulDrmPlane::~DrmPlane() {
356a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul}
366a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
376a55e9fb8e16c63c2e42bde31814f963205f722dSean Paulint DrmPlane::Init() {
386a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  DrmProperty p;
396a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
406a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  int ret = drm_->GetPlaneProperty(*this, "type", &p);
416a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  if (ret) {
426a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul    ALOGE("Could not get plane type property");
436a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul    return ret;
446a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  }
456a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
466a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  uint64_t type;
476a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  ret = p.value(&type);
486a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  if (ret) {
496a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul    ALOGE("Failed to get plane type property value");
506a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul    return ret;
516a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  }
526a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  switch (type) {
536a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul    case DRM_PLANE_TYPE_OVERLAY:
546a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul    case DRM_PLANE_TYPE_PRIMARY:
556a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul    case DRM_PLANE_TYPE_CURSOR:
566a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul      type_ = (uint32_t)type;
576a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul      break;
586a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul    default:
596a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul      ALOGE("Invalid plane type %d", type);
606a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul      return -EINVAL;
616a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  }
626a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
636a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  ret = drm_->GetPlaneProperty(*this, "CRTC_ID", &crtc_property_);
646a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  if (ret) {
656a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul    ALOGE("Could not get CRTC_ID property");
666a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul    return ret;
676a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  }
686a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
696a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  ret = drm_->GetPlaneProperty(*this, "FB_ID", &fb_property_);
706a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  if (ret) {
716a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul    ALOGE("Could not get FB_ID property");
726a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul    return ret;
736a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  }
746a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
756a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  ret = drm_->GetPlaneProperty(*this, "CRTC_X", &crtc_x_property_);
766a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  if (ret) {
776a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul    ALOGE("Could not get CRTC_X property");
786a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul    return ret;
796a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  }
806a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
816a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  ret = drm_->GetPlaneProperty(*this, "CRTC_Y", &crtc_y_property_);
826a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  if (ret) {
836a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul    ALOGE("Could not get CRTC_Y property");
846a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul    return ret;
856a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  }
866a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
876a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  ret = drm_->GetPlaneProperty(*this, "CRTC_W", &crtc_w_property_);
886a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  if (ret) {
896a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul    ALOGE("Could not get CRTC_W property");
906a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul    return ret;
916a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  }
926a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
936a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  ret = drm_->GetPlaneProperty(*this, "CRTC_H", &crtc_h_property_);
946a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  if (ret) {
956a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul    ALOGE("Could not get CRTC_H property");
966a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul    return ret;
976a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  }
986a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
996a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  ret = drm_->GetPlaneProperty(*this, "SRC_X", &src_x_property_);
1006a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  if (ret) {
1016a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul    ALOGE("Could not get SRC_X property");
1026a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul    return ret;
1036a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  }
1046a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
1056a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  ret = drm_->GetPlaneProperty(*this, "SRC_Y", &src_y_property_);
1066a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  if (ret) {
1076a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul    ALOGE("Could not get SRC_Y property");
1086a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul    return ret;
1096a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  }
1106a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
1116a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  ret = drm_->GetPlaneProperty(*this, "SRC_W", &src_w_property_);
1126a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  if (ret) {
1136a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul    ALOGE("Could not get SRC_W property");
1146a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul    return ret;
1156a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  }
1166a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
1176a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  ret = drm_->GetPlaneProperty(*this, "SRC_H", &src_h_property_);
1186a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  if (ret) {
1196a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul    ALOGE("Could not get SRC_H property");
1206a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul    return ret;
1216a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  }
1226a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
1231c4c32635df1f45bbcf63c8c1a76207ca90402e5Sean Paul  ret = drm_->GetPlaneProperty(*this, "rotation", &rotation_property_);
1241c4c32635df1f45bbcf63c8c1a76207ca90402e5Sean Paul  if (ret)
1251c4c32635df1f45bbcf63c8c1a76207ca90402e5Sean Paul    ALOGE("Could not get rotation property");
1261c4c32635df1f45bbcf63c8c1a76207ca90402e5Sean Paul
127d8aefb635a854c36b0cf2eb36ecdf9070ddc7151Sean Paul  ret = drm_->GetPlaneProperty(*this, "alpha", &alpha_property_);
128d8aefb635a854c36b0cf2eb36ecdf9070ddc7151Sean Paul  if (ret)
129d8aefb635a854c36b0cf2eb36ecdf9070ddc7151Sean Paul    ALOGI("Could not get alpha property");
130d8aefb635a854c36b0cf2eb36ecdf9070ddc7151Sean Paul
1316a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  return 0;
1326a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul}
1336a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
1346a55e9fb8e16c63c2e42bde31814f963205f722dSean Pauluint32_t DrmPlane::id() const {
1356a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  return id_;
1366a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul}
1376a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
1386a55e9fb8e16c63c2e42bde31814f963205f722dSean Paulbool DrmPlane::GetCrtcSupported(const DrmCrtc &crtc) const {
1396a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  return !!((1 << crtc.pipe()) & possible_crtc_mask_);
1406a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul}
1416a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
1426a55e9fb8e16c63c2e42bde31814f963205f722dSean Pauluint32_t DrmPlane::type() const {
1436a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  return type_;
1446a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul}
1456a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
1466a55e9fb8e16c63c2e42bde31814f963205f722dSean Paulconst DrmProperty &DrmPlane::crtc_property() const {
1476a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  return crtc_property_;
1486a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul}
1496a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
1506a55e9fb8e16c63c2e42bde31814f963205f722dSean Paulconst DrmProperty &DrmPlane::fb_property() const {
1516a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  return fb_property_;
1526a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul}
1536a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
1546a55e9fb8e16c63c2e42bde31814f963205f722dSean Paulconst DrmProperty &DrmPlane::crtc_x_property() const {
1556a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  return crtc_x_property_;
1566a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul}
1576a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
1586a55e9fb8e16c63c2e42bde31814f963205f722dSean Paulconst DrmProperty &DrmPlane::crtc_y_property() const {
1596a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  return crtc_y_property_;
1606a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul}
1616a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
1626a55e9fb8e16c63c2e42bde31814f963205f722dSean Paulconst DrmProperty &DrmPlane::crtc_w_property() const {
1636a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  return crtc_w_property_;
1646a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul}
1656a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
1666a55e9fb8e16c63c2e42bde31814f963205f722dSean Paulconst DrmProperty &DrmPlane::crtc_h_property() const {
1676a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  return crtc_h_property_;
1686a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul}
1696a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
1706a55e9fb8e16c63c2e42bde31814f963205f722dSean Paulconst DrmProperty &DrmPlane::src_x_property() const {
1716a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  return src_x_property_;
1726a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul}
1736a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
1746a55e9fb8e16c63c2e42bde31814f963205f722dSean Paulconst DrmProperty &DrmPlane::src_y_property() const {
1756a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  return src_y_property_;
1766a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul}
1776a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
1786a55e9fb8e16c63c2e42bde31814f963205f722dSean Paulconst DrmProperty &DrmPlane::src_w_property() const {
1796a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  return src_w_property_;
1806a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul}
1816a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul
1826a55e9fb8e16c63c2e42bde31814f963205f722dSean Paulconst DrmProperty &DrmPlane::src_h_property() const {
1836a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul  return src_h_property_;
1846a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul}
1851c4c32635df1f45bbcf63c8c1a76207ca90402e5Sean Paul
1861c4c32635df1f45bbcf63c8c1a76207ca90402e5Sean Paulconst DrmProperty &DrmPlane::rotation_property() const {
1871c4c32635df1f45bbcf63c8c1a76207ca90402e5Sean Paul  return rotation_property_;
1881c4c32635df1f45bbcf63c8c1a76207ca90402e5Sean Paul}
189d8aefb635a854c36b0cf2eb36ecdf9070ddc7151Sean Paul
190d8aefb635a854c36b0cf2eb36ecdf9070ddc7151Sean Paulconst DrmProperty &DrmPlane::alpha_property() const {
191d8aefb635a854c36b0cf2eb36ecdf9070ddc7151Sean Paul  return alpha_property_;
192d8aefb635a854c36b0cf2eb36ecdf9070ddc7151Sean Paul}
1936a55e9fb8e16c63c2e42bde31814f963205f722dSean Paul}
194