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