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();