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