6f968ef
From cd6f931fb06f825f246222a4362fbf728f8dce73 Mon Sep 17 00:00:00 2001
97c6429
From: Dave Airlie <airlied@redhat.com>
97c6429
Date: Fri, 17 Aug 2012 09:49:24 +1000
Dave Airlie 9620f4c
Subject: [PATCH] autobind GPUs to the screen, (v3)
97c6429
97c6429
this is racy and really not what we want for hotplug going forward,
97c6429
but until DE support is in GNOME its probably for the best.
97c6429
8830e76
v2: fix if config or slave config is NULL
Dave Airlie 9620f4c
v3: fix multi useful slaves
97c6429
DO NOT UPSTREAM.
Dave Airlie 02cbf43
Dave Airlie 02cbf43
Signed-off-by: Dave Airlie <airlied@gmail.com>
97c6429
---
Dave Airlie 9620f4c
 hw/xfree86/common/xf86Init.c        | 12 ++++++++++++
6f968ef
 hw/xfree86/common/xf86platformBus.c |  3 +++
6f968ef
 hw/xfree86/modes/xf86Crtc.c         | 32 ++++++++++++++++++++++++++++++++
6f968ef
 3 files changed, 47 insertions(+)
97c6429
97c6429
diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c
6f968ef
index 6282252..dc33ad1 100644
97c6429
--- a/hw/xfree86/common/xf86Init.c
97c6429
+++ b/hw/xfree86/common/xf86Init.c
6f968ef
@@ -361,6 +361,16 @@ xf86CreateRootWindow(WindowPtr pWin)
6f968ef
     return ret;
fc48514
 }
97c6429
 
6f968ef
+extern void xf86AutoConfigOutputDevice(ScrnInfoPtr pScrn, ScrnInfoPtr master);                              
6f968ef
+static void
fc48514
+xf86AutoConfigOutputDevices(void)
fc48514
+{
fc48514
+    int i;
fc48514
+
fc48514
+    for (i = 0; i < xf86NumGPUScreens; i++)
fc48514
+        xf86AutoConfigOutputDevice(xf86GPUScreens[i], xf86Screens[0]);
fc48514
+}
fc48514
+
6f968ef
 static void
fc48514
 InstallSignalHandlers(void)
fc48514
 {
6f968ef
@@ -949,6 +959,8 @@ InitOutput(ScreenInfo * pScreenInfo, int argc, char **argv)
fc48514
     for (i = 0; i < xf86NumGPUScreens; i++)
fc48514
         AttachUnboundGPU(xf86Screens[0]->pScreen, xf86GPUScreens[i]->pScreen);
97c6429
 
fc48514
+    xf86AutoConfigOutputDevices();
fc48514
+
97c6429
     xf86VGAarbiterWrapFunctions();
97c6429
     if (sigio_blocked)
fc48514
         OsReleaseSIGIO();
97c6429
diff --git a/hw/xfree86/common/xf86platformBus.c b/hw/xfree86/common/xf86platformBus.c
6f968ef
index 33b2b7d..be3bdd9 100644
97c6429
--- a/hw/xfree86/common/xf86platformBus.c
97c6429
+++ b/hw/xfree86/common/xf86platformBus.c
6f968ef
@@ -393,6 +393,8 @@ xf86platformProbeDev(DriverPtr drvp)
6f968ef
     return foundScreen;
6f968ef
 }
97c6429
 
6f968ef
+extern void xf86AutoConfigOutputDevice(ScrnInfoPtr pScrn, ScrnInfoPtr master);
6f968ef
+
6f968ef
 int
6f968ef
 xf86platformAddDevice(int index)
6f968ef
 {
6f968ef
@@ -465,6 +467,7 @@ xf86platformAddDevice(int index)
Dave Airlie 9dc0b02
    }
fc48514
    /* attach unbound to 0 protocol screen */
fc48514
    AttachUnboundGPU(xf86Screens[0]->pScreen, xf86GPUScreens[i]->pScreen);
fc48514
+   xf86AutoConfigOutputDevice(xf86GPUScreens[i], xf86Screens[0]);
fc48514
 
488b3f2
    RRResourcesChanged(xf86Screens[0]->pScreen);
488b3f2
    RRTellChanged(xf86Screens[0]->pScreen);
fc48514
diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
6f968ef
index 4726f2a..e83ea13 100644
fc48514
--- a/hw/xfree86/modes/xf86Crtc.c
fc48514
+++ b/hw/xfree86/modes/xf86Crtc.c
6f968ef
@@ -3440,3 +3440,35 @@ xf86DetachAllCrtc(ScrnInfoPtr scrn)
fc48514
             crtc->x = crtc->y = 0;
fc48514
         }
fc48514
 }
fc48514
+
6f968ef
+
fc48514
+void xf86AutoConfigOutputDevice(ScrnInfoPtr pScrn, ScrnInfoPtr master)
fc48514
+{
fc48514
+    RRProviderPtr master_provider;
fc48514
+    xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(master);
fc48514
+    xf86CrtcConfigPtr slave_config = XF86_CRTC_CONFIG_PTR(pScrn);
6f968ef
+    Bool unbound = FALSE;
fc48514
+
8830e76
+    if (!config || !slave_config)
8830e76
+        return;
8830e76
+
fc48514
+    master_provider = config->randr_provider;
fc48514
+
fc48514
+    if ((master->capabilities & RR_Capability_SinkOffload) &&
6f968ef
+        pScrn->capabilities & RR_Capability_SourceOffload) {
6f968ef
+            /* source offload */
6f968ef
+            
6f968ef
+        DetachUnboundGPU(pScrn->pScreen);
6f968ef
+        unbound = TRUE;
fc48514
+        AttachOffloadGPU(master->pScreen, pScrn->pScreen);
fc48514
+        slave_config->randr_provider->offload_sink = master_provider;
Dave Airlie 9620f4c
+    }
Dave Airlie 9620f4c
+    if ((master->capabilities & RR_Capability_SourceOutput) &&
fc48514
+               pScrn->capabilities & RR_Capability_SinkOutput) {
fc48514
+        /* sink offload */
6f968ef
+        if (!unbound)
6f968ef
+            DetachUnboundGPU(pScrn->pScreen);
fc48514
+        AttachOutputGPU(master->pScreen, pScrn->pScreen);
fc48514
+        slave_config->randr_provider->output_source = master_provider;
fc48514
+    }
fc48514
+}
Dave Airlie 9dc0b02
-- 
6f968ef
1.8.3.1
Dave Airlie 9dc0b02