sdm: Add support for minimum encryption level settings for HDCP.

- Add min_enc_level parameter in minHdcpEncryptionLevelChanged API.

Change-Id: I4c6ddfb7c0178ce547ce7aa357f86f0320d35208
diff --git a/libqdutils/display_config.cpp b/libqdutils/display_config.cpp
index e9b30f3..1470223 100644
--- a/libqdutils/display_config.cpp
+++ b/libqdutils/display_config.cpp
@@ -320,11 +320,12 @@
 // ----------------------------------------------------------------------------
 // Functions for linking dynamically to libqdutils
 // ----------------------------------------------------------------------------
-extern "C" int minHdcpEncryptionLevelChanged(int dpy) {
+extern "C" int minHdcpEncryptionLevelChanged(int dpy, int min_enc_level) {
     status_t err = (status_t) FAILED_TRANSACTION;
     sp<IQService> binder = getBinder();
     Parcel inParcel, outParcel;
     inParcel.writeInt32(dpy);
+    inParcel.writeInt32(min_enc_level);
 
     if(binder != NULL) {
         err = binder->dispatch(IQService::MIN_HDCP_ENCRYPTION_LEVEL_CHANGED,
diff --git a/sdm/include/core/display_interface.h b/sdm/include/core/display_interface.h
index 01037b4..d3fc1f5 100644
--- a/sdm/include/core/display_interface.h
+++ b/sdm/include/core/display_interface.h
@@ -377,9 +377,11 @@
 
   /*! @brief Method to notify display about change in min HDCP encryption level.
 
+    @param[in] min_enc_level minimum encryption level value.
+
     @return \link DisplayError \endlink
   */
-  virtual DisplayError OnMinHdcpEncryptionLevelChange() = 0;
+  virtual DisplayError OnMinHdcpEncryptionLevelChange(uint32_t min_enc_level) = 0;
 
   /*! @brief Method to route display API requests to color service.
 
diff --git a/sdm/libs/core/display_base.cpp b/sdm/libs/core/display_base.cpp
index ad67dd0..b299e98 100644
--- a/sdm/libs/core/display_base.cpp
+++ b/sdm/libs/core/display_base.cpp
@@ -454,7 +454,7 @@
   return kErrorNotSupported;
 }
 
-DisplayError DisplayBase::OnMinHdcpEncryptionLevelChange() {
+DisplayError DisplayBase::OnMinHdcpEncryptionLevelChange(uint32_t min_enc_level) {
   return kErrorNotSupported;
 }
 
diff --git a/sdm/libs/core/display_base.h b/sdm/libs/core/display_base.h
index 2f2c072..8c7c1b5 100644
--- a/sdm/libs/core/display_base.h
+++ b/sdm/libs/core/display_base.h
@@ -65,7 +65,7 @@
   virtual DisplayError IsScalingValid(const LayerRect &crop, const LayerRect &dst, bool rotate90);
   virtual bool IsUnderscanSupported();
   virtual DisplayError SetPanelBrightness(int level);
-  virtual DisplayError OnMinHdcpEncryptionLevelChange();
+  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_hdmi.cpp b/sdm/libs/core/display_hdmi.cpp
index 76deba0..d812f0c 100644
--- a/sdm/libs/core/display_hdmi.cpp
+++ b/sdm/libs/core/display_hdmi.cpp
@@ -176,9 +176,9 @@
   return DisplayBase::SetPanelBrightness(level);
 }
 
-DisplayError DisplayHDMI::OnMinHdcpEncryptionLevelChange() {
+DisplayError DisplayHDMI::OnMinHdcpEncryptionLevelChange(uint32_t min_enc_level) {
   SCOPE_LOCK(locker_);
-  return hw_intf_->OnMinHdcpEncryptionLevelChange();
+  return hw_intf_->OnMinHdcpEncryptionLevelChange(min_enc_level);
 }
 
 int DisplayHDMI::GetBestConfig() {
diff --git a/sdm/libs/core/display_hdmi.h b/sdm/libs/core/display_hdmi.h
index 2f50a3d..ce22104 100644
--- a/sdm/libs/core/display_hdmi.h
+++ b/sdm/libs/core/display_hdmi.h
@@ -59,7 +59,7 @@
   virtual DisplayError SetRefreshRate(uint32_t refresh_rate);
   virtual bool IsUnderscanSupported();
   virtual DisplayError SetPanelBrightness(int level);
-  virtual DisplayError OnMinHdcpEncryptionLevelChange();
+  virtual DisplayError OnMinHdcpEncryptionLevelChange(uint32_t min_enc_level);
   virtual void AppendDump(char *buffer, uint32_t length);
   virtual DisplayError SetCursorPosition(int x, int y);
 
diff --git a/sdm/libs/core/fb/hw_device.cpp b/sdm/libs/core/fb/hw_device.cpp
index 590c23c..d5cde24 100644
--- a/sdm/libs/core/fb/hw_device.cpp
+++ b/sdm/libs/core/fb/hw_device.cpp
@@ -995,7 +995,7 @@
   return kErrorNotSupported;
 }
 
-DisplayError HWDevice::OnMinHdcpEncryptionLevelChange() {
+DisplayError HWDevice::OnMinHdcpEncryptionLevelChange(uint32_t min_enc_level) {
   return kErrorNotSupported;
 }
 
diff --git a/sdm/libs/core/fb/hw_device.h b/sdm/libs/core/fb/hw_device.h
index 138dbda..09fddc2 100644
--- a/sdm/libs/core/fb/hw_device.h
+++ b/sdm/libs/core/fb/hw_device.h
@@ -70,7 +70,7 @@
   virtual DisplayError GetVideoFormat(uint32_t config_index, uint32_t *video_format);
   virtual DisplayError GetMaxCEAFormat(uint32_t *max_cea_format);
   virtual DisplayError SetCursorPosition(HWLayers *hw_layers, int x, int y);
-  virtual DisplayError OnMinHdcpEncryptionLevelChange();
+  virtual DisplayError OnMinHdcpEncryptionLevelChange(uint32_t min_enc_level);
   virtual DisplayError GetPanelBrightness(int *level);
 
   // For HWDevice derivatives
diff --git a/sdm/libs/core/fb/hw_hdmi.cpp b/sdm/libs/core/fb/hw_hdmi.cpp
index a5fff54..58c5f5c 100644
--- a/sdm/libs/core/fb/hw_hdmi.cpp
+++ b/sdm/libs/core/fb/hw_hdmi.cpp
@@ -346,7 +346,7 @@
   return kErrorNone;
 }
 
-DisplayError HWHDMI::OnMinHdcpEncryptionLevelChange() {
+DisplayError HWHDMI::OnMinHdcpEncryptionLevelChange(uint32_t min_enc_level) {
   DisplayError error = kErrorNone;
   int fd = -1;
   char data[kMaxStringLength] = {'\0'};
@@ -359,8 +359,7 @@
     return kErrorHardware;
   }
 
-  // write any value (1 here) on this fd to trigger level change.
-  snprintf(data, sizeof(data), "%d", 1);
+  snprintf(data, sizeof(data), "%d", min_enc_level);
 
   ssize_t err = Sys::pwrite_(fd, data, strlen(data), 0);
   if (err <= 0) {
diff --git a/sdm/libs/core/fb/hw_hdmi.h b/sdm/libs/core/fb/hw_hdmi.h
index c216b8f..2457ee0 100644
--- a/sdm/libs/core/fb/hw_hdmi.h
+++ b/sdm/libs/core/fb/hw_hdmi.h
@@ -48,7 +48,7 @@
   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);
-  virtual DisplayError OnMinHdcpEncryptionLevelChange();
+  virtual DisplayError OnMinHdcpEncryptionLevelChange(uint32_t min_enc_level);
   virtual DisplayError SetDisplayAttributes(uint32_t index);
   virtual DisplayError GetConfigIndex(uint32_t mode, uint32_t *index);
   virtual DisplayError Validate(HWLayers *hw_layers);
diff --git a/sdm/libs/core/hw_interface.h b/sdm/libs/core/hw_interface.h
index 648c313..5b6ddac 100644
--- a/sdm/libs/core/hw_interface.h
+++ b/sdm/libs/core/hw_interface.h
@@ -88,7 +88,7 @@
   virtual DisplayError GetVideoFormat(uint32_t config_index, uint32_t *video_format) = 0;
   virtual DisplayError GetMaxCEAFormat(uint32_t *max_cea_format) = 0;
   virtual DisplayError SetCursorPosition(HWLayers *hw_layers, int x, int y) = 0;
-  virtual DisplayError OnMinHdcpEncryptionLevelChange() = 0;
+  virtual DisplayError OnMinHdcpEncryptionLevelChange(uint32_t min_enc_level) = 0;
   virtual DisplayError GetPanelBrightness(int *level) = 0;
 
  protected:
diff --git a/sdm/libs/hwc/hwc_display.cpp b/sdm/libs/hwc/hwc_display.cpp
index 099a507..29a35b2 100644
--- a/sdm/libs/hwc/hwc_display.cpp
+++ b/sdm/libs/hwc/hwc_display.cpp
@@ -1209,8 +1209,8 @@
   return 0;
 }
 
-int HWCDisplay::OnMinHdcpEncryptionLevelChange() {
-  DisplayError error = display_intf_->OnMinHdcpEncryptionLevelChange();
+int HWCDisplay::OnMinHdcpEncryptionLevelChange(uint32_t min_enc_level) {
+  DisplayError error = display_intf_->OnMinHdcpEncryptionLevelChange(min_enc_level);
   if (error != kErrorNone) {
     DLOGE("Failed. Error = %d", error);
     return -1;
diff --git a/sdm/libs/hwc/hwc_display.h b/sdm/libs/hwc/hwc_display.h
index 9154225..0aab57b 100644
--- a/sdm/libs/hwc/hwc_display.h
+++ b/sdm/libs/hwc/hwc_display.h
@@ -59,7 +59,7 @@
   virtual void GetFrameBufferResolution(uint32_t *x_pixels, uint32_t *y_pixels);
   virtual void GetPanelResolution(uint32_t *x_pixels, uint32_t *y_pixels);
   virtual int SetDisplayStatus(uint32_t display_status);
-  virtual int OnMinHdcpEncryptionLevelChange();
+  virtual int OnMinHdcpEncryptionLevelChange(uint32_t min_enc_level);
   virtual int Perform(uint32_t operation, ...);
   virtual int SetCursorPosition(int x, int y);
   virtual void SetSecureDisplay(bool secure_display_active);
diff --git a/sdm/libs/hwc/hwc_session.cpp b/sdm/libs/hwc/hwc_session.cpp
index b755ab8..e90b181 100644
--- a/sdm/libs/hwc/hwc_session.cpp
+++ b/sdm/libs/hwc/hwc_session.cpp
@@ -1058,6 +1058,7 @@
                                                              android::Parcel *output_parcel) {
   int ret = -EINVAL;
   uint32_t display_id = UINT32(input_parcel->readInt32());
+  uint32_t min_enc_level = UINT32(input_parcel->readInt32());
 
   DLOGI("Display %d", display_id);
 
@@ -1068,7 +1069,7 @@
   } else if (!hwc_display_[display_id]) {
     DLOGW("Display is not connected");
   } else {
-    ret = hwc_display_[display_id]->OnMinHdcpEncryptionLevelChange();
+    ret = hwc_display_[display_id]->OnMinHdcpEncryptionLevelChange(min_enc_level);
   }
 
   output_parcel->writeInt32(ret);