diff --git a/src/nv_driver.c b/src/nv_driver.c index 9b5b9d6..7c7f822 100644 --- a/src/nv_driver.c +++ b/src/nv_driver.c @@ -57,6 +57,8 @@ static void NVFreeScreen(FREE_SCREEN_ARGS_DECL); static Bool NVMapMem(ScrnInfoPtr pScrn); static Bool NVUnmapMem(ScrnInfoPtr pScrn); +static Bool nouveau_kernel_mode_enabled(ScrnInfoPtr pScrn, + struct pci_device *pci_dev); #define NOUVEAU_PCI_DEVICE(_vendor_id, _device_id) \ { (_vendor_id), (_device_id), PCI_MATCH_ANY, PCI_MATCH_ANY, \ @@ -76,20 +78,28 @@ static Bool NVPciProbe ( DriverPtr drv, #ifdef XSERVER_PLATFORM_BUS static Bool NVPlatformProbe(DriverPtr driver, - int entity_num, int flags, struct xf86_platform_device *dev, intptr_t dev_match_data) + int entity_num, int flags, + struct xf86_platform_device *dev, + intptr_t dev_match_data) { ScrnInfoPtr scrn = NULL; uint32_t scr_flags = 0; + EntityInfoPtr pEnt = NULL; if (!dev->pdev) return FALSE; - if (flags & PLATFORM_PROBE_GPU_SCREEN) - scr_flags = XF86_ALLOCATE_GPU_SCREEN; + if (flags & PLATFORM_PROBE_GPU_SCREEN) + scr_flags = XF86_ALLOCATE_GPU_SCREEN; scrn = xf86AllocateScreen(driver, scr_flags); + if (!scrn) + return FALSE; xf86AddEntityToScreen(scrn, entity_num); + if (!nouveau_kernel_mode_enabled(scrn, dev->pdev)) + return FALSE; + scrn->driverVersion = NV_VERSION; scrn->driverName = NV_DRIVER_NAME; scrn->name = NV_NAME; @@ -102,7 +112,13 @@ NVPlatformProbe(DriverPtr driver, scrn->EnterVT = NVEnterVT; scrn->LeaveVT = NVLeaveVT; scrn->FreeScreen = NVFreeScreen; - return scrn != NULL; + + xf86SetEntitySharable(entity_num); + + pEnt = xf86GetEntityInfo(entity_num); + xf86SetEntityInstanceForScreen(scrn, pEnt->index, xf86GetNumEntityInstances(pEnt->index) - 1); + free(pEnt); + return TRUE; } #endif @@ -252,54 +268,49 @@ NVDriverFunc(ScrnInfoPtr scrn, xorgDriverFuncOp op, void *data) } static Bool -NVPciProbe(DriverPtr drv, int entity_num, struct pci_device *pci_dev, - intptr_t match_data) +nouveau_kernel_mode_enabled(ScrnInfoPtr pScrn, struct pci_device *pci_dev) { - PciChipsets NVChipsets[] = { - { pci_dev->device_id, - (pci_dev->vendor_id << 16) | pci_dev->device_id, NULL }, - { -1, -1, NULL } - }; struct nouveau_device *dev = NULL; - EntityInfoPtr pEnt = NULL; - ScrnInfoPtr pScrn = NULL; drmVersion *version; - int chipset, ret; char *busid; + int chipset, ret; if (!xf86LoaderCheckSymbol("DRICreatePCIBusID")) { - xf86DrvMsg(-1, X_ERROR, "[drm] No DRICreatePCIBusID symbol\n"); + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[drm] No DRICreatePCIBusID symbol\n"); return FALSE; } + busid = DRICreatePCIBusID(pci_dev); + ret = drmCheckModesettingSupported(busid); + if (ret) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[drm] KMS not enabled\n"); + free(busid); + return FALSE; + } ret = nouveau_device_open(busid, &dev); if (ret) { - xf86DrvMsg(-1, X_ERROR, "[drm] failed to open device\n"); + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[drm] failed to open device\n"); free(busid); return FALSE; } - /* Check the version reported by the kernel module. In theory we * shouldn't have to do this, as libdrm_nouveau will do its own checks. * But, we're currently using the kernel patchlevel to also version * the DRI interface. */ version = drmGetVersion(dev->fd); - xf86DrvMsg(-1, X_INFO, "[drm] nouveau interface version: %d.%d.%d\n", + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "[drm] nouveau interface version: %d.%d.%d\n", version->version_major, version->version_minor, version->version_patchlevel); drmFree(version); chipset = dev->chipset; nouveau_device_del(&dev); - - ret = drmCheckModesettingSupported(busid); free(busid); - if (ret) { - xf86DrvMsg(-1, X_ERROR, "[drm] KMS not enabled\n"); - return FALSE; - } switch (chipset & 0xf0) { case 0x00: @@ -317,15 +328,36 @@ NVPciProbe(DriverPtr drv, int entity_num, struct pci_device *pci_dev, case 0xe0: break; default: - xf86DrvMsg(-1, X_ERROR, "Unknown chipset: NV%02x\n", chipset); + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Unknown chipset: NV%02x\n", chipset); return FALSE; } + return TRUE; +} + +static Bool +NVPciProbe(DriverPtr drv, int entity_num, struct pci_device *pci_dev, + intptr_t match_data) +{ + PciChipsets NVChipsets[] = { + { pci_dev->device_id, + (pci_dev->vendor_id << 16) | pci_dev->device_id, NULL }, + { -1, -1, NULL } + }; + EntityInfoPtr pEnt = NULL; + ScrnInfoPtr pScrn = NULL; + int ret; + pScrn = xf86ConfigPciEntity(pScrn, 0, entity_num, NVChipsets, NULL, NULL, NULL, NULL, NULL); if (!pScrn) return FALSE; + if (!nouveau_kernel_mode_enabled(pScrn, pci_dev)) { + return FALSE; + } + pScrn->driverVersion = NV_VERSION; pScrn->driverName = NV_DRIVER_NAME; pScrn->name = NV_NAME;