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