From: Thierry Reding <thierry.reding@gmail.com>
To: dri-devel@lists.freedesktop.org
Cc: David Airlie <airlied@linux.ie>,
Daniel Vetter <daniel.vetter@ffwll.ch>,
intel-gfx@lists.freedesktop.org,
David Herrmann <dh.herrmann@gmail.com>,
Russell King <rmk+kernel@arm.linux.org.uk>
Subject: [PATCH 1/2] drm: provide a helper for the encoder possible_crtcs mask
Date: Mon, 13 Jan 2014 12:46:49 +0100 [thread overview]
Message-ID: <1389613610-21084-2-git-send-email-treding@nvidia.com> (raw)
In-Reply-To: <1389613610-21084-1-git-send-email-treding@nvidia.com>
From: Russell King <rmk+kernel@arm.linux.org.uk>
The encoder possible_crtcs mask identifies which CRTCs can be bound to
a particular encoder. Each bit from bit 0 defines an index in the list
of CRTCs held in the DRM mode_config crtc_list. Rather than having
drivers trying to track the position of their CRTCs in the list, expose
the code which already exists for calculating the appropriate mask bit
for a CRTC.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Reviewed-by: David Herrmann <dh.herrmann@gmail.com>
[treding@nvidia.com: add drm_crtc_index(), move to core]
Signed-off-by: Thierry Reding <treding@nvidia.com>
---
Changes in v2:
- further extract a new drm_crtc_index() function
- move to DRM core (drm_crtc.c)
drivers/gpu/drm/drm_crtc.c | 38 ++++++++++++++++++++++++++++++++++++++
drivers/gpu/drm/drm_crtc_helper.c | 16 +++-------------
include/drm/drm_crtc.h | 2 ++
3 files changed, 43 insertions(+), 13 deletions(-)
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index 266a01d7f635..fdfa5a0e51d6 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -675,6 +675,44 @@ void drm_crtc_cleanup(struct drm_crtc *crtc)
EXPORT_SYMBOL(drm_crtc_cleanup);
/**
+ * drm_crtc_index - find the index of a registered CRTC
+ * @crtc: CRTC to find index for
+ *
+ * Given a registered CRTC, return the index of that CRTC within a DRM
+ * device's list of CRTCs. If the CRTC isn't registered, return -1.
+ */
+int drm_crtc_index(struct drm_crtc *crtc)
+{
+ struct drm_crtc *tmp;
+ int index = 0;
+
+ list_for_each_entry(tmp, &crtc->dev->mode_config.crtc_list, head) {
+ if (tmp == crtc)
+ return index;
+
+ index++;
+ }
+
+ return -1;
+}
+EXPORT_SYMBOL(drm_crtc_index);
+
+/**
+ * drm_crtc_mask - find the mask of a registered CRTC
+ * @crtc: CRTC to find mask for
+ *
+ * Given a registered CRTC, return the mask bit of that CRTC for an
+ * encoder's possible_crtcs field.
+ */
+uint32_t drm_crtc_mask(struct drm_crtc *crtc)
+{
+ int i = drm_crtc_index(crtc);
+
+ return i < 0 ? 0 : 1 << i;
+}
+EXPORT_SYMBOL(drm_crtc_mask);
+
+/**
* drm_mode_probed_add - add a mode to a connector's probed mode list
* @connector: connector the new mode
* @mode: mode data
diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c
index 01361aba033b..95b32098badf 100644
--- a/drivers/gpu/drm/drm_crtc_helper.c
+++ b/drivers/gpu/drm/drm_crtc_helper.c
@@ -334,23 +334,13 @@ EXPORT_SYMBOL(drm_helper_disable_unused_functions);
static bool drm_encoder_crtc_ok(struct drm_encoder *encoder,
struct drm_crtc *crtc)
{
- struct drm_device *dev;
- struct drm_crtc *tmp;
- int crtc_mask = 1;
+ uint32_t crtc_mask;
WARN(!crtc, "checking null crtc?\n");
- dev = crtc->dev;
-
- list_for_each_entry(tmp, &dev->mode_config.crtc_list, head) {
- if (tmp == crtc)
- break;
- crtc_mask <<= 1;
- }
+ crtc_mask = drm_crtc_mask(crtc);
- if (encoder->possible_crtcs & crtc_mask)
- return true;
- return false;
+ return !!(encoder->possible_crtcs & crtc_mask);
}
/*
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index f32c5cd51f41..a61fb73fdcb5 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -929,6 +929,8 @@ extern int drm_crtc_init(struct drm_device *dev,
struct drm_crtc *crtc,
const struct drm_crtc_funcs *funcs);
extern void drm_crtc_cleanup(struct drm_crtc *crtc);
+extern int drm_crtc_index(struct drm_crtc *crtc);
+extern uint32_t drm_crtc_mask(struct drm_crtc *crtc);
extern void drm_connector_ida_init(void);
extern void drm_connector_ida_destroy(void);
--
1.8.4.2
next prev parent reply other threads:[~2014-01-13 11:46 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-01-13 11:46 [PATCH 0/2] drm: Introduce drm_crtc_index() and drm_crtc_mask() Thierry Reding
2014-01-13 11:46 ` Thierry Reding [this message]
2014-01-13 11:58 ` [PATCH 1/2] drm: provide a helper for the encoder possible_crtcs mask David Herrmann
2014-01-13 12:47 ` Russell King - ARM Linux
2014-01-13 13:50 ` David Herrmann
2014-01-13 13:55 ` Russell King - ARM Linux
2014-01-13 13:57 ` David Herrmann
2014-01-13 13:14 ` Jani Nikula
2014-01-13 11:46 ` [PATCH 2/2] drm/i915: Use drm_crtc_mask() helper Thierry Reding
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=1389613610-21084-2-git-send-email-treding@nvidia.com \
--to=thierry.reding@gmail.com \
--cc=airlied@linux.ie \
--cc=daniel.vetter@ffwll.ch \
--cc=dh.herrmann@gmail.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=intel-gfx@lists.freedesktop.org \
--cc=rmk+kernel@arm.linux.org.uk \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.