From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755258AbdEIRA4 (ORCPT ); Tue, 9 May 2017 13:00:56 -0400 Received: from smtprelay2.synopsys.com ([198.182.60.111]:36125 "EHLO smtprelay.synopsys.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755125AbdEIRAw (ORCPT ); Tue, 9 May 2017 13:00:52 -0400 From: Jose Abreu To: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org Cc: Jose Abreu , Carlos Palminha , Alexey Brodkin , =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= , Daniel Vetter , Dave Airlie , Andrzej Hajda , Archit Taneja Subject: [PATCH v2 1/8] drm: Add crtc/encoder/bridge->mode_valid() callbacks Date: Tue, 9 May 2017 18:00:08 +0100 Message-Id: <0187832f758eb489258212b0ec917d5013366fe5.1494347165.git.joabreu@synopsys.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: References: In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This adds a new callback to crtc, encoder and bridge helper functions called mode_valid(). This callback shall be implemented if the corresponding component has some sort of restriction in the modes that can be displayed. A NULL callback implicates that the component can display all the modes. We also change the description of connector->mode_valid() callback so that it matches the existing behaviour: It is never called in atomic check phase. Only the callbacks were implemented to simplify review process, following patches will make use of them. Signed-off-by: Jose Abreu Cc: Carlos Palminha Cc: Alexey Brodkin Cc: Ville Syrjälä Cc: Daniel Vetter Cc: Dave Airlie Cc: Andrzej Hajda Cc: Archit Taneja --- Changes v1->v2: - Change description of connector->mode_valid() (Daniel) include/drm/drm_bridge.h | 20 ++++++++++++++ include/drm/drm_modeset_helper_vtables.h | 45 ++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h index fdd82fc..00c6c36 100644 --- a/include/drm/drm_bridge.h +++ b/include/drm/drm_bridge.h @@ -59,6 +59,26 @@ struct drm_bridge_funcs { void (*detach)(struct drm_bridge *bridge); /** + * @mode_valid: + * + * This callback is used to check if a specific mode is valid in this + * bridge. This should be implemented if the bridge has some sort of + * restriction in the modes it can display. For example, a given bridge + * may be responsible to set a clock value. If the clock can not + * produce all the values for the available modes then this callback + * can be used to restrict the number of modes to only the ones that + * can be displayed. + * + * This is called at mode probe and at atomic check phase. + * + * RETURNS: + * + * drm_mode_status Enum + */ + enum drm_mode_status (*mode_valid)(struct drm_bridge *crtc, + const struct drm_display_mode *mode); + + /** * @mode_fixup: * * This callback is used to validate and adjust a mode. The paramater diff --git a/include/drm/drm_modeset_helper_vtables.h b/include/drm/drm_modeset_helper_vtables.h index c01c328..eec2c70 100644 --- a/include/drm/drm_modeset_helper_vtables.h +++ b/include/drm/drm_modeset_helper_vtables.h @@ -106,6 +106,26 @@ struct drm_crtc_helper_funcs { void (*commit)(struct drm_crtc *crtc); /** + * @mode_valid: + * + * This callback is used to check if a specific mode is valid in this + * crtc. This should be implemented if the crtc has some sort of + * restriction in the modes it can display. For example, a given crtc + * may be responsible to set a clock value. If the clock can not + * produce all the values for the available modes then this callback + * can be used to restrict the number of modes to only the ones that + * can be displayed. + * + * This is called at mode probe and at atomic check phase. + * + * RETURNS: + * + * drm_mode_status Enum + */ + enum drm_mode_status (*mode_valid)(struct drm_crtc *crtc, + const struct drm_display_mode *mode); + + /** * @mode_fixup: * * This callback is used to validate a mode. The parameter mode is the @@ -457,6 +477,26 @@ struct drm_encoder_helper_funcs { void (*dpms)(struct drm_encoder *encoder, int mode); /** + * @mode_valid: + * + * This callback is used to check if a specific mode is valid in this + * encoder. This should be implemented if the encoder has some sort + * of restriction in the modes it can display. For example, a given + * encoder may be responsible to set a clock value. If the clock can + * not produce all the values for the available modes then this callback + * can be used to restrict the number of modes to only the ones that + * can be displayed. + * + * This is called at mode probe and at atomic check phase. + * + * RETURNS: + * + * drm_mode_status Enum + */ + enum drm_mode_status (*mode_valid)(struct drm_encoder *crtc, + const struct drm_display_mode *mode); + + /** * @mode_fixup: * * This callback is used to validate and adjust a mode. The parameter @@ -795,6 +835,11 @@ struct drm_connector_helper_funcs { * (which is usually derived from the EDID data block from the sink). * See e.g. drm_helper_probe_single_connector_modes(). * + * This callback is never called in atomic check phase so that userspace + * can override kernel sink checks in case of broken EDID with wrong + * limits from the sink. You can use the remaining mode_valid() + * callbacks to validate the mode against your video path. + * * NOTE: * * This only filters the mode list supplied to userspace in the -- 1.9.1