sdm: Update scalar LUT handling

Blobs related to scaler LUTs need to be freed on display deinit because
they are created on display init.

Also modified init sequence to only create blobs for builtin-primary and
external as primary use cases. Virtual as primary not supported.

Change-Id: Ib9ebc50647fe967ef5514ea3e372a7b7f60dc8a9
CRs-Fixed: 2240961
diff --git a/libdrmutils/drm_interface.h b/libdrmutils/drm_interface.h
index 5685064..c352839 100644
--- a/libdrmutils/drm_interface.h
+++ b/libdrmutils/drm_interface.h
@@ -801,6 +801,7 @@
    * [return]: Error code if the API fails, 0 on success.
    */
   virtual int Commit(bool synchronous, bool retain_planes) = 0;
+
   /*
    * Validate the params set via Perform().
    * [return]: Error code if the API fails, 0 on success.
@@ -923,6 +924,7 @@
    * [return]: Error code if the API fails, 0 on success.
    */
   virtual int DestroyAtomicReq(DRMAtomicReqInterface *intf) = 0;
+
   /*
    * Sets the global scaler LUT
    * [input]: LUT Info
@@ -931,6 +933,13 @@
   virtual int SetScalerLUT(const DRMScalerLUTInfo &lut_info) = 0;
 
   /*
+   * Unsets the global scaler LUT
+   * [input]: None
+   * [return]: Error code if the API fails, 0 on success.
+   */
+  virtual int UnsetScalerLUT() = 0;
+
+  /*
    * Get the DPPS feature info
    * [input]: Dpps feature id, info->id
    * [output]: Dpps feature version, info->version
diff --git a/sdm/libs/core/display_base.cpp b/sdm/libs/core/display_base.cpp
index afc8433..6d54b4e 100644
--- a/sdm/libs/core/display_base.cpp
+++ b/sdm/libs/core/display_base.cpp
@@ -116,12 +116,14 @@
   fb_config_.x_pixels = mixer_attributes_.width;
   fb_config_.y_pixels = mixer_attributes_.height;
 
-  HWScaleLutInfo lut_info = {};
-  error = comp_manager_->GetScaleLutConfig(&lut_info);
-  if (error == kErrorNone) {
-    error = hw_intf_->SetScaleLutConfig(&lut_info);
-    if (error != kErrorNone) {
-      goto CleanupOnError;
+  if (IsPrimaryDisplay()) {
+    HWScaleLutInfo lut_info = {};
+    error = comp_manager_->GetScaleLutConfig(&lut_info);
+    if (error == kErrorNone) {
+      error = hw_intf_->SetScaleLutConfig(&lut_info);
+      if (error != kErrorNone) {
+        goto CleanupOnError;
+      }
     }
   }
 
@@ -182,6 +184,9 @@
     lock_guard<recursive_mutex> obj(recursive_mutex_);
     ClearColorInfo();
     comp_manager_->UnregisterDisplay(display_comp_ctx_);
+    if (IsPrimaryDisplay()) {
+      hw_intf_->UnsetScaleLutConfig();
+    }
   }
   HWEventsInterface::Destroy(hw_events_intf_);
   HWInterface::Destroy(hw_intf_);
diff --git a/sdm/libs/core/display_virtual.cpp b/sdm/libs/core/display_virtual.cpp
index 3b334d0..cff7519 100644
--- a/sdm/libs/core/display_virtual.cpp
+++ b/sdm/libs/core/display_virtual.cpp
@@ -61,16 +61,6 @@
     hw_intf_->GetDisplayId(&display_id_);
   }
 
-  HWScaleLutInfo lut_info = {};
-  error = comp_manager_->GetScaleLutConfig(&lut_info);
-  if (error == kErrorNone) {
-    error = hw_intf_->SetScaleLutConfig(&lut_info);
-    if (error != kErrorNone) {
-      HWInterface::Destroy(hw_intf_);
-      return error;
-    }
-  }
-
   if (hw_info_intf_) {
     HWResourceInfo hw_resource_info = HWResourceInfo();
     hw_info_intf_->GetHWResourceInfo(&hw_resource_info);
diff --git a/sdm/libs/core/drm/hw_device_drm.cpp b/sdm/libs/core/drm/hw_device_drm.cpp
index 4cb06c7..8311084 100644
--- a/sdm/libs/core/drm/hw_device_drm.cpp
+++ b/sdm/libs/core/drm/hw_device_drm.cpp
@@ -1615,6 +1615,12 @@
   return kErrorNone;
 }
 
+DisplayError HWDeviceDRM::UnsetScaleLutConfig() {
+  drm_mgr_intf_->UnsetScalerLUT();
+
+  return kErrorNone;
+}
+
 DisplayError HWDeviceDRM::SetMixerAttributes(const HWMixerAttributes &mixer_attributes) {
   if (IsResolutionSwitchEnabled()) {
     return kErrorNotSupported;
diff --git a/sdm/libs/core/drm/hw_device_drm.h b/sdm/libs/core/drm/hw_device_drm.h
index b89391b..6cfd51c 100644
--- a/sdm/libs/core/drm/hw_device_drm.h
+++ b/sdm/libs/core/drm/hw_device_drm.h
@@ -104,6 +104,7 @@
   virtual DisplayError SetAutoRefresh(bool enable) { autorefresh_ = enable; return kErrorNone; }
   virtual DisplayError SetS3DMode(HWS3DMode s3d_mode);
   virtual DisplayError SetScaleLutConfig(HWScaleLutInfo *lut_info);
+  virtual DisplayError UnsetScaleLutConfig();
   virtual DisplayError SetMixerAttributes(const HWMixerAttributes &mixer_attributes);
   virtual DisplayError GetMixerAttributes(HWMixerAttributes *mixer_attributes);
   virtual void InitializeConfigs();
diff --git a/sdm/libs/core/drm/hw_virtual_drm.h b/sdm/libs/core/drm/hw_virtual_drm.h
index 9dfc409..61f498b 100644
--- a/sdm/libs/core/drm/hw_virtual_drm.h
+++ b/sdm/libs/core/drm/hw_virtual_drm.h
@@ -53,6 +53,12 @@
   virtual DisplayError Commit(HWLayers *hw_layers);
   virtual DisplayError GetPPFeaturesVersion(PPFeatureVersion *vers);
   virtual DisplayError PowerOn(const HWQosData &qos_data, int *release_fence);
+  virtual DisplayError SetScaleLutConfig(HWScaleLutInfo *lut_info) {
+    return kErrorNotSupported;
+  }
+  virtual DisplayError UnsetScaleLutConfig() {
+    return kErrorNotSupported;
+  }
 
  private:
   void ConfigureWbConnectorFbId(uint32_t fb_id);
diff --git a/sdm/libs/core/fb/hw_device.h b/sdm/libs/core/fb/hw_device.h
index cf77e09..7504721 100644
--- a/sdm/libs/core/fb/hw_device.h
+++ b/sdm/libs/core/fb/hw_device.h
@@ -95,6 +95,7 @@
   virtual DisplayError SetAutoRefresh(bool enable) { return kErrorNone; }
   virtual DisplayError SetS3DMode(HWS3DMode s3d_mode);
   virtual DisplayError SetScaleLutConfig(HWScaleLutInfo *lut_info);
+  virtual DisplayError UnsetScaleLutConfig() { return kErrorNotSupported; }
   virtual DisplayError SetMixerAttributes(const HWMixerAttributes &mixer_attributes);
   virtual DisplayError GetMixerAttributes(HWMixerAttributes *mixer_attributes);
   virtual DisplayError DumpDebugData();
diff --git a/sdm/libs/core/hw_interface.h b/sdm/libs/core/hw_interface.h
index b5223b5..06d166e 100644
--- a/sdm/libs/core/hw_interface.h
+++ b/sdm/libs/core/hw_interface.h
@@ -111,6 +111,7 @@
   virtual DisplayError SetAutoRefresh(bool enable) = 0;
   virtual DisplayError SetS3DMode(HWS3DMode s3d_mode) = 0;
   virtual DisplayError SetScaleLutConfig(HWScaleLutInfo *lut_info) = 0;
+  virtual DisplayError UnsetScaleLutConfig() = 0;
   virtual DisplayError SetMixerAttributes(const HWMixerAttributes &mixer_attributes) = 0;
   virtual DisplayError GetMixerAttributes(HWMixerAttributes *mixer_attributes) = 0;
   virtual DisplayError DumpDebugData() = 0;