Merge "sdm: drm: return default feature info for all the PP features"
diff --git a/sdm/include/private/color_params.h b/sdm/include/private/color_params.h
index 08895ee..14ec40f 100644
--- a/sdm/include/private/color_params.h
+++ b/sdm/include/private/color_params.h
@@ -157,6 +157,7 @@
   static const uint32_t kSDEPADitherV17 = 16;
   static const uint32_t kSDEIgcV30 = 17;
   static const uint32_t kSDEGamutV4 = 18;
+  static const uint32_t kSDEPccV4 = 19;
 
   uint32_t version[kMaxNumPPFeatures];
   PPFeatureVersion() { memset(version, 0, sizeof(version)); }
@@ -327,6 +328,29 @@
   SDEPccCfg *GetConfig() { return this; }
 };
 
+struct SDEPccV4Coeff {
+  uint32_t c = 0;
+  uint32_t r = 0;
+  uint32_t g = 0;
+  uint32_t b = 0;
+  uint32_t rg = 0;
+  uint32_t gb = 0;
+  uint32_t rb = 0;
+  uint32_t rgb = 0;
+  uint32_t rr = 0;
+  uint32_t gg = 0;
+  uint32_t bb = 0;
+};
+
+struct SDEPccV4Cfg {
+  SDEPccV4Coeff red;
+  SDEPccV4Coeff green;
+  SDEPccV4Coeff blue;
+
+  static SDEPccV4Cfg *Init(uint32_t arg __attribute__((__unused__)));
+  SDEPccV4Cfg *GetConfig() { return this; }
+};
+
 struct SDEDitherCfg {
   uint32_t g_y_depth;
   uint32_t r_cr_depth;
diff --git a/sdm/libs/core/drm/hw_color_manager_drm.cpp b/sdm/libs/core/drm/hw_color_manager_drm.cpp
index 67478c9..2000f9a 100644
--- a/sdm/libs/core/drm/hw_color_manager_drm.cpp
+++ b/sdm/libs/core/drm/hw_color_manager_drm.cpp
@@ -77,6 +77,11 @@
 
   switch (feature.id) {
     case kFeaturePcc:
+      if (feature.version == 1) {
+        version = PPFeatureVersion::kSDEPccV17;
+      } else if (feature.version == 4) {
+        version = PPFeatureVersion::kSDEPccV4;
+      }
       break;
     case kFeatureIgc:
       if (feature.version == 3)
@@ -87,10 +92,13 @@
         version = PPFeatureVersion::kSDEPgcV17;
       break;
     case kFeatureMixerGc:
+        version = PPFeatureVersion::kSDEPgcV17;
       break;
     case kFeaturePaV2:
+        version = PPFeatureVersion::kSDEPaV17;
       break;
     case kFeatureDither:
+        version = PPFeatureVersion::kSDEDitherV17;
       break;
     case kFeatureGamut:
       if (feature.version == 1)
@@ -99,6 +107,7 @@
         version = PPFeatureVersion::kSDEGamutV4;
       break;
     case kFeaturePADither:
+        version = PPFeatureVersion::kSDEPADitherV17;
       break;
     default:
       break;
@@ -143,6 +152,84 @@
 DisplayError HWColorManagerDrm::GetDrmPCC(const PPFeatureInfo &in_data,
                                           DRMPPFeatureInfo *out_data) {
   DisplayError ret = kErrorNone;
+#ifdef PP_DRM_ENABLE
+  struct SDEPccV4Cfg *sde_pcc = NULL;
+  struct SDEPccV4Coeff *sde_pcc_coeffs = NULL;
+  struct drm_msm_pcc *mdp_pcc = NULL;
+  struct drm_msm_pcc_coeff *mdp_pcc_coeffs = NULL;
+  uint32_t i = 0;
+
+  if (!out_data) {
+    DLOGE("Invalid input parameter for pcc");
+    return kErrorParameters;
+  }
+
+  switch (in_data.feature_version_) {
+  case PPFeatureVersion::kSDEPccV4:
+    sde_pcc = (struct SDEPccV4Cfg *) in_data.GetConfigData();
+    break;
+  default:
+    DLOGE("Unsupported pcc feature version: %d", in_data.feature_version_);
+    return kErrorParameters;
+  }
+
+  out_data->id = kFeaturePcc;
+  out_data->type = sde_drm::kPropBlob;
+  out_data->version = in_data.feature_version_;
+  out_data->payload_size = sizeof(struct drm_msm_pcc);
+
+  if (in_data.enable_flags_ & kOpsDisable) {
+    /* feature disable case */
+    out_data->payload = NULL;
+    return ret;
+  } else if (!(in_data.enable_flags_ & kOpsEnable)) {
+    out_data->payload = NULL;
+    return kErrorParameters;
+  }
+
+  mdp_pcc = new drm_msm_pcc();
+  if (!mdp_pcc) {
+    DLOGE("Failed to allocate memory for pcc");
+    return kErrorMemory;
+  }
+
+  mdp_pcc->flags = 0;
+
+  for (i = 0; i < kMaxPCCChanel; i++) {
+    switch (i) {
+    case 0:
+      sde_pcc_coeffs = &sde_pcc->red;
+      mdp_pcc_coeffs = &mdp_pcc->r;
+      mdp_pcc->r_rr = sde_pcc_coeffs->rr;
+      mdp_pcc->r_gg = sde_pcc_coeffs->gg;
+      mdp_pcc->r_bb = sde_pcc_coeffs->bb;
+      break;
+    case 1:
+        sde_pcc_coeffs = &sde_pcc->green;
+        mdp_pcc_coeffs = &mdp_pcc->g;
+        mdp_pcc->g_rr = sde_pcc_coeffs->rr;
+        mdp_pcc->g_gg = sde_pcc_coeffs->gg;
+        mdp_pcc->g_bb = sde_pcc_coeffs->bb;
+      break;
+    case 2:
+        sde_pcc_coeffs = &sde_pcc->blue;
+        mdp_pcc_coeffs = &mdp_pcc->b;
+        mdp_pcc->b_rr = sde_pcc_coeffs->rr;
+        mdp_pcc->b_gg = sde_pcc_coeffs->gg;
+        mdp_pcc->b_bb = sde_pcc_coeffs->bb;
+      break;
+    }
+    mdp_pcc_coeffs->c = sde_pcc_coeffs->c;
+    mdp_pcc_coeffs->r = sde_pcc_coeffs->r;
+    mdp_pcc_coeffs->g = sde_pcc_coeffs->g;
+    mdp_pcc_coeffs->b = sde_pcc_coeffs->b;
+    mdp_pcc_coeffs->rg = sde_pcc_coeffs->rg;
+    mdp_pcc_coeffs->gb = sde_pcc_coeffs->gb;
+    mdp_pcc_coeffs->rb = sde_pcc_coeffs->rb;
+    mdp_pcc_coeffs->rgb = sde_pcc_coeffs->rgb;
+  }
+  out_data->payload = mdp_pcc;
+#endif
   return ret;
 }
 
@@ -266,18 +353,49 @@
 DisplayError HWColorManagerDrm::GetDrmMixerGC(const PPFeatureInfo &in_data,
                                               DRMPPFeatureInfo *out_data) {
   DisplayError ret = kErrorNone;
+#ifdef PP_DRM_ENABLE
+  if (!out_data) {
+    DLOGE("Invalid input parameter for Mixer GC");
+    return kErrorParameters;
+  }
+
+  out_data->id = kPPFeaturesMax;
+  out_data->type = sde_drm::kPropBlob;
+  out_data->version = in_data.feature_version_;
+#endif
   return ret;
 }
 
 DisplayError HWColorManagerDrm::GetDrmPAV2(const PPFeatureInfo &in_data,
                                            DRMPPFeatureInfo *out_data) {
   DisplayError ret = kErrorNone;
+#ifdef PP_DRM_ENABLE
+  if (!out_data) {
+    DLOGE("Invalid input parameter for PA V2");
+    return kErrorParameters;
+  }
+
+  out_data->id = kPPFeaturesMax;
+  out_data->type = sde_drm::kPropBlob;
+  out_data->version = in_data.feature_version_;
+
+#endif
   return ret;
 }
 
 DisplayError HWColorManagerDrm::GetDrmDither(const PPFeatureInfo &in_data,
                                              DRMPPFeatureInfo *out_data) {
   DisplayError ret = kErrorNone;
+#ifdef PP_DRM_ENABLE
+  if (!out_data) {
+    DLOGE("Invalid input parameter for dither");
+    return kErrorParameters;
+  }
+
+  out_data->id = kPPFeaturesMax;
+  out_data->type = sde_drm::kPropBlob;
+  out_data->version = in_data.feature_version_;
+#endif
   return ret;
 }
 
@@ -360,6 +478,16 @@
 DisplayError HWColorManagerDrm::GetDrmPADither(const PPFeatureInfo &in_data,
                                                DRMPPFeatureInfo *out_data) {
   DisplayError ret = kErrorNone;
+#ifdef PP_DRM_ENABLE
+  if (!out_data) {
+    DLOGE("Invalid input parameter for PA dither");
+    return kErrorParameters;
+  }
+
+  out_data->id = kPPFeaturesMax;
+  out_data->type = sde_drm::kPropBlob;
+  out_data->version = in_data.feature_version_;
+#endif
   return ret;
 }
 
diff --git a/sdm/libs/core/drm/hw_color_manager_drm.h b/sdm/libs/core/drm/hw_color_manager_drm.h
index a10d00b..290c606 100644
--- a/sdm/libs/core/drm/hw_color_manager_drm.h
+++ b/sdm/libs/core/drm/hw_color_manager_drm.h
@@ -38,6 +38,8 @@
 
 namespace sdm {
 
+static const uint32_t kMaxPCCChanel = 3;
+
 class HWColorManagerDrm {
  public:
   static DisplayError (*GetDrmFeature[kMaxNumPPFeatures])(const PPFeatureInfo &in_data,