From: Jose Abreu <Jose.Abreu@synopsys.com>
To: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org
Cc: Jose Abreu <Jose.Abreu@synopsys.com>,
Carlos Palminha <CARLOS.PALMINHA@synopsys.com>,
Dave Airlie <airlied@linux.ie>,
Andrzej Hajda <a.hajda@samsung.com>,
Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Subject: [PATCH v5 03/10] drm: Use new mode_valid() helpers in connector probe helper
Date: Thu, 25 May 2017 15:19:15 +0100 [thread overview]
Message-ID: <d4e3ba87d822fa92f1b8773e441b9a02af3bde71.1495720737.git.joabreu@synopsys.com> (raw)
In-Reply-To: <cover.1495720737.git.joabreu@synopsys.com>
In-Reply-To: <cover.1495720737.git.joabreu@synopsys.com>
This changes the connector probe helper function to use the new
encoder->mode_valid(), bridge->mode_valid() and crtc->mode_valid()
helper callbacks to validate the modes.
The new callbacks are optional so the behaviour remains the same
if they are not implemented. If they are, then the code loops
through all the connector's encodersXbridgesXcrtcs and calls the
callback.
If at least a valid encoderXbridgeXcrtc combination is found which
accepts the mode then the function returns MODE_OK.
Signed-off-by: Jose Abreu <joabreu@synopsys.com>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Carlos Palminha <palminha@synopsys.com>
Cc: Dave Airlie <airlied@linux.ie>
Cc: Andrzej Hajda <a.hajda@samsung.com>
Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Changes v3->v4:
- Change function name (Laurent)
Changes v2->v3:
- Call also bridge->mode_valid (Daniel)
Changes v1->v2:
- Use new helpers suggested by Ville
- Change documentation (Daniel)
---
drivers/gpu/drm/drm_probe_helper.c | 67 +++++++++++++++++++++++++++++++++++---
1 file changed, 63 insertions(+), 4 deletions(-)
diff --git a/drivers/gpu/drm/drm_probe_helper.c b/drivers/gpu/drm/drm_probe_helper.c
index f01abdc..00e6832 100644
--- a/drivers/gpu/drm/drm_probe_helper.c
+++ b/drivers/gpu/drm/drm_probe_helper.c
@@ -83,6 +83,61 @@
return MODE_OK;
}
+static enum drm_mode_status
+drm_mode_validate_pipeline(struct drm_display_mode *mode,
+ struct drm_connector *connector)
+{
+ struct drm_device *dev = connector->dev;
+ uint32_t *ids = connector->encoder_ids;
+ enum drm_mode_status ret = MODE_OK;
+ unsigned int i;
+
+ /* Step 1: Validate against connector */
+ ret = drm_connector_mode_valid(connector, mode);
+ if (ret != MODE_OK)
+ return ret;
+
+ /* Step 2: Validate against encoders and crtcs */
+ for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
+ struct drm_encoder *encoder = drm_encoder_find(dev, ids[i]);
+ struct drm_crtc *crtc;
+
+ if (!encoder)
+ continue;
+
+ ret = drm_encoder_mode_valid(encoder, mode);
+ if (ret != MODE_OK) {
+ /* No point in continuing for crtc check as this encoder
+ * will not accept the mode anyway. If all encoders
+ * reject the mode then, at exit, ret will not be
+ * MODE_OK. */
+ continue;
+ }
+
+ ret = drm_bridge_mode_valid(encoder->bridge, mode);
+ if (ret != MODE_OK) {
+ /* There is also no point in continuing for crtc check
+ * here. */
+ continue;
+ }
+
+ drm_for_each_crtc(crtc, dev) {
+ if (!drm_encoder_crtc_ok(encoder, crtc))
+ continue;
+
+ ret = drm_crtc_mode_valid(crtc, mode);
+ if (ret == MODE_OK) {
+ /* If we get to this point there is at least
+ * one combination of encoder+crtc that works
+ * for this mode. Lets return now. */
+ return ret;
+ }
+ }
+ }
+
+ return ret;
+}
+
static int drm_helper_probe_add_cmdline_mode(struct drm_connector *connector)
{
struct drm_cmdline_mode *cmdline_mode;
@@ -322,7 +377,11 @@ void drm_kms_helper_poll_enable(struct drm_device *dev)
* - drm_mode_validate_flag() checks the modes against basic connector
* capabilities (interlace_allowed,doublescan_allowed,stereo_allowed)
* - the optional &drm_connector_helper_funcs.mode_valid helper can perform
- * driver and/or hardware specific checks
+ * driver and/or sink specific checks
+ * - the optional &drm_crtc_helper_funcs.mode_valid,
+ * &drm_bridge_funcs.mode_valid and &drm_encoder_helper_funcs.mode_valid
+ * helpers can perform driver and/or source specific checks which are also
+ * enforced by the modeset/atomic helpers
*
* 5. Any mode whose status is not OK is pruned from the connector's modes list,
* accompanied by a debug message indicating the reason for the mode's
@@ -466,9 +525,9 @@ int drm_helper_probe_single_connector_modes(struct drm_connector *connector,
if (mode->status == MODE_OK)
mode->status = drm_mode_validate_flag(mode, mode_flags);
- if (mode->status == MODE_OK && connector_funcs->mode_valid)
- mode->status = connector_funcs->mode_valid(connector,
- mode);
+ if (mode->status == MODE_OK)
+ mode->status = drm_mode_validate_pipeline(mode,
+ connector);
}
prune:
--
1.9.1
next prev parent reply other threads:[~2017-05-25 14:22 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-05-25 14:19 [PATCH v5 00/10] Introduce new mode validation callbacks Jose Abreu
2017-05-25 14:19 ` [PATCH v5 01/10] drm: Add drm_{crtc/encoder/connector}_mode_valid() Jose Abreu
2017-05-30 6:38 ` Daniel Vetter
2017-05-30 7:26 ` Neil Armstrong
2017-05-25 14:19 ` [PATCH v5 02/10] drm: Introduce drm_bridge_mode_valid() Jose Abreu
2017-05-26 4:25 ` Archit Taneja
2017-05-30 7:27 ` Neil Armstrong
2017-05-25 14:19 ` Jose Abreu [this message]
2017-05-30 7:27 ` [PATCH v5 03/10] drm: Use new mode_valid() helpers in connector probe helper Neil Armstrong
2017-05-25 14:19 ` [PATCH v5 04/10] drm: Use mode_valid() in atomic modeset Jose Abreu
2017-05-29 19:38 ` Daniel Vetter
2017-05-30 7:27 ` Neil Armstrong
2017-05-25 14:19 ` [PATCH v5 05/10] drm: arcpgu: Use crtc->mode_valid() callback Jose Abreu
2017-05-30 7:28 ` Neil Armstrong
2017-06-21 9:38 ` Jose Abreu
2017-06-22 8:46 ` Daniel Vetter
2017-05-25 14:19 ` [PATCH v5 06/10] drm/bridge: analogix-anx78xx: Use bridge->mode_valid() callback Jose Abreu
2017-05-26 4:27 ` Archit Taneja
2017-05-30 7:28 ` Neil Armstrong
2017-05-30 10:35 ` Archit Taneja
2017-05-25 14:19 ` [PATCH v5 07/10] drm/bridge/synopsys: dw-hdmi: " Jose Abreu
2017-05-29 9:45 ` Neil Armstrong
2017-05-30 10:24 ` Archit Taneja
2017-05-30 10:29 ` Philipp Zabel
2017-06-05 7:53 ` Archit Taneja
2017-05-25 14:19 ` [PATCH v5 08/10] drm/arm: malidp: Use crtc->mode_valid() callback Jose Abreu
2017-05-30 7:29 ` Neil Armstrong
2017-05-30 9:37 ` Liviu Dudau
2017-05-31 8:20 ` Daniel Vetter
2017-05-31 10:48 ` Liviu Dudau
2017-05-31 10:56 ` Daniel Vetter
2017-05-31 11:09 ` Liviu Dudau
2017-05-25 14:19 ` [PATCH v5 09/10] drm/atmel-hlcdc: " Jose Abreu
2017-05-30 7:30 ` Neil Armstrong
2017-06-02 9:35 ` Boris Brezillon
2017-05-25 14:19 ` [PATCH v5 10/10] drm: vc4: Use crtc->mode_valid() and encoder->mode_valid() callbacks Jose Abreu
2017-05-30 7:30 ` Neil Armstrong
2017-06-02 20:10 ` Eric Anholt
2017-06-20 8:47 ` Daniel Vetter
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=d4e3ba87d822fa92f1b8773e441b9a02af3bde71.1495720737.git.joabreu@synopsys.com \
--to=jose.abreu@synopsys.com \
--cc=CARLOS.PALMINHA@synopsys.com \
--cc=a.hajda@samsung.com \
--cc=airlied@linux.ie \
--cc=dri-devel@lists.freedesktop.org \
--cc=laurent.pinchart@ideasonboard.com \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®