diff options
5 files changed, 68 insertions, 8 deletions
diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp index ebf45f5..a65c6ec 100644 --- a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp +++ b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp @@ -30,6 +30,7 @@ #include "BrightnessController.h" #include "ExynosHWCDebug.h" #include "ExynosHWCHelper.h" +#include "ExynosPrimaryDisplay.h" using namespace std::chrono_literals; using namespace SOC_VERSION; @@ -594,6 +595,27 @@ void ExynosDisplayDrmInterface::updateMountOrientation() ALOGW("%s ignore unrecoganized orientation %" PRId64, __func__, drmOrientation); } +void ExynosDisplayDrmInterface::parseRCDId(const DrmProperty &property) { + if (mExynosDisplay->mType != HWC_DISPLAY_PRIMARY) { + ALOGW("%s invalid display type: %d", __func__, mExynosDisplay->mType); + return; + } + + if (property.id() == 0) { + static_cast<ExynosPrimaryDisplay *>(mExynosDisplay)->mRcdId = -1; + return; + } + + auto [err, rcd_id] = property.value(); + if (err < 0) { + ALOGW("%s failed to get drm prop value", __func__); + return; + } + + if (getSpecialChannelId(rcd_id) >= 0) + static_cast<ExynosPrimaryDisplay *>(mExynosDisplay)->mRcdId = rcd_id; +} + uint32_t ExynosDisplayDrmInterface::getDrmDisplayId(uint32_t type, uint32_t index) { return type+index; @@ -680,6 +702,8 @@ int32_t ExynosDisplayDrmInterface::initDrmDevice(DrmDevice *drmDevice) parseMipiSyncEnums(mDrmConnector->mipi_sync()); updateMountOrientation(); + if (mExynosDisplay->mType == HWC_DISPLAY_PRIMARY) parseRCDId(mDrmCrtc->rcd_plane_id_property()); + if (mExynosDisplay->mBrightnessController && mExynosDisplay->mBrightnessController->initDrm(*mDrmDevice, *mDrmConnector)) { ALOGW("%s failed to init brightness controller", __func__); @@ -1767,15 +1791,18 @@ int32_t ExynosDisplayDrmInterface::deliverWinConfigData() for (size_t i = 0; i < mExynosDisplay->mDpuData.rcdConfigs.size(); ++i) { exynos_win_config_data &config = mExynosDisplay->mDpuData.rcdConfigs[i]; - if (config.state == config.WIN_STATE_RCD) { - const int channelId = mExynosDisplay->mDevice->getSpecialPlaneId( - mExynosDisplay->mIndex); // TODO: b/227584297 - auto &plane = mDrmDevice->planes().at(channelId); - uint32_t fbId = 0; - if ((ret = setupCommitFromDisplayConfig(drmReq, config, i, plane, fbId)) < 0) { - HWC_LOGE(mExynosDisplay, "setupCommitFromDisplayConfig failed, config[%zu]", i); + if ((config.state == config.WIN_STATE_RCD) && + (mExynosDisplay->mType == HWC_DISPLAY_PRIMARY)) { + const int32_t rcdId = static_cast<ExynosPrimaryDisplay *>(mExynosDisplay)->mRcdId; + const int32_t channelId = getSpecialChannelId(rcdId); + if (channelId >= 0) { + auto &plane = mDrmDevice->planes().at(channelId); + uint32_t fbId = 0; + if ((ret = setupCommitFromDisplayConfig(drmReq, config, i, plane, fbId)) < 0) { + HWC_LOGE(mExynosDisplay, "setupCommitFromDisplayConfig failed, config[%zu]", i); + } + planeEnableInfo[plane->id()] = 1; } - planeEnableInfo[plane->id()] = 1; } } @@ -1789,6 +1816,10 @@ int32_t ExynosDisplayDrmInterface::deliverWinConfigData() (exynosMPP->mReservedDisplay != (int32_t)mExynosDisplay->mDisplayId)) continue; + if ((exynosMPP == NULL) && (mExynosDisplay->mType == HWC_DISPLAY_PRIMARY) && + (plane->id() != static_cast<ExynosPrimaryDisplay *>(mExynosDisplay)->mRcdId)) + continue; + if ((ret = drmReq.atomicAddProperty(plane->id(), plane->crtc_property(), 0)) < 0) return ret; @@ -2440,3 +2471,16 @@ int32_t ExynosDisplayDrmInterface::getDisplayIdentificationData( return HWC2_ERROR_NONE; } + +int32_t ExynosDisplayDrmInterface::getSpecialChannelId(uint32_t planeId) { + ExynosDevice *exynosDevice = mExynosDisplay->mDevice; + for (int i = 0; i < exynosDevice->getSpecialPlaneNum(); i++) { + const int32_t channelId = exynosDevice->getSpecialPlaneId(i); + auto &plane = mDrmDevice->planes().at(channelId); + if (plane->id() == planeId) return channelId; + } + + ALOGE("%s: Failed to get RCD planeId.", __func__); + + return -EINVAL; +} diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.h b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.h index 2e5edba..8ff2adb 100644 --- a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.h +++ b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.h @@ -405,6 +405,7 @@ class ExynosDisplayDrmInterface : void parseColorModeEnums(const DrmProperty &property); void parseMipiSyncEnums(const DrmProperty &property); void updateMountOrientation(); + void parseRCDId(const DrmProperty &property); int32_t setupWritebackCommit(DrmModeAtomicReq &drmReq); int32_t clearWritebackCommit(DrmModeAtomicReq &drmReq); @@ -414,6 +415,7 @@ class ExynosDisplayDrmInterface : int32_t getLowPowerDrmModeModeInfo(); int32_t setActiveDrmMode(DrmMode const &mode); void setMaxWindowNum(uint32_t num) { mMaxWindowNum = num; }; + int32_t getSpecialChannelId(uint32_t planeId); protected: struct PartialRegionState { diff --git a/libhwc2.1/libdrmresource/drm/drmcrtc.cpp b/libhwc2.1/libdrmresource/drm/drmcrtc.cpp index 21fd040..55cee3c 100644 --- a/libhwc2.1/libdrmresource/drm/drmcrtc.cpp +++ b/libhwc2.1/libdrmresource/drm/drmcrtc.cpp @@ -97,6 +97,8 @@ int DrmCrtc::Init() { ALOGI("Failed to get &histogram_threshold property"); if (drm_->GetCrtcProperty(*this, "histogram_pos", &histogram_position_property_)) ALOGI("Failed to get &histogram_position property"); + if (drm_->GetCrtcProperty(*this, "rcd_plane_id", &rcd_plane_id_property_)) + ALOGI("Failed to get &rcd_plane_id property"); properties_.push_back(&active_property_); properties_.push_back(&mode_property_); @@ -126,6 +128,8 @@ int DrmCrtc::Init() { properties_.push_back(&histogram_threshold_property_); properties_.push_back(&histogram_position_property_); + properties_.push_back(&rcd_plane_id_property_); + return 0; } @@ -262,4 +266,8 @@ const DrmProperty &DrmCrtc::histogram_position_property() const { return histogram_position_property_; } +const DrmProperty &DrmCrtc::rcd_plane_id_property() const { + return rcd_plane_id_property_; +} + } // namespace android diff --git a/libhwc2.1/libdrmresource/include/drmcrtc.h b/libhwc2.1/libdrmresource/include/drmcrtc.h index 9149f51..6bb73fd 100644 --- a/libhwc2.1/libdrmresource/include/drmcrtc.h +++ b/libhwc2.1/libdrmresource/include/drmcrtc.h @@ -72,6 +72,8 @@ class DrmCrtc { const DrmProperty &histogram_threshold_property() const; const DrmProperty &histogram_position_property() const; + const DrmProperty &rcd_plane_id_property() const; + const std::vector<DrmProperty *> &properties() const { return properties_; } @@ -113,6 +115,8 @@ class DrmCrtc { DrmProperty histogram_threshold_property_; DrmProperty histogram_position_property_; + DrmProperty rcd_plane_id_property_; + std::vector<DrmProperty *> properties_; }; } // namespace android diff --git a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h index 0181a10..a7cff09 100644 --- a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h +++ b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h @@ -88,6 +88,8 @@ class ExynosPrimaryDisplay : public ExynosDisplay { ResolutionInfo mResolutionInfo; std::string getPanelSysfsPath(const displaycolor::DisplayType& type); + uint32_t mRcdId = -1; + private: static constexpr const char* kDisplayCalFilePath = "/mnt/vendor/persist/display/"; static constexpr const char* kPanelGammaCalFilePrefix = "gamma_calib_data"; |