Merge "display: Build composer in headless mode"
diff --git a/config/display-product.mk b/config/display-product.mk
index 237aa97..cac925e 100644
--- a/config/display-product.mk
+++ b/config/display-product.mk
@@ -81,7 +81,6 @@
 PRODUCT_DEFAULT_PROPERTY_OVERRIDES += ro.surface_flinger.has_HDR_display=true
 PRODUCT_DEFAULT_PROPERTY_OVERRIDES += ro.surface_flinger.use_color_management=true
 PRODUCT_DEFAULT_PROPERTY_OVERRIDES += ro.surface_flinger.wcg_composition_dataspace=143261696
-PRODUCT_DEFAULT_PROPERTY_OVERRIDES += ro.surface_flinger.protected_contents=true
 
 ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
 # Recovery is enabled, logging is enabled
diff --git a/libdrmutils/drm_interface.h b/libdrmutils/drm_interface.h
index 7e94d78..4f8edb3 100644
--- a/libdrmutils/drm_interface.h
+++ b/libdrmutils/drm_interface.h
@@ -513,6 +513,12 @@
   uint32_t min_prefill_lines = 0;
   int secure_disp_blend_stage = -1;
   bool concurrent_writeback = false;
+  uint32_t vig_limit_index = 0;
+  uint32_t dma_limit_index = 0;
+  uint32_t scaling_limit_index = 0;
+  uint32_t rotation_limit_index = 0;
+  uint32_t line_width_constraints_count = 0;
+  std::vector< std::pair <uint32_t, uint32_t> > line_width_limits;
 };
 
 enum struct DRMPlaneType {
diff --git a/sde-drm/drm_crtc.cpp b/sde-drm/drm_crtc.cpp
index e2cafa0..64bcea2 100644
--- a/sde-drm/drm_crtc.cpp
+++ b/sde-drm/drm_crtc.cpp
@@ -54,6 +54,8 @@
 using std::map;
 using std::mutex;
 using std::lock_guard;
+using std::pair;
+using std::vector;
 
 // CRTC Security Levels
 static uint8_t SECURE_NON_SECURE = 0;
@@ -354,6 +356,14 @@
   string max_dest_scaler_input_width = "max_dest_scaler_input_width=";
   string max_dest_scaler_output_width = "max_dest_scaler_output_width=";
   string sec_ui_blendstage = "sec_ui_blendstage=";
+  string vig = "vig=";
+  string dma = "dma=";
+  string scaling = "scale=";
+  string rotation = "rotation=";
+  string linewidth_constraints = "sspp_linewidth_usecases=";
+  string linewidth_values = "sspp_linewidth_values=";
+  string limit_constraint = "limit_usecase=";
+  string limit_value = "limit_value=";
 
   while (std::getline(stream, line)) {
     if (line.find(max_blendstages) != string::npos) {
@@ -429,6 +439,36 @@
       crtc_info_.min_prefill_lines = std::stoi(string(line, min_prefill_lines.length()));
     } else if (line.find(sec_ui_blendstage) != string::npos) {
       crtc_info_.secure_disp_blend_stage = std::stoi(string(line, (sec_ui_blendstage).length()));
+    } else if (line.find(linewidth_constraints) != string::npos) {
+      crtc_info_.line_width_constraints_count =
+                            std::stoi(string(line, (linewidth_constraints).length()));
+    } else if (line.find(vig) != string::npos) {
+      crtc_info_.vig_limit_index = std::stoi(string(line, (vig).length()));
+    } else if (line.find(dma) != string::npos) {
+      crtc_info_.dma_limit_index = std::stoi(string(line, (dma).length()));
+    } else if (line.find(scaling) != string::npos) {
+      crtc_info_.scaling_limit_index = std::stoi(string(line, (scaling).length()));
+    } else if (line.find(rotation) != string::npos) {
+      crtc_info_.rotation_limit_index = std::stoi(string(line, (rotation).length()));
+    } else if (line.find(linewidth_values) != string::npos) {
+      uint32_t num_linewidth_values = std::stoi(string(line, (linewidth_values).length()));
+      vector< pair <uint32_t,uint32_t> > constraint_vector;
+      for (uint32_t i = 0; i < num_linewidth_values; i++) {
+        uint32_t constraint = 0;
+        uint32_t value  = 0;
+        std::getline(stream, line);
+        if (line.find(limit_constraint) != string::npos) {
+          constraint = std::stoi(string(line, (limit_constraint).length()));
+        }
+        std::getline(stream, line);
+        if (line.find(limit_value) != string::npos) {
+          value = std::stoi(string(line, (limit_value).length()));
+        }
+        if (value) {
+          constraint_vector.push_back(std::make_pair(constraint,value));
+        }
+      }
+      crtc_info_.line_width_limits = std::move(constraint_vector);
     }
   }
   drmModeFreePropertyBlob(blob);
diff --git a/sdm/include/private/hw_info_types.h b/sdm/include/private/hw_info_types.h
index 0daf0ef..42822a0 100644
--- a/sdm/include/private/hw_info_types.h
+++ b/sdm/include/private/hw_info_types.h
@@ -36,9 +36,12 @@
 #include <set>
 #include <string>
 #include <vector>
+#include <utility>
 
 namespace sdm {
 using std::string;
+using std::pair;
+using std::vector;
 
 const int kMaxSDELayers = 16;   // Maximum number of layers that can be handled by MDP5 hardware
                                 // in a given layer stack.
@@ -266,6 +269,12 @@
   float max_downscale_rt = 2.2f;    // max downscale real time display
 };
 
+
+const int  kPipeVigLimit       = (1 << 0);
+const int  kPipeDmaLimit       = (1 << 1);
+const int  kPipeScalingLimit   = (1 << 2);
+const int  kPipeRotationLimit  = (1 << 3);
+
 struct HWResourceInfo {
   uint32_t hw_version = 0;
   uint32_t num_dma_pipe = 0;
@@ -321,6 +330,9 @@
   InlineRotationInfo inline_rot_info;
   std::bitset<32> src_tone_map = 0;  //!< Stores the bit mask of src tone map capability
   int secure_disp_blend_stage = -1;
+  uint32_t line_width_constraints_count = 0;
+  vector< pair <uint32_t, uint32_t> > line_width_limits;
+  vector< pair <uint32_t, uint32_t> > line_width_constraints;
 };
 
 struct HWSplitInfo {
diff --git a/sdm/libs/core/drm/hw_info_drm.cpp b/sdm/libs/core/drm/hw_info_drm.cpp
index 6af7538..eaa065c 100644
--- a/sdm/libs/core/drm/hw_info_drm.cpp
+++ b/sdm/libs/core/drm/hw_info_drm.cpp
@@ -327,6 +327,15 @@
   hw_resource->min_prefill_lines = info.min_prefill_lines;
   hw_resource->secure_disp_blend_stage = info.secure_disp_blend_stage;
   hw_resource->has_concurrent_writeback = info.concurrent_writeback;
+  hw_resource->line_width_constraints_count = info.line_width_constraints_count;
+  if (info.line_width_constraints_count) {
+    auto &width_constraints = hw_resource->line_width_constraints;
+    hw_resource->line_width_limits = std::move(info.line_width_limits);
+    width_constraints.push_back(std::make_pair(kPipeVigLimit, info.vig_limit_index));
+    width_constraints.push_back(std::make_pair(kPipeDmaLimit, info.dma_limit_index));
+    width_constraints.push_back(std::make_pair(kPipeScalingLimit, info.scaling_limit_index));
+    width_constraints.push_back(std::make_pair(kPipeRotationLimit, info.rotation_limit_index));
+  }
 }
 
 void HWInfoDRM::GetHWPlanesInfo(HWResourceInfo *hw_resource) {