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 --- a/hw/xfree86/common/xf86Init.c
19 +++ b/hw/xfree86/common/xf86Init.c
20 @@ -361,6 +361,16 @@ xf86CreateRootWindow(WindowPtr pWin)
24 +extern void xf86AutoConfigOutputDevice(ScrnInfoPtr pScrn, ScrnInfoPtr master);
26 +xf86AutoConfigOutputDevices(void)
30 + for (i = 0; i < xf86NumGPUScreens; i++)
31 + xf86AutoConfigOutputDevice(xf86GPUScreens[i], xf86Screens[0]);
35 InstallSignalHandlers(void)
37 @@ -951,6 +961,8 @@ InitOutput(ScreenInfo * pScreenInfo, int
38 for (i = 0; i < xf86NumGPUScreens; i++)
39 AttachUnboundGPU(xf86Screens[0]->pScreen, xf86GPUScreens[i]->pScreen);
41 + xf86AutoConfigOutputDevices();
43 xf86VGAarbiterWrapFunctions();
46 --- a/hw/xfree86/common/xf86platformBus.c
47 +++ b/hw/xfree86/common/xf86platformBus.c
48 @@ -401,6 +401,8 @@ xf86platformProbeDev(DriverPtr drvp)
52 +extern void xf86AutoConfigOutputDevice(ScrnInfoPtr pScrn, ScrnInfoPtr master);
55 xf86platformAddDevice(int index)
57 @@ -473,6 +475,7 @@ xf86platformAddDevice(int index)
59 /* attach unbound to 0 protocol screen */
60 AttachUnboundGPU(xf86Screens[0]->pScreen, xf86GPUScreens[i]->pScreen);
61 + xf86AutoConfigOutputDevice(xf86GPUScreens[i], xf86Screens[0]);
63 RRResourcesChanged(xf86Screens[0]->pScreen);
64 RRTellChanged(xf86Screens[0]->pScreen);
65 --- a/hw/xfree86/modes/xf86Crtc.c
66 +++ b/hw/xfree86/modes/xf86Crtc.c
67 @@ -3383,3 +3383,35 @@ xf86DetachAllCrtc(ScrnInfoPtr scrn)
68 crtc->x = crtc->y = 0;
73 +void xf86AutoConfigOutputDevice(ScrnInfoPtr pScrn, ScrnInfoPtr master)
75 + RRProviderPtr master_provider;
76 + xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(master);
77 + xf86CrtcConfigPtr slave_config = XF86_CRTC_CONFIG_PTR(pScrn);
78 + Bool unbound = FALSE;
80 + if (!config || !slave_config)
83 + master_provider = config->randr_provider;
85 + if ((master->capabilities & RR_Capability_SinkOffload) &&
86 + pScrn->capabilities & RR_Capability_SourceOffload) {
87 + /* source offload */
89 + DetachUnboundGPU(pScrn->pScreen);
91 + AttachOffloadGPU(master->pScreen, pScrn->pScreen);
92 + slave_config->randr_provider->offload_sink = master_provider;
94 + if ((master->capabilities & RR_Capability_SourceOutput) &&
95 + pScrn->capabilities & RR_Capability_SinkOutput) {
98 + DetachUnboundGPU(pScrn->pScreen);
99 + AttachOutputGPU(master->pScreen, pScrn->pScreen);
100 + slave_config->randr_provider->output_source = master_provider;