summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp60
-rw-r--r--libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.h2
-rw-r--r--libhwc2.1/libdrmresource/drm/drmcrtc.cpp8
-rw-r--r--libhwc2.1/libdrmresource/include/drmcrtc.h4
-rw-r--r--libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h2
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";