diff options
-rw-r--r-- | src/ati.c | 39 | ||||
-rw-r--r-- | src/ati.h | 2 | ||||
-rw-r--r-- | src/atimach64probe.h | 2 | ||||
-rw-r--r-- | src/atimisc.c | 6 | ||||
-rw-r--r-- | src/atimodule.c | 2 | ||||
-rw-r--r-- | src/r128_misc.c | 5 | ||||
-rw-r--r-- | src/r128_probe.h | 2 | ||||
-rw-r--r-- | src/radeon_misc.c | 5 | ||||
-rw-r--r-- | src/radeon_probe.h | 2 |
9 files changed, 56 insertions, 9 deletions
@@ -81,6 +81,29 @@ enum ATI_CHIP_FAMILY_Radeon }; +/* + * Record which sub-drivers have already been loaded, and thus have called + * xf86AddDriver(). For those sub-drivers, cause the ati wrapper later to fail + * when probing. + * + * The check is only called once when the ati wrapper is loaded and depends on + * the X server loading all drivers before doing any probes. + */ +static Bool mach64_drv_added = FALSE; +static Bool r128_drv_added = FALSE; +static Bool radeon_drv_added = FALSE; + +void +ati_check_subdriver_added() +{ + if (LoaderSymbol(MACH64_NAME)) + mach64_drv_added = TRUE; + if (LoaderSymbol(R128_NAME)) + r128_drv_added = TRUE; + if (LoaderSymbol(RADEON_NAME)) + radeon_drv_added = TRUE; +} + static int ATIChipID(const CARD16); #ifdef XSERVER_LIBPCIACCESS @@ -142,6 +165,10 @@ ATIProbe Bool DoRage128 = FALSE, DoRadeon = FALSE; int Chip; + /* Let the sub-drivers probe & configure for themselves */ + if (xf86ServerIsOnlyDetecting()) + return FALSE; + #ifndef XSERVER_LIBPCIACCESS xf86PciVideoInfo = xf86GetPciVideoInfo(); @@ -199,6 +226,10 @@ ATIProbe { DriverRec *radeon; + /* If the sub-driver was added, let it probe for itself */ + if (radeon_drv_added) + return FALSE; + if (!LoaderSymbol(RADEON_NAME)) xf86LoadDrvSubModule(pDriver, RADEON_DRIVER_NAME); @@ -222,6 +253,10 @@ ATIProbe { DriverRec *r128; + /* If the sub-driver was added, let it probe for itself */ + if (r128_drv_added) + return FALSE; + if (!LoaderSymbol(R128_NAME)) xf86LoadDrvSubModule(pDriver, R128_DRIVER_NAME); @@ -245,6 +280,10 @@ ATIProbe { DriverRec *mach64; + /* If the sub-driver was added, let it probe for itself */ + if (mach64_drv_added) + return FALSE; + if (!LoaderSymbol(MACH64_NAME)) xf86LoadDrvSubModule(pDriver, MACH64_DRIVER_NAME); @@ -31,6 +31,8 @@ #include "xf86_OSproc.h" +extern void ati_check_subdriver_added(); + extern DriverRec ATI; #endif /* ___ATI_H___ */ diff --git a/src/atimach64probe.h b/src/atimach64probe.h index 9d50b638..7b0b4b67 100644 --- a/src/atimach64probe.h +++ b/src/atimach64probe.h @@ -25,6 +25,8 @@ #include "xf86str.h" +extern DriverRec MACH64; + extern SymTabRec Mach64Chipsets[]; #endif /* ___ATIMACH64PROBE_H___ */ diff --git a/src/atimisc.c b/src/atimisc.c index d71b0ad4..cf2347a3 100644 --- a/src/atimisc.c +++ b/src/atimisc.c @@ -27,6 +27,7 @@ #include "ati.h" #include "ativersion.h" +#include "atimach64probe.h" #include "atimach64version.h" /* Module loader interface for subsidiary driver module */ @@ -63,9 +64,8 @@ ATISetup if (!Inited) { - /* Ensure main driver module is loaded, but not as a submodule */ - if (!xf86ServerIsOnlyDetecting() && !LoaderSymbol(ATI_NAME)) - xf86LoadOneModule(ATI_DRIVER_NAME, Options); + if (xf86ServerIsOnlyDetecting() || !LoaderSymbol(ATI_NAME)) + xf86AddDriver(&MACH64, Module, 0); Inited = TRUE; } diff --git a/src/atimodule.c b/src/atimodule.c index 12b4ffd9..802c35ad 100644 --- a/src/atimodule.c +++ b/src/atimodule.c @@ -63,6 +63,8 @@ ATISetup { Inited = TRUE; xf86AddDriver(&ATI, Module, 0); + + ati_check_subdriver_added(); } return (pointer)1; diff --git a/src/r128_misc.c b/src/r128_misc.c index 49d2803b..f8bccfef 100644 --- a/src/r128_misc.c +++ b/src/r128_misc.c @@ -65,9 +65,8 @@ R128Setup if (!Inited) { - /* Ensure main driver module is loaded, but not as a submodule */ - if (!xf86ServerIsOnlyDetecting() && !LoaderSymbol(ATI_NAME)) - xf86LoadOneModule(ATI_DRIVER_NAME, Options); + if (xf86ServerIsOnlyDetecting() || !LoaderSymbol(ATI_NAME)) + xf86AddDriver(&R128, Module, 0); Inited = TRUE; } diff --git a/src/r128_probe.h b/src/r128_probe.h index 28856044..719340a0 100644 --- a/src/r128_probe.h +++ b/src/r128_probe.h @@ -38,6 +38,8 @@ #include "xf86str.h" +extern DriverRec R128; + typedef struct { Bool IsDRIEnabled; diff --git a/src/radeon_misc.c b/src/radeon_misc.c index 7840376a..fc608ddc 100644 --- a/src/radeon_misc.c +++ b/src/radeon_misc.c @@ -64,9 +64,8 @@ RADEONSetup static Bool Inited = FALSE; if (!Inited) { - /* Ensure main driver module is loaded, but not as a submodule */ - if (!xf86ServerIsOnlyDetecting() && !LoaderSymbol(ATI_NAME)) - xf86LoadOneModule(ATI_DRIVER_NAME, Options); + if (xf86ServerIsOnlyDetecting() || !LoaderSymbol(ATI_NAME)) + xf86AddDriver(&RADEON, Module, 0); Inited = TRUE; } diff --git a/src/radeon_probe.h b/src/radeon_probe.h index ef4ddbcf..17c0f1b1 100644 --- a/src/radeon_probe.h +++ b/src/radeon_probe.h @@ -53,6 +53,8 @@ #include "xaa.h" #endif +extern DriverRec RADEON; + typedef enum { MT_UNKNOWN = -1, |