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;