msmcobalt: Update to 07.00.00.253.042

msmcobalt: from hardware/qcom/display
  1f98b37 Merge AU_LINUX_ANDROID_LA.UM.5.7.R1.07.00.00.253.039 on remote branch
  d48fe97 Promotion of display.lnx.3.0-00065.
  30163cb Merge "sdm: Avoid flush for command mode panels"
  22f508d sdm: Add method to disable certain composition types.
  42166bc sdm: Remove rotator interface.
  33f438a Merge "qdMetadata: Fix potential memory leak in copyMetaData"
  8221411 Promotion of display.lnx.3.0-00062.
  c96d346 sdm: Avoid flush for command mode panels
  2b4f604 qdMetadata: Fix potential memory leak in copyMetaData
  0b1fa17 sdm : Reset cached auto_refresh_ variable during suspend.
  82253a4 sdm: Remove version dependency.

Change-Id: Iec27452ace45b3aa406fed99c2dd61bf25f19f8b
Signed-off-by: Thierry Strudel <tstrudel@google.com>
diff --git a/msmcobalt/libgralloc/Makefile.am b/msmcobalt/libgralloc/Makefile.am
index 2698df3..d57ad32 100644
--- a/msmcobalt/libgralloc/Makefile.am
+++ b/msmcobalt/libgralloc/Makefile.am
@@ -12,8 +12,9 @@
 libmemalloc_la_SOURCES = $(cpp_sources)
 libmemalloc_la_CFLAGS = $(COMMON_CFLAGS) -DLOG_TAG=\"qdmemalloc\"
 libmemalloc_la_CPPFLAGS = $(AM_CPPFLAGS)
-libmemalloc_LDADD = -lhardware -lcutils -llog -lutils -ldl
 libmemalloc_la_LIBADD = ../libqdutils/libqdutils.la
+libmemalloc_la_LIBADD += -lhardware -lcutils -llog -lutils -ldl
+libmemalloc_la_LDFLAGS = -shared -avoid-version
 
 header_sources = gralloc_priv.h \
                  gr.h
@@ -31,7 +32,8 @@
 libgralloc_la_SOURCES = $(c_sources)
 libgralloc_la_CFLAGS = $(COMMON_CFLAGS) -DLOG_TAG=\"qdgralloc\"
 libgralloc_la_CPPFLAGS = $(AM_CPPFLAGS)
-libgralloc_LDADD = -lhardware -lcutils -llog -lutils
 libgralloc_la_LIBADD = ../libqdutils/libqdutils.la
 libgralloc_la_LIBADD += ../libqdutils/libqdMetaData.la
-libgralloc_la_LIBADD += libmemalloc.la
\ No newline at end of file
+libgralloc_la_LIBADD += -lhardware -lcutils -llog -lutils -lbinder
+libgralloc_la_LIBADD += libmemalloc.la
+libgralloc_la_LDFLAGS = -shared -avoid-version
\ No newline at end of file
diff --git a/msmcobalt/libqdutils/Makefile.am b/msmcobalt/libqdutils/Makefile.am
index ef2108d..01fbf19 100644
--- a/msmcobalt/libqdutils/Makefile.am
+++ b/msmcobalt/libqdutils/Makefile.am
@@ -11,6 +11,7 @@
 libqdMetaData_la_CFLAGS = $(AM_CFLAGS) -DLOG_TAG=\"DisplayMetaData\"
 libqdMetaData_la_CPPFLAGS = $(AM_CPPFLAGS)
 libqdMetaData_LDADD = -lcutils -llog
+libqdMetaData_la_LDFLAGS = -shared -avoid-version
 
 header_sources = display_config.h
 
@@ -27,4 +28,5 @@
 libqdutils_la_CFLAGS = $(COMMON_CFLAGS) -DLOG_TAG=\"qdutils\"
 libqdutils_la_CPPFLAGS = $(AM_CPPFLAGS)
 libqdutils_LDADD = -lhardware -lcutils -llog -lbinder
-libqdutils_la_LIBADD = ../libqservice/libqservice.la
\ No newline at end of file
+libqdutils_la_LIBADD = ../libqservice/libqservice.la
+libqdutils_la_LDFLAGS = -shared -avoid-version
\ No newline at end of file
diff --git a/msmcobalt/libqdutils/qdMetaData.cpp b/msmcobalt/libqdutils/qdMetaData.cpp
index 51dfa82..f62653a 100644
--- a/msmcobalt/libqdutils/qdMetaData.cpp
+++ b/msmcobalt/libqdutils/qdMetaData.cpp
@@ -233,6 +233,9 @@
         dst->fd_metadata, 0);
     if (base_dst == reinterpret_cast<void*>(MAP_FAILED)) {
         ALOGE("%s: dst mmap() failed: error is %s!", __func__, strerror(errno));
+        if(munmap(base_src, size))
+            ALOGE("%s: failed to unmap src ptr %p, err %d", __func__,
+                                             (void*)base_src, errno);
         return -1;
     }
 
diff --git a/msmcobalt/libqservice/Makefile.am b/msmcobalt/libqservice/Makefile.am
index 155060d..79935b8 100644
--- a/msmcobalt/libqservice/Makefile.am
+++ b/msmcobalt/libqservice/Makefile.am
@@ -14,4 +14,5 @@
 libqservice_la_SOURCES = $(cpp_sources)
 libqservice_la_CFLAGS = $(COMMON_CFLAGS) -DLOG_TAG=\"qdqservice\"
 libqservice_la_CPPFLAGS = $(AM_CPPFLAGS)
-libqservice_LDADD = -lhardware -lcutils -llog -lbinder
\ No newline at end of file
+libqservice_LDADD = -lhardware -lcutils -llog -lbinder
+libqservice_la_LDFLAGS = -shared -avoid-version
\ No newline at end of file
diff --git a/msmcobalt/sdm/include/core/display_interface.h b/msmcobalt/sdm/include/core/display_interface.h
index ccaa0b5..416e01a 100644
--- a/msmcobalt/sdm/include/core/display_interface.h
+++ b/msmcobalt/sdm/include/core/display_interface.h
@@ -140,6 +140,7 @@
 struct DisplayConfigFixedInfo {
   bool underscan = false;   //!< If display support CE underscan.
   bool secure = false;      //!< If this display is capable of handling secure content.
+  bool is_cmdmode = false;  //!< If panel is command mode panel.
 };
 
 /*! @brief This structure defines configuration for variable properties of a display device.
@@ -597,10 +598,30 @@
 
   /*! @brief Method to query whether it is Primrary device.
 
-    @return \link Bool \endlink
+    @return true if this interface is primary.
   */
   virtual bool IsPrimaryDisplay() = 0;
 
+  /*! @brief Method to toggle composition types handling by SDM.
+
+    @details Client shall call this method to request SDM to enable/disable a specific type of
+    layer composition. If client disables a composition type, SDM will not handle any of the layer
+    composition using the disabled method in a draw cycle. On lack of resources to handle all
+    layers using other enabled composition methods, Prepare() will return an error.
+
+    Request to toggle composition type is applied from subsequent draw cycles.
+
+    Default state of all defined composition types is enabled.
+
+    @param[in] composition_type \link LayerComposition \endlink
+    @param[in] enable \link enable composition type \endlink
+
+    @return \link DisplayError \endlink
+
+    @sa Prepare
+  */
+  virtual DisplayError SetCompositionState(LayerComposition composition_type, bool enable) = 0;
+
  protected:
   virtual ~DisplayInterface() { }
 };
diff --git a/msmcobalt/sdm/include/core/layer_stack.h b/msmcobalt/sdm/include/core/layer_stack.h
index 0fcab25..2741f71 100644
--- a/msmcobalt/sdm/include/core/layer_stack.h
+++ b/msmcobalt/sdm/include/core/layer_stack.h
@@ -102,10 +102,10 @@
   /* === List of composition types set by Client === */
   /* These composition types represent target buffer layers onto which GPU or Blit will draw if SDM
      decide to have some or all layers drawn by respective composition engine.
-     If client does not provide a target buffer layer, SDM will assume that respective composition
-     engine is not available and will not mark any layer for such a composition. If SDM is unable
-     to handle layers without support of such a composition engine, Prepare() call will return
-     failure.
+     Client must provide a target buffer layer, if respective composition type is not disabled by
+     an explicit call to SetCompositionState() method. If a composition type is not disabled,
+     providing a target buffer layer is optional. If SDM is unable to handle layers without support
+     of such a composition engine, Prepare() call will return failure.
   */
   kCompositionGPUTarget,    //!< This layer will hold result of composition for layers marked for
                             //!< GPU composition.
diff --git a/msmcobalt/sdm/include/private/extension_interface.h b/msmcobalt/sdm/include/private/extension_interface.h
index dea127e..fc32616 100644
--- a/msmcobalt/sdm/include/private/extension_interface.h
+++ b/msmcobalt/sdm/include/private/extension_interface.h
@@ -31,7 +31,6 @@
 #include "partial_update_interface.h"
 #include "strategy_interface.h"
 #include "resource_interface.h"
-#include "rotator_interface.h"
 
 namespace sdm {
 
@@ -68,15 +67,10 @@
 
   virtual DisplayError CreateResourceExtn(const HWResourceInfo &hw_resource_info,
                                           ResourceInterface **interface,
+                                          BufferAllocator *buffer_allocator,
                                           BufferSyncHandler *buffer_sync_handler) = 0;
   virtual DisplayError DestroyResourceExtn(ResourceInterface *interface) = 0;
 
-  virtual DisplayError CreateRotator(const HWRotatorInfo &hw_rot_info,
-                                     BufferAllocator *buffer_allocator,
-                                     BufferSyncHandler *buffer_sync_handler,
-                                     RotatorInterface **intf) = 0;
-  virtual DisplayError DestroyRotator(RotatorInterface *intf) = 0;
-
  protected:
   virtual ~ExtensionInterface() { }
 };
diff --git a/msmcobalt/sdm/include/private/resource_interface.h b/msmcobalt/sdm/include/private/resource_interface.h
index 6115112..3f34e91 100644
--- a/msmcobalt/sdm/include/private/resource_interface.h
+++ b/msmcobalt/sdm/include/private/resource_interface.h
@@ -44,8 +44,9 @@
                                           const HWMixerAttributes &mixer_attributes) = 0;
   virtual DisplayError Start(Handle display_ctx) = 0;
   virtual DisplayError Stop(Handle display_ctx) = 0;
-  virtual DisplayError Acquire(Handle display_ctx, HWLayers *hw_layers) = 0;
+  virtual DisplayError Prepare(Handle display_ctx, HWLayers *hw_layers) = 0;
   virtual DisplayError PostPrepare(Handle display_ctx, HWLayers *hw_layers) = 0;
+  virtual DisplayError Commit(Handle display_ctx, HWLayers *hw_layers) = 0;
   virtual DisplayError PostCommit(Handle display_ctx, HWLayers *hw_layers) = 0;
   virtual void Purge(Handle display_ctx) = 0;
   virtual DisplayError SetMaxMixerStages(Handle display_ctx, uint32_t max_mixer_stages) = 0;
diff --git a/msmcobalt/sdm/include/private/strategy_interface.h b/msmcobalt/sdm/include/private/strategy_interface.h
index f2bfe23..188c540 100644
--- a/msmcobalt/sdm/include/private/strategy_interface.h
+++ b/msmcobalt/sdm/include/private/strategy_interface.h
@@ -51,6 +51,7 @@
   virtual DisplayError Reconfigure(HWDisplayMode mode, HWS3DMode s3d_mode,
                                    const HWMixerAttributes &mixer_attributes,
                                    const DisplayConfigVariableInfo &fb_config) = 0;
+  virtual DisplayError SetCompositionState(LayerComposition composition_type, bool enable) = 0;
 
  protected:
   virtual ~StrategyInterface() { }
diff --git a/msmcobalt/sdm/libs/core/Android.mk b/msmcobalt/sdm/libs/core/Android.mk
index de314ba..f97ff33 100644
--- a/msmcobalt/sdm/libs/core/Android.mk
+++ b/msmcobalt/sdm/libs/core/Android.mk
@@ -53,6 +53,5 @@
                                  $(SDM_HEADER_PATH)/private/hw_info_types.h \
                                  $(SDM_HEADER_PATH)/private/partial_update_interface.h \
                                  $(SDM_HEADER_PATH)/private/resource_interface.h \
-                                 $(SDM_HEADER_PATH)/private/rotator_interface.h \
                                  $(SDM_HEADER_PATH)/private/strategy_interface.h
 include $(BUILD_COPY_HEADERS)
diff --git a/msmcobalt/sdm/libs/core/Makefile.am b/msmcobalt/sdm/libs/core/Makefile.am
index 8dbbe2f..9041394 100644
--- a/msmcobalt/sdm/libs/core/Makefile.am
+++ b/msmcobalt/sdm/libs/core/Makefile.am
@@ -40,4 +40,5 @@
 libsdmcore_la_SOURCES = $(c_sources)
 libsdmcore_la_CFLAGS = $(COMMON_CFLAGS) -DLOG_TAG=\"SDM\"
 libsdmcore_la_CPPFLAGS = $(AM_CPPFLAGS)
-libsdmcore_la_LIBADD = ../utils/libsdmutils.la
\ No newline at end of file
+libsdmcore_la_LIBADD = ../utils/libsdmutils.la
+libsdmcore_la_LDFLAGS = -shared -avoid-version
\ No newline at end of file
diff --git a/msmcobalt/sdm/libs/core/comp_manager.cpp b/msmcobalt/sdm/libs/core/comp_manager.cpp
index 0b66320..4f33e9d 100644
--- a/msmcobalt/sdm/libs/core/comp_manager.cpp
+++ b/msmcobalt/sdm/libs/core/comp_manager.cpp
@@ -35,16 +35,17 @@
 
 DisplayError CompManager::Init(const HWResourceInfo &hw_res_info,
                                ExtensionInterface *extension_intf,
+                               BufferAllocator *buffer_allocator,
                                BufferSyncHandler *buffer_sync_handler) {
   SCOPE_LOCK(locker_);
 
   DisplayError error = kErrorNone;
 
   if (extension_intf) {
-    error = extension_intf->CreateResourceExtn(hw_res_info, &resource_intf_, buffer_sync_handler);
+    error = extension_intf->CreateResourceExtn(hw_res_info, &resource_intf_, buffer_allocator,
+                                               buffer_sync_handler);
   } else {
-    resource_intf_ = &resource_default_;
-    error = resource_default_.Init(hw_res_info);
+    error = ResourceDefault::CreateResourceDefault(hw_res_info, &resource_intf_);
   }
 
   if (error != kErrorNone) {
@@ -63,7 +64,7 @@
   if (extension_intf_) {
     extension_intf_->DestroyResourceExtn(resource_intf_);
   } else {
-    resource_default_.Deinit();
+    ResourceDefault::DestroyResourceDefault(resource_intf_);
   }
 
   return kErrorNone;
@@ -127,11 +128,11 @@
   return kErrorNone;
 }
 
-DisplayError CompManager::UnregisterDisplay(Handle comp_handle) {
+DisplayError CompManager::UnregisterDisplay(Handle display_ctx) {
   SCOPE_LOCK(locker_);
 
   DisplayCompositionContext *display_comp_ctx =
-                             reinterpret_cast<DisplayCompositionContext *>(comp_handle);
+                             reinterpret_cast<DisplayCompositionContext *>(display_ctx);
 
   if (!display_comp_ctx) {
     return kErrorParameters;
@@ -267,8 +268,8 @@
     }
 
     if (!exit) {
-      error = resource_intf_->Acquire(display_resource_ctx, hw_layers);
-      // Exit if successfully allocated resource, else try next strategy.
+      error = resource_intf_->Prepare(display_resource_ctx, hw_layers);
+      // Exit if successfully prepared resource, else try next strategy.
       exit = (error == kErrorNone);
     }
   }
@@ -299,6 +300,15 @@
   return kErrorNone;
 }
 
+DisplayError CompManager::Commit(Handle display_ctx, HWLayers *hw_layers) {
+  SCOPE_LOCK(locker_);
+
+  DisplayCompositionContext *display_comp_ctx =
+                             reinterpret_cast<DisplayCompositionContext *>(display_ctx);
+
+  return resource_intf_->Commit(display_comp_ctx->display_resource_ctx, hw_layers);
+}
+
 DisplayError CompManager::ReConfigure(Handle display_ctx, HWLayers *hw_layers) {
   SCOPE_LOCK(locker_);
 
@@ -308,7 +318,7 @@
 
   DisplayError error = kErrorUndefined;
   resource_intf_->Start(display_resource_ctx);
-  error = resource_intf_->Acquire(display_resource_ctx, hw_layers);
+  error = resource_intf_->Prepare(display_resource_ctx, hw_layers);
 
   if (error != kErrorNone) {
     DLOGE("Reconfigure failed for display = %d", display_comp_ctx->display_type);
@@ -492,5 +502,14 @@
   return resource_intf_->SetDetailEnhancerData(display_comp_ctx->display_resource_ctx, de_data);
 }
 
-}  // namespace sdm
+DisplayError CompManager::SetCompositionState(Handle display_ctx,
+                                              LayerComposition composition_type, bool enable) {
+  SCOPE_LOCK(locker_);
 
+  DisplayCompositionContext *display_comp_ctx =
+                             reinterpret_cast<DisplayCompositionContext *>(display_ctx);
+
+  return display_comp_ctx->strategy->SetCompositionState(composition_type, enable);
+}
+
+}  // namespace sdm
diff --git a/msmcobalt/sdm/libs/core/comp_manager.h b/msmcobalt/sdm/libs/core/comp_manager.h
index 688010c..3e646cf 100644
--- a/msmcobalt/sdm/libs/core/comp_manager.h
+++ b/msmcobalt/sdm/libs/core/comp_manager.h
@@ -40,19 +40,20 @@
 class CompManager : public DumpImpl {
  public:
   DisplayError Init(const HWResourceInfo &hw_res_info_, ExtensionInterface *extension_intf,
-                  BufferSyncHandler *buffer_sync_handler);
+                    BufferAllocator *buffer_allocator, BufferSyncHandler *buffer_sync_handler);
   DisplayError Deinit();
   DisplayError RegisterDisplay(DisplayType type, const HWDisplayAttributes &display_attributes,
                                const HWPanelInfo &hw_panel_info,
                                const HWMixerAttributes &mixer_attributes,
-                               const DisplayConfigVariableInfo &fb_config, Handle *res_mgr_hnd);
-  DisplayError UnregisterDisplay(Handle res_mgr_hnd);
+                               const DisplayConfigVariableInfo &fb_config, Handle *display_ctx);
+  DisplayError UnregisterDisplay(Handle display_ctx);
   DisplayError ReconfigureDisplay(Handle display_ctx, const HWDisplayAttributes &display_attributes,
                                   const HWPanelInfo &hw_panel_info,
                                   const HWMixerAttributes &mixer_attributes,
                                   const DisplayConfigVariableInfo &fb_config);
   void PrePrepare(Handle display_ctx, HWLayers *hw_layers);
   DisplayError Prepare(Handle display_ctx, HWLayers *hw_layers);
+  DisplayError Commit(Handle display_ctx, HWLayers *hw_layers);
   DisplayError PostPrepare(Handle display_ctx, HWLayers *hw_layers);
   DisplayError ReConfigure(Handle display_ctx, HWLayers *hw_layers);
   DisplayError PostCommit(Handle display_ctx, HWLayers *hw_layers);
@@ -68,6 +69,8 @@
   DisplayError SetMaxBandwidthMode(HWBwModes mode);
   DisplayError GetScaleLutConfig(HWScaleLutInfo *lut_info);
   DisplayError SetDetailEnhancerData(Handle display_ctx, const DisplayDetailEnhancerData &de_data);
+  DisplayError SetCompositionState(Handle display_ctx, LayerComposition composition_type,
+                                   bool enable);
 
   // DumpImpl method
   virtual void AppendDump(char *buffer, uint32_t length);
@@ -94,7 +97,6 @@
 
   Locker locker_;
   ResourceInterface *resource_intf_ = NULL;
-  ResourceDefault resource_default_;
   std::bitset<kDisplayMax> registered_displays_;  // Bit mask of registered displays
   std::bitset<kDisplayMax> configured_displays_;  // Bit mask of sucessfully configured displays
   bool safe_mode_ = false;              // Flag to notify all displays to be in resource crunch
diff --git a/msmcobalt/sdm/libs/core/core_impl.cpp b/msmcobalt/sdm/libs/core/core_impl.cpp
index 66eb846..5976176 100644
--- a/msmcobalt/sdm/libs/core/core_impl.cpp
+++ b/msmcobalt/sdm/libs/core/core_impl.cpp
@@ -76,19 +76,11 @@
     goto CleanupOnError;
   }
 
-  error = comp_mgr_.Init(hw_resource_, extension_intf_, buffer_sync_handler_);
+  error = comp_mgr_.Init(hw_resource_, extension_intf_, buffer_allocator_, buffer_sync_handler_);
   if (error != kErrorNone) {
     goto CleanupOnError;
   }
 
-  if (extension_intf_ && hw_resource_.hw_rot_info.num_rotator) {
-    error = extension_intf_->CreateRotator(hw_resource_.hw_rot_info, buffer_allocator_,
-                                           buffer_sync_handler_, &rotator_intf_);
-    if (error != kErrorNone) {
-      DLOGW("rotation is not supported");
-    }
-  }
-
   error = ColorManagerProxy::Init(hw_resource_);
   // if failed, doesn't affect display core functionalities.
   if (error != kErrorNone) {
@@ -108,10 +100,6 @@
 DisplayError CoreImpl::Deinit() {
   SCOPE_LOCK(locker_);
 
-  if (extension_intf_ && hw_resource_.hw_rot_info.num_rotator) {
-    extension_intf_->DestroyRotator(rotator_intf_);
-  }
-
   ColorManagerProxy::Deinit();
 
   comp_mgr_.Deinit();
@@ -133,15 +121,15 @@
   switch (type) {
   case kPrimary:
     display_base = new DisplayPrimary(event_handler, hw_info_intf_, buffer_sync_handler_,
-                                      &comp_mgr_, rotator_intf_);
+                                      &comp_mgr_);
     break;
   case kHDMI:
     display_base = new DisplayHDMI(event_handler, hw_info_intf_, buffer_sync_handler_,
-                                   &comp_mgr_, rotator_intf_);
+                                   &comp_mgr_);
     break;
   case kVirtual:
     display_base = new DisplayVirtual(event_handler, hw_info_intf_, buffer_sync_handler_,
-                                      &comp_mgr_, rotator_intf_);
+                                      &comp_mgr_);
     break;
   default:
     DLOGE("Spurious display type %d", type);
diff --git a/msmcobalt/sdm/libs/core/core_impl.h b/msmcobalt/sdm/libs/core/core_impl.h
index c2e98c3..459495d 100644
--- a/msmcobalt/sdm/libs/core/core_impl.h
+++ b/msmcobalt/sdm/libs/core/core_impl.h
@@ -38,9 +38,6 @@
 
 namespace sdm {
 
-class HWInfoInterface;
-class RotatorCtrl;
-
 class CoreImpl : public CoreInterface {
  public:
   // This class implements display core interface revision 1.0.
@@ -63,12 +60,11 @@
 
  protected:
   Locker locker_;
-  BufferAllocator *buffer_allocator_;
-  BufferSyncHandler *buffer_sync_handler_;
+  BufferAllocator *buffer_allocator_ = NULL;
+  BufferSyncHandler *buffer_sync_handler_ = NULL;
   HWResourceInfo hw_resource_;
   CompManager comp_mgr_;
   HWInfoInterface *hw_info_intf_ = NULL;
-  RotatorInterface *rotator_intf_ = NULL;
   DynLib extension_lib_;
   ExtensionInterface *extension_intf_ = NULL;
   CreateExtensionInterface create_extension_intf_ = NULL;
diff --git a/msmcobalt/sdm/libs/core/display_base.cpp b/msmcobalt/sdm/libs/core/display_base.cpp
index d7036e3..efd408d 100644
--- a/msmcobalt/sdm/libs/core/display_base.cpp
+++ b/msmcobalt/sdm/libs/core/display_base.cpp
@@ -41,11 +41,10 @@
 // TODO(user): Have a single structure handle carries all the interface pointers and variables.
 DisplayBase::DisplayBase(DisplayType display_type, DisplayEventHandler *event_handler,
                          HWDeviceType hw_device_type, BufferSyncHandler *buffer_sync_handler,
-                         CompManager *comp_manager, RotatorInterface *rotator_intf,
-                         HWInfoInterface *hw_info_intf)
+                         CompManager *comp_manager, HWInfoInterface *hw_info_intf)
   : display_type_(display_type), event_handler_(event_handler), hw_device_type_(hw_device_type),
     buffer_sync_handler_(buffer_sync_handler), comp_manager_(comp_manager),
-    rotator_intf_(rotator_intf), hw_info_intf_(hw_info_intf) {
+    hw_info_intf_(hw_info_intf) {
 }
 
 DisplayError DisplayBase::Init() {
@@ -90,13 +89,6 @@
     goto CleanupOnError;
   }
 
-  if (rotator_intf_) {
-    error = rotator_intf_->RegisterDisplay(display_type_, &display_rotator_ctx_);
-    if (error != kErrorNone) {
-      goto CleanupOnError;
-    }
-  }
-
   if (hw_info_intf_) {
     HWResourceInfo hw_resource_info = HWResourceInfo();
     hw_info_intf_->GetHWResourceInfo(&hw_resource_info);
@@ -126,9 +118,6 @@
 
 DisplayError DisplayBase::Deinit() {
   lock_guard<recursive_mutex> obj(recursive_mutex_);
-  if (rotator_intf_) {
-    rotator_intf_->UnregisterDisplay(display_rotator_ctx_);
-  }
 
   if (color_mgr_) {
     delete color_mgr_;
@@ -243,29 +232,15 @@
       break;
     }
 
-    if (IsRotationRequired(&hw_layers_)) {
-      if (!rotator_intf_) {
-        continue;
-      }
-      error = rotator_intf_->Prepare(display_rotator_ctx_, &hw_layers_);
-    } else {
-      // Release all the previous rotator sessions.
-      if (rotator_intf_) {
-        error = rotator_intf_->Purge(display_rotator_ctx_);
-      }
-    }
-
+    error = hw_intf_->Validate(&hw_layers_);
     if (error == kErrorNone) {
-      error = hw_intf_->Validate(&hw_layers_);
-      if (error == kErrorNone) {
-        // Strategy is successful now, wait for Commit().
-        pending_commit_ = true;
-        break;
-      }
-      if (error == kErrorShutDown) {
-        comp_manager_->PostPrepare(display_comp_ctx_, &hw_layers_);
-        return error;
-      }
+      // Strategy is successful now, wait for Commit().
+      pending_commit_ = true;
+      break;
+    }
+    if (error == kErrorShutDown) {
+      comp_manager_->PostPrepare(display_comp_ctx_, &hw_layers_);
+      return error;
     }
   }
 
@@ -307,8 +282,7 @@
     }
   }
 
-  if (rotator_intf_ && IsRotationRequired(&hw_layers_)) {
-    error = rotator_intf_->Commit(display_rotator_ctx_, &hw_layers_);
+  if (comp_manager_->Commit(display_comp_ctx_, &hw_layers_)) {
     if (error != kErrorNone) {
       return error;
     }
@@ -327,13 +301,6 @@
     return error;
   }
 
-  if (rotator_intf_ && IsRotationRequired(&hw_layers_)) {
-    error = rotator_intf_->PostCommit(display_rotator_ctx_, &hw_layers_);
-    if (error != kErrorNone) {
-      return error;
-    }
-  }
-
   if (partial_update_control_) {
     comp_manager_->ControlPartialUpdate(display_comp_ctx_, true /* enable */);
   }
@@ -357,17 +324,7 @@
   hw_layers_.info.count = 0;
   error = hw_intf_->Flush();
   if (error == kErrorNone) {
-    // Release all the rotator sessions.
-    if (rotator_intf_) {
-      error = rotator_intf_->Purge(display_rotator_ctx_);
-      if (error != kErrorNone) {
-        DLOGE("Rotator purge failed for display %d", display_type_);
-        return error;
-      }
-    }
-
     comp_manager_->Purge(display_comp_ctx_);
-
     pending_commit_ = false;
   } else {
     DLOGW("Unable to flush display = %d", display_type_);
@@ -402,6 +359,13 @@
   return kErrorNotSupported;
 }
 
+DisplayError DisplayBase::GetConfig(DisplayConfigFixedInfo *variable_info) {
+  lock_guard<recursive_mutex> obj(recursive_mutex_);
+  variable_info->is_cmdmode = (hw_panel_info_.mode == kModeCommand);
+
+  return kErrorNone;
+}
+
 DisplayError DisplayBase::GetActiveConfig(uint32_t *index) {
   lock_guard<recursive_mutex> obj(recursive_mutex_);
   return hw_intf_->GetActiveConfig(index);
@@ -435,17 +399,7 @@
     hw_layers_.info.count = 0;
     error = hw_intf_->Flush();
     if (error == kErrorNone) {
-      // Release all the rotator sessions.
-      if (rotator_intf_) {
-        error = rotator_intf_->Purge(display_rotator_ctx_);
-        if (error != kErrorNone) {
-          DLOGE("Rotator purge failed for display %d", display_type_);
-          return error;
-        }
-      }
-
       comp_manager_->Purge(display_comp_ctx_);
-
       error = hw_intf_->PowerOff();
     }
     break;
@@ -660,21 +614,6 @@
   }
 }
 
-bool DisplayBase::IsRotationRequired(HWLayers *hw_layers) {
-  lock_guard<recursive_mutex> obj(recursive_mutex_);
-  HWLayersInfo &layer_info = hw_layers->info;
-
-  for (uint32_t i = 0; i < layer_info.count; i++) {
-    HWRotatorSession *hw_rotator_session = &hw_layers->config[i].hw_rotator_session;
-
-    if (hw_rotator_session->hw_block_count) {
-      return true;
-    }
-  }
-
-  return false;
-}
-
 const char * DisplayBase::GetName(const LayerComposition &composition) {
   switch (composition) {
   case kCompositionGPU:         return "GPU";
@@ -1126,4 +1065,10 @@
   return hw_panel_info_.is_primary_panel;
 }
 
+DisplayError DisplayBase::SetCompositionState(LayerComposition composition_type, bool enable) {
+  lock_guard<recursive_mutex> obj(recursive_mutex_);
+
+  return comp_manager_->SetCompositionState(display_comp_ctx_, composition_type, enable);
+}
+
 }  // namespace sdm
diff --git a/msmcobalt/sdm/libs/core/display_base.h b/msmcobalt/sdm/libs/core/display_base.h
index 43c5280..ae1171d 100644
--- a/msmcobalt/sdm/libs/core/display_base.h
+++ b/msmcobalt/sdm/libs/core/display_base.h
@@ -27,7 +27,6 @@
 
 #include <core/display_interface.h>
 #include <private/strategy_interface.h>
-#include <private/rotator_interface.h>
 #include <private/color_interface.h>
 
 #include <map>
@@ -45,15 +44,11 @@
 using std::recursive_mutex;
 using std::lock_guard;
 
-class RotatorCtrl;
-class HWInfoInterface;
-
 class DisplayBase : public DisplayInterface, DumpImpl {
  public:
   DisplayBase(DisplayType display_type, DisplayEventHandler *event_handler,
               HWDeviceType hw_device_type, BufferSyncHandler *buffer_sync_handler,
-              CompManager *comp_manager, RotatorInterface *rotator_intf,
-              HWInfoInterface *hw_info_intf);
+              CompManager *comp_manager, HWInfoInterface *hw_info_intf);
   virtual ~DisplayBase() { }
   virtual DisplayError Init();
   virtual DisplayError Deinit();
@@ -63,6 +58,7 @@
   virtual DisplayError GetDisplayState(DisplayState *state);
   virtual DisplayError GetNumVariableInfoConfigs(uint32_t *count);
   virtual DisplayError GetConfig(uint32_t index, DisplayConfigVariableInfo *variable_info);
+  virtual DisplayError GetConfig(DisplayConfigFixedInfo *variable_info);
   virtual DisplayError GetActiveConfig(uint32_t *index);
   virtual DisplayError GetVSyncState(bool *enabled);
   virtual DisplayError SetDisplayState(DisplayState state);
@@ -111,6 +107,7 @@
   virtual DisplayError SetDetailEnhancerData(const DisplayDetailEnhancerData &de_data);
   virtual DisplayError GetDisplayPort(DisplayPort *port);
   virtual bool IsPrimaryDisplay();
+  virtual DisplayError SetCompositionState(LayerComposition composition_type, bool enable);
 
  protected:
   DisplayError BuildLayerStackStats(LayerStack *layer_stack);
@@ -119,7 +116,6 @@
   // DumpImpl method
   void AppendDump(char *buffer, uint32_t length);
 
-  bool IsRotationRequired(HWLayers *hw_layers);
   const char *GetName(const LayerComposition &composition);
   DisplayError ReconfigureDisplay();
   bool NeedsMixerReconfiguration(LayerStack *layer_stack, uint32_t *new_mixer_width,
@@ -135,12 +131,10 @@
   HWPanelInfo hw_panel_info_;
   BufferSyncHandler *buffer_sync_handler_ = NULL;
   CompManager *comp_manager_ = NULL;
-  RotatorInterface *rotator_intf_ = NULL;
   DisplayState state_ = kStateOff;
   bool active_ = false;
   Handle hw_device_ = 0;
   Handle display_comp_ctx_ = 0;
-  Handle display_rotator_ctx_ = 0;
   HWLayers hw_layers_;
   bool pending_commit_ = false;
   bool vsync_enable_ = false;
@@ -159,12 +153,6 @@
   DisplayConfigVariableInfo fb_config_ = {};
   uint32_t req_mixer_width_ = 0;
   uint32_t req_mixer_height_ = 0;
-
- private:
-  // Unused
-  virtual DisplayError GetConfig(DisplayConfigFixedInfo *variable_info) {
-    return kErrorNone;
-  }
 };
 
 }  // namespace sdm
diff --git a/msmcobalt/sdm/libs/core/display_hdmi.cpp b/msmcobalt/sdm/libs/core/display_hdmi.cpp
index 3c3d9f4..a577348 100644
--- a/msmcobalt/sdm/libs/core/display_hdmi.cpp
+++ b/msmcobalt/sdm/libs/core/display_hdmi.cpp
@@ -37,10 +37,9 @@
 namespace sdm {
 
 DisplayHDMI::DisplayHDMI(DisplayEventHandler *event_handler, HWInfoInterface *hw_info_intf,
-                         BufferSyncHandler *buffer_sync_handler, CompManager *comp_manager,
-                         RotatorInterface *rotator_intf)
+                         BufferSyncHandler *buffer_sync_handler, CompManager *comp_manager)
   : DisplayBase(kHDMI, event_handler, kDeviceHDMI, buffer_sync_handler, comp_manager,
-                rotator_intf, hw_info_intf) {
+                hw_info_intf) {
 }
 
 DisplayError DisplayHDMI::Init() {
diff --git a/msmcobalt/sdm/libs/core/display_hdmi.h b/msmcobalt/sdm/libs/core/display_hdmi.h
index 091cdc3..868b141 100644
--- a/msmcobalt/sdm/libs/core/display_hdmi.h
+++ b/msmcobalt/sdm/libs/core/display_hdmi.h
@@ -38,8 +38,7 @@
 class DisplayHDMI : public DisplayBase, HWEventHandler {
  public:
   DisplayHDMI(DisplayEventHandler *event_handler, HWInfoInterface *hw_info_intf,
-              BufferSyncHandler *buffer_sync_handler, CompManager *comp_manager,
-              RotatorInterface *rotator_intf);
+              BufferSyncHandler *buffer_sync_handler, CompManager *comp_manager);
   virtual DisplayError Init();
   virtual DisplayError Prepare(LayerStack *layer_stack);
   virtual DisplayError GetRefreshRateRange(uint32_t *min_refresh_rate, uint32_t *max_refresh_rate);
diff --git a/msmcobalt/sdm/libs/core/display_primary.cpp b/msmcobalt/sdm/libs/core/display_primary.cpp
index e8689ea..cb0884c 100644
--- a/msmcobalt/sdm/libs/core/display_primary.cpp
+++ b/msmcobalt/sdm/libs/core/display_primary.cpp
@@ -39,10 +39,9 @@
 namespace sdm {
 
 DisplayPrimary::DisplayPrimary(DisplayEventHandler *event_handler, HWInfoInterface *hw_info_intf,
-                               BufferSyncHandler *buffer_sync_handler, CompManager *comp_manager,
-                               RotatorInterface *rotator_intf)
+                               BufferSyncHandler *buffer_sync_handler, CompManager *comp_manager)
   : DisplayBase(kPrimary, event_handler, kDevicePrimary, buffer_sync_handler, comp_manager,
-                rotator_intf, hw_info_intf) {
+                hw_info_intf) {
 }
 
 DisplayError DisplayPrimary::Init() {
diff --git a/msmcobalt/sdm/libs/core/display_primary.h b/msmcobalt/sdm/libs/core/display_primary.h
index 7a03005..a6b8b4c 100644
--- a/msmcobalt/sdm/libs/core/display_primary.h
+++ b/msmcobalt/sdm/libs/core/display_primary.h
@@ -37,8 +37,7 @@
 class DisplayPrimary : public DisplayBase, HWEventHandler {
  public:
   DisplayPrimary(DisplayEventHandler *event_handler, HWInfoInterface *hw_info_intf,
-                 BufferSyncHandler *buffer_sync_handler, CompManager *comp_manager,
-                 RotatorInterface *rotator_intf);
+                 BufferSyncHandler *buffer_sync_handler, CompManager *comp_manager);
   virtual DisplayError Init();
   virtual DisplayError Prepare(LayerStack *layer_stack);
   virtual DisplayError Commit(LayerStack *layer_stack);
diff --git a/msmcobalt/sdm/libs/core/display_virtual.cpp b/msmcobalt/sdm/libs/core/display_virtual.cpp
index 6beea5c..04922c4 100644
--- a/msmcobalt/sdm/libs/core/display_virtual.cpp
+++ b/msmcobalt/sdm/libs/core/display_virtual.cpp
@@ -34,10 +34,9 @@
 namespace sdm {
 
 DisplayVirtual::DisplayVirtual(DisplayEventHandler *event_handler, HWInfoInterface *hw_info_intf,
-                               BufferSyncHandler *buffer_sync_handler, CompManager *comp_manager,
-                               RotatorInterface *rotator_intf)
+                               BufferSyncHandler *buffer_sync_handler, CompManager *comp_manager)
   : DisplayBase(kVirtual, event_handler, kDeviceVirtual, buffer_sync_handler, comp_manager,
-                rotator_intf, hw_info_intf) {
+                hw_info_intf) {
 }
 
 DisplayError DisplayVirtual::Init() {
diff --git a/msmcobalt/sdm/libs/core/display_virtual.h b/msmcobalt/sdm/libs/core/display_virtual.h
index d6ce915..3cc2e24 100644
--- a/msmcobalt/sdm/libs/core/display_virtual.h
+++ b/msmcobalt/sdm/libs/core/display_virtual.h
@@ -36,8 +36,7 @@
 class DisplayVirtual : public DisplayBase {
  public:
   DisplayVirtual(DisplayEventHandler *event_handler, HWInfoInterface *hw_info_intf,
-                 BufferSyncHandler *buffer_sync_handler, CompManager *comp_manager,
-                 RotatorInterface *rotator_intf);
+                 BufferSyncHandler *buffer_sync_handler, CompManager *comp_manager);
   virtual DisplayError Init();
   virtual DisplayError Prepare(LayerStack *layer_stack);
   virtual DisplayError GetNumVariableInfoConfigs(uint32_t *count);
diff --git a/msmcobalt/sdm/libs/core/fb/hw_primary.cpp b/msmcobalt/sdm/libs/core/fb/hw_primary.cpp
index f3c7639..3dfa4dd 100644
--- a/msmcobalt/sdm/libs/core/fb/hw_primary.cpp
+++ b/msmcobalt/sdm/libs/core/fb/hw_primary.cpp
@@ -332,6 +332,8 @@
     return kErrorHardware;
   }
 
+  auto_refresh_ = false;
+
   return kErrorNone;
 }
 
diff --git a/msmcobalt/sdm/libs/core/resource_default.cpp b/msmcobalt/sdm/libs/core/resource_default.cpp
index 4fc3ce4..54a6658 100644
--- a/msmcobalt/sdm/libs/core/resource_default.cpp
+++ b/msmcobalt/sdm/libs/core/resource_default.cpp
@@ -37,10 +37,42 @@
 
 namespace sdm {
 
-DisplayError ResourceDefault::Init(const HWResourceInfo &hw_res_info) {
+DisplayError ResourceDefault::CreateResourceDefault(const HWResourceInfo &hw_resource_info,
+                                                    ResourceInterface **resource_intf) {
   DisplayError error = kErrorNone;
 
-  num_pipe_ = hw_res_info.num_vig_pipe + hw_res_info.num_rgb_pipe + hw_res_info.num_dma_pipe;
+  ResourceDefault *resource_default = new ResourceDefault(hw_resource_info);
+  if (!resource_default) {
+    return kErrorNone;
+  }
+
+  error = resource_default->Init();
+  if (error != kErrorNone) {
+    delete resource_default;
+  }
+
+  *resource_intf = resource_default;
+
+  return kErrorNone;
+}
+
+DisplayError ResourceDefault::DestroyResourceDefault(ResourceInterface *resource_intf) {
+  ResourceDefault *resource_default = static_cast<ResourceDefault *>(resource_intf);
+
+  resource_default->Deinit();
+  delete resource_default;
+
+  return kErrorNone;
+}
+
+ResourceDefault::ResourceDefault(const HWResourceInfo &hw_res_info)
+  : hw_res_info_(hw_res_info) {
+}
+
+DisplayError ResourceDefault::Init() {
+  DisplayError error = kErrorNone;
+
+  num_pipe_ = hw_res_info_.num_vig_pipe + hw_res_info_.num_rgb_pipe + hw_res_info_.num_dma_pipe;
 
   if (!num_pipe_) {
     DLOGE("Number of H/W pipes is Zero!");
@@ -48,7 +80,6 @@
   }
 
   src_pipes_.resize(num_pipe_);
-  hw_res_info_ = hw_res_info;
 
   // Priority order of pipes: VIG, RGB, DMA
   uint32_t vig_index = 0;
@@ -187,7 +218,7 @@
   return kErrorNone;
 }
 
-DisplayError ResourceDefault::Acquire(Handle display_ctx, HWLayers *hw_layers) {
+DisplayError ResourceDefault::Prepare(Handle display_ctx, HWLayers *hw_layers) {
   DisplayResourceContext *display_resource_ctx =
                           reinterpret_cast<DisplayResourceContext *>(display_ctx);
 
@@ -297,6 +328,12 @@
   return kErrorNone;
 }
 
+DisplayError ResourceDefault::Commit(Handle display_ctx, HWLayers *hw_layers) {
+  SCOPE_LOCK(locker_);
+
+  return kErrorNone;
+}
+
 DisplayError ResourceDefault::PostCommit(Handle display_ctx, HWLayers *hw_layers) {
   SCOPE_LOCK(locker_);
   DisplayResourceContext *display_resource_ctx =
diff --git a/msmcobalt/sdm/libs/core/resource_default.h b/msmcobalt/sdm/libs/core/resource_default.h
index 79e7dcd..9f08155 100644
--- a/msmcobalt/sdm/libs/core/resource_default.h
+++ b/msmcobalt/sdm/libs/core/resource_default.h
@@ -36,8 +36,9 @@
 
 class ResourceDefault : public ResourceInterface {
  public:
-  DisplayError Init(const HWResourceInfo &hw_resource_info);
-  DisplayError Deinit();
+  static DisplayError CreateResourceDefault(const HWResourceInfo &hw_resource_info,
+                                            ResourceInterface **resource_intf);
+  static DisplayError DestroyResourceDefault(ResourceInterface *resource_intf);
   virtual DisplayError RegisterDisplay(DisplayType type,
                                        const HWDisplayAttributes &display_attributes,
                                        const HWPanelInfo &hw_panel_info,
@@ -50,8 +51,9 @@
                                           const HWMixerAttributes &mixer_attributes);
   virtual DisplayError Start(Handle display_ctx);
   virtual DisplayError Stop(Handle display_ctx);
-  virtual DisplayError Acquire(Handle display_ctx, HWLayers *hw_layers);
+  virtual DisplayError Prepare(Handle display_ctx, HWLayers *hw_layers);
   virtual DisplayError PostPrepare(Handle display_ctx, HWLayers *hw_layers);
+  virtual DisplayError Commit(Handle display_ctx, HWLayers *hw_layers);
   virtual DisplayError PostCommit(Handle display_ctx, HWLayers *hw_layers);
   virtual void Purge(Handle display_ctx);
   virtual DisplayError SetMaxMixerStages(Handle display_ctx, uint32_t max_mixer_stages);
@@ -102,6 +104,9 @@
     HWBlockContext() : is_in_use(false) { }
   };
 
+  explicit ResourceDefault(const HWResourceInfo &hw_res_info);
+  DisplayError Init();
+  DisplayError Deinit();
   uint32_t NextPipe(PipeType pipe_type, HWBlockType hw_block_id);
   uint32_t SearchPipe(HWBlockType hw_block_id, SourcePipe *src_pipes, uint32_t num_pipe);
   uint32_t GetPipe(HWBlockType hw_block_id, bool need_scale);
diff --git a/msmcobalt/sdm/libs/core/strategy.cpp b/msmcobalt/sdm/libs/core/strategy.cpp
index 1734b9c..02f7fa7 100644
--- a/msmcobalt/sdm/libs/core/strategy.cpp
+++ b/msmcobalt/sdm/libs/core/strategy.cpp
@@ -82,6 +82,11 @@
   extn_start_success_ = false;
   tried_default_ = false;
 
+  if (!disable_gpu_comp_ && !hw_layers_info_->gpu_target_index) {
+    DLOGE("GPU composition is enabled and GPU target buffer not provided.");
+    return kErrorNotSupported;
+  }
+
   if (partial_update_intf_) {
     partial_update_intf_->ControlPartialUpdate(partial_update_enable);
   }
@@ -118,8 +123,8 @@
     }
   }
 
-  // Default composition is not possible if GPU composition is not supported.
-  if (!hw_layers_info_->gpu_target_index) {
+  // Do not fallback to GPU if GPU comp is disabled.
+  if (disable_gpu_comp_) {
     return kErrorNotSupported;
   }
 
@@ -224,4 +229,18 @@
   return kErrorNone;
 }
 
+DisplayError Strategy::SetCompositionState(LayerComposition composition_type, bool enable) {
+  DLOGI("composition type = %d, enable = %d", composition_type, enable);
+
+  if (composition_type == kCompositionGPU) {
+    disable_gpu_comp_ = !enable;
+  }
+
+  if (strategy_intf_) {
+    return strategy_intf_->SetCompositionState(composition_type, enable);
+  }
+
+  return kErrorNone;
+}
+
 }  // namespace sdm
diff --git a/msmcobalt/sdm/libs/core/strategy.h b/msmcobalt/sdm/libs/core/strategy.h
index 8b4b6f4..025f753 100644
--- a/msmcobalt/sdm/libs/core/strategy.h
+++ b/msmcobalt/sdm/libs/core/strategy.h
@@ -48,6 +48,7 @@
                            const HWDisplayAttributes &hw_display_attributes,
                            const HWMixerAttributes &mixer_attributes,
                            const DisplayConfigVariableInfo &fb_config);
+  DisplayError SetCompositionState(LayerComposition composition_type, bool enable);
 
  private:
   void GenerateROI();
@@ -64,6 +65,7 @@
   DisplayConfigVariableInfo fb_config_ = {};
   bool extn_start_success_ = false;
   bool tried_default_ = false;
+  bool disable_gpu_comp_ = false;
 };
 
 }  // namespace sdm
diff --git a/msmcobalt/sdm/libs/hwc/hwc_display_primary.cpp b/msmcobalt/sdm/libs/hwc/hwc_display_primary.cpp
index bf2d384..783f322 100644
--- a/msmcobalt/sdm/libs/hwc/hwc_display_primary.cpp
+++ b/msmcobalt/sdm/libs/hwc/hwc_display_primary.cpp
@@ -304,8 +304,15 @@
            secure_display_active);
     secure_display_active_ = secure_display_active;
     skip_prepare_ = true;
+
+    // Avoid flush for command mode panels
+    DisplayConfigFixedInfo display_config;
+    display_intf_->GetConfig(&display_config);
+    if (display_config.is_cmdmode) {
+      DLOGI("Avoid flush for command mode panel");
+      skip_prepare_ = false;
+    }
   }
-  return;
 }
 
 void HWCDisplayPrimary::ForceRefreshRate(uint32_t refresh_rate) {
diff --git a/msmcobalt/sdm/libs/utils/Makefile.am b/msmcobalt/sdm/libs/utils/Makefile.am
index 5b0eaab..ba6efae 100644
--- a/msmcobalt/sdm/libs/utils/Makefile.am
+++ b/msmcobalt/sdm/libs/utils/Makefile.am
@@ -7,4 +7,5 @@
 libsdmutils_la_CC = @CC@
 libsdmutils_la_SOURCES = $(cpp_sources)
 libsdmutils_la_CFLAGS = $(COMMON_CFLAGS) -DLOG_TAG=\"SDM\"
-libsdmutils_la_CPPFLAGS = $(AM_CPPFLAGS)
\ No newline at end of file
+libsdmutils_la_CPPFLAGS = $(AM_CPPFLAGS)
+libsdmutils_la_LDFLAGS = -shared -avoid-version
\ No newline at end of file