weston-10: add drm_set_qms command [1/1]

PD#SWPL-196689

Problem:
add drm_set_qms command

Solution:
add drm_set_qms command

Verify:
S7D-Trunk

Change-Id: Iccc8285acbbfe107f99c03b330c244024e9fbed9
Signed-off-by: chen.wang1 <chen.wang1@amlogic.com>
diff --git a/aml-weston/aml-backend.c b/aml-weston/aml-backend.c
index 419665f..82991e2 100644
--- a/aml-weston/aml-backend.c
+++ b/aml-weston/aml-backend.c
@@ -1110,6 +1110,19 @@
 	return ret;
 }
 
+static void drm_set_qms(struct drm_backend *b, int value)
+{
+	struct drm_output *output;
+
+#ifdef ENABLE_MODE_POLICY
+	wl_list_for_each(output, &b->compositor->output_list, base.link) {
+		mode_policy_set_output(&output->base);
+		mode_policy_set_qms(value);
+		weston_output_damage(&output->base);
+	}
+#endif
+}
+
 static void drm_set_display_enable(drm_cmd *info, int enable)
 {
 	struct drm_backend *b = info->b;
@@ -1295,6 +1308,13 @@
 						} else if (compare_string(tok, "hdr_priority")) {
 							weston_log("hdr_priority: %s\n", ctx);
 							drm_set_priority(info, &ctx);
+						} else if (compare_string(tok, "QMS")) {
+							tok = strtok_r(0, " ", &ctx);
+							if (tok) {
+								int qms_value = atoi(tok);
+								weston_log("qms value: %d\n", qms_value);
+								drm_set_qms(info->b, qms_value);
+							}
 						}
 					}
 				} else {
diff --git a/libweston/modepolicy/DisplayAdapter.cpp b/libweston/modepolicy/DisplayAdapter.cpp
index b8a4ba1..c061fe4 100644
--- a/libweston/modepolicy/DisplayAdapter.cpp
+++ b/libweston/modepolicy/DisplayAdapter.cpp
@@ -125,6 +125,7 @@
     DA_DEFINE(VRR_ENABLED, "0", update_sys_node_by_property);
     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);
 
 #define DA_SET_NODE(ID, NODE) \
         display_attrs[DA_##ID].sysfs_node = NODE
@@ -162,6 +163,7 @@
     DA_SET_NODE(VRR_ENABLED, "VRR_ENABLED");
     DA_SET_NODE(BRR_UPDATE, "brr_update");
     DA_SET_NODE(HDMI_HDR_STATUS, "hdmi_hdr_status");
+    DA_SET_NODE(UPDATE, "UPDATE");
 
 #define DA_SET_READ_ONLY(ID) \
         display_attrs[DA_##ID].is_read_only = true
@@ -188,6 +190,7 @@
         DA_SET_OBJ_ID(HDMI_COLOR_ATTR, conn->connector_id);
         DA_SET_OBJ_ID(VRR_SUPPORTED, conn->connector_id);
         DA_SET_OBJ_ID(HDMI_HDR_STATUS, conn->connector_id);
+        DA_SET_OBJ_ID(UPDATE, conn->connector_id);
     }
     if (crtc) {
         DA_SET_OBJ_ID(AMDV_MODE, crtc->crtc_id);
diff --git a/libweston/modepolicy/DisplayAdapter.h b/libweston/modepolicy/DisplayAdapter.h
index 60f88e1..b30af83 100644
--- a/libweston/modepolicy/DisplayAdapter.h
+++ b/libweston/modepolicy/DisplayAdapter.h
@@ -83,7 +83,8 @@
 #define DISPLAY_VRR_SUPPORTED                   "VRR_SUPPORTED"
 #define DISPLAY_VRR_ENABLED                     "VRR_ENABLED"
 #define DISPLAY_BRR_UPDATE                      "BRR_UPDATE"
-#define DISPLAY_HDMI_HDR_STATUS                "HDMI_HDR_STATUS"
+#define DISPLAY_HDMI_HDR_STATUS                 "HDMI_HDR_STATUS"
+#define DISPLAY_UPDATE                          "UPDATE"
 
 
 
@@ -114,6 +115,7 @@
     DA_VRR_ENABLED,
     DA_BRR_UPDATE,
     DA_HDMI_HDR_STATUS,
+    DA_UPDATE,
     DA_DISPLAY_ATTRIBUTE__COUNT
 };
 
diff --git a/libweston/modepolicy/ModePolicy.cpp b/libweston/modepolicy/ModePolicy.cpp
index 003b42e..37b6b32 100644
--- a/libweston/modepolicy/ModePolicy.cpp
+++ b/libweston/modepolicy/ModePolicy.cpp
@@ -3073,12 +3073,16 @@
     for (int32_t i = 0; i < mVrrModeGroup.num; i++) {
         if (mVrrModeGroup.groups[i].width == mode.pixelW
                 && mVrrModeGroup.groups[i].height == mode.pixelH) {
+            MESON_LOGD("mVrrModeGroup: w %d h %d mode: W %d H %d refreshRate %d\n",
+                  mVrrModeGroup.groups[i].width,mVrrModeGroup.groups[i].height,mode.pixelW,mode.pixelH,mode.refreshRate);
             if (((mode.refreshRate - mVrrModeGroup.groups[i].vrr_min) >= 0
                     //frac refresh rate
                     || std::abs(mode.refreshRate - (mVrrModeGroup.groups[i].vrr_min * 1000) / (float)1001) < 0.001)
                         && (mode.refreshRate - mVrrModeGroup.groups[i].vrr_max <= 0)) {
                 if (mVrrModeGroup.groups[i].width == groupMode.pixelW
                         && mVrrModeGroup.groups[i].height == groupMode.pixelH) {
+                    MESON_LOGD("groupMode: W %d H %d refreshRate %d\n",
+                      groupMode.pixelW,groupMode.pixelH,groupMode.refreshRate);
                     if (((groupMode.refreshRate - mVrrModeGroup.groups[i].vrr_min) >= 0
                         //frac refresh rate
                         || std::abs(groupMode.refreshRate - (mVrrModeGroup.groups[i].vrr_min * 1000) / (float)1001) < 0.001)
@@ -3205,6 +3209,8 @@
             if (!itGroupModes.empty()) {
                 /* only need check the first item*/
                 drm_mode_info_t *gmodePtr = itGroupModes[0];
+                MESON_LOGD("gmodePtr: W %d H %d itMode: W %d H %d\n",gmodePtr->pixelW,
+                        gmodePtr->pixelH,itMode.pixelW,itMode.pixelH);
                 if (gmodePtr->pixelW == itMode.pixelW && gmodePtr->pixelH == itMode.pixelH
                             && isSeamlessMode(itMode, *gmodePtr)) {
                     itMode.groupId = groupId;
@@ -3240,6 +3246,13 @@
     mSeamlessSwitchEnabled = enable;
 }
 
+void ModePolicy::seamlessSwitchQmsEnabled(bool enable)
+{
+    seamlessSwitchEnabled(enable);
+    setSourceDisplay(OUTPUT_MODE_STATE_POWER);
+    applyDisplaySetting(true);
+}
+
 void ModePolicy::setQMSVRR(char* curDisplayMode, char* final_displaymode )
 {
     if (!curDisplayMode || !final_displaymode) {
@@ -3272,6 +3285,7 @@
     sprintf(sEnableVrr, "%d",enableVrr);
     setDisplayAttribute(DISPLAY_VRR_ENABLED, sEnableVrr);
 
+    setDisplayAttribute(DISPLAY_UPDATE, "1");
 }
 int32_t bindCrtcAndConnector(drmModeCrtc *crtc, drmModeConnector *conn)
 {
@@ -3402,6 +3416,12 @@
        g_Policy->seamlessSwitchEnabled(enable);
 }
 
+void seamlessSwitchQmsEnabled(bool enable)
+{
+    if (g_Policy.get())
+       g_Policy->seamlessSwitchQmsEnabled(enable);
+}
+
 int setPriority(int priority)
 {
     if (g_Policy.get())
diff --git a/libweston/modepolicy/ModePolicy.h b/libweston/modepolicy/ModePolicy.h
index fcc3c32..3f76222 100644
--- a/libweston/modepolicy/ModePolicy.h
+++ b/libweston/modepolicy/ModePolicy.h
@@ -375,6 +375,7 @@
         int32_t width, int32_t height, uint32_t refresh, uint32_t flags);
     void updateDrmfd(int drmFd);
     void seamlessSwitchEnabled(bool enable);
+    void seamlessSwitchQmsEnabled(bool enable);
     int32_t setHdrPriority(int32_t type);
     int32_t getHdrPriority();
 
diff --git a/libweston/modepolicy/modepolicy_aml.cpp b/libweston/modepolicy/modepolicy_aml.cpp
index e9b622a..234afbe 100644
--- a/libweston/modepolicy/modepolicy_aml.cpp
+++ b/libweston/modepolicy/modepolicy_aml.cpp
@@ -929,6 +929,20 @@
 	return &ctx->current_mode;
 }
 
+void mode_policy_set_qms(int value)
+{
+	weston_ctx *ctx = weston_get_ctx();
+	if (!ctx)
+		return;
+
+	if (ctx->enableVrr == value) {
+		return;
+	}
+
+	ctx->enableVrr = value;
+	seamlessSwitchQmsEnabled(ctx->enableVrr);
+}
+
 void mode_policy_update_bestmode(bool bestmode)
 {
 	bootenv_update("is.bestmode", bestmode ? "true" : "false");
diff --git a/libweston/modepolicy/modepolicy_aml.h b/libweston/modepolicy/modepolicy_aml.h
index dd0d3f9..7d3cf75 100644
--- a/libweston/modepolicy/modepolicy_aml.h
+++ b/libweston/modepolicy/modepolicy_aml.h
@@ -79,6 +79,7 @@
 int mode_policy_set_property(const char *name, int value);
 int mode_policy_get_scaling();
 int mode_policy_set_scaling(int scaling);
+void mode_policy_set_qms(int value);
 void mode_policy_resume();
 drmModeCrtc *weston_get_crtc_for_conn(int drm_fd, drmModeConnector *conn);
 bool set_policy_by_appName(const char *name, int state);
diff --git a/libweston/modepolicy/modepolicyfunc.h b/libweston/modepolicy/modepolicyfunc.h
index 44e4090..27ce773 100644
--- a/libweston/modepolicy/modepolicyfunc.h
+++ b/libweston/modepolicy/modepolicyfunc.h
@@ -43,6 +43,7 @@
 bool getModeNameForPix(char *name,
     int32_t width, int32_t height, uint32_t refresh, uint32_t flags);
 void seamlessSwitchEnabled(bool enable);
+void seamlessSwitchQmsEnabled(bool enable);
 void updateDrmfd(int fd);
 int setPriority(int priority);
 int getPriority();