From 1884b4cb348e2382a8ea9f926e929b9e9a7a83943e88288de78bf3c22cfc6d39 Mon Sep 17 00:00:00 2001 From: OBS User autobuild Date: Tue, 29 Sep 2009 20:22:51 +0000 Subject: [PATCH] Accepting request 21377 from X11:XOrg Copy from X11:XOrg/xorg-x11-server based on submit request 21377 from user sndirsch OBS-URL: https://build.opensuse.org/request/show/21377 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/xorg-x11-server?expand=0&rev=143 --- dga-removal-fix.diff | 147 ++++++++++++++++++++++++++++++++++++++++ xorg-x11-server.changes | 9 +++ xorg-x11-server.spec | 4 +- 3 files changed, 159 insertions(+), 1 deletion(-) create mode 100644 dga-removal-fix.diff diff --git a/dga-removal-fix.diff b/dga-removal-fix.diff new file mode 100644 index 0000000..2a05f6f --- /dev/null +++ b/dga-removal-fix.diff @@ -0,0 +1,147 @@ +Removing DGA ended up breaking any drivers calling into the old +xf86DiDGAInit function as it tried to see if DGA was already enabled +and ended up crashing if the VT wasn't completely initialized. Oops. + +Also, if the driver initializes DGA itself, have the DiDGA +initialization overwrite that information as the DiDGA code will call +ReInit on mode detect. + +Signed-off-by: Keith Packard +--- + hw/xfree86/common/xf86DGA.c | 29 ++++++++++++++++------------- + hw/xfree86/modes/xf86Crtc.c | 4 ++-- + hw/xfree86/modes/xf86Crtc.h | 8 ++++++++ + hw/xfree86/modes/xf86DiDGA.c | 15 ++++++++++++--- + 4 files changed, 38 insertions(+), 18 deletions(-) + +diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c +index 42b7c58..804fd37 100644 +--- a/hw/xfree86/common/xf86DGA.c ++++ b/hw/xfree86/common/xf86DGA.c +@@ -120,8 +120,22 @@ DGAInit( + + DGAScreenKey = &DGAScreenKeyIndex; + +- if(!(pScreenPriv = (DGAScreenPtr)xalloc(sizeof(DGAScreenRec)))) +- return FALSE; ++ pScreenPriv = DGA_GET_SCREEN_PRIV(pScreen); ++ ++ if (!pScreenPriv) ++ { ++ if(!(pScreenPriv = (DGAScreenPtr)xalloc(sizeof(DGAScreenRec)))) ++ return FALSE; ++ dixSetPrivate(&pScreen->devPrivates, DGAScreenKey, pScreenPriv); ++ pScreenPriv->CloseScreen = pScreen->CloseScreen; ++ pScreen->CloseScreen = DGACloseScreen; ++ pScreenPriv->DestroyColormap = pScreen->DestroyColormap; ++ pScreen->DestroyColormap = DGADestroyColormap; ++ pScreenPriv->InstallColormap = pScreen->InstallColormap; ++ pScreen->InstallColormap = DGAInstallColormap; ++ pScreenPriv->UninstallColormap = pScreen->UninstallColormap; ++ pScreen->UninstallColormap = DGAUninstallColormap; ++ } + + pScreenPriv->pScrn = pScrn; + pScreenPriv->numModes = num; +@@ -146,17 +160,6 @@ DGAInit( + modes[i].flags &= ~DGA_PIXMAP_AVAILABLE; + #endif + +- dixSetPrivate(&pScreen->devPrivates, DGAScreenKey, pScreenPriv); +- pScreenPriv->CloseScreen = pScreen->CloseScreen; +- pScreen->CloseScreen = DGACloseScreen; +- pScreenPriv->DestroyColormap = pScreen->DestroyColormap; +- pScreen->DestroyColormap = DGADestroyColormap; +- pScreenPriv->InstallColormap = pScreen->InstallColormap; +- pScreen->InstallColormap = DGAInstallColormap; +- pScreenPriv->UninstallColormap = pScreen->UninstallColormap; +- pScreen->UninstallColormap = DGAUninstallColormap; +- +- + return TRUE; + } + +diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c +index c1e31e0..f274725 100644 +--- a/hw/xfree86/modes/xf86Crtc.c ++++ b/hw/xfree86/modes/xf86Crtc.c +@@ -806,7 +806,7 @@ xf86CrtcScreenInit (ScreenPtr screen) + screen->CloseScreen = xf86CrtcCloseScreen; + + #ifdef XFreeXDGA +- xf86DiDGAInit(screen, 0); ++ _xf86_di_dga_init_for_reals(screen); + #endif + #ifdef RANDR_13_INTERFACE + return RANDR_INTERFACE_VERSION; +@@ -1928,7 +1928,7 @@ xf86SetScrnInfoModes (ScrnInfoPtr scrn) + scrn->currentMode = scrn->modes; + #ifdef XFreeXDGA + if (scrn->pScreen) +- xf86DiDGAReInit(scrn->pScreen); ++ _xf86_di_dga_reinit_for_reals(scrn->pScreen); + #endif + } + +diff --git a/hw/xfree86/modes/xf86Crtc.h b/hw/xfree86/modes/xf86Crtc.h +index 69afaa5..edf84d8 100644 +--- a/hw/xfree86/modes/xf86Crtc.h ++++ b/hw/xfree86/modes/xf86Crtc.h +@@ -833,6 +833,10 @@ xf86OutputGetEDID (xf86OutputPtr output, I2CBusPtr pDDCBus); + extern _X_EXPORT Bool + xf86DiDGAInit (ScreenPtr pScreen, unsigned long dga_address); + ++/* this is the real function, used only internally */ ++_X_INTERNAL Bool ++_xf86_di_dga_init_for_reals (ScreenPtr pScreen); ++ + /** + * Re-initialize dga for this screen (as when the set of modes changes) + */ +@@ -841,6 +845,10 @@ extern _X_EXPORT Bool + xf86DiDGAReInit (ScreenPtr pScreen); + #endif + ++/* This is the real function, used only internally */ ++_X_INTERNAL Bool ++_xf86_di_dga_reinit_for_reals (ScreenPtr pScreen); ++ + /* + * Set the subpixel order reported for the screen using + * the information from the outputs +diff --git a/hw/xfree86/modes/xf86DiDGA.c b/hw/xfree86/modes/xf86DiDGA.c +index 0f7b834..3df3754 100644 +--- a/hw/xfree86/modes/xf86DiDGA.c ++++ b/hw/xfree86/modes/xf86DiDGA.c +@@ -175,6 +175,12 @@ static DGAFunctionRec xf86_dga_funcs = { + Bool + xf86DiDGAReInit (ScreenPtr pScreen) + { ++ return TRUE; ++} ++ ++_X_INTERNAL Bool ++_xf86_di_dga_reinit_for_reals (ScreenPtr pScreen) ++{ + ScrnInfoPtr scrn = xf86Screens[pScreen->myNum]; + xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn); + +@@ -190,12 +196,15 @@ xf86DiDGAReInit (ScreenPtr pScreen) + Bool + xf86DiDGAInit (ScreenPtr pScreen, unsigned long dga_address) + { ++ return TRUE; ++} ++ ++_X_INTERNAL Bool ++_xf86_di_dga_init_for_reals (ScreenPtr pScreen) ++{ + ScrnInfoPtr scrn = xf86Screens[pScreen->myNum]; + xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn); + +- if (DGAAvailable(pScreen->myNum)) +- return TRUE; +- + xf86_config->dga_flags = 0; + xf86_config->dga_address = 0; + xf86_config->dga_width = 0; diff --git a/xorg-x11-server.changes b/xorg-x11-server.changes index 4992f9f..2e4f425 100644 --- a/xorg-x11-server.changes +++ b/xorg-x11-server.changes @@ -1,3 +1,12 @@ +------------------------------------------------------------------- +Tue Sep 29 19:43:23 CEST 2009 - sndirsch@suse.de + +- dga-removal-fix.diff + * "Removing DGA ended up breaking any drivers calling into the old + xf86DiDGAInit function as it tried to see if DGA was already + enabled and ended up crashing if the VT wasn't completely + initialized. Oops." + ------------------------------------------------------------------- Mon Sep 28 20:50:34 CEST 2009 - sndirsch@suse.de diff --git a/xorg-x11-server.spec b/xorg-x11-server.spec index dc2a73e..db72788 100644 --- a/xorg-x11-server.spec +++ b/xorg-x11-server.spec @@ -33,7 +33,7 @@ BuildRequires: libjpeg-devel Url: http://xorg.freedesktop.org/ %define EXPERIMENTAL 0 Version: 7.4 -Release: 55 +Release: 56 License: GPL v2 or later ; MIT License (or similar) BuildRoot: %{_tmppath}/%{name}-%{version}-build Group: System/X11/Servers/XF86_4 @@ -138,6 +138,7 @@ Patch171: moblin-use_preferred_mode_for_all_outputs.diff Patch190: 0001-Unclaim-PCI-slot-if-driver-probing-fails.patch Patch191: 0001-Fix-sporadic-segfault-on-resume-with-intel-KMS-due-t.patch Patch200: bug534768-prefer_local_symbols.patch +Patch201: dga-removal-fix.diff Patch532341: bug532341.diff %description @@ -281,6 +282,7 @@ popd %patch190 -p1 %patch191 -p1 %patch200 -p1 +%patch201 -p1 %patch532341 -p1 %build