diff options
author | Matthieu Herrb <matthieu@cvs.openbsd.org> | 2012-01-25 21:33:36 +0000 |
---|---|---|
committer | Matthieu Herrb <matthieu@cvs.openbsd.org> | 2012-01-25 21:33:36 +0000 |
commit | 46e73e726a6a3567a4bb19b06c59826b9c6767d1 (patch) | |
tree | 8df52bebcc8ecbe55a8f8be1afae536b5fb46319 /driver/xf86-video-ati/src/radeon_probe.c | |
parent | ee1cf1e0a2b9e0f7070a4d1efa6b426373e8ba67 (diff) |
Update to xf86-video-ati 6.14.3. Tested by many.
Diffstat (limited to 'driver/xf86-video-ati/src/radeon_probe.c')
-rw-r--r-- | driver/xf86-video-ati/src/radeon_probe.c | 124 |
1 files changed, 103 insertions, 21 deletions
diff --git a/driver/xf86-video-ati/src/radeon_probe.c b/driver/xf86-video-ati/src/radeon_probe.c index 25d3bcfd4..26dec285e 100644 --- a/driver/xf86-video-ati/src/radeon_probe.c +++ b/driver/xf86-video-ati/src/radeon_probe.c @@ -31,11 +31,13 @@ #endif #include <string.h> +#include <stdlib.h> /* * Authors: * Kevin E. Martin <martin@xfree86.org> * Rickard E. Faith <faith@valinux.com> + * KMS support - Dave Airlie <airlied@redhat.com> */ #include "radeon_probe.h" @@ -44,16 +46,44 @@ #include "atipcirename.h" #include "xf86.h" -#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 7 +#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 6 #include "xf86Resources.h" #endif +#ifdef XF86DRM_MODE +#include "xf86drmMode.h" +#include "dri.h" +#endif + #include "radeon_chipset_gen.h" #include "radeon_pci_chipset_gen.h" +#include "radeon_chipinfo_gen.h" + #ifdef XSERVER_LIBPCIACCESS #include "radeon_pci_device_match_gen.h" + +static Bool radeon_ums_supported(ScrnInfoPtr pScrn, struct pci_device *pci_dev) +{ + unsigned family = 0, i; + + for (i = 0; i < sizeof(RADEONCards) / sizeof(RADEONCardInfo); i++) { + if (pci_dev->device_id == RADEONCards[i].pci_device_id) { + family = RADEONCards[i].chip_family; + break; + } + } + + if (family >= CHIP_FAMILY_SUMO) { + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 0, + "GPU only supported with KMS, using vesa instead.\n"); + return FALSE; + } + return TRUE; +} +#else +#define radeon_ums_supported(x, y) TRUE #endif #ifndef XSERVER_LIBPCIACCESS @@ -78,11 +108,42 @@ RADEONIdentify(int flags) RADEONChipsets); } + +#ifdef XF86DRM_MODE +static Bool radeon_kernel_mode_enabled(ScrnInfoPtr pScrn, struct pci_device *pci_dev) +{ + char *busIdString; + int ret; + + if (!xf86LoaderCheckSymbol("DRICreatePCIBusID")) { + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 0, + "[KMS] No DRICreatePCIBusID symbol, no kernel modesetting.\n"); + return FALSE; + } + + busIdString = DRICreatePCIBusID(pci_dev); + ret = drmCheckModesettingSupported(busIdString); + free(busIdString); + if (ret) { + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 0, + "[KMS] drm report modesetting isn't supported.\n"); + return FALSE; + } + + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 0, + "[KMS] Kernel modesetting enabled.\n"); + return TRUE; +} +#else +#define radeon_kernel_mode_enabled(x, y) FALSE +#endif + static Bool -radeon_get_scrninfo(int entity_num) +radeon_get_scrninfo(int entity_num, void *pci_dev) { ScrnInfoPtr pScrn = NULL; EntityInfoPtr pEnt; + int kms = 0; pScrn = xf86ConfigPciEntity(pScrn, 0, entity_num, RADEONPciChipsets, NULL, @@ -91,6 +152,16 @@ radeon_get_scrninfo(int entity_num) if (!pScrn) return FALSE; + if (pci_dev) { + if (radeon_kernel_mode_enabled(pScrn, pci_dev)) { + kms = 1; + } else { + if (!radeon_ums_supported(pScrn, pci_dev)) { + return FALSE; + } + } + } + pScrn->driverVersion = RADEON_VERSION_CURRENT; pScrn->driverName = RADEON_DRIVER_NAME; pScrn->name = RADEON_NAME; @@ -99,14 +170,29 @@ radeon_get_scrninfo(int entity_num) #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; + +#ifdef XF86DRM_MODE + if (kms == 1) { + pScrn->PreInit = RADEONPreInit_KMS; + pScrn->ScreenInit = RADEONScreenInit_KMS; + pScrn->SwitchMode = RADEONSwitchMode_KMS; + pScrn->AdjustFrame = RADEONAdjustFrame_KMS; + pScrn->EnterVT = RADEONEnterVT_KMS; + pScrn->LeaveVT = RADEONLeaveVT_KMS; + pScrn->FreeScreen = RADEONFreeScreen_KMS; + pScrn->ValidMode = RADEONValidMode; + } else +#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); @@ -125,13 +211,9 @@ radeon_get_scrninfo(int entity_num) 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); + xf86SetEntityInstanceForScreen(pScrn, pEnt->index, xf86GetNumEntityInstances(pEnt->index) - 1); + if (!pPriv->ptr) { pPriv->ptr = xnfcalloc(sizeof(RADEONEntRec), 1); pRADEONEnt = pPriv->ptr; pRADEONEnt->HasSecondary = FALSE; @@ -141,7 +223,7 @@ radeon_get_scrninfo(int entity_num) } } - xfree(pEnt); + free(pEnt); return TRUE; } @@ -180,13 +262,13 @@ RADEONProbe(DriverPtr drv, int flags) foundScreen = TRUE; } else { for (i = 0; i < numUsed; i++) { - if (radeon_get_scrninfo(usedChips[i])) + if (radeon_get_scrninfo(usedChips[i], NULL)) foundScreen = TRUE; } } - xfree(usedChips); - xfree(devSections); + free(usedChips); + free(devSections); return foundScreen; } @@ -201,7 +283,7 @@ radeon_pci_probe( intptr_t match_data ) { - return radeon_get_scrninfo(entity_num); + return radeon_get_scrninfo(entity_num, (void *)device); } #endif /* XSERVER_LIBPCIACCESS */ |