Merge Android 14 QPR3 to AOSP main

Bug: 346855327
Merged-In: Iff4b5ae1c46c3feeb2015db5b8b5dcf300cac40e
Change-Id: I5c0c4450b8c85e55f60b8988f8dd22a673c015fd
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/libdevice/HistogramController.cpp b/libhwc2.1/libdevice/HistogramController.cpp
index 6cf6f78..b9f635a 100644
--- a/libhwc2.1/libdevice/HistogramController.cpp
+++ b/libhwc2.1/libdevice/HistogramController.cpp
@@ -20,54 +20,3 @@
     mHistogramCapability.supportSamplePosList.push_back(HistogramSamplePos::PRE_POSTPROC);
     mHistogramCapability.supportBlockingRoi = true;
 }
-
-// TODO: b/295990513 - Remove the if defined after kernel prebuilts are merged.
-#if defined(EXYNOS_HISTOGRAM_CHANNEL_REQUEST)
-int HistogramController::createHistogramDrmConfigLocked(const ChannelInfo& channel,
-                                                        std::shared_ptr<void>& configPtr,
-                                                        size_t& length) const {
-    configPtr = std::make_shared<struct histogram_channel_config>();
-    struct histogram_channel_config* channelConfig =
-            (struct histogram_channel_config*)configPtr.get();
-
-    if (channelConfig == nullptr) {
-        ALOGE("%s: histogram failed to allocate histogram_channel_config", __func__);
-        return NO_MEMORY;
-    }
-
-    channelConfig->roi.start_x = channel.workingConfig.roi.left;
-    channelConfig->roi.start_y = channel.workingConfig.roi.top;
-    channelConfig->roi.hsize = channel.workingConfig.roi.right - channel.workingConfig.roi.left;
-    channelConfig->roi.vsize = channel.workingConfig.roi.bottom - channel.workingConfig.roi.top;
-    if (channel.workingConfig.blockingRoi.has_value() &&
-        channel.workingConfig.blockingRoi.value() != DISABLED_ROI) {
-        const HistogramRoiRect& blockedRoi = channel.workingConfig.blockingRoi.value();
-        channelConfig->flags |= HISTOGRAM_FLAGS_BLOCKED_ROI;
-        channelConfig->blocked_roi.start_x = blockedRoi.left;
-        channelConfig->blocked_roi.start_y = blockedRoi.top;
-        channelConfig->blocked_roi.hsize = blockedRoi.right - blockedRoi.left;
-        channelConfig->blocked_roi.vsize = blockedRoi.bottom - blockedRoi.top;
-    } else {
-        channelConfig->flags &= ~HISTOGRAM_FLAGS_BLOCKED_ROI;
-    }
-    channelConfig->weights.weight_r = channel.workingConfig.weights.weightR;
-    channelConfig->weights.weight_g = channel.workingConfig.weights.weightG;
-    channelConfig->weights.weight_b = channel.workingConfig.weights.weightB;
-    channelConfig->pos = (channel.workingConfig.samplePos == HistogramSamplePos::POST_POSTPROC)
-            ? POST_DQE
-            : PRE_DQE;
-    channelConfig->threshold = channel.threshold;
-
-    length = sizeof(struct histogram_channel_config);
-
-    return NO_ERROR;
-}
-
-int HistogramController::parseDrmEvent(void* event, uint8_t& channelId, char16_t*& buffer) const {
-    struct exynos_drm_histogram_channel_event* histogram_channel_event =
-            (struct exynos_drm_histogram_channel_event*)event;
-    channelId = histogram_channel_event->hist_id;
-    buffer = (char16_t*)&histogram_channel_event->bins;
-    return NO_ERROR;
-}
-#endif
diff --git a/libhwc2.1/libdevice/HistogramController.h b/libhwc2.1/libdevice/HistogramController.h
index a895bdd..58b3f5c 100644
--- a/libhwc2.1/libdevice/HistogramController.h
+++ b/libhwc2.1/libdevice/HistogramController.h
@@ -22,12 +22,4 @@
 public:
     HistogramController(ExynosDisplay* display) : HistogramDevice(display, 4, {3}) {}
     virtual void initPlatformHistogramCapability() override;
-// TODO: b/295990513 - Remove the if defined after kernel prebuilts are merged.
-#if defined(EXYNOS_HISTOGRAM_CHANNEL_REQUEST)
-    virtual int createHistogramDrmConfigLocked(const ChannelInfo& channel,
-                                               std::shared_ptr<void>& configPtr,
-                                               size_t& length) const override
-            REQUIRES(channel.channelInfoMutex);
-    virtual int parseDrmEvent(void* event, uint8_t& channelId, char16_t*& buffer) const override;
-#endif
 };
diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.cpp b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.cpp
index 62ab010..4400cfe 100644
--- a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.cpp
+++ b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.cpp
@@ -51,26 +51,3 @@
 
             std::memcpy(mMonitorDescription.data(), panelModel.c_str(), mMonitorDescription.size());
 }
-
-// TODO: b/295990513 - Remove the if defined after kernel prebuilts are merged.
-#if defined(EXYNOS_HISTOGRAM_CHANNEL_REQUEST)
-int32_t ExynosPrimaryDisplayDrmInterfaceModule::sendHistogramChannelIoctl(HistogramChannelIoctl_t control, uint8_t channelId) const {
-    struct exynos_drm_histogram_channel_request histogramRequest;
-
-    histogramRequest.crtc_id = mDrmCrtc->id();
-    histogramRequest.hist_id = channelId;
-
-    if (control == HistogramChannelIoctl_t::REQUEST) {
-        ATRACE_NAME(String8::format("requestIoctl #%u", channelId).c_str());
-        return mDrmDevice->CallVendorIoctl(DRM_IOCTL_EXYNOS_HISTOGRAM_CHANNEL_REQUEST,
-                                           (void *)&histogramRequest);
-    } else if (control == HistogramChannelIoctl_t::CANCEL) {
-        ATRACE_NAME(String8::format("cancelIoctl #%u", channelId).c_str());
-        return mDrmDevice->CallVendorIoctl(DRM_IOCTL_EXYNOS_HISTOGRAM_CHANNEL_CANCEL,
-                                           (void *)&histogramRequest);
-    } else {
-        ALOGE("%s: unknown control %d", __func__, (int)control);
-        return BAD_VALUE;
-    }
-}
-#endif
diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.h b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.h
index f654d4b..27a5b26 100644
--- a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.h
+++ b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.h
@@ -27,11 +27,6 @@
       : public gs201::ExynosPrimaryDisplayDrmInterfaceModule {
 public:
     ExynosPrimaryDisplayDrmInterfaceModule(ExynosDisplay *exynosDisplay);
-// TODO: b/295990513 - Remove the if defined after kernel prebuilts are merged.
-#if defined(EXYNOS_HISTOGRAM_CHANNEL_REQUEST)
-    virtual int32_t sendHistogramChannelIoctl(HistogramChannelIoctl_t control,
-                                              uint8_t channelId) const override;
-#endif
 };
 
 using ExynosExternalDisplayDrmInterfaceModule = gs201::ExynosExternalDisplayDrmInterfaceModule;
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;