diff --git a/xorg-server-walk_drivers.diff b/xorg-server-walk_drivers.diff index dc5fcbe..ba78d97 100644 --- a/xorg-server-walk_drivers.diff +++ b/xorg-server-walk_drivers.diff @@ -1,123 +1,97 @@ -commit 4da6cffa8b6169595ea447cc53dfab857c04db04 -Author: h_root -Date: Thu Mar 25 18:32:04 2010 +0100 - - when doing driver autoconfiguration with some parts of the config - file present but no driver set (e.g. only input configuration) - fix the case that we may have multiple drivers to try. - - create a screen section for each driver and let them be tried - in a row - -diff --git a/hw/xfree86/common/xf86AutoConfig.c b/hw/xfree86/common/xf86AutoConfig.c -index 7f4ada8..56f7deb 100644 ---- a/hw/xfree86/common/xf86AutoConfig.c -+++ b/hw/xfree86/common/xf86AutoConfig.c -@@ -546,10 +546,41 @@ chooseVideoDriver(void) - return chosen_driver; +--- hw/xfree86/common/xf86AutoConfig.c ++++ hw/xfree86/common/xf86AutoConfig.c +@@ -539,34 +541,13 @@ + } } -+ -+/* copy a screen section and enter the desired driver -+ * and insert it at i in the list of screens */ -+static Bool -+copyScreen(confScreenPtr oscreen, GDevPtr odev, int i, char *driver) -+{ -+ GDevPtr cptr = NULL; -+ -+ xf86ConfigLayout.screens[i].screen = xnfcalloc(1, sizeof(confScreenRec)); -+ if(!xf86ConfigLayout.screens[i].screen) -+ return FALSE; -+ memcpy(xf86ConfigLayout.screens[i].screen, oscreen, sizeof(confScreenRec)); -+ -+ cptr = xcalloc(1, sizeof(GDevRec)); -+ if (!cptr) -+ return FALSE; -+ memcpy(cptr, odev, sizeof(GDevRec)); -+ -+ cptr->identifier = Xprintf("Autoconfigured Video Device %s", driver); -+ cptr->driver = driver; -+ -+ /* now associate the new driver entry with the new screen entry */ -+ xf86ConfigLayout.screens[i].screen->device = cptr; -+ cptr->myScreenSection = xf86ConfigLayout.screens[i].screen; -+ -+ return TRUE; -+} -+ +-static char* +-chooseVideoDriver(void) +-{ +- char *chosen_driver = NULL; +- int i; +- char *matches[20]; /* If we have more than 20 drivers we're in trouble */ +- +- listPossibleVideoDrivers(matches, 20); +- +- /* TODO Handle multiple drivers claiming to support the same PCI ID */ +- chosen_driver = matches[0]; +- +- xf86Msg(X_DEFAULT, "Matched %s for the autoconfigured driver\n", +- chosen_driver); +- +- for (i = 0; matches[i] ; i++) { +- if (matches[i] != chosen_driver) { +- xfree(matches[i]); +- } +- } +- +- return chosen_driver; +-} +- GDevPtr autoConfigDevice(GDevPtr preconf_device) { - GDevPtr ptr = NULL; +- GDevPtr ptr = NULL; ++ GDevPtr ptr = NULL, cptr = NULL; + char *matches[20]; /* If we have more than 20 drivers we're in trouble */ + int num_matches = 0, num_screens = 0, i; + screenLayoutPtr slp; if (!xf86configptr) { return NULL; -@@ -573,14 +604,59 @@ autoConfigDevice(GDevPtr preconf_device) +@@ -589,14 +571,49 @@ ptr->driver = NULL; } if (!ptr->driver) { - ptr->driver = chooseVideoDriver(); -- } -+ /* get all possible video drivers and count them */ -+ listPossibleVideoDrivers(matches, 20); -+ for (; matches[num_matches]; num_matches++) { -+ xf86Msg(X_DEFAULT, "Matched %s as autoconfigured driver %d\n", -+ matches[num_matches], num_matches); -+ } -+ -+ slp = xf86ConfigLayout.screens; -+ if (slp) { -+ /* count the number of screens and make space for -+ * a new screen for each additional possible driver -+ * minus one for the already existing first one -+ * plus one for the terminating NULL */ -+ for (; slp[num_screens].screen; num_screens++); -+ xf86ConfigLayout.screens = xnfcalloc(num_screens + num_matches, -+ sizeof(screenLayoutRec)); -+ xf86ConfigLayout.screens[0] = slp[0]; -+ -+ /* do the first match and set that for the original first screen */ -+ ptr->driver = matches[0]; -+ if (!xf86ConfigLayout.screens[0].screen->device) { -+ xf86ConfigLayout.screens[0].screen->device = ptr; -+ ptr->myScreenSection = xf86ConfigLayout.screens[0].screen; -+ } -+ -+ /* for each other driver found, copy the first screen, insert it -+ * into the list of screens and set the driver */ -+ i = 0; -+ while (i++ < num_matches) { -+ if (!copyScreen(slp[0].screen, ptr, i, matches[i])) -+ return NULL; -+ } ++ listPossibleVideoDrivers(matches, 20); ++ for (; matches[num_matches] ; num_matches++); ++ slp = xf86ConfigLayout.screens; ++ if (slp) { ++ for (; slp[num_screens].screen ; num_screens++); ++ xf86ConfigLayout.screens = xnfcalloc(1,(num_screens+num_matches+1) * sizeof(screenLayoutRec)); ++ xf86ConfigLayout.screens[0] = slp[0]; ++ } ++ for (i=0; idriver = matches[0]; ++ if (slp && !xf86ConfigLayout.screens[0].screen->device) { ++ xf86ConfigLayout.screens[0].screen->device = ptr; ++ ptr->myScreenSection = xf86ConfigLayout.screens[0].screen; ++ } ++ } else { ++ if (slp) { ++ xf86ConfigLayout.screens[i].screen = xnfcalloc(1, sizeof(confScreenRec)); ++ if(!xf86ConfigLayout.screens[i].screen) ++ return NULL; ++ memcpy(xf86ConfigLayout.screens[i].screen, slp[0].screen, sizeof(confScreenRec)); ++ } ++ cptr = xcalloc(1, sizeof(GDevRec)); ++ if (!cptr) ++ return NULL; ++ memcpy(cptr, ptr, sizeof(GDevRec)); ++ cptr->identifier = xnfcalloc(1,strlen("Autoconfigured Video Device ")+strlen(matches[i])+1); ++ sprintf(cptr->identifier, "Autoconfigured Video Device %s", matches[i]); ++ cptr->driver = matches[i]; ++ if (slp) { ++ xf86ConfigLayout.screens[i].screen->device = cptr; ++ cptr->myScreenSection = xf86ConfigLayout.screens[i].screen; ++ } ++ } ++ } ++ for (i=1;iscreen->device) { - xf86ConfigLayout.screens->screen->device = ptr; - ptr->myScreenSection = xf86ConfigLayout.screens->screen; -+ /* shift the rest of the original screen list -+ * to the end of the current screen list -+ * -+ * TODO Handle rest of multiple screen sections */ -+ for (i = 1; i < num_screens; i++) { -+ xf86ConfigLayout.screens[i+num_matches] = slp[i]; -+ } -+ xf86ConfigLayout.screens[num_screens+num_matches-1].screen = NULL; -+ xfree(slp); -+ } else { -+ /* layout does not have any screens, not much to do */ -+ ptr->driver = matches[0]; -+ for (i = 1; matches[i] ; i++) { -+ if (matches[i] != matches[0]) { -+ xfree(matches[i]); -+ } -+ } -+ } - } -+ +- } ++ /* TODO Handle rest of multiple screen sections */ xf86Msg(X_DEFAULT, "Assigned the driver to the xf86ConfigLayout\n"); return ptr; diff --git a/xorg-x11-server.changes b/xorg-x11-server.changes index 9eddabe..126ad89 100644 --- a/xorg-x11-server.changes +++ b/xorg-x11-server.changes @@ -1,10 +1,3 @@ -------------------------------------------------------------------- -Fri Mar 26 02:45:15 CET 2010 - sndirsch@suse.de - -- xorg-server-walk_drivers.diff: - * updated patch working more cleanly, fixed coding style, added - comments (RĂ¼diger Oerttel) - ------------------------------------------------------------------- Wed Mar 24 17:05:53 CET 2010 - sndirsch@suse.de diff --git a/xorg-x11-server.spec b/xorg-x11-server.spec index 976f69a..2d5b0ed 100644 --- a/xorg-x11-server.spec +++ b/xorg-x11-server.spec @@ -229,7 +229,7 @@ popd %patch132 -p1 %patch143 -p0 %patch145 -p0 -%patch146 -p1 +%patch146 -p0 %patch147 -p1 %patch162 -p1 %if %moblin