[automerger skipped] Merge Android 24Q1 Release (ab/11220357) am: 3f66ebf163 -s ours

am skip reason: Merged-In I5bf4143db67448d5ed2c581c61985f7e2ac21ddc with SHA-1 1357848058 is already in history

Original change: https://googleplex-android-review.googlesource.com/c/platform/hardware/google/graphics/zuma/+/25974135

Change-Id: I8e172229961a7e64991aeac2fb9d6e5aeab4d870
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/libhwc2.1/Android.mk b/libhwc2.1/Android.mk
index c704838..083af9b 100644
--- a/libhwc2.1/Android.mk
+++ b/libhwc2.1/Android.mk
@@ -27,6 +27,7 @@
 	../../gs101/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.cpp \
 	../../gs201/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.cpp \
 	../../zuma/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.cpp \
+	../../gs101/libhwc2.1/libcolormanager/ColorManager.cpp \
 	../../zuma/libhwc2.1/libcolormanager/DisplayColorModule.cpp \
 	../../zuma/libhwc2.1/libdevice/ExynosDeviceModule.cpp \
 	../../zuma/libhwc2.1/libdevice/HistogramController.cpp
diff --git a/libhwc2.1/ExynosHWCModule.h b/libhwc2.1/ExynosHWCModule.h
index 29412f2..97d16fb 100644
--- a/libhwc2.1/ExynosHWCModule.h
+++ b/libhwc2.1/ExynosHWCModule.h
@@ -88,50 +88,50 @@
     // Zuma has total 14 Layers
 
     // DPP0(IDMA_GFS0) in DPUF0 is connected with AXI0 port
-    {MPP_DPP_GFS, MPP_LOGICAL_DPP_GFS, "DPP_GFS0", 0, 0, HWC_DISPLAY_PRIMARY_BIT,
-        static_cast<uint32_t>(DPUF0), static_cast<uint32_t>(AXI0)},
+    {MPP_DPP_GFS, MPP_LOGICAL_DPP_GFS, "DPP_GFS0", 0, 0, HWC_RESERVE_DISPLAY_MAIN_BIT,
+     static_cast<uint32_t>(DPUF0), static_cast<uint32_t>(AXI0)},
     // DPP1(IDMA_VGRFS0) in DPUF0 is connected with AXI0 port
-    {MPP_DPP_VGRFS, MPP_LOGICAL_DPP_VGRFS, "DPP_VGRFS0", 0, 0, HWC_DISPLAY_PRIMARY_BIT,
-        static_cast<uint32_t>(DPUF0), static_cast<uint32_t>(AXI0)},
+    {MPP_DPP_VGRFS, MPP_LOGICAL_DPP_VGRFS, "DPP_VGRFS0", 0, 0, HWC_RESERVE_DISPLAY_MAIN_BIT,
+     static_cast<uint32_t>(DPUF0), static_cast<uint32_t>(AXI0)},
     // DPP2(IDMA_GFS1) in DPUF0 is connected with AXI0 port
-    {MPP_DPP_GFS, MPP_LOGICAL_DPP_GFS, "DPP_GFS1", 1, 0, HWC_DISPLAY_PRIMARY_BIT,
-        static_cast<uint32_t>(DPUF0), static_cast<uint32_t>(AXI0)},
+    {MPP_DPP_GFS, MPP_LOGICAL_DPP_GFS, "DPP_GFS1", 1, 0, HWC_RESERVE_DISPLAY_MAIN_BIT,
+     static_cast<uint32_t>(DPUF0), static_cast<uint32_t>(AXI0)},
     // DPP3(IDMA_VGRFS1) in DPUF0 is connected with AXI0 port
-    {MPP_DPP_VGRFS, MPP_LOGICAL_DPP_VGRFS, "DPP_VGRFS1", 1, 0, HWC_DISPLAY_PRIMARY_BIT,
-        static_cast<uint32_t>(DPUF0), static_cast<uint32_t>(AXI0)},
+    {MPP_DPP_VGRFS, MPP_LOGICAL_DPP_VGRFS, "DPP_VGRFS1", 1, 0, HWC_RESERVE_DISPLAY_MAIN_BIT,
+     static_cast<uint32_t>(DPUF0), static_cast<uint32_t>(AXI0)},
 
     // DPP4(IDMA_GFS2) in DPUF0 is connected with AXI1 port
-    {MPP_DPP_GFS, MPP_LOGICAL_DPP_GFS, "DPP_GFS2", 2, 0, HWC_DISPLAY_PRIMARY_BIT,
-        static_cast<uint32_t>(DPUF0), static_cast<uint32_t>(AXI1)},
+    {MPP_DPP_GFS, MPP_LOGICAL_DPP_GFS, "DPP_GFS2", 2, 0, HWC_RESERVE_DISPLAY_MINOR_BIT,
+     static_cast<uint32_t>(DPUF0), static_cast<uint32_t>(AXI1)},
     // DPP5(IDMA_VGRFS2) in DPUF0 is connected with AXI1 port
-    {MPP_DPP_VGRFS, MPP_LOGICAL_DPP_VGRFS, "DPP_VGRFS2", 2, 0, HWC_DISPLAY_PRIMARY_BIT,
-        static_cast<uint32_t>(DPUF0), static_cast<uint32_t>(AXI1)},
+    {MPP_DPP_VGRFS, MPP_LOGICAL_DPP_VGRFS, "DPP_VGRFS2", 2, 0, HWC_RESERVE_DISPLAY_MAIN_BIT,
+     static_cast<uint32_t>(DPUF0), static_cast<uint32_t>(AXI1)},
     // DPP6(IDMA_GFS3) in DPUF0 is connected with AXI1 port
-    {MPP_DPP_GFS, MPP_LOGICAL_DPP_GFS, "DPP_GFS3", 3, 0, HWC_DISPLAY_PRIMARY_BIT,
-        static_cast<uint32_t>(DPUF0), static_cast<uint32_t>(AXI1)},
+    {MPP_DPP_GFS, MPP_LOGICAL_DPP_GFS, "DPP_GFS3", 3, 0, HWC_RESERVE_DISPLAY_MINOR_BIT,
+     static_cast<uint32_t>(DPUF0), static_cast<uint32_t>(AXI1)},
 
     // DPP7(IDMA_GFS4) in DPUF1 is connected with AXI1 port
-    {MPP_DPP_GFS, MPP_LOGICAL_DPP_GFS, "DPP_GFS4", 4, 0, HWC_DISPLAY_SECONDARY_BIT,
-        static_cast<uint32_t>(DPUF1), static_cast<uint32_t>(AXI1)},
+    {MPP_DPP_GFS, MPP_LOGICAL_DPP_GFS, "DPP_GFS4", 4, 0, HWC_RESERVE_DISPLAY_MAIN_BIT,
+     static_cast<uint32_t>(DPUF1), static_cast<uint32_t>(AXI1)},
     // DPP8(IDMA_VGRFS3) in DPUF1 is connected with AXI1 port
-    {MPP_DPP_VGRFS, MPP_LOGICAL_DPP_VGRFS, "DPP_VGRFS3", 3, 0, HWC_DISPLAY_SECONDARY_BIT,
-        static_cast<uint32_t>(DPUF1), static_cast<uint32_t>(AXI1)},
+    {MPP_DPP_VGRFS, MPP_LOGICAL_DPP_VGRFS, "DPP_VGRFS3", 3, 0, HWC_RESERVE_DISPLAY_MAIN_BIT,
+     static_cast<uint32_t>(DPUF1), static_cast<uint32_t>(AXI1)},
     // DPP9(IDMA_GFS5) in DPUF1 is connected with AXI1 port
-    {MPP_DPP_GFS, MPP_LOGICAL_DPP_GFS, "DPP_GFS5", 5, 0, HWC_DISPLAY_SECONDARY_BIT,
-        static_cast<uint32_t>(DPUF1), static_cast<uint32_t>(AXI1)},
+    {MPP_DPP_GFS, MPP_LOGICAL_DPP_GFS, "DPP_GFS5", 5, 0, HWC_RESERVE_DISPLAY_MINOR_BIT,
+     static_cast<uint32_t>(DPUF1), static_cast<uint32_t>(AXI1)},
     // DPP10(IDMA_VGRFS4) in DPUF1 is connected with AXI1 port
-    {MPP_DPP_VGRFS, MPP_LOGICAL_DPP_VGRFS, "DPP_VGRFS4", 4, 0, HWC_DISPLAY_SECONDARY_BIT,
-        static_cast<uint32_t>(DPUF1), static_cast<uint32_t>(AXI1)},
+    {MPP_DPP_VGRFS, MPP_LOGICAL_DPP_VGRFS, "DPP_VGRFS4", 4, 0, HWC_RESERVE_DISPLAY_MAIN_BIT,
+     static_cast<uint32_t>(DPUF1), static_cast<uint32_t>(AXI1)},
 
     // DPP11(IDMA_GFS6) in DPUF1 is connected with AXI0 port
-    {MPP_DPP_GFS, MPP_LOGICAL_DPP_GFS, "DPP_GFS6", 6, 0, HWC_DISPLAY_EXTERNAL_BIT,
-        static_cast<uint32_t>(DPUF1), static_cast<uint32_t>(AXI0)},
+    {MPP_DPP_GFS, MPP_LOGICAL_DPP_GFS, "DPP_GFS6", 6, 0, HWC_RESERVE_DISPLAY_MINOR_BIT,
+     static_cast<uint32_t>(DPUF1), static_cast<uint32_t>(AXI0)},
     // DPP12(IDMA_VGRFS5) in DPUF1 is connected with AXI0 port
-    {MPP_DPP_VGRFS, MPP_LOGICAL_DPP_VGRFS, "DPP_VGRFS5", 5, 0, HWC_DISPLAY_EXTERNAL_BIT,
-        static_cast<uint32_t>(DPUF1), static_cast<uint32_t>(AXI0)},
+    {MPP_DPP_VGRFS, MPP_LOGICAL_DPP_VGRFS, "DPP_VGRFS5", 5, 0, HWC_RESERVE_DISPLAY_MINOR_BIT,
+     static_cast<uint32_t>(DPUF1), static_cast<uint32_t>(AXI0)},
     // DPP13(IDMA_GFS7) in DPUF1 is connected with AXI0 port
-    {MPP_DPP_GFS, MPP_LOGICAL_DPP_GFS, "DPP_GFS7", 7, 0, HWC_DISPLAY_EXTERNAL_BIT,
-        static_cast<uint32_t>(DPUF1), static_cast<uint32_t>(AXI0)},
+    {MPP_DPP_GFS, MPP_LOGICAL_DPP_GFS, "DPP_GFS7", 7, 0, HWC_RESERVE_DISPLAY_MINOR_BIT,
+     static_cast<uint32_t>(DPUF1), static_cast<uint32_t>(AXI0)},
 };
 
 static const std::array<exynos_display_t, 3> AVAILABLE_DISPLAY_UNITS = {{
@@ -150,25 +150,20 @@
         tdm_attr_t attr;
         DPUblockId_t DPUBlockNo;
         AXIPortId_t axiId;
-        int dispType;
         ConstraintRev_t constraintRev;
 
     public:
-        HWResourceIndexes(const tdm_attr_t &_attr, const DPUblockId_t &_DPUBlockNo,
-                          const AXIPortId_t &_axiId, const int &_dispType,
-                          const ConstraintRev_t &_constraintRev)
+        HWResourceIndexes(const tdm_attr_t& _attr, const DPUblockId_t& _DPUBlockNo,
+                          const AXIPortId_t& _axiId, const ConstraintRev_t& _constraintRev)
               : attr(_attr),
                 DPUBlockNo(_DPUBlockNo),
                 axiId(_axiId),
-                dispType(_dispType),
                 constraintRev(_constraintRev) {}
         bool operator<(const HWResourceIndexes& rhs) const {
             if (attr != rhs.attr) return attr < rhs.attr;
 
             if (DPUBlockNo != rhs.DPUBlockNo) return DPUBlockNo < rhs.DPUBlockNo;
 
-            if (dispType != rhs.dispType) return dispType < rhs.dispType;
-
             if (axiId != AXI_DONT_CARE && rhs.axiId != AXI_DONT_CARE && axiId != rhs.axiId)
                 return axiId < rhs.axiId;
 
@@ -178,15 +173,16 @@
         }
         String8 toString8() const {
             String8 log;
-            log.appendFormat("attr=%d,DPUBlockNo=%d,axiId=%d,dispType=%d,constraintRev=%d", attr,
-                            DPUBlockNo, axiId, dispType, constraintRev);
+            log.appendFormat("attr=%d,DPUBlockNo=%d,axiId=%d,constraintRev=%d", attr, DPUBlockNo,
+                             axiId, constraintRev);
             return log;
         }
 };
 
 typedef struct HWResourceAmounts {
-    int maxAssignedAmount;
-    int totalAmount;
+    int mainAmount;
+    int minorAmount;
+    int total;
 } HWResourceAmounts_t;
 
 /* Note :
@@ -194,144 +190,31 @@
  * Primary amount = total - others */
 
 const std::map<HWResourceIndexes, HWResourceAmounts_t> HWResourceTables = {
-        {HWResourceIndexes(TDM_ATTR_SRAM_AMOUNT, DPUF0, AXI_DONT_CARE, HWC_DISPLAY_PRIMARY,
-                           CONSTRAINT_NONE),
-         {80, 80}},
-        {HWResourceIndexes(TDM_ATTR_SRAM_AMOUNT, DPUF0, AXI_DONT_CARE, HWC_DISPLAY_EXTERNAL,
-                           CONSTRAINT_NONE),
-         {0, 80}},
-        {HWResourceIndexes(TDM_ATTR_SRAM_AMOUNT, DPUF0, AXI_DONT_CARE, HWC_DISPLAY_VIRTUAL,
-                           CONSTRAINT_NONE),
-         {0, 80}},
-        {HWResourceIndexes(TDM_ATTR_SRAM_AMOUNT, DPUF1, AXI_DONT_CARE, HWC_DISPLAY_PRIMARY,
-                           CONSTRAINT_NONE),
-         {80, 80}},
-        {HWResourceIndexes(TDM_ATTR_SRAM_AMOUNT, DPUF1, AXI_DONT_CARE, HWC_DISPLAY_EXTERNAL,
-                           CONSTRAINT_NONE),
-         {80, 80}},
-        {HWResourceIndexes(TDM_ATTR_SRAM_AMOUNT, DPUF1, AXI_DONT_CARE, HWC_DISPLAY_VIRTUAL,
-                           CONSTRAINT_NONE),
-         {80, 80}},
-
-        {HWResourceIndexes(TDM_ATTR_SCALE, DPUF0, AXI_DONT_CARE, HWC_DISPLAY_PRIMARY,
-                           CONSTRAINT_NONE),
-         {2, 2}},
-        {HWResourceIndexes(TDM_ATTR_SCALE, DPUF0, AXI_DONT_CARE, HWC_DISPLAY_EXTERNAL,
-                           CONSTRAINT_NONE),
-         {0, 2}},
-        {HWResourceIndexes(TDM_ATTR_SCALE, DPUF0, AXI_DONT_CARE, HWC_DISPLAY_VIRTUAL,
-                           CONSTRAINT_NONE),
-         {0, 2}},
-        {HWResourceIndexes(TDM_ATTR_SCALE, DPUF1, AXI_DONT_CARE, HWC_DISPLAY_PRIMARY,
-                           CONSTRAINT_NONE),
-         {2, 2}},
-        {HWResourceIndexes(TDM_ATTR_SCALE, DPUF1, AXI_DONT_CARE, HWC_DISPLAY_EXTERNAL,
-                           CONSTRAINT_NONE),
-         {2, 2}},
-        {HWResourceIndexes(TDM_ATTR_SCALE, DPUF1, AXI_DONT_CARE, HWC_DISPLAY_VIRTUAL,
-                           CONSTRAINT_NONE),
-         {2, 2}},
-
-        {HWResourceIndexes(TDM_ATTR_SBWC, DPUF0, AXI_DONT_CARE, HWC_DISPLAY_PRIMARY,
-                           CONSTRAINT_NONE),
-         {2, 2}},
-        {HWResourceIndexes(TDM_ATTR_SBWC, DPUF0, AXI_DONT_CARE, HWC_DISPLAY_EXTERNAL,
-                           CONSTRAINT_NONE),
-         {0, 2}},
-        {HWResourceIndexes(TDM_ATTR_SBWC, DPUF0, AXI_DONT_CARE, HWC_DISPLAY_VIRTUAL,
-                           CONSTRAINT_NONE),
-         {0, 2}},
-        {HWResourceIndexes(TDM_ATTR_SBWC, DPUF1, AXI_DONT_CARE, HWC_DISPLAY_PRIMARY,
-                           CONSTRAINT_NONE),
-         {2, 2}},
-        {HWResourceIndexes(TDM_ATTR_SBWC, DPUF1, AXI_DONT_CARE, HWC_DISPLAY_EXTERNAL,
-                           CONSTRAINT_NONE),
-         {2, 2}},
-        {HWResourceIndexes(TDM_ATTR_SBWC, DPUF1, AXI_DONT_CARE, HWC_DISPLAY_VIRTUAL,
-                           CONSTRAINT_NONE),
-         {2, 2}},
-
-        {HWResourceIndexes(TDM_ATTR_AFBC, DPUF0, AXI_DONT_CARE, HWC_DISPLAY_PRIMARY,
-                           CONSTRAINT_NONE),
-         {4, 4}},
-        {HWResourceIndexes(TDM_ATTR_AFBC, DPUF0, AXI_DONT_CARE, HWC_DISPLAY_EXTERNAL,
-                           CONSTRAINT_NONE),
-         {0, 4}},
-        {HWResourceIndexes(TDM_ATTR_AFBC, DPUF0, AXI_DONT_CARE, HWC_DISPLAY_VIRTUAL,
-                           CONSTRAINT_NONE),
-         {0, 4}},
-        {HWResourceIndexes(TDM_ATTR_AFBC, DPUF1, AXI_DONT_CARE, HWC_DISPLAY_PRIMARY,
-                           CONSTRAINT_NONE),
-         {4, 4}},
-        {HWResourceIndexes(TDM_ATTR_AFBC, DPUF1, AXI_DONT_CARE, HWC_DISPLAY_EXTERNAL,
-                           CONSTRAINT_NONE),
-         {4, 4}},
-        {HWResourceIndexes(TDM_ATTR_AFBC, DPUF1, AXI_DONT_CARE, HWC_DISPLAY_VIRTUAL,
-                           CONSTRAINT_NONE),
-         {4, 4}},
-
-        {HWResourceIndexes(TDM_ATTR_ITP, DPUF0, AXI_DONT_CARE, HWC_DISPLAY_PRIMARY,
-                           CONSTRAINT_NONE),
-         {4, 4}},
-        {HWResourceIndexes(TDM_ATTR_ITP, DPUF0, AXI_DONT_CARE, HWC_DISPLAY_EXTERNAL,
-                           CONSTRAINT_NONE),
-         {0, 4}},
-        {HWResourceIndexes(TDM_ATTR_ITP, DPUF0, AXI_DONT_CARE, HWC_DISPLAY_VIRTUAL,
-                           CONSTRAINT_NONE),
-         {0, 4}},
-        {HWResourceIndexes(TDM_ATTR_ITP, DPUF1, AXI_DONT_CARE, HWC_DISPLAY_PRIMARY,
-                           CONSTRAINT_NONE),
-         {4, 4}},
-        {HWResourceIndexes(TDM_ATTR_ITP, DPUF1, AXI_DONT_CARE, HWC_DISPLAY_EXTERNAL,
-                           CONSTRAINT_NONE),
-         {4, 4}},
-        {HWResourceIndexes(TDM_ATTR_ITP, DPUF1, AXI_DONT_CARE, HWC_DISPLAY_VIRTUAL,
-                           CONSTRAINT_NONE),
-         {4, 4}},
-
-        {HWResourceIndexes(TDM_ATTR_ROT_90, DPUF0, AXI_DONT_CARE, HWC_DISPLAY_PRIMARY,
-                           CONSTRAINT_NONE),
-         {2, 2}},
-        {HWResourceIndexes(TDM_ATTR_ROT_90, DPUF0, AXI_DONT_CARE, HWC_DISPLAY_EXTERNAL,
-                           CONSTRAINT_NONE),
-         {0, 2}},
-        {HWResourceIndexes(TDM_ATTR_ROT_90, DPUF0, AXI_DONT_CARE, HWC_DISPLAY_VIRTUAL,
-                           CONSTRAINT_NONE),
-         {0, 2}},
-        {HWResourceIndexes(TDM_ATTR_ROT_90, DPUF1, AXI_DONT_CARE, HWC_DISPLAY_PRIMARY,
-                           CONSTRAINT_NONE),
-         {2, 2}},
-        {HWResourceIndexes(TDM_ATTR_ROT_90, DPUF1, AXI_DONT_CARE, HWC_DISPLAY_EXTERNAL,
-                           CONSTRAINT_NONE),
-         {2, 2}},
-        {HWResourceIndexes(TDM_ATTR_ROT_90, DPUF1, AXI_DONT_CARE, HWC_DISPLAY_VIRTUAL,
-                           CONSTRAINT_NONE),
-         {2, 2}},
-
-        {HWResourceIndexes(TDM_ATTR_WCG, DPUF0, AXI_DONT_CARE, HWC_DISPLAY_PRIMARY, CONSTRAINT_A0),
-         {2, 2}},
-        {HWResourceIndexes(TDM_ATTR_WCG, DPUF0, AXI_DONT_CARE, HWC_DISPLAY_EXTERNAL, CONSTRAINT_A0),
-         {0, 2}},
-        {HWResourceIndexes(TDM_ATTR_WCG, DPUF0, AXI_DONT_CARE, HWC_DISPLAY_VIRTUAL, CONSTRAINT_A0),
-         {0, 2}},
-        {HWResourceIndexes(TDM_ATTR_WCG, DPUF1, AXI_DONT_CARE, HWC_DISPLAY_PRIMARY, CONSTRAINT_A0),
-         {2, 2}},
-        {HWResourceIndexes(TDM_ATTR_WCG, DPUF1, AXI_DONT_CARE, HWC_DISPLAY_EXTERNAL, CONSTRAINT_A0),
-         {2, 2}},
-        {HWResourceIndexes(TDM_ATTR_WCG, DPUF1, AXI_DONT_CARE, HWC_DISPLAY_VIRTUAL, CONSTRAINT_A0),
-         {2, 2}},
-        {HWResourceIndexes(TDM_ATTR_WCG, DPUF0, AXI0, HWC_DISPLAY_PRIMARY, CONSTRAINT_B0), {2, 2}},
-        {HWResourceIndexes(TDM_ATTR_WCG, DPUF0, AXI0, HWC_DISPLAY_EXTERNAL, CONSTRAINT_B0), {0, 2}},
-        {HWResourceIndexes(TDM_ATTR_WCG, DPUF0, AXI0, HWC_DISPLAY_VIRTUAL, CONSTRAINT_B0), {0, 2}},
-        {HWResourceIndexes(TDM_ATTR_WCG, DPUF0, AXI1, HWC_DISPLAY_PRIMARY, CONSTRAINT_B0), {2, 2}},
-        {HWResourceIndexes(TDM_ATTR_WCG, DPUF0, AXI1, HWC_DISPLAY_EXTERNAL, CONSTRAINT_B0), {0, 2}},
-        {HWResourceIndexes(TDM_ATTR_WCG, DPUF0, AXI1, HWC_DISPLAY_VIRTUAL, CONSTRAINT_B0), {0, 2}},
-        {HWResourceIndexes(TDM_ATTR_WCG, DPUF1, AXI0, HWC_DISPLAY_PRIMARY, CONSTRAINT_B0), {2, 2}},
-        {HWResourceIndexes(TDM_ATTR_WCG, DPUF1, AXI0, HWC_DISPLAY_EXTERNAL, CONSTRAINT_B0), {2, 2}},
-        {HWResourceIndexes(TDM_ATTR_WCG, DPUF1, AXI0, HWC_DISPLAY_VIRTUAL, CONSTRAINT_B0), {2, 2}},
-        {HWResourceIndexes(TDM_ATTR_WCG, DPUF1, AXI1, HWC_DISPLAY_PRIMARY, CONSTRAINT_B0), {2, 2}},
-        {HWResourceIndexes(TDM_ATTR_WCG, DPUF1, AXI1, HWC_DISPLAY_EXTERNAL, CONSTRAINT_B0), {2, 2}},
-        {HWResourceIndexes(TDM_ATTR_WCG, DPUF1, AXI1, HWC_DISPLAY_VIRTUAL, CONSTRAINT_B0), {2, 2}},
+    // SRAM
+    {HWResourceIndexes(TDM_ATTR_SRAM_AMOUNT, DPUF0, AXI_DONT_CARE, CONSTRAINT_NONE), {50, 30, 80}},
+    {HWResourceIndexes(TDM_ATTR_SRAM_AMOUNT, DPUF1, AXI_DONT_CARE, CONSTRAINT_NONE), {50, 30, 80}},
+    // SCALE
+    {HWResourceIndexes(TDM_ATTR_SCALE, DPUF0, AXI_DONT_CARE, CONSTRAINT_NONE), {2, 0, 2}},
+    {HWResourceIndexes(TDM_ATTR_SCALE, DPUF1, AXI_DONT_CARE, CONSTRAINT_NONE), {1, 1, 2}},
+    // SBWC
+    {HWResourceIndexes(TDM_ATTR_SBWC, DPUF0, AXI_DONT_CARE, CONSTRAINT_NONE), {2, 0, 2}},
+    {HWResourceIndexes(TDM_ATTR_SBWC, DPUF1, AXI_DONT_CARE, CONSTRAINT_NONE), {0, 2, 2}},
+    // AFBC
+    {HWResourceIndexes(TDM_ATTR_AFBC, DPUF0, AXI_DONT_CARE, CONSTRAINT_NONE), {3, 1, 4}},
+    {HWResourceIndexes(TDM_ATTR_AFBC, DPUF1, AXI_DONT_CARE, CONSTRAINT_NONE), {1, 3, 4}},
+    // ITP
+    {HWResourceIndexes(TDM_ATTR_ITP, DPUF0, AXI_DONT_CARE, CONSTRAINT_NONE), {3, 1, 4}},
+    {HWResourceIndexes(TDM_ATTR_ITP, DPUF1, AXI_DONT_CARE, CONSTRAINT_NONE), {1, 3, 4}},
+    // ROT_90
+    {HWResourceIndexes(TDM_ATTR_ROT_90, DPUF0, AXI_DONT_CARE, CONSTRAINT_NONE), {1, 1, 2}},
+    {HWResourceIndexes(TDM_ATTR_ROT_90, DPUF1, AXI_DONT_CARE, CONSTRAINT_NONE), {1, 1, 2}},
+    // WCG
+    {HWResourceIndexes(TDM_ATTR_WCG, DPUF0, AXI_DONT_CARE, CONSTRAINT_A0), {2, 0, 2}},
+    {HWResourceIndexes(TDM_ATTR_WCG, DPUF1, AXI_DONT_CARE, CONSTRAINT_A0), {0, 2, 2}},
+    {HWResourceIndexes(TDM_ATTR_WCG, DPUF0, AXI0, CONSTRAINT_B0), {2, 0, 2}},
+    {HWResourceIndexes(TDM_ATTR_WCG, DPUF0, AXI1, CONSTRAINT_B0), {2, 0, 2}},
+    {HWResourceIndexes(TDM_ATTR_WCG, DPUF1, AXI0, CONSTRAINT_B0), {0, 2, 2}},
+    {HWResourceIndexes(TDM_ATTR_WCG, DPUF1, AXI1, CONSTRAINT_B0), {0, 2, 2}},
 };
 
 typedef enum lbWidthIndex {
diff --git a/libhwc2.1/libcolormanager/ColorManager.h b/libhwc2.1/libcolormanager/ColorManager.h
new file mode 100644
index 0000000..c60f41a
--- /dev/null
+++ b/libhwc2.1/libcolormanager/ColorManager.h
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "../../../gs101/libhwc2.1/libcolormanager/ColorManager.h"
diff --git a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.cpp b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.cpp
index b5bb83a..a49dc3c 100644
--- a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.cpp
+++ b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.cpp
@@ -253,7 +253,9 @@
     int count = 0;
 
     auto checkPreblending = [&](const int idx, ExynosMPPSource* mppSrc) -> int {
-        auto& dpp = getDppForLayer(mppSrc);
+        auto* colorManager = getColorManager();
+        if (!colorManager) return false;
+        auto& dpp = colorManager->getDppForLayer(mppSrc);
         mppSrc->mNeedPreblending =
                 dpp.EotfLut().enable | dpp.Gm().enable | dpp.Dtm().enable | dpp.OetfLut().enable;
         if (hwcCheckDebugMessages(eDebugTDM)) {
diff --git a/libhwc2.1/libresource/ExynosResourceManagerModule.cpp b/libhwc2.1/libresource/ExynosResourceManagerModule.cpp
index faf52af..0428350 100644
--- a/libhwc2.1/libresource/ExynosResourceManagerModule.cpp
+++ b/libhwc2.1/libresource/ExynosResourceManagerModule.cpp
@@ -150,78 +150,65 @@
     return true;
 }
 
-void ExynosResourceManagerModule::setupHWResource(const tdm_attr_t &tdmAttrId, const String8 &name,
-                                                  const DPUblockId_t &blkId,
-                                                  const AXIPortId_t &axiId, ExynosDisplay *display,
-                                                  ExynosDisplay *addedDisplay,
-                                                  const ConstraintRev_t &constraintsRev) {
-    const int32_t dispType = display->mType;
-    const auto &resourceIdx = HWResourceIndexes(tdmAttrId, blkId, axiId, dispType, constraintsRev);
+void ExynosResourceManagerModule::setupHWResource(const tdm_attr_t& tdmAttrId, const String8& name,
+                                                  const DPUblockId_t& blkId,
+                                                  const AXIPortId_t& axiId, ExynosDisplay* mainDisp,
+                                                  ExynosDisplay* minorDisp,
+                                                  const ConstraintRev_t& constraintsRev) {
+    const auto& resourceIdx = HWResourceIndexes(tdmAttrId, blkId, axiId, constraintsRev);
     const auto &iter = mHWResourceTables->find(resourceIdx);
     if (iter != mHWResourceTables->end()) {
         auto &hwResource = iter->second;
         const auto &TDMInfoIdx = (HWAttrs.at(tdmAttrId).loadSharing == LS_DPUF)
                 ? std::make_pair(blkId, AXI_DONT_CARE)
                 : std::make_pair(blkId, axiId);
-        uint32_t amount = (addedDisplay == nullptr) ? hwResource.maxAssignedAmount
-                                                    : hwResource.totalAmount -
-                        addedDisplay->mDisplayTDMInfo[TDMInfoIdx]
-                                .getAvailableAmount(tdmAttrId)
-                                .totalAmount;
-        display->mDisplayTDMInfo[TDMInfoIdx].initTDMInfo(DisplayTDMInfo::ResourceAmount_t{amount},
-                                                         tdmAttrId);
-        if (addedDisplay == nullptr) {
-            HDEBUGLOGD(eDebugTDM, "(%s=>%s) : %s amount is updated to %d",
-                       resourceIdx.toString8().c_str(), iter->first.toString8().c_str(),
-                       name.c_str(), amount);
-        } else {
-            HDEBUGLOGD(eDebugTDM, "(%s=>%s) : hwResource.totalAmount=%d %s amount is updated to %d",
-                       resourceIdx.toString8().c_str(), iter->first.toString8().c_str(),
-                       hwResource.totalAmount, name.c_str(), amount);
+        if (mainDisp != nullptr) {
+            const uint32_t mainAmount = (minorDisp != nullptr)
+                    ? hwResource.mainAmount
+                    : hwResource.mainAmount + hwResource.minorAmount;
+            mainDisp->mDisplayTDMInfo[TDMInfoIdx]
+                    .initTDMInfo(DisplayTDMInfo::ResourceAmount_t{mainAmount}, tdmAttrId);
+        }
+        if (minorDisp != nullptr) {
+            const uint32_t minorAmount = hwResource.minorAmount;
+            minorDisp->mDisplayTDMInfo[TDMInfoIdx]
+                    .initTDMInfo(DisplayTDMInfo::ResourceAmount_t{minorAmount}, tdmAttrId);
         }
     } else {
         ALOGW("(%s): cannot find resource for %s", resourceIdx.toString8().c_str(), name.c_str());
     }
 }
 
-uint32_t ExynosResourceManagerModule::setDisplaysTDMInfo()
-{
-    ExynosDisplay *addedDisplay = nullptr;
-
+uint32_t ExynosResourceManagerModule::setDisplaysTDMInfo(ExynosDisplay* mainDisp,
+                                                         ExynosDisplay* minorDisp) {
     /*
-     * Checking display connections,
-     * Assume that WFD and External are not connected at the same time
-     * If non-primary display is connected, primary display's HW resource is looted
+     * Update main/minor display resource amount
+     * If only one display exists, all TDM resources are allocated for the only display.
      */
-    for (auto &display : mDisplays) {
-        if (display->mType == HWC_DISPLAY_PRIMARY) continue;
-        if (display->isEnabled()) {
-            addedDisplay = display;
-            break;
-        }
-    }
-
-    /*
-     * Update Primary's resource amount. primary = total - loot(other display's HW resource)
-     * Other's aready defined at initDisplaysTDMInfo()
-     */
-    ExynosDisplay *primaryDisplay = getDisplay(getDisplayId(HWC_DISPLAY_PRIMARY, 0));
     for (auto attr = HWAttrs.begin(); attr != HWAttrs.end(); attr++) {
         for (auto blockId = DPUBlocks.begin(); blockId != DPUBlocks.end(); blockId++) {
             if (attr->second.loadSharing == LS_DPUF) {
                 setupHWResource(attr->first, attr->second.name, blockId->first, AXI_DONT_CARE,
-                                primaryDisplay, addedDisplay, mConstraintRev);
+                                mainDisp, minorDisp, mConstraintRev);
             } else if (attr->second.loadSharing == LS_DPUF_AXI) {
                 for (auto axi = AXIPorts.begin(); axi != AXIPorts.end(); ++axi) {
                     setupHWResource(attr->first, attr->second.name, blockId->first, axi->first,
-                                    primaryDisplay, addedDisplay, mConstraintRev);
+                                    mainDisp, minorDisp, mConstraintRev);
                 }
             }
+            else {
+                ALOGE("%s attr[%s] wrong load sharing=%d", __func__, attr->second.name.c_str(),
+                                                           attr->second.loadSharing);
+                return BAD_TYPE;
+            }
         }
     }
 
     if (hwcCheckDebugMessages(eDebugTDM)) {
         for (auto &display : mDisplays) {
+            if (!(display->mPlugState == true && display->mPowerModeState.has_value() &&
+                  display->mPowerModeState.value() != (hwc2_power_mode_t)HWC_POWER_MODE_OFF))
+                continue;
             for (auto attr = HWAttrs.begin(); attr != HWAttrs.end(); attr++) {
                 for (auto blockId = DPUBlocks.begin(); blockId != DPUBlocks.end(); blockId++) {
                     if (attr->second.loadSharing == LS_DPUF) {
@@ -230,7 +217,7 @@
                                                  .getAvailableAmount(attr->first)
                                                  .totalAmount;
                         HDEBUGLOGD(eDebugTDM, "%s : [%s] display:%d,block:%d, amount : %d(%s)",
-                                   __func__, attr->second.name.c_str(), display->mType,
+                                   __func__, attr->second.name.c_str(), display->mDisplayId,
                                    blockId->first, amount,
                                    display->isEnabled() ? "used" : "not used");
                     } else {
@@ -251,32 +238,7 @@
         }
     }
 
-    return 0;
-}
-
-uint32_t ExynosResourceManagerModule::initDisplaysTDMInfo()
-{
-    /*
-     * Initialize as predefined value at table
-     * Primary's resource will be changed at setDisplaysTDMInfo() function
-     */
-    for (auto &display : mDisplays) {
-        for (auto attr = HWAttrs.begin(); attr != HWAttrs.end(); attr++) {
-            for (auto blockId = DPUBlocks.begin(); blockId != DPUBlocks.end(); blockId++) {
-                if (attr->second.loadSharing == LS_DPUF) {
-                    setupHWResource(attr->first, attr->second.name, blockId->first, AXI_DONT_CARE,
-                                    display, nullptr, mConstraintRev);
-                } else if (attr->second.loadSharing == LS_DPUF_AXI) {
-                    for (auto axi = AXIPorts.begin(); axi != AXIPorts.end(); ++axi) {
-                        setupHWResource(attr->first, attr->second.name, blockId->first, axi->first,
-                                        display, nullptr, mConstraintRev);
-                    }
-                }
-            }
-        }
-    }
-
-    return 0;
+    return NO_ERROR;
 }
 
 uint32_t getSramAmount(tdm_attr_t attr, uint32_t formatProperty, lbWidthIndex_t widthIndex) {
@@ -615,3 +577,15 @@
 
     return 0;
 }
+
+bool ExynosResourceManagerModule::isAssignable(ExynosMPP* candidateMPP, ExynosDisplay* display,
+                                               struct exynos_image& src, struct exynos_image& dst,
+                                               ExynosMPPSource* mppSrc) {
+    if (display != nullptr && candidateMPP != nullptr &&
+        display->mType == HWC_DISPLAY_EXTERNAL &&
+        !(candidateMPP->mPhysicalType == MPP_DPP_VGRFS && candidateMPP->mPhysicalIndex == 0)) {
+        return false;
+    }
+    return gs201::ExynosResourceManagerModule::isAssignable(candidateMPP, display, src, dst,
+                                                            mppSrc);
+}
diff --git a/libhwc2.1/libresource/ExynosResourceManagerModule.h b/libhwc2.1/libresource/ExynosResourceManagerModule.h
index cf6c4fe..e9ab5ad 100644
--- a/libhwc2.1/libresource/ExynosResourceManagerModule.h
+++ b/libhwc2.1/libresource/ExynosResourceManagerModule.h
@@ -29,8 +29,7 @@
         /* TDM (Time-Division Multiplexing) based Resource Management */
         virtual bool isHWResourceAvailable(ExynosDisplay *display, ExynosMPP *currentMPP,
                                            ExynosMPPSource *mppSrc);
-        virtual uint32_t setDisplaysTDMInfo();
-        virtual uint32_t initDisplaysTDMInfo();
+        virtual uint32_t setDisplaysTDMInfo(ExynosDisplay* mainDisp, ExynosDisplay* minorDisp);
         virtual uint32_t calculateHWResourceAmount(ExynosDisplay *display, ExynosMPPSource *mppSrc);
         virtual int32_t otfMppReordering(ExynosDisplay *display, ExynosMPPVector &otfMPPs,
                                          struct exynos_image &src, struct exynos_image &dst);
@@ -45,10 +44,13 @@
         bool checkTDMResource(ExynosDisplay *display, ExynosMPP *currentMPP,
                               ExynosMPPSource *mppSrc);
         const std::map<HWResourceIndexes, HWResourceAmounts_t> *mHWResourceTables = nullptr;
-        void setupHWResource(const tdm_attr_t &tdmAttrId, const String8 &name,
-                             const DPUblockId_t &blkId, const AXIPortId_t &axiId,
-                             ExynosDisplay *display, ExynosDisplay *addedDisplay,
-                             const ConstraintRev_t &constraintsRev);
+        void setupHWResource(const tdm_attr_t& tdmAttrId, const String8& name,
+                             const DPUblockId_t& blkId, const AXIPortId_t& axiId,
+                             ExynosDisplay* mainDisp, ExynosDisplay* minorDisp,
+                             const ConstraintRev_t& constraintsRev);
+        virtual bool isAssignable(ExynosMPP* candidateMPP, ExynosDisplay* display,
+                                  struct exynos_image& src, struct exynos_image& dst,
+                                  ExynosMPPSource* mppSrc);
 
     private:
         ConstraintRev_t mConstraintRev;