Merge "sdm: Add API for SR and PU control from Dpps" into display.lnx.5.0
diff --git a/libdrmutils/drm_interface.h b/libdrmutils/drm_interface.h
index 8f2a5f8..91d6194 100644
--- a/libdrmutils/drm_interface.h
+++ b/libdrmutils/drm_interface.h
@@ -643,6 +643,12 @@
   kDppsFeaturesMax,
 };
 
+struct DppsFeaturePayload {
+  uint32_t object_type;
+  uint32_t feature_id;
+  uint64_t value;
+};
+
 struct DRMDppsFeatureInfo {
   DRMDPPSFeatureID id;
   uint32_t version;
diff --git a/sdm/include/core/dpps_interface.h b/sdm/include/core/dpps_interface.h
index d3d3d02..47b3e2b 100644
--- a/sdm/include/core/dpps_interface.h
+++ b/sdm/include/core/dpps_interface.h
@@ -34,11 +34,17 @@
 
 namespace sdm {
 
+enum DppsOps {
+  kDppsSetFeature,
+  kDppsGetFeatureInfo,
+  kDppsScreenRefresh,
+  kDppsPartialUpdate,
+  kDppsOpMax,
+};
+
 class DppsPropIntf {
  public:
-  virtual DisplayError SetDppsFeature(uint32_t object_type,
-                                      uint32_t feature_id, uint64_t value) = 0;
-  virtual DisplayError GetDppsFeatureInfo(void *info) = 0;
+  virtual DisplayError DppsProcessOps(enum DppsOps op, void *payload, size_t size) = 0;
 
  protected:
   virtual ~DppsPropIntf() { }
diff --git a/sdm/libs/core/display_primary.cpp b/sdm/libs/core/display_primary.cpp
index 4a42e18..2448fe7 100644
--- a/sdm/libs/core/display_primary.cpp
+++ b/sdm/libs/core/display_primary.cpp
@@ -436,13 +436,46 @@
   }
 }
 
-DisplayError DisplayPrimary::SetDppsFeature(uint32_t object_type,
-                            uint32_t feature_id, uint64_t value) {
-    return hw_intf_->SetDppsFeature(object_type, feature_id, value);
-}
+DisplayError DisplayPrimary::DppsProcessOps(enum DppsOps op, void *payload, size_t size) {
+  DisplayError error = kErrorNone;
+  uint32_t pending;
+  bool enable = false;
 
-DisplayError DisplayPrimary::GetDppsFeatureInfo(void *info) {
-    return hw_intf_->GetDppsFeatureInfo(info);
+  switch (op) {
+  case kDppsSetFeature:
+    if (!payload) {
+      DLOGE("Invalid payload parameter for op %d", op);
+      error = kErrorParameters;
+      break;
+    }
+    error = hw_intf_->SetDppsFeature(payload, size);
+    break;
+  case kDppsGetFeatureInfo:
+    if (!payload) {
+      DLOGE("Invalid payload parameter for op %d", op);
+      error = kErrorParameters;
+      break;
+    }
+    error = hw_intf_->GetDppsFeatureInfo(payload, size);
+    break;
+  case kDppsScreenRefresh:
+    event_handler_->Refresh();
+    break;
+  case kDppsPartialUpdate:
+    if (!payload) {
+      DLOGE("Invalid payload parameter for op %d", op);
+      error = kErrorParameters;
+      break;
+    }
+    enable = *((bool *)payload);
+    ControlPartialUpdate(enable, &pending);
+    break;
+  default:
+    DLOGE("Invalid input op %d", op);
+    error = kErrorParameters;
+    break;
+  }
+  return error;
 }
 
 void DppsInfo::Init(DppsPropIntf* intf) {
diff --git a/sdm/libs/core/display_primary.h b/sdm/libs/core/display_primary.h
index fcb2f19..541504b 100644
--- a/sdm/libs/core/display_primary.h
+++ b/sdm/libs/core/display_primary.h
@@ -81,9 +81,7 @@
   virtual void HwRecovery(const HWRecoveryEvent sdm_event_code);
 
   // Implement the DppsPropIntf
-  virtual DisplayError SetDppsFeature(uint32_t object_type,
-                                      uint32_t feature_id, uint64_t value);
-  virtual DisplayError GetDppsFeatureInfo(void *info);
+  virtual DisplayError DppsProcessOps(enum DppsOps op, void *payload, size_t size);
 
  private:
   bool NeedsAVREnable();
diff --git a/sdm/libs/core/drm/hw_device_drm.h b/sdm/libs/core/drm/hw_device_drm.h
index f684394..51ba46a 100644
--- a/sdm/libs/core/drm/hw_device_drm.h
+++ b/sdm/libs/core/drm/hw_device_drm.h
@@ -105,9 +105,8 @@
   virtual void InitializeConfigs();
   virtual DisplayError DumpDebugData();
   virtual void PopulateHWPanelInfo();
-  virtual DisplayError SetDppsFeature(uint32_t object_type, uint32_t feature_id,
-                                      uint64_t value) { return kErrorNotSupported; }
-  virtual DisplayError GetDppsFeatureInfo(void *info) { return kErrorNotSupported; }
+  virtual DisplayError SetDppsFeature(void *payload, size_t size) { return kErrorNotSupported; }
+  virtual DisplayError GetDppsFeatureInfo(void *payload, size_t size) { return kErrorNotSupported; }
   virtual DisplayError HandleSecureEvent(SecureEvent secure_event) { return kErrorNotSupported; }
 
   enum {
diff --git a/sdm/libs/core/drm/hw_peripheral_drm.cpp b/sdm/libs/core/drm/hw_peripheral_drm.cpp
index df1149c..6420c13 100644
--- a/sdm/libs/core/drm/hw_peripheral_drm.cpp
+++ b/sdm/libs/core/drm/hw_peripheral_drm.cpp
@@ -37,6 +37,7 @@
 using sde_drm::DRMDisplayType;
 using sde_drm::DRMOps;
 using sde_drm::DRMPowerMode;
+using sde_drm::DppsFeaturePayload;
 using sde_drm::DRMDppsFeatureInfo;
 using sde_drm::DRMSecureMode;
 using sde_drm::DRMCWbCaptureMode;
@@ -143,10 +144,19 @@
   return kErrorNone;
 }
 
-DisplayError HWPeripheralDRM::SetDppsFeature(uint32_t object_type,
-        uint32_t feature_id, uint64_t value) {
-  uint32_t obj_id;
+DisplayError HWPeripheralDRM::SetDppsFeature(void *payload, size_t size) {
+  uint32_t obj_id = 0, object_type = 0, feature_id = 0;
+  uint64_t value = 0;
 
+  if (size != sizeof(DppsFeaturePayload)) {
+    DLOGE("invalid payload size %d, expected %d", size, sizeof(DppsFeaturePayload));
+    return kErrorParameters;
+  }
+
+  DppsFeaturePayload *feature_payload = reinterpret_cast<DppsFeaturePayload *>(payload);
+  object_type = feature_payload->object_type;
+  feature_id = feature_payload->feature_id;
+  value = feature_payload->value;
   if (object_type == DRM_MODE_OBJECT_CRTC) {
     obj_id = token_.crtc_id;
   } else if (object_type == DRM_MODE_OBJECT_CONNECTOR) {
@@ -160,8 +170,12 @@
   return kErrorNone;
 }
 
-DisplayError HWPeripheralDRM::GetDppsFeatureInfo(void *info) {
-  DRMDppsFeatureInfo *feature_info = reinterpret_cast<DRMDppsFeatureInfo *>(info);
+DisplayError HWPeripheralDRM::GetDppsFeatureInfo(void *payload, size_t size) {
+  if (size != sizeof(DRMDppsFeatureInfo)) {
+    DLOGE("invalid payload size %d, expected %d", size, sizeof(DRMDppsFeatureInfo));
+    return kErrorParameters;
+  }
+  DRMDppsFeatureInfo *feature_info = reinterpret_cast<DRMDppsFeatureInfo *>(payload);
   drm_mgr_intf_->GetDppsFeatureInfo(feature_info);
   return kErrorNone;
 }
diff --git a/sdm/libs/core/drm/hw_peripheral_drm.h b/sdm/libs/core/drm/hw_peripheral_drm.h
index f93d405..86af571 100644
--- a/sdm/libs/core/drm/hw_peripheral_drm.h
+++ b/sdm/libs/core/drm/hw_peripheral_drm.h
@@ -52,9 +52,8 @@
   virtual DisplayError Validate(HWLayers *hw_layers);
   virtual DisplayError Commit(HWLayers *hw_layers);
   virtual DisplayError Flush();
-  virtual DisplayError SetDppsFeature(uint32_t object_type, uint32_t feature_id,
-                                      uint64_t value);
-  virtual DisplayError GetDppsFeatureInfo(void *info);
+  virtual DisplayError SetDppsFeature(void *payload, size_t size);
+  virtual DisplayError GetDppsFeatureInfo(void *payload, size_t size);
   virtual DisplayError HandleSecureEvent(SecureEvent secure_event);
 
  private:
diff --git a/sdm/libs/core/fb/hw_device.h b/sdm/libs/core/fb/hw_device.h
index d2a813f..7dd7f7a 100644
--- a/sdm/libs/core/fb/hw_device.h
+++ b/sdm/libs/core/fb/hw_device.h
@@ -98,9 +98,8 @@
   virtual DisplayError SetMixerAttributes(const HWMixerAttributes &mixer_attributes);
   virtual DisplayError GetMixerAttributes(HWMixerAttributes *mixer_attributes);
   virtual DisplayError DumpDebugData();
-  virtual DisplayError SetDppsFeature(uint32_t object_type, uint32_t feature_id,
-                                      uint64_t value) { return kErrorNotSupported; }
-  virtual DisplayError GetDppsFeatureInfo(void *info) { return kErrorNotSupported; }
+  virtual DisplayError SetDppsFeature(void *payload, size_t size) { return kErrorNotSupported; }
+  virtual DisplayError GetDppsFeatureInfo(void *payload, size_t size) { return kErrorNotSupported; }
   virtual DisplayError DumpDebugData(DisplayType type) { return kErrorNone; }
   virtual DisplayError HandleSecureEvent(SecureEvent secure_event) { return kErrorNotSupported; }
 
diff --git a/sdm/libs/core/hw_interface.h b/sdm/libs/core/hw_interface.h
index 884c2c6..3cc483b 100644
--- a/sdm/libs/core/hw_interface.h
+++ b/sdm/libs/core/hw_interface.h
@@ -114,9 +114,8 @@
   virtual DisplayError SetMixerAttributes(const HWMixerAttributes &mixer_attributes) = 0;
   virtual DisplayError GetMixerAttributes(HWMixerAttributes *mixer_attributes) = 0;
   virtual DisplayError DumpDebugData() = 0;
-  virtual DisplayError SetDppsFeature(uint32_t object_type,
-                                      uint32_t feature_id, uint64_t value) = 0;
-  virtual DisplayError GetDppsFeatureInfo(void *info) = 0;
+  virtual DisplayError SetDppsFeature(void *payload, size_t size) = 0;
+  virtual DisplayError GetDppsFeatureInfo(void *payload, size_t size) = 0;
   virtual DisplayError HandleSecureEvent(SecureEvent secure_event) = 0;
 
  protected: