--- /dev/null
+--- a/hw/xfree86/common/xf86Globals.c
++++ b/hw/xfree86/common/xf86Globals.c
+@@ -161,6 +161,7 @@
+ int xf86NumInputDrivers = 0;
+ int xf86NumScreens = 0;
+ int xf86NumGPUScreens = 0;
++Bool xf86AttemptedFallback = FALSE;
+
+ const char *xf86VisualNames[] = {
+ "StaticGray",
+--- a/hw/xfree86/common/xf86Init.c
++++ b/hw/xfree86/common/xf86Init.c
+@@ -481,20 +481,34 @@
+ free(optionlist);
+ }
+
++ Fallback:
+ /* Load all driver modules specified in the config file */
+ /* If there aren't any specified in the config file, autoconfig them */
+ /* FIXME: Does not handle multiple active screen sections, but I'm not
+ * sure if we really want to handle that case*/
+ configured_device = xf86ConfigLayout.screens->screen->device;
+- if ((!configured_device) || (!configured_device->driver)) {
++ if (xf86AttemptedFallback) {
++ configured_device->driver = NULL;
++ if (!autoConfigDevice(configured_device)) {
++ xf86Msg(X_ERROR, "Auto configuration on fallback failed\n");
++ return;
++ }
++ }
++ else if ((!configured_device) || (!configured_device->driver)) {
+ if (!autoConfigDevice(configured_device)) {
+ xf86Msg(X_ERROR, "Automatic driver configuration failed\n");
+ return;
+ }
+ }
+ if ((modulelist = xf86DriverlistFromConfig())) {
+- xf86LoadModules(modulelist, NULL);
+- free(modulelist);
++ if (!xf86LoadModules(modulelist, NULL) && !xf86AttemptedFallback) {
++ free(modulelist);
++ xf86AttemptedFallback = TRUE;
++ goto Fallback;
++ }
++ else {
++ free(modulelist);
++ }
+ }
+
+ /* Load all input driver modules specified in the config file. */
+@@ -554,8 +568,15 @@
+ else
+ xf86Info.dontVTSwitch = TRUE;
+
+- if (xf86BusConfig() == FALSE)
+- return;
++ if (xf86BusConfig() == FALSE) {
++ if (!xf86AttemptedFallback) {
++ xf86AttemptedFallback = TRUE;
++ goto Fallback;
++ }
++ else {
++ return;
++ }
++ }
+
+ xf86PostProbe();
+
+--- a/hw/xfree86/common/xf86Priv.h
++++ b/hw/xfree86/common/xf86Priv.h
+@@ -89,6 +89,7 @@
+ extern _X_EXPORT Bool xf86Resetting;
+ extern _X_EXPORT Bool xf86Initialising;
+ extern _X_EXPORT int xf86NumScreens;
++extern _X_EXPORT Bool xf86AttemptedFallback;
+ extern _X_EXPORT const char *xf86VisualNames[];
+ extern _X_EXPORT int xf86Verbose; /* verbosity level */
+ extern _X_EXPORT int xf86LogVerbose; /* log file verbosity level */