1 From 37d51acb3b6a38af1717bfaa7925043c35bfb447 Mon Sep 17 00:00:00 2001
2 From: Dave Airlie <airlied@redhat.com>
3 Date: Fri, 17 Aug 2012 09:49:24 +1000
4 Subject: [PATCH] autobind GPUs to the screen, (v3)
6 this is racy and really not what we want for hotplug going forward,
7 but until DE support is in GNOME its probably for the best.
9 v2: fix if config or slave config is NULL
10 v3: fix multi useful slaves
13 hw/xfree86/common/xf86Init.c | 12 ++++++++++++
14 hw/xfree86/common/xf86platformBus.c | 3 +++
15 hw/xfree86/modes/xf86Crtc.c | 32 ++++++++++++++++++++++++++++++++
16 3 files changed, 47 insertions(+), 0 deletions(-)
18 diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c
19 index d231ced..89629c1 100644
20 --- a/hw/xfree86/common/xf86Init.c
21 +++ b/hw/xfree86/common/xf86Init.c
22 @@ -361,6 +361,16 @@ xf86CreateRootWindow(WindowPtr pWin)
26 +extern void xf86AutoConfigOutputDevice(ScrnInfoPtr pScrn, ScrnInfoPtr master);
28 +xf86AutoConfigOutputDevices(void)
32 + for (i = 0; i < xf86NumGPUScreens; i++)
33 + xf86AutoConfigOutputDevice(xf86GPUScreens[i], xf86Screens[0]);
37 InstallSignalHandlers(void)
39 @@ -926,6 +936,8 @@ InitOutput(ScreenInfo * pScreenInfo, int argc, char **argv)
40 for (i = 0; i < xf86NumGPUScreens; i++)
41 AttachUnboundGPU(xf86Screens[0]->pScreen, xf86GPUScreens[i]->pScreen);
43 + xf86AutoConfigOutputDevices();
45 xf86VGAarbiterWrapFunctions();
48 diff --git a/hw/xfree86/common/xf86platformBus.c b/hw/xfree86/common/xf86platformBus.c
49 index 0525e39..82fef32 100644
50 --- a/hw/xfree86/common/xf86platformBus.c
51 +++ b/hw/xfree86/common/xf86platformBus.c
52 @@ -387,6 +387,8 @@ xf86platformProbeDev(DriverPtr drvp)
56 +extern void xf86AutoConfigOutputDevice(ScrnInfoPtr pScrn, ScrnInfoPtr master);
59 xf86platformAddDevice(int index)
61 @@ -446,6 +448,7 @@ xf86platformAddDevice(int index)
63 /* attach unbound to 0 protocol screen */
64 AttachUnboundGPU(xf86Screens[0]->pScreen, xf86GPUScreens[i]->pScreen);
65 + xf86AutoConfigOutputDevice(xf86GPUScreens[i], xf86Screens[0]);
69 diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
70 index 3011f13..34c1848 100644
71 --- a/hw/xfree86/modes/xf86Crtc.c
72 +++ b/hw/xfree86/modes/xf86Crtc.c
73 @@ -3323,3 +3323,35 @@ xf86DetachAllCrtc(ScrnInfoPtr scrn)
74 crtc->x = crtc->y = 0;
79 +void xf86AutoConfigOutputDevice(ScrnInfoPtr pScrn, ScrnInfoPtr master)
81 + RRProviderPtr master_provider;
82 + xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(master);
83 + xf86CrtcConfigPtr slave_config = XF86_CRTC_CONFIG_PTR(pScrn);
84 + Bool unbound = FALSE;
86 + if (!config || !slave_config)
89 + master_provider = config->randr_provider;
91 + if ((master->capabilities & RR_Capability_SinkOffload) &&
92 + pScrn->capabilities & RR_Capability_SourceOffload) {
93 + /* source offload */
95 + DetachUnboundGPU(pScrn->pScreen);
97 + AttachOffloadGPU(master->pScreen, pScrn->pScreen);
98 + slave_config->randr_provider->offload_sink = master_provider;
100 + if ((master->capabilities & RR_Capability_SourceOutput) &&
101 + pScrn->capabilities & RR_Capability_SinkOutput) {
104 + DetachUnboundGPU(pScrn->pScreen);
105 + AttachOutputGPU(master->pScreen, pScrn->pScreen);
106 + slave_config->randr_provider->output_source = master_provider;