diff options
Diffstat (limited to 'src/radeon_probe.c')
-rw-r--r-- | src/radeon_probe.c | 165 |
1 files changed, 102 insertions, 63 deletions
diff --git a/src/radeon_probe.c b/src/radeon_probe.c index 4974530..658f909 100644 --- a/src/radeon_probe.c +++ b/src/radeon_probe.c @@ -41,6 +41,7 @@ #include "radeon_probe.h" #include "radeon_version.h" #include "atipciids.h" +#include "atipcirename.h" #include "xf86.h" #define _XF86MISC_SERVER_ @@ -51,6 +52,10 @@ #include "radeon_pci_chipset_gen.h" +#ifdef XSERVER_LIBPCIACCESS +#include "radeon_pci_device_match_gen.h" +#endif + int gRADEONEntityIndex = -1; /* Return the options for supported chipset 'n'; NULL otherwise */ @@ -69,6 +74,76 @@ RADEONIdentify(int flags) RADEONChipsets); } +static Bool +radeon_get_scrninfo(int entity_num) +{ + ScrnInfoPtr pScrn = NULL; + EntityInfoPtr pEnt; + + pScrn = xf86ConfigPciEntity(pScrn, 0, entity_num, RADEONPciChipsets, + NULL, + NULL, NULL, NULL, NULL); + + if (!pScrn) + return FALSE; + + pScrn->driverVersion = RADEON_VERSION_CURRENT; + pScrn->driverName = RADEON_DRIVER_NAME; + pScrn->name = RADEON_NAME; +#ifdef XSERVER_LIBPCIACCESS + pScrn->Probe = NULL; +#else + pScrn->Probe = RADEONProbe; +#endif + pScrn->PreInit = RADEONPreInit; + pScrn->ScreenInit = RADEONScreenInit; + pScrn->SwitchMode = RADEONSwitchMode; + pScrn->AdjustFrame = RADEONAdjustFrame; + pScrn->EnterVT = RADEONEnterVT; + pScrn->LeaveVT = RADEONLeaveVT; + pScrn->FreeScreen = RADEONFreeScreen; + pScrn->ValidMode = RADEONValidMode; + + pEnt = xf86GetEntityInfo(entity_num); + + /* Create a RADEONEntity for all chips, even with old single head + * Radeon, need to use pRADEONEnt for new monitor detection routines. + */ + { + DevUnion *pPriv; + RADEONEntPtr pRADEONEnt; + + xf86SetEntitySharable(entity_num); + + if (gRADEONEntityIndex == -1) + gRADEONEntityIndex = xf86AllocateEntityPrivateIndex(); + + pPriv = xf86GetEntityPrivate(pEnt->index, + gRADEONEntityIndex); + + if (!pPriv->ptr) { + int j; + int instance = xf86GetNumEntityInstances(pEnt->index); + + for (j = 0; j < instance; j++) + xf86SetEntityInstanceForScreen(pScrn, pEnt->index, j); + + pPriv->ptr = xnfcalloc(sizeof(RADEONEntRec), 1); + pRADEONEnt = pPriv->ptr; + pRADEONEnt->HasSecondary = FALSE; + } else { + pRADEONEnt = pPriv->ptr; + pRADEONEnt->HasSecondary = TRUE; + } + } + + xfree(pEnt); + + return TRUE; +} + +#ifndef XSERVER_LIBPCIACCESS + /* Return TRUE if chipset is present; FALSE otherwise. */ static Bool RADEONProbe(DriverPtr drv, int flags) @@ -80,9 +155,7 @@ RADEONProbe(DriverPtr drv, int flags) Bool foundScreen = FALSE; int i; -#ifndef XSERVER_LIBPCIACCESS if (!xf86GetPciVideoInfo()) return FALSE; -#endif numDevSections = xf86MatchDevice(RADEON_NAME, &devSections); @@ -103,66 +176,8 @@ RADEONProbe(DriverPtr drv, int flags) foundScreen = TRUE; } else { for (i = 0; i < numUsed; i++) { - ScrnInfoPtr pScrn = NULL; - EntityInfoPtr pEnt; - pEnt = xf86GetEntityInfo(usedChips[i]); - if ((pScrn = xf86ConfigPciEntity(pScrn, 0, usedChips[i], - RADEONPciChipsets, 0, 0, 0, - 0, 0))) { - pScrn->driverVersion = RADEON_VERSION_CURRENT; - pScrn->driverName = RADEON_DRIVER_NAME; - pScrn->name = RADEON_NAME; - pScrn->Probe = RADEONProbe; - pScrn->PreInit = RADEONPreInit; - pScrn->ScreenInit = RADEONScreenInit; - pScrn->SwitchMode = RADEONSwitchMode; -#ifdef X_XF86MiscPassMessage - pScrn->HandleMessage = RADEONHandleMessage; -#endif - pScrn->AdjustFrame = RADEONAdjustFrame; - pScrn->EnterVT = RADEONEnterVT; - pScrn->LeaveVT = RADEONLeaveVT; - pScrn->FreeScreen = RADEONFreeScreen; - pScrn->ValidMode = RADEONValidMode; - - foundScreen = TRUE; - } - - xfree(pEnt); - pEnt = xf86GetEntityInfo(usedChips[i]); - - /* create a RADEONEntity for all chips, even with - old single head Radeon, need to use pRADEONEnt - for new monitor detection routines - */ - { - DevUnion *pPriv; - RADEONEntPtr pRADEONEnt; - - xf86SetEntitySharable(usedChips[i]); - - if (gRADEONEntityIndex == -1) - gRADEONEntityIndex = xf86AllocateEntityPrivateIndex(); - - pPriv = xf86GetEntityPrivate(pEnt->index, - gRADEONEntityIndex); - - if (!pPriv->ptr) { - int j; - int instance = xf86GetNumEntityInstances(pEnt->index); - - for (j = 0; j < instance; j++) - xf86SetEntityInstanceForScreen(pScrn, pEnt->index, j); - - pPriv->ptr = xnfcalloc(sizeof(RADEONEntRec), 1); - pRADEONEnt = pPriv->ptr; - pRADEONEnt->HasSecondary = FALSE; - } else { - pRADEONEnt = pPriv->ptr; - pRADEONEnt->HasSecondary = TRUE; - } - } - xfree(pEnt); + if (radeon_get_scrninfo(entity_num)) + foundScreen = TRUE; } } @@ -172,13 +187,37 @@ RADEONProbe(DriverPtr drv, int flags) return foundScreen; } +#else /* XSERVER_LIBPCIACCESS */ + +static Bool +radeon_pci_probe( + DriverPtr pDriver, + int entity_num, + struct pci_device *device, + intptr_t match_data +) +{ + return radeon_get_scrninfo(entity_num); +} + +#endif /* XSERVER_LIBPCIACCESS */ + _X_EXPORT DriverRec RADEON = { RADEON_VERSION_CURRENT, RADEON_DRIVER_NAME, RADEONIdentify, +#ifdef XSERVER_LIBPCIACCESS + NULL, +#else RADEONProbe, +#endif RADEONAvailableOptions, NULL, - 0 + 0, + NULL, +#ifdef XSERVER_LIBPCIACCESS + radeon_device_match, + radeon_pci_probe +#endif }; |