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: