Merge "sdm: Reject bit clk updates in inactive state."
diff --git a/sdm/libs/core/display_builtin.cpp b/sdm/libs/core/display_builtin.cpp
index c223ce2..b567a80 100644
--- a/sdm/libs/core/display_builtin.cpp
+++ b/sdm/libs/core/display_builtin.cpp
@@ -788,6 +788,11 @@
DisplayError DisplayBuiltIn::SetDynamicDSIClock(uint64_t bit_clk_rate) {
lock_guard<recursive_mutex> obj(recursive_mutex_);
+ if (!active_) {
+ DLOGW("Invalid display state = %d. Panel must be on.", state_);
+ return kErrorNotSupported;
+ }
+
if (!hw_panel_info_.dyn_bitclk_support) {
return kErrorNotSupported;
}
diff --git a/sdm/libs/core/drm/hw_device_drm.cpp b/sdm/libs/core/drm/hw_device_drm.cpp
index 62f5923..8929fc9 100644
--- a/sdm/libs/core/drm/hw_device_drm.cpp
+++ b/sdm/libs/core/drm/hw_device_drm.cpp
@@ -1292,10 +1292,12 @@
drm_atomic_intf_->Perform(DRMOps::CONNECTOR_SET_CRTC, token_.conn_id, token_.crtc_id);
DRMPowerMode power_mode = pending_doze_ ? DRMPowerMode::DOZE : DRMPowerMode::ON;
drm_atomic_intf_->Perform(DRMOps::CONNECTOR_SET_POWER_MODE, token_.conn_id, power_mode);
+ last_power_mode_ = power_mode;
} else if (pending_doze_ && !validate) {
drm_atomic_intf_->Perform(DRMOps::CRTC_SET_ACTIVE, token_.crtc_id, 1);
drm_atomic_intf_->Perform(DRMOps::CONNECTOR_SET_POWER_MODE, token_.conn_id, DRMPowerMode::DOZE);
pending_doze_ = false;
+ last_power_mode_ = DRMPowerMode::DOZE;
}
// Set CRTC mode, only if display config changes
diff --git a/sdm/libs/core/drm/hw_device_drm.h b/sdm/libs/core/drm/hw_device_drm.h
index 066e5ca..16982d0 100644
--- a/sdm/libs/core/drm/hw_device_drm.h
+++ b/sdm/libs/core/drm/hw_device_drm.h
@@ -50,6 +50,7 @@
#define VIDEO_FBID_LIMIT 16
#define OFFLINE_ROTATOR_FBID_LIMIT 2
+using sde_drm::DRMPowerMode;
namespace sdm {
class HWInfoInterface;
@@ -242,6 +243,7 @@
bool update_mode_ = false;
bool pending_doze_ = false;
PrimariesTransfer blend_space_ = {};
+ DRMPowerMode last_power_mode_ = DRMPowerMode::OFF;
private:
std::string interface_str_ = "DSI";
diff --git a/sdm/libs/core/drm/hw_peripheral_drm.cpp b/sdm/libs/core/drm/hw_peripheral_drm.cpp
index 063befd..68889d8 100644
--- a/sdm/libs/core/drm/hw_peripheral_drm.cpp
+++ b/sdm/libs/core/drm/hw_peripheral_drm.cpp
@@ -97,6 +97,10 @@
}
DisplayError HWPeripheralDRM::SetDynamicDSIClock(uint64_t bit_clk_rate) {
+ if (last_power_mode_ == DRMPowerMode::DOZE_SUSPEND || last_power_mode_ == DRMPowerMode::OFF) {
+ return kErrorNotSupported;
+ }
+
bit_clk_rate_ = bit_clk_rate;
update_mode_ = true;