summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2022-07-11 19:38:05 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2022-07-11 19:38:05 +0000
commite8dc530335d12f577e1b9f0bba36302d8684443d (patch)
treee87f38c8d7785fce4dfd24b9989b231c904b7ea3
parent7d3924720b28644a044d0ff67a0a620f3d8beccc (diff)
parent60d1378c756c072ad2364f2c055220d97ba7c3fb (diff)
downloadcommon-android13-mainline-go-neuralnetworks-release.tar.gz
Snap for 8817865 from 60d1378c756c072ad2364f2c055220d97ba7c3fb to mainline-go-neuralnetworks-releaseaml_go_neu_330912000android13-mainline-go-neuralnetworks-release
Change-Id: I6c65ed4f5f1c6e586720982b46f422ad6a485f24
-rw-r--r--libhwc2.1/libdevice/BrightnessController.h8
-rw-r--r--libhwc2.1/libdevice/ExynosDisplay.h1
-rw-r--r--libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp10
-rw-r--r--libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp61
-rw-r--r--libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h7
5 files changed, 44 insertions, 43 deletions
diff --git a/libhwc2.1/libdevice/BrightnessController.h b/libhwc2.1/libdevice/BrightnessController.h
index 3a7fa85..2e4d304 100644
--- a/libhwc2.1/libdevice/BrightnessController.h
+++ b/libhwc2.1/libdevice/BrightnessController.h
@@ -111,6 +111,8 @@ public:
std::lock_guard<std::recursive_mutex> lock(mBrightnessMutex);
return mLhbm.get();
}
+ int checkSysfsStatus(const char *file, const std::string &expectedValue,
+ const nsecs_t timeoutNs);
uint32_t getBrightnessLevel() {
std::lock_guard<std::recursive_mutex> lock(mBrightnessMutex);
@@ -176,19 +178,17 @@ public:
NONE,
};
+ static constexpr const char *kLocalHbmModeFileNode =
+ "/sys/class/backlight/panel%d-backlight/local_hbm_mode";
private:
// Worst case for panel with brightness range 2 nits to 1000 nits.
static constexpr float kGhbmMinDimRatio = 0.002;
static constexpr int32_t kHbmDimmingTimeUs = 5000000;
- static constexpr const char *kLocalHbmModeFileNode =
- "/sys/class/backlight/panel%d-backlight/local_hbm_mode";
static constexpr const char *kGlobalHbmModeFileNode =
"/sys/class/backlight/panel%d-backlight/hbm_mode";
int queryBrightness(float brightness, bool* ghbm = nullptr, uint32_t* level = nullptr,
float *nits = nullptr);
- int checkSysfsStatus(const char *file, const std::string &expectedValue,
- const nsecs_t timeoutNs);
void initBrightnessTable(const DrmDevice& device, const DrmConnector& connector);
void initBrightnessSysfs();
void initDimmingUsage();
diff --git a/libhwc2.1/libdevice/ExynosDisplay.h b/libhwc2.1/libdevice/ExynosDisplay.h
index e31a692..6c7eded 100644
--- a/libhwc2.1/libdevice/ExynosDisplay.h
+++ b/libhwc2.1/libdevice/ExynosDisplay.h
@@ -1188,7 +1188,6 @@ class ExynosDisplay {
virtual int32_t setLhbmState(bool __unused enabled) { return NO_ERROR; }
virtual bool getLhbmState() { return false; };
- virtual void notifyLhbmState(bool __unused enabled) {}
virtual void setEarlyWakeupDisplay() {}
virtual void setExpectedPresentTime(uint64_t __unused timestamp) {}
virtual uint64_t getPendingExpectedPresentTime() { return 0; }
diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
index 82286a1..2e5e4e1 100644
--- a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
+++ b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
@@ -803,9 +803,6 @@ int32_t ExynosDisplayDrmInterface::setPowerMode(int32_t mode)
HWC_LOGE(mExynosDisplay, "setPower mode ret (%d)", ret);
}
- if (mode == HWC_POWER_MODE_OFF) {
- mExynosDisplay->notifyLhbmState(false);
- }
return ret;
}
@@ -1850,13 +1847,6 @@ int32_t ExynosDisplayDrmInterface::deliverWinConfigData()
mDrmVSyncWorker.VSyncControl(true);
}
- if (mipi_sync_type &
- (1 << mMipiSyncEnums[toUnderlying(HalMipiSyncType::HAL_MIPI_CMD_SYNC_LHBM)])) {
- // Notify that lhbm request is handled.
- // still need one more vblank to complete
- mExynosDisplay->notifyLhbmState(mExynosDisplay->mBrightnessController->isLhbmOn());
- }
-
return NO_ERROR;
}
diff --git a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp
index 633b1d7..099ad73 100644
--- a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp
+++ b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp
@@ -313,6 +313,9 @@ int32_t ExynosPrimaryDisplay::setPowerOff() {
closeFencesForSkipFrame(RENDERING_STATE_VALIDATED);
mRenderingState = RENDERING_STATE_NONE;
+ // in the case user turns off screen when LHBM is on
+ // TODO: b/236433238 considering a lock for mLhbmOn state
+ mLhbmOn = false;
return HWC2_ERROR_NONE;
}
@@ -494,6 +497,9 @@ int32_t ExynosPrimaryDisplay::SetCurrentPanelGammaSource(const DisplayType type,
}
int32_t ExynosPrimaryDisplay::setLhbmState(bool enabled) {
+ // NOTE: mLhbmOn could be set to false at any time by setPowerOff in another
+ // thread. Make sure no side effect if that happens. Or add lock if we have
+ // to when new code is added.
ATRACE_CALL();
if (enabled) {
ATRACE_NAME("wait for peak refresh rate");
@@ -512,39 +518,50 @@ int32_t ExynosPrimaryDisplay::setLhbmState(bool enabled) {
}
requestLhbm(enabled);
+ constexpr uint32_t kSysfsCheckTimeoutMs = 500;
ALOGI("setLhbmState =%d", enabled);
+ bool succeed = mBrightnessController->checkSysfsStatus(
+ BrightnessController::kLocalHbmModeFileNode,
+ std::to_string(enabled ? 1 : 0),
+ ms2ns(kSysfsCheckTimeoutMs));
+ if (!succeed) {
+ ALOGE("failed to update lhbm mode");
+ return -ENODEV;
+ }
+
+ {
+ // lhbm takes effect at next vblank
+ ATRACE_NAME("lhbm_wait_apply");
+ if (mDisplayInterface->waitVBlank()) {
+ ALOGE("%s failed to wait vblank", __func__);
+ return -ENODEV;
+ }
+ }
- std::unique_lock<std::mutex> lk(lhbm_mutex_);
- mLhbmChanged = false;
-
- if (!lhbm_cond_.wait_for(lk, std::chrono::milliseconds(1000),
- [this] { return mLhbmChanged; })) {
- ALOGI("setLhbmState =%d timeout !", enabled);
- return TIMED_OUT;
- } else {
- if (enabled) {
- mDisplayInterface->waitVBlank();
- ATRACE_NAME("frames to reach LHBM peak brightness");
- for (int32_t i = mFramesToReachLhbmPeakBrightness; i > 0; i--) {
- mDevice->onRefresh();
- mDisplayInterface->waitVBlank();
+ if (enabled) {
+ for (int32_t i = mFramesToReachLhbmPeakBrightness; i > 0; i--) {
+ ATRACE_NAME("lhbm_wait_peak_brightness");
+ mDevice->onRefresh();
+ if (mDisplayInterface->waitVBlank()) {
+ ALOGE("%s failed to wait vblank, %d", __func__, i);
+ return -ENODEV;
}
}
- return NO_ERROR;
}
+
+ mLhbmOn = enabled;
+ if (mPowerModeState == HWC2_POWER_MODE_OFF && mLhbmOn) {
+ mLhbmOn = false;
+ ALOGE("%s power off during request lhbm on", __func__);
+ return -EINVAL;
+ }
+ return NO_ERROR;
}
bool ExynosPrimaryDisplay::getLhbmState() {
return mLhbmOn;
}
-void ExynosPrimaryDisplay::notifyLhbmState(bool enabled) {
- std::lock_guard<std::mutex> lk(lhbm_mutex_);
- mLhbmChanged = true;
- lhbm_cond_.notify_one();
- mLhbmOn = enabled;
-}
-
void ExynosPrimaryDisplay::setEarlyWakeupDisplay() {
if (mEarlyWakeupDispFd) {
writeFileNode(mEarlyWakeupDispFd, 1);
diff --git a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h
index c4d79ea..2aa0325 100644
--- a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h
+++ b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h
@@ -36,7 +36,6 @@ class ExynosPrimaryDisplay : public ExynosDisplay {
virtual int32_t setLhbmState(bool enabled);
virtual bool getLhbmState();
- virtual void notifyLhbmState(bool enabled);
virtual void setEarlyWakeupDisplay();
virtual void setExpectedPresentTime(uint64_t timestamp);
virtual uint64_t getPendingExpectedPresentTime();
@@ -100,15 +99,11 @@ class ExynosPrimaryDisplay : public ExynosDisplay {
// LHBM
FILE* mLhbmFd;
- bool mLhbmOn;
- bool mLhbmChanged;
+ std::atomic<bool> mLhbmOn;
int32_t mFramesToReachLhbmPeakBrightness;
// wait num of vsync periods for peak refresh rate
static constexpr uint32_t kLhbmWaitForPeakRefreshRate = 10;
- std::mutex lhbm_mutex_;
- std::condition_variable lhbm_cond_;
-
FILE* mEarlyWakeupDispFd;
static constexpr const char* kWakeupDispFilePath =
"/sys/devices/platform/1c300000.drmdecon/early_wakeup";