sdm: set minHDCP level whenever requested.
- Currently it is rejected if external display
is not conencted, leading to a secure video
failure on external once connected.
- Hence set minHDCP level on request irrespective
of external connected or not.
CRs-Fixed: 2604308
Change-Id: I865f54114c2a23891c7f8abc00668179ffa66d27
diff --git a/composer/hwc_session_services.cpp b/composer/hwc_session_services.cpp
index 81f04fa..af457eb 100644
--- a/composer/hwc_session_services.cpp
+++ b/composer/hwc_session_services.cpp
@@ -328,6 +328,10 @@
int HWCSession::MinHdcpEncryptionLevelChanged(int disp_id, uint32_t min_enc_level) {
DLOGI("Display %d", disp_id);
+ // SSG team hardcoded disp_id as external because it applies to external only but SSG team sends
+ // this level irrespective of external connected or not. So to honor the call, make disp_id to
+ // primary & set level.
+ disp_id = HWC_DISPLAY_PRIMARY;
int disp_idx = GetDisplayIndex(disp_id);
if (disp_idx == -1) {
DLOGE("Invalid display = %d", disp_id);
@@ -335,15 +339,13 @@
}
SEQUENCE_WAIT_SCOPE_LOCK(locker_[disp_idx]);
- if (disp_idx != HWC_DISPLAY_EXTERNAL) {
- DLOGE("Not supported for display");
- } else if (!hwc_display_[disp_idx]) {
- DLOGW("Display is not connected");
- } else {
- return hwc_display_[disp_idx]->OnMinHdcpEncryptionLevelChange(min_enc_level);
+ HWCDisplay *hwc_display = hwc_display_[disp_idx];
+ if (!hwc_display) {
+ DLOGE("Display = %d is not connected.", disp_idx);
+ return -EINVAL;
}
- return -EINVAL;
+ return hwc_display->OnMinHdcpEncryptionLevelChange(min_enc_level);
}
int HWCSession::DisplayConfigImpl::MinHdcpEncryptionLevelChanged(DispType dpy,
diff --git a/sdm/libs/core/display_base.cpp b/sdm/libs/core/display_base.cpp
index 7c78ea9..1ba4e40 100644
--- a/sdm/libs/core/display_base.cpp
+++ b/sdm/libs/core/display_base.cpp
@@ -2097,4 +2097,9 @@
return false;
}
+DisplayError DisplayBase::OnMinHdcpEncryptionLevelChange(uint32_t min_enc_level) {
+ lock_guard<recursive_mutex> obj(recursive_mutex_);
+ return hw_intf_->OnMinHdcpEncryptionLevelChange(min_enc_level);
+}
+
} // namespace sdm
diff --git a/sdm/libs/core/display_base.h b/sdm/libs/core/display_base.h
index f9a2bfd..f5e347a 100644
--- a/sdm/libs/core/display_base.h
+++ b/sdm/libs/core/display_base.h
@@ -86,9 +86,7 @@
virtual DisplayError SetPanelBrightness(float brightness) {
return kErrorNotSupported;
}
- virtual DisplayError OnMinHdcpEncryptionLevelChange(uint32_t min_enc_level) {
- return kErrorNotSupported;
- }
+ virtual DisplayError OnMinHdcpEncryptionLevelChange(uint32_t min_enc_level);
virtual DisplayError ColorSVCRequestRoute(const PPDisplayAPIPayload &in_payload,
PPDisplayAPIPayload *out_payload,
PPPendingParams *pending_action);
diff --git a/sdm/libs/core/display_pluggable.cpp b/sdm/libs/core/display_pluggable.cpp
index 45550f1..ab0c177 100644
--- a/sdm/libs/core/display_pluggable.cpp
+++ b/sdm/libs/core/display_pluggable.cpp
@@ -179,11 +179,6 @@
return underscan_supported_;
}
-DisplayError DisplayPluggable::OnMinHdcpEncryptionLevelChange(uint32_t min_enc_level) {
- lock_guard<recursive_mutex> obj(recursive_mutex_);
- return hw_intf_->OnMinHdcpEncryptionLevelChange(min_enc_level);
-}
-
DisplayError DisplayPluggable::GetOverrideConfig(uint32_t *mode_index) {
DisplayError error = kErrorNone;
diff --git a/sdm/libs/core/display_pluggable.h b/sdm/libs/core/display_pluggable.h
index 2aeb19b..e2b5c3a 100644
--- a/sdm/libs/core/display_pluggable.h
+++ b/sdm/libs/core/display_pluggable.h
@@ -46,7 +46,6 @@
virtual DisplayError GetRefreshRateRange(uint32_t *min_refresh_rate, uint32_t *max_refresh_rate);
virtual DisplayError SetRefreshRate(uint32_t refresh_rate, bool final_rate);
virtual bool IsUnderscanSupported();
- virtual DisplayError OnMinHdcpEncryptionLevelChange(uint32_t min_enc_level);
virtual DisplayError InitializeColorModes();
virtual DisplayError SetColorMode(const std::string &color_mode);
virtual DisplayError GetColorModeCount(uint32_t *mode_count);
diff --git a/sdm/libs/core/drm/hw_device_drm.cpp b/sdm/libs/core/drm/hw_device_drm.cpp
index abd2ca5..c6e914f 100644
--- a/sdm/libs/core/drm/hw_device_drm.cpp
+++ b/sdm/libs/core/drm/hw_device_drm.cpp
@@ -1832,7 +1832,29 @@
}
DisplayError HWDeviceDRM::OnMinHdcpEncryptionLevelChange(uint32_t min_enc_level) {
- return kErrorNotSupported;
+ DisplayError error = kErrorNone;
+ int fd = -1;
+ char data[kMaxStringLength] = {'\0'};
+
+ snprintf(data, sizeof(data), "/sys/devices/virtual/hdcp/msm_hdcp/min_level_change");
+
+ fd = Sys::open_(data, O_WRONLY);
+ if (fd < 0) {
+ DLOGE("File '%s' could not be opened. errno = %d, desc = %s", data, errno, strerror(errno));
+ return kErrorHardware;
+ }
+
+ snprintf(data, sizeof(data), "%d", min_enc_level);
+
+ ssize_t err = Sys::pwrite_(fd, data, strlen(data), 0);
+ if (err <= 0) {
+ DLOGE("Write failed, Error = %s", strerror(errno));
+ error = kErrorHardware;
+ }
+
+ Sys::close_(fd);
+
+ return error;
}
DisplayError HWDeviceDRM::SetScaleLutConfig(HWScaleLutInfo *lut_info) {
diff --git a/sdm/libs/core/drm/hw_tv_drm.cpp b/sdm/libs/core/drm/hw_tv_drm.cpp
index 14f5a90..ee45c5a 100644
--- a/sdm/libs/core/drm/hw_tv_drm.cpp
+++ b/sdm/libs/core/drm/hw_tv_drm.cpp
@@ -439,31 +439,5 @@
return HWDeviceDRM::PowerOn(qos_data, release_fence);
}
-DisplayError HWTVDRM::OnMinHdcpEncryptionLevelChange(uint32_t min_enc_level) {
- DisplayError error = kErrorNone;
- int fd = -1;
- char data[kMaxStringLength] = {'\0'};
-
- snprintf(data, sizeof(data), "/sys/devices/virtual/hdcp/msm_hdcp/min_level_change");
-
- fd = Sys::open_(data, O_WRONLY);
- if (fd < 0) {
- DLOGE("File '%s' could not be opened. errno = %d, desc = %s", data, errno, strerror(errno));
- return kErrorHardware;
- }
-
- snprintf(data, sizeof(data), "%d", min_enc_level);
-
- ssize_t err = Sys::pwrite_(fd, data, strlen(data), 0);
- if (err <= 0) {
- DLOGE("Write failed, Error = %s", strerror(errno));
- error = kErrorHardware;
- }
-
- Sys::close_(fd);
-
- return error;
-}
-
} // namespace sdm
diff --git a/sdm/libs/core/drm/hw_tv_drm.h b/sdm/libs/core/drm/hw_tv_drm.h
index 2325499..3b1969f 100644
--- a/sdm/libs/core/drm/hw_tv_drm.h
+++ b/sdm/libs/core/drm/hw_tv_drm.h
@@ -49,7 +49,6 @@
virtual DisplayError Commit(HWLayers *hw_layers);
virtual void PopulateHWPanelInfo();
virtual DisplayError GetDefaultConfig(uint32_t *default_config);
- virtual DisplayError OnMinHdcpEncryptionLevelChange(uint32_t min_enc_level);
virtual DisplayError PowerOn(const HWQosData &qos_data, shared_ptr<Fence> *release_fence);
private: