sdm: add one action to set panel brightness and refresh screen
Add one action to set panel brightness and refresh screen. The
backlight level is cached and sent through display commit IOCTL
to driver, which would take effect along with display commit.
Change-Id: I87483e82b5c13ef25c1da956ac9403162afd031e
diff --git a/sdm/include/core/display_interface.h b/sdm/include/core/display_interface.h
index 1b95b91..09c6a79 100644
--- a/sdm/include/core/display_interface.h
+++ b/sdm/include/core/display_interface.h
@@ -472,6 +472,14 @@
*/
virtual DisplayError SetPanelBrightness(int level) = 0;
+ /*! @brief Method to cache brightness of the primary display.
+
+ @param[in] level the new backlight level.
+
+ @return \link DisplayError \endlink
+ */
+ virtual DisplayError CachePanelBrightness(int level) = 0;
+
/*! @brief Method to notify display about change in min HDCP encryption level.
@param[in] min_enc_level minimum encryption level value.
diff --git a/sdm/include/private/color_params.h b/sdm/include/private/color_params.h
index a3ecd50..e2e094e 100644
--- a/sdm/include/private/color_params.h
+++ b/sdm/include/private/color_params.h
@@ -51,6 +51,7 @@
kEnableFrameCapture = BITMAP(6),
kDisableFrameCapture = BITMAP(7),
kConfigureDetailedEnhancer = BITMAP(8),
+ kInvalidatingAndkSetPanelBrightness = BITMAP(9),
kGetDetailedEnhancerData = BITMAP(21),
kNoAction = BITMAP(31),
};
diff --git a/sdm/libs/core/display_base.h b/sdm/libs/core/display_base.h
index 64f8ab7..3026b38 100644
--- a/sdm/libs/core/display_base.h
+++ b/sdm/libs/core/display_base.h
@@ -82,6 +82,9 @@
virtual DisplayError SetPanelBrightness(int level) {
return kErrorNotSupported;
}
+ virtual DisplayError CachePanelBrightness(int level) {
+ return kErrorNotSupported;
+ }
virtual DisplayError OnMinHdcpEncryptionLevelChange(uint32_t min_enc_level) {
return kErrorNotSupported;
}
diff --git a/sdm/libs/core/display_primary.cpp b/sdm/libs/core/display_primary.cpp
index 09e0c22..753020d 100644
--- a/sdm/libs/core/display_primary.cpp
+++ b/sdm/libs/core/display_primary.cpp
@@ -240,6 +240,11 @@
return hw_intf_->SetPanelBrightness(level);
}
+DisplayError DisplayPrimary::CachePanelBrightness(int level) {
+ lock_guard<recursive_mutex> obj(recursive_mutex_);
+ return hw_intf_->CachePanelBrightness(level);
+}
+
DisplayError DisplayPrimary::GetRefreshRateRange(uint32_t *min_refresh_rate,
uint32_t *max_refresh_rate) {
lock_guard<recursive_mutex> obj(recursive_mutex_);
diff --git a/sdm/libs/core/display_primary.h b/sdm/libs/core/display_primary.h
index 0bfef04..a16c367 100644
--- a/sdm/libs/core/display_primary.h
+++ b/sdm/libs/core/display_primary.h
@@ -51,6 +51,7 @@
virtual DisplayError SetRefreshRate(uint32_t refresh_rate);
virtual DisplayError SetPanelBrightness(int level);
virtual DisplayError GetPanelBrightness(int *level);
+ virtual DisplayError CachePanelBrightness(int level);
// Implement the HWEventHandlers
virtual DisplayError VSync(int64_t timestamp);
diff --git a/sdm/libs/core/drm/hw_device_drm.cpp b/sdm/libs/core/drm/hw_device_drm.cpp
index 2886b56..355dab9 100644
--- a/sdm/libs/core/drm/hw_device_drm.cpp
+++ b/sdm/libs/core/drm/hw_device_drm.cpp
@@ -649,6 +649,10 @@
return kErrorNotSupported;
}
+DisplayError HWDeviceDRM::CachePanelBrightness(int level) {
+ return kErrorNotSupported;
+}
+
DisplayError HWDeviceDRM::GetHWScanInfo(HWScanInfo *scan_info) {
return kErrorNotSupported;
}
diff --git a/sdm/libs/core/drm/hw_device_drm.h b/sdm/libs/core/drm/hw_device_drm.h
index db135a0..d6e64ad 100644
--- a/sdm/libs/core/drm/hw_device_drm.h
+++ b/sdm/libs/core/drm/hw_device_drm.h
@@ -77,6 +77,7 @@
virtual DisplayError SetDisplayMode(const HWDisplayMode hw_display_mode);
virtual DisplayError SetRefreshRate(uint32_t refresh_rate);
virtual DisplayError SetPanelBrightness(int level);
+ virtual DisplayError CachePanelBrightness(int level);
virtual DisplayError GetHWScanInfo(HWScanInfo *scan_info);
virtual DisplayError GetVideoFormat(uint32_t config_index, uint32_t *video_format);
virtual DisplayError GetMaxCEAFormat(uint32_t *max_cea_format);
diff --git a/sdm/libs/core/fb/hw_device.cpp b/sdm/libs/core/fb/hw_device.cpp
index 999265e..6309c09 100644
--- a/sdm/libs/core/fb/hw_device.cpp
+++ b/sdm/libs/core/fb/hw_device.cpp
@@ -485,6 +485,10 @@
if (synchronous_commit_) {
mdp_commit.flags |= MDP_COMMIT_WAIT_FOR_FINISH;
}
+ if (bl_update_commit && bl_level_update_commit >= 0) {
+ mdp_commit.bl_level = (uint32_t)bl_level_update_commit;
+ mdp_commit.flags |= MDP_COMMIT_UPDATE_BRIGHTNESS;
+ }
if (Sys::ioctl_(device_fd_, INT(MSMFB_ATOMIC_COMMIT), &mdp_disp_commit_) < 0) {
if (errno == ESHUTDOWN) {
DLOGI_IF(kTagDriverConfig, "Driver is processing shutdown sequence");
@@ -539,6 +543,9 @@
synchronous_commit_ = false;
}
+ if (bl_update_commit)
+ bl_update_commit = false;
+
return kErrorNone;
}
@@ -1180,6 +1187,10 @@
return kErrorNotSupported;
}
+DisplayError HWDevice::CachePanelBrightness(int level) {
+ return kErrorNotSupported;
+}
+
DisplayError HWDevice::GetHWScanInfo(HWScanInfo *scan_info) {
return kErrorNotSupported;
}
diff --git a/sdm/libs/core/fb/hw_device.h b/sdm/libs/core/fb/hw_device.h
index aa73177..b94a5f3 100644
--- a/sdm/libs/core/fb/hw_device.h
+++ b/sdm/libs/core/fb/hw_device.h
@@ -85,6 +85,7 @@
virtual DisplayError SetDisplayMode(const HWDisplayMode hw_display_mode);
virtual DisplayError SetRefreshRate(uint32_t refresh_rate);
virtual DisplayError SetPanelBrightness(int level);
+ virtual DisplayError CachePanelBrightness(int level);
virtual DisplayError GetHWScanInfo(HWScanInfo *scan_info);
virtual DisplayError GetVideoFormat(uint32_t config_index, uint32_t *video_format);
virtual DisplayError GetMaxCEAFormat(uint32_t *max_cea_format);
@@ -156,6 +157,8 @@
HWDisplayAttributes display_attributes_ = {};
HWMixerAttributes mixer_attributes_ = {};
std::vector<mdp_destination_scaler_data> mdp_dest_scalar_data_;
+ int bl_level_update_commit = -1;
+ bool bl_update_commit = false;
};
} // namespace sdm
diff --git a/sdm/libs/core/fb/hw_primary.cpp b/sdm/libs/core/fb/hw_primary.cpp
index 1e6f37d..8102e5f 100644
--- a/sdm/libs/core/fb/hw_primary.cpp
+++ b/sdm/libs/core/fb/hw_primary.cpp
@@ -570,6 +570,12 @@
return kErrorNone;
}
+DisplayError HWPrimary::CachePanelBrightness(int level) {
+ bl_level_update_commit = level;
+ bl_update_commit = true;
+ return kErrorNone;
+}
+
DisplayError HWPrimary::SetAutoRefresh(bool enable) {
const int kWriteLength = 2;
char buffer[kWriteLength] = {'\0'};
diff --git a/sdm/libs/core/fb/hw_primary.h b/sdm/libs/core/fb/hw_primary.h
index bd6ea2f..38b3b9a 100644
--- a/sdm/libs/core/fb/hw_primary.h
+++ b/sdm/libs/core/fb/hw_primary.h
@@ -55,6 +55,7 @@
virtual DisplayError SetDisplayMode(const HWDisplayMode hw_display_mode);
virtual DisplayError SetRefreshRate(uint32_t refresh_rate);
virtual DisplayError SetPanelBrightness(int level);
+ virtual DisplayError CachePanelBrightness(int level);
virtual DisplayError GetPPFeaturesVersion(PPFeatureVersion *vers);
virtual DisplayError SetPPFeatures(PPFeaturesConfig *feature_list);
virtual DisplayError GetPanelBrightness(int *level);
diff --git a/sdm/libs/core/hw_interface.h b/sdm/libs/core/hw_interface.h
index fbebb13..23c6114 100644
--- a/sdm/libs/core/hw_interface.h
+++ b/sdm/libs/core/hw_interface.h
@@ -96,6 +96,7 @@
virtual DisplayError SetDisplayMode(const HWDisplayMode hw_display_mode) = 0;
virtual DisplayError SetRefreshRate(uint32_t refresh_rate) = 0;
virtual DisplayError SetPanelBrightness(int level) = 0;
+ virtual DisplayError CachePanelBrightness(int level) = 0;
virtual DisplayError GetHWScanInfo(HWScanInfo *scan_info) = 0;
virtual DisplayError GetVideoFormat(uint32_t config_index, uint32_t *video_format) = 0;
virtual DisplayError GetMaxCEAFormat(uint32_t *max_cea_format) = 0;
diff --git a/sdm/libs/hwc/hwc_display.cpp b/sdm/libs/hwc/hwc_display.cpp
index c1e4134..b0d2c7c 100644
--- a/sdm/libs/hwc/hwc_display.cpp
+++ b/sdm/libs/hwc/hwc_display.cpp
@@ -1377,6 +1377,16 @@
return display_intf_->GetPanelBrightness(level);
}
+int HWCDisplay::CachePanelBrightness(int level) {
+ int ret = 0;
+ if (display_intf_)
+ ret = display_intf_->CachePanelBrightness(level);
+ else
+ ret = -EINVAL;
+
+ return ret;
+}
+
int HWCDisplay::ToggleScreenUpdates(bool enable) {
const hwc_procs_t *hwc_procs = *hwc_procs_;
display_paused_ = enable ? false : true;
diff --git a/sdm/libs/hwc/hwc_display.h b/sdm/libs/hwc/hwc_display.h
index 5652996..b0a40d5 100644
--- a/sdm/libs/hwc/hwc_display.h
+++ b/sdm/libs/hwc/hwc_display.h
@@ -141,6 +141,7 @@
int SetPanelBrightness(int level);
int GetPanelBrightness(int *level);
+ int CachePanelBrightness(int level);
int ToggleScreenUpdates(bool enable);
int ColorSVCRequestRoute(const PPDisplayAPIPayload &in_payload,
PPDisplayAPIPayload *out_payload,
diff --git a/sdm/libs/hwc/hwc_session.cpp b/sdm/libs/hwc/hwc_session.cpp
index a324856..e6aa70f 100644
--- a/sdm/libs/hwc/hwc_session.cpp
+++ b/sdm/libs/hwc/hwc_session.cpp
@@ -1358,6 +1358,16 @@
hwc_display_[HWC_DISPLAY_PRIMARY]);
hwc_procs_->invalidate(hwc_procs_);
break;
+ case kInvalidatingAndkSetPanelBrightness:
+ brightness_value = reinterpret_cast<int32_t*>(resp_payload.payload);
+ if (brightness_value == NULL) {
+ DLOGE("Brightness value is Null");
+ return -EINVAL;
+ }
+ if (HWC_DISPLAY_PRIMARY == display_id)
+ ret = hwc_display_[HWC_DISPLAY_PRIMARY]->CachePanelBrightness(*brightness_value);
+ hwc_procs_->invalidate(hwc_procs_);
+ break;
case kNoAction:
break;
default: