weston: add max output size limit [1/1]

PD#SWPL-202731

Problem:
some crtc didn't support some mode in mode list.

Solution:
add max output size limit for crtc

Verify:
s6

Change-Id: Iecf5b2ee82c8eacb89b7c91336bc238be8352ef4
Signed-off-by: limin.tian <limin.tian@amlogic.com>
diff --git a/libweston/modepolicy/DisplayAdapter.cpp b/libweston/modepolicy/DisplayAdapter.cpp
index c061fe4..d091ff6 100644
--- a/libweston/modepolicy/DisplayAdapter.cpp
+++ b/libweston/modepolicy/DisplayAdapter.cpp
@@ -126,6 +126,7 @@
     DA_DEFINE(BRR_UPDATE, "0", update_sys_node_by_property);
     DA_DEFINE(HDMI_HDR_STATUS, "0", update_sys_node_by_property);
     DA_DEFINE(UPDATE, "0", update_sys_node_by_property);
+    DA_DEFINE(CRTC_MAX_OUTPUT_SIZE, "0", update_sys_node_by_property);
 
 #define DA_SET_NODE(ID, NODE) \
         display_attrs[DA_##ID].sysfs_node = NODE
@@ -164,6 +165,7 @@
     DA_SET_NODE(BRR_UPDATE, "brr_update");
     DA_SET_NODE(HDMI_HDR_STATUS, "hdmi_hdr_status");
     DA_SET_NODE(UPDATE, "UPDATE");
+    DA_SET_NODE(CRTC_MAX_OUTPUT_SIZE, "crtc_max_out_size");
 
 #define DA_SET_READ_ONLY(ID) \
         display_attrs[DA_##ID].is_read_only = true
@@ -198,6 +200,7 @@
         DA_SET_OBJ_ID(AMDV_ENABLE, crtc->crtc_id);
         DA_SET_OBJ_ID(VRR_ENABLED, crtc->crtc_id);
         DA_SET_OBJ_ID(BRR_UPDATE, crtc->crtc_id);
+        DA_SET_OBJ_ID(CRTC_MAX_OUTPUT_SIZE, crtc->crtc_id);
     }
 }
 
diff --git a/libweston/modepolicy/DisplayAdapter.h b/libweston/modepolicy/DisplayAdapter.h
index b30af83..436008f 100644
--- a/libweston/modepolicy/DisplayAdapter.h
+++ b/libweston/modepolicy/DisplayAdapter.h
@@ -85,7 +85,7 @@
 #define DISPLAY_BRR_UPDATE                      "BRR_UPDATE"
 #define DISPLAY_HDMI_HDR_STATUS                 "HDMI_HDR_STATUS"
 #define DISPLAY_UPDATE                          "UPDATE"
-
+#define DISPLAY_CRTC_MAX_OUTPUT_SIZE            "CRTC_MAX_OUTPUT_SIZE"
 
 
 #define MAX_BUF_LEN MESON_MAX_STR_LEN
@@ -116,6 +116,7 @@
     DA_BRR_UPDATE,
     DA_HDMI_HDR_STATUS,
     DA_UPDATE,
+    DA_CRTC_MAX_OUTPUT_SIZE,
     DA_DISPLAY_ATTRIBUTE__COUNT
 };
 
diff --git a/libweston/modepolicy/ModePolicy.cpp b/libweston/modepolicy/ModePolicy.cpp
index 37b6b32..6d8be98 100644
--- a/libweston/modepolicy/ModePolicy.cpp
+++ b/libweston/modepolicy/ModePolicy.cpp
@@ -1102,12 +1102,29 @@
     if (connector->connection != DRM_MODE_CONNECTED)
         return;
 
+    std::string s_max_output_size;
+    getDisplayAttribute(DISPLAY_CRTC_MAX_OUTPUT_SIZE, s_max_output_size);
+    int max_output_size = 0;
+    int max_output_size_w = 0;
+    int max_output_size_h = 0;
+    max_output_size = atoi(s_max_output_size.c_str());
+    max_output_size_w = max_output_size & 0xffff;
+    max_output_size_h = max_output_size >> 16;
+    MESON_LOGD("DISPLAY_CRTC_MAX_OUTPUT_SIZE:%s (%dx%d)",
+               s_max_output_size.c_str(), max_output_size_w, max_output_size_h);
+
     mConnecterModes.clear();
     /*add new display mode list.*/
     drmModeModeInfoPtr drmModes = connector->modes;
     drm_mode_info_t modeInfo;
     memset(&modeInfo, 0, sizeof(modeInfo));
     for (int i = 0;i < connector->count_modes; i++) {
+        if (max_output_size_w != 0 && max_output_size_h != 0
+            && drmModes[i].hdisplay > max_output_size_w
+            && drmModes[i].vdisplay > max_output_size_h ) {
+            MESON_LOGD("mode:%dx%d not support", drmModes[i].hdisplay, drmModes[i].vdisplay);
+            continue;
+        }
         strncpy(modeInfo.name, drmModes[i].name, DRM_DISPLAY_MODE_LEN - 1);
         modeInfo.pixelW = drmModes[i].hdisplay;
         modeInfo.pixelH = drmModes[i].vdisplay;