From eecb74a2f3a111578d833ade42f33f5d21e540d3 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Wed, 29 Nov 2017 15:20:28 +0900 Subject: [PATCH] dpms: handling extended DPMS modes Change-Id: Ic847321b932625daa6b357ffd435ec719d140ad9 --- client/tdm_client.c | 7 +++++++ include/tdm_common.h | 6 +++++- src/tdm_macro.h | 1 + src/tdm_output.c | 26 ++++++++++++++++++++++++++ 4 files changed, 39 insertions(+), 1 deletion(-) diff --git a/client/tdm_client.c b/client/tdm_client.c index 6153187..a855e8f 100644 --- a/client/tdm_client.c +++ b/client/tdm_client.c @@ -274,6 +274,13 @@ _tdm_client_output_cb_dpms(void *data, struct wl_tdm_output *wl_tdm_output, uint TDM_RETURN_IF_FAIL(private_output != NULL); + /* If value is extended value, we handle it as DPMS on in client side + * The extended DPMS value is valid only in server side. + * Or, need to export to client side also? + */ + if (value > TDM_OUTPUT_DPMS_OFF) + value = TDM_OUTPUT_DPMS_ON; + if (private_output->dpms == value) return; diff --git a/include/tdm_common.h b/include/tdm_common.h index f353216..d087fc8 100644 --- a/include/tdm_common.h +++ b/include/tdm_common.h @@ -87,11 +87,15 @@ typedef enum { /** * @brief The output capability enumeration * @details - * @remark + * If a backend module provides #TDM_OUTPUT_CAPABILITY_EXTENDED_DPMS, we can set + * an extended DPMS mode to an output which a backend module supports. + * Don't use the low-4bit for an extended DPMS mode value. It's used for default + * DPMS modes. */ typedef enum { TDM_OUTPUT_CAPABILITY_ASYNC_DPMS = (1 << 0), /**< if a outupt supports asynchronous DPMS operation */ TDM_OUTPUT_CAPABILITY_HWC = (1 << 1), /**< if a outupt supports hwc operation @since 2.0.0*/ + TDM_OUTPUT_CAPABILITY_EXTENDED_DPMS = (1 << 2), /**< if a outupt supports extended DPMS operation @since 2.0.0 */ } tdm_output_capability; /** diff --git a/src/tdm_macro.h b/src/tdm_macro.h index 775354e..9a99ae3 100644 --- a/src/tdm_macro.h +++ b/src/tdm_macro.h @@ -162,6 +162,7 @@ extern "C" { /* can't export VSYNC macro because we can't define the exact meaning of vsync off * at this time. Does committing in standy mode work? Doesn't committing in suspend mode work? */ +#define TDM_OUTPUT_DPMS_DEFAULT_MASK 0xF #define TDM_OUTPUT_DPMS_VSYNC_OFF_MASK 0x2 #define TDM_OUTPUT_DPMS_VSYNC_IS_OFF(dpms) ((dpms) & TDM_OUTPUT_DPMS_VSYNC_OFF_MASK) diff --git a/src/tdm_output.c b/src/tdm_output.c index 42dfe87..9188c9c 100644 --- a/src/tdm_output.c +++ b/src/tdm_output.c @@ -1209,6 +1209,19 @@ tdm_output_set_dpms(tdm_output *output, tdm_output_dpms dpms_value) tdm_func_output *func_output; OUTPUT_FUNC_ENTRY(); + if (dpms_value > TDM_OUTPUT_DPMS_OFF) { + if (dpms_value & TDM_OUTPUT_DPMS_DEFAULT_MASK) { + TDM_ERR("Don't use the low-4bit for an extended DPMS mode: dpms_value(%x)", dpms_value); + return TDM_ERROR_BAD_REQUEST; + } + + if (!(private_output->caps.capabilities & TDM_OUTPUT_CAPABILITY_EXTENDED_DPMS)) { + TDM_ERR("output(%d) doesn't support the extended DPMS control: '%s'", + private_output->pipe, tdm_dpms_str(dpms_value)); + return TDM_ERROR_BAD_REQUEST; + } + } + _pthread_mutex_lock(&private_display->lock); if (private_output->waiting_dpms_change) { @@ -1264,6 +1277,19 @@ tdm_output_set_dpms_async(tdm_output *output, tdm_output_dpms dpms_value) return TDM_ERROR_BAD_REQUEST; } + if (dpms_value > TDM_OUTPUT_DPMS_OFF) { + if (dpms_value & TDM_OUTPUT_DPMS_DEFAULT_MASK) { + TDM_ERR("Don't use the low-4bit for an extended DPMS mode: dpms_value(%x)", dpms_value); + return TDM_ERROR_BAD_REQUEST; + } + + if (!(private_output->caps.capabilities & TDM_OUTPUT_CAPABILITY_EXTENDED_DPMS)) { + TDM_ERR("output(%d) doesn't support the extended DPMS control: '%s'", + private_output->pipe, tdm_dpms_str(dpms_value)); + return TDM_ERROR_BAD_REQUEST; + } + } + _pthread_mutex_lock(&private_display->lock); if (private_output->waiting_dpms_change) { -- 2.7.4