From: Paulo Zanoni <przanoni@gmail.com>
To: intel-gfx@lists.freedesktop.org
Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
Subject: [PATCH xf86-video-intel] uxa: fix possible_clones computation
Date: Thu, 11 Oct 2012 18:10:17 -0300 [thread overview]
Message-ID: <1349989817-9510-1-git-send-email-przanoni@gmail.com> (raw)
From: Paulo Zanoni <paulo.r.zanoni@intel.com>
Libdrm's possible_clones is a mask of encoders. Xorg's possible_clones
is a mask of outputs, so we just can't do the following:
output->possible_clones = kencoder->possible_clones;
This is a problem on Haswell because, at least with the current
patches floating on the mailing list, there is more than one connector
per encoder.
This patch writes the code to properly translate libdrm's encoder mask
into Xorg's output mask.
Still need an SNA version.
Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com>
---
src/intel_display.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 56 insertions(+), 1 deletion(-)
diff --git a/src/intel_display.c b/src/intel_display.c
index b2a5904..d58e6e0 100644
--- a/src/intel_display.c
+++ b/src/intel_display.c
@@ -1435,7 +1435,6 @@ intel_output_init(ScrnInfoPtr scrn, struct intel_mode *mode, int num)
intel_output_backlight_init(output);
output->possible_crtcs = kencoder->possible_crtcs;
- output->possible_clones = kencoder->possible_clones;
output->interlaceAllowed = TRUE;
intel_output->output = output;
@@ -1680,6 +1679,60 @@ drm_wakeup_handler(pointer data, int err, pointer p)
drmHandleEvent(mode->fd, &mode->event_context);
}
+static drmModeEncoderPtr
+intel_get_kencoder(struct intel_mode *mode, int num)
+{
+ struct intel_output *iterator;
+ int id = mode->mode_res->encoders[num];
+
+ list_for_each_entry(iterator, &mode->outputs, link)
+ if (iterator->mode_encoder->encoder_id == id)
+ return iterator->mode_encoder;
+
+ return NULL;
+}
+
+/*
+ * Libdrm's possible_clones is a mask of encoders, Xorg's possible_clones is a
+ * mask of outputs. This function sets Xorg's possible_clones based on the
+ * values read from libdrm.
+ */
+static void
+intel_compute_possible_clones(ScrnInfoPtr scrn, struct intel_mode *mode)
+{
+ xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn);
+ struct intel_output *intel_output, *clone;
+ drmModeEncoderPtr cloned_encoder;
+ uint32_t mask;
+ int i, j, k;
+ CARD32 possible_clones;
+
+ for (i = 0; i < config->num_output; i++) {
+ possible_clones = 0;
+ intel_output = config->output[i]->driver_private;
+
+ mask = intel_output->mode_encoder->possible_clones;
+ for (j = 0; mask != 0; j++, mask >>= 1) {
+
+ if ((mask & 1) == 0)
+ continue;
+
+ cloned_encoder = intel_get_kencoder(mode, j);
+ if (!cloned_encoder)
+ continue;
+
+ for (k = 0; k < config->num_output; k++) {
+ clone = config->output[k]->driver_private;
+ if (clone->mode_encoder->encoder_id ==
+ cloned_encoder->encoder_id)
+ possible_clones |= (1 << k);
+ }
+ }
+
+ config->output[i]->possible_clones = possible_clones;
+ }
+}
+
Bool intel_mode_pre_init(ScrnInfoPtr scrn, int fd, int cpp)
{
intel_screen_private *intel = intel_get_screen_private(scrn);
@@ -1716,6 +1769,8 @@ Bool intel_mode_pre_init(ScrnInfoPtr scrn, int fd, int cpp)
for (i = 0; i < mode->mode_res->count_connectors; i++)
intel_output_init(scrn, mode, i);
+ intel_compute_possible_clones(scrn, mode);
+
#ifdef INTEL_PIXMAP_SHARING
xf86ProviderSetup(scrn, NULL, "Intel");
#endif
--
1.7.10.4
next reply other threads:[~2012-10-11 21:10 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-11 21:10 Paulo Zanoni [this message]
2012-10-12 8:49 ` [PATCH xf86-video-intel] uxa: fix possible_clones computation Chris Wilson
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=1349989817-9510-1-git-send-email-przanoni@gmail.com \
--to=przanoni@gmail.com \
--cc=intel-gfx@lists.freedesktop.org \
--cc=paulo.r.zanoni@intel.com \
/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