From patchwork Wed Jun 17 09:13:49 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chris Wilson X-Patchwork-Id: 6623341 Return-Path: X-Original-To: patchwork-intel-gfx@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id C52AE9F326 for ; Wed, 17 Jun 2015 09:14:00 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 200B6206CD for ; Wed, 17 Jun 2015 09:13:59 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id 81B9720634 for ; Wed, 17 Jun 2015 09:13:57 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 8CE946E5DB; Wed, 17 Jun 2015 02:13:55 -0700 (PDT) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from fireflyinternet.com (mail.fireflyinternet.com [87.106.93.118]) by gabe.freedesktop.org (Postfix) with ESMTP id BE25D6E0F6 for ; Wed, 17 Jun 2015 02:13:53 -0700 (PDT) X-Default-Received-SPF: pass (skip=forwardok (res=PASS)) x-ip-name=78.156.65.138; Received: from nuc-i3427.alporthouse.com (unverified [78.156.65.138]) by fireflyinternet.com (Firefly Internet (M1)) with ESMTP id 41182698-1500048 for multiple; Wed, 17 Jun 2015 10:14:06 +0100 Received: by nuc-i3427.alporthouse.com (sSMTP sendmail emulation); Wed, 17 Jun 2015 10:13:49 +0100 Date: Wed, 17 Jun 2015 10:13:49 +0100 From: Chris Wilson To: Nathan Schulte , xorg@lists.x.org, intel-gfx@lists.freedesktop.org Message-ID: <20150617091349.GC24012@nuc-i3427.alporthouse.com> Mail-Followup-To: Chris Wilson , Nathan Schulte , xorg@lists.x.org, intel-gfx@lists.freedesktop.org References: <55804361.6090209@gmail.com> <20150617084625.GB24012@nuc-i3427.alporthouse.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20150617084625.GB24012@nuc-i3427.alporthouse.com> User-Agent: Mutt/1.5.21 (2010-09-15) Subject: Re: [Intel-gfx] RandR + i915 (HD 4600 / Haswell) -- Cannot switch from internal to 3x external X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" X-Spam-Status: No, score=-4.8 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP On Wed, Jun 17, 2015 at 09:46:25AM +0100, Chris Wilson wrote: > On Tue, Jun 16, 2015 at 10:40:17AM -0500, Nathan Schulte wrote: > > I am running Debian Sid on a laptop machine with an Intel Haswell > > CPU with Intel HD 4600 graphics. > > > > >$ Xorg -version > > > > > >X.Org X Server 1.17.1 > > >Release Date: 2015-02-10 > > >X Protocol Version 11, Revision 0 > > >Build Operating System: Linux 3.16.0-4-amd64 x86_64 Debian > > >Current Operating System: Linux desmas-l 4.0.0-1-amd64 #1 SMP Debian 4.0.2-1 (2015-05-11) x86_64 > > >Kernel command line: BOOT_IMAGE=/vmlinuz-4.0.0-1-amd64 root=UUID=f5ba8b5c-63aa-4a67-a07c-dd8d3297b2d3 ro quiet > > >Build Date: 04 May 2015 11:22:06PM > > >xorg-server 2:1.17.1-2 (http://www.debian.org/support) > > >Current version of pixman: 0.32.6 > > > Before reporting problems, check http://wiki.x.org > > > to make sure that you have the latest version. > > > > When using RandR (xrandr, arandr), I am unable to re-configure my > > displays from the one integrated in the machine (eDP1), to three > > external displays (in this case, HDMI1 (DP -> DVI via DP++), HDMI2 > > (HDMI -> DVI), HDMI3 (miniDP -> DVI); the machine has three external > > connectors). I haven't played with DP and multi-stream transport, > > but I expect it would behave similarly (that is, annoyingly). > > > > >xrandr: cannot find crtc for output HDMI > > > > My work-around is to issue two RandR requests, with the first one > > enabling an external display, and the second one disabling the > > internal display and enabling the rest. This is rather annoying and > > conflicts with some of the scripts I use to automatically configure > > my displays based upon context and hot-plug (autorandr). > > > > The internal display is 1920x1080, and the three external displays > > are identical monitors with 1920x1200 resolution. I believe this is > > key, and has to do with the number of available PLLs (2) and > > encoders (3) in the Intel hardware. > > > > I've attached an strace (xrandr.log) of the xrandr command: > > > > >xrandr \ > > > --output DP2 --off \ > > > --output DP1 --off \ > > > --output HDMI3 --mode 1920x1200 --pos 3120x0 --rotate left \ > > > --output HDMI2 --mode 1920x1200 --pos 1920x0 --rotate left \ > > > --output HDMI1 --primary --mode 1920x1200 --pos 0x410 --rotate normal \ > > > --output eDP1 --off \ > > > --output VGA1 --off > > > > Any help resolving this issue is greatly appreciated. > > I think this is the right fix: > > diff --git a/xrandr.c b/xrandr.c > index fbfd93e..c0feac3 100644 > --- a/xrandr.c > +++ b/xrandr.c > @@ -3029,7 +3029,7 @@ main (int argc, char **argv) > if (!config_output) argerr ("%s must be used after --output\n", argv[i]); > set_name_xid (&config_output->mode, None); > set_name_xid (&config_output->crtc, None); > - config_output->changes |= changes_mode; > + config_output->changes |= changes_mode | changes_crtc; > continue; > } > if (!strcmp ("--fb", argv[i])) { Though there is still this logic in check_crtc_for_output: if (crtc->notput) { // check we can clone in our configuration ... } else if (crtc->crtc_info->noutput) { // check against old } But we never ignore the old configuration when we disable all the outputs on it. So to avoid running out of CRTC prematurely, we also need to stop considering the old configuration like: -Chris diff --git a/xrandr.c b/xrandr.c index c0feac3..181c76e 100644 --- a/xrandr.c +++ b/xrandr.c @@ -2243,6 +2243,8 @@ static void pick_crtcs (void) { output_t *output; + int saved_crtc_noutput[num_crtcs]; + int n; /* * First try to match up newly enabled outputs with spare crtcs @@ -2274,7 +2276,18 @@ pick_crtcs (void) */ for (output = all_outputs; output; output = output->next) output->current_crtc_info = output->crtc_info; + + /* Mark all CRTC as currently unused */ + for (n = 0; n < num_crtcs; n++) { + saved_crtc_noutput[n] = crtcs[n].crtc_info->noutput; + crtcs[n].crtc_info->noutput = 0; + } + pick_crtcs_score (all_outputs); + + for (n = 0; n < num_crtcs; n++) + crtcs[n].crtc_info->noutput = saved_crtc_noutput[n]; + for (output = all_outputs; output; output = output->next) { if (output->mode_info && !output->crtc_info)