summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXu Yang <yangxu@codeaurora.org>2016-09-29 16:32:04 +0800
committerRajesh Yadav <ryadav@codeaurora.org>2017-03-09 19:18:08 +0530
commitc31d7f8d94d0caf226b0ee246400b435a4fa7cec (patch)
tree80b923c72b5b77a2c221253e2732c79b2b901144
parent14ee4b688bdb572f6b7ccc4d8e0fce861a0f6e39 (diff)
downloaddisplay-c31d7f8d94d0caf226b0ee246400b435a4fa7cec.tar.gz
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
-rw-r--r--sdm/include/core/display_interface.h8
-rw-r--r--sdm/include/private/color_params.h1
-rw-r--r--sdm/libs/core/display_base.h3
-rw-r--r--sdm/libs/core/display_primary.cpp5
-rw-r--r--sdm/libs/core/display_primary.h1
-rw-r--r--sdm/libs/core/drm/hw_device_drm.cpp4
-rw-r--r--sdm/libs/core/drm/hw_device_drm.h1
-rw-r--r--sdm/libs/core/fb/hw_device.cpp11
-rw-r--r--sdm/libs/core/fb/hw_device.h3
-rw-r--r--sdm/libs/core/fb/hw_primary.cpp6
-rw-r--r--sdm/libs/core/fb/hw_primary.h1
-rw-r--r--sdm/libs/core/hw_interface.h1
-rw-r--r--sdm/libs/hwc/hwc_display.cpp10
-rw-r--r--sdm/libs/hwc/hwc_display.h1
-rw-r--r--sdm/libs/hwc/hwc_session.cpp10
15 files changed, 66 insertions, 0 deletions
diff --git a/sdm/include/core/display_interface.h b/sdm/include/core/display_interface.h
index 1b95b916..09c6a79c 100644
--- a/sdm/include/core/display_interface.h
+++ b/sdm/include/core/display_interface.h
@@ -472,6 +472,14 @@ class DisplayInterface {
*/
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 a3ecd50c..e2e094e4 100644
--- a/sdm/include/private/color_params.h
+++ b/sdm/include/private/color_params.h
@@ -51,6 +51,7 @@ enum PendingAction {
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 64f8ab75..3026b38f 100644
--- a/sdm/libs/core/display_base.h
+++ b/sdm/libs/core/display_base.h
@@ -82,6 +82,9 @@ class DisplayBase : public DisplayInterface, DumpImpl {
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 09e0c228..753020d0 100644
--- a/sdm/libs/core/display_primary.cpp
+++ b/sdm/libs/core/display_primary.cpp
@@ -240,6 +240,11 @@ DisplayError DisplayPrimary::SetPanelBrightness(int level) {
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 0bfef046..a16c3676 100644
--- a/sdm/libs/core/display_primary.h
+++ b/sdm/libs/core/display_primary.h
@@ -51,6 +51,7 @@ class DisplayPrimary : public DisplayBase, HWEventHandler {
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 2886b569..355dab9f 100644
--- a/sdm/libs/core/drm/hw_device_drm.cpp
+++ b/sdm/libs/core/drm/hw_device_drm.cpp
@@ -649,6 +649,10 @@ DisplayError HWDeviceDRM::SetPanelBrightness(int level) {
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 db135a03..d6e64ad6 100644
--- a/sdm/libs/core/drm/hw_device_drm.h
+++ b/sdm/libs/core/drm/hw_device_drm.h
@@ -77,6 +77,7 @@ class HWDeviceDRM : public HWInterface {
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 999265eb..6309c09a 100644
--- a/sdm/libs/core/fb/hw_device.cpp
+++ b/sdm/libs/core/fb/hw_device.cpp
@@ -485,6 +485,10 @@ DisplayError HWDevice::Commit(HWLayers *hw_layers) {
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 @@ DisplayError HWDevice::Commit(HWLayers *hw_layers) {
synchronous_commit_ = false;
}
+ if (bl_update_commit)
+ bl_update_commit = false;
+
return kErrorNone;
}
@@ -1180,6 +1187,10 @@ DisplayError HWDevice::SetPanelBrightness(int level) {
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 aa73177d..b94a5f36 100644
--- a/sdm/libs/core/fb/hw_device.h
+++ b/sdm/libs/core/fb/hw_device.h
@@ -85,6 +85,7 @@ class HWDevice : public HWInterface {
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 @@ class HWDevice : public HWInterface {
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 1e6f37de..8102e5f7 100644
--- a/sdm/libs/core/fb/hw_primary.cpp
+++ b/sdm/libs/core/fb/hw_primary.cpp
@@ -570,6 +570,12 @@ DisplayError HWPrimary::GetPanelBrightness(int *level) {
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 bd6ea2f9..38b3b9ac 100644
--- a/sdm/libs/core/fb/hw_primary.h
+++ b/sdm/libs/core/fb/hw_primary.h
@@ -55,6 +55,7 @@ class HWPrimary : public HWDevice {
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 fbebb136..23c6114a 100644
--- a/sdm/libs/core/hw_interface.h
+++ b/sdm/libs/core/hw_interface.h
@@ -96,6 +96,7 @@ class HWInterface {
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 c1e41345..b0d2c7c0 100644
--- a/sdm/libs/hwc/hwc_display.cpp
+++ b/sdm/libs/hwc/hwc_display.cpp
@@ -1377,6 +1377,16 @@ int HWCDisplay::GetPanelBrightness(int *level) {
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 56529962..b0a40d5b 100644
--- a/sdm/libs/hwc/hwc_display.h
+++ b/sdm/libs/hwc/hwc_display.h
@@ -141,6 +141,7 @@ class HWCDisplay : public DisplayEventHandler {
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 a3248568..e6aa70f5 100644
--- a/sdm/libs/hwc/hwc_session.cpp
+++ b/sdm/libs/hwc/hwc_session.cpp
@@ -1358,6 +1358,16 @@ android::status_t HWCSession::QdcmCMDHandler(const android::Parcel *input_parcel
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: