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); #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) if (ret) { if (xf86LoadKernelModule("radeonkms")) ret = drmCheckModesettingSupported(busIdString); } #endif 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; }
static Bool has_kernel_mode_setting(const struct pci_device *dev) { char id[20]; int ret, fd; snprintf(id, sizeof(id), "pci:%04x:%02x:%02x.%d", dev->domain, dev->bus, dev->dev, dev->func); ret = drmCheckModesettingSupported(id); if (ret) { if (xf86LoadKernelModule("i915")) ret = drmCheckModesettingSupported(id); if (ret) return FALSE; /* Be nice to the user and load fbcon too */ (void)xf86LoadKernelModule("fbcon"); } /* Confirm that this is a i915.ko device with GEM/KMS enabled */ ret = FALSE; fd = drmOpen(NULL, id); if (fd != -1) { drmVersionPtr version = drmGetVersion(fd); if (version) { ret = strcmp ("i915", version->name) == 0; drmFreeVersion(version); } if (ret) { struct drm_i915_getparam gp; gp.param = I915_PARAM_HAS_GEM; gp.value = &ret; if (drmIoctl(fd, DRM_IOCTL_I915_GETPARAM, &gp)) ret = FALSE; } if (ret) { struct drm_mode_card_res res; memset(&res, 0, sizeof(res)); if (drmIoctl(fd, DRM_IOCTL_MODE_GETRESOURCES, &res)) ret = FALSE; } close(fd); } return ret; }
void Rk30MaliDRI2_Init(ScreenPtr pScreen) { int drm_fd; DRI2InfoRec info; ump_secure_id ump_id1, ump_id2; ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; FBDevPtr pMxv = FBDEVPTR(pScrn); Bool isOverlay = TRUE; #if DRI2INFOREC_VERSION >= 4 const char *driverNames[1]; #endif pMxv->Rk30Mali = NULL; if(pMxv->OvlHW == NULL){ xf86DrvMsg(pScreen->myNum, X_ERROR, "Rk30MaliDRI2_Init: Overlay not found!\n"); return; } OvlHWPtr overlay = pMxv->OvlHW; if (!xf86LoadKernelModule("ump")) xf86DrvMsg(pScreen->myNum, X_INFO, "can't load 'ump' kernel module\n"); if (!xf86LoadKernelModule("disp_ump")) xf86DrvMsg(pScreen->myNum, X_INFO, "can't load 'disp_ump' kernel module\n"); if (!xf86LoadKernelModule("mali")) xf86DrvMsg(pScreen->myNum, X_INFO, "can't load 'mali' kernel module\n"); if (!xf86LoadKernelModule("drm")) xf86DrvMsg(pScreen->myNum, X_INFO, "can't load 'drm' kernel module\n"); if (!xf86LoadKernelModule("mali_drm")) xf86DrvMsg(pScreen->myNum, X_INFO, "can't load 'mali_drm' kernel module\n"); if (!xf86LoadSubModule(xf86Screens[pScreen->myNum], "dri2")) return; if ((drm_fd = drmOpen("mali_drm", NULL)) < 0) { xf86DrvMsg(pScreen->myNum, X_ERROR, "Rk30MaliDRI2_Init: drmOpen failed!\n"); return; } if (ump_open() != UMP_OK) { xf86DrvMsg(pScreen->myNum, X_ERROR, "Rk30MaliDRI2_Init: ump_open() != UMP_OK\n"); goto err0; } if(!(pMxv->Rk30Mali = calloc(1, sizeof(Rk30MaliRec) ))){ xf86DrvMsg(pScreen->myNum, X_ERROR, "Rk30MaliDRI2_Init: Mem alloc failed!\n"); goto err0; } Rk30MaliPtr rk_3d = pMxv->Rk30Mali; rk_3d->PMemBuf = OvlAllocMemPg(pScrn, BUF_MEM); if(rk_3d->PMemBuf == NULL){ xf86DrvMsg(pScreen->myNum, X_INFO, "Alloc fb buf failed\n"); goto err1; } ump_id1 = rk_3d->PMemBuf->ump_fb_secure_id; if (ump_id1 == UMP_INVALID_SECURE_ID) { xf86DrvMsg(pScreen->myNum, X_INFO, "GET_UMP_SECURE_ID failed\n"); goto err1; } if (isOverlay){ xf86DrvMsg(pScreen->myNum, X_INFO, "HW overlay for 3D activated\n"); } else xf86DrvMsg(pScreen->myNum, X_INFO, "HW overlay for 3D not usable\n"); info.version = 3; info.driverName = "rk30-mali"; info.deviceName = "/dev/dri/card0"; info.fd = drm_fd; info.CreateBuffer = MaliDRI2CreateBuffer; info.DestroyBuffer = MaliDRI2DestroyBuffer; info.CopyRegion = MaliDRI2CopyRegion; /* #if DRI2INFOREC_VERSION >= 4 Bool USE_PAGEFLIP = TRUE; if (USE_PAGEFLIP) { info.version = 4; info.ScheduleSwap = MaliDRI2ScheduleSwap; info.GetMSC = NULL; info.ScheduleWaitMSC = NULL; info.numDrivers = 1; info.driverNames = driverNames; driverNames[0] = info.driverName; } #endif */ if (DRI2ScreenInit(pScreen, &info)){ /* Wrap the current DestroyWindow function */ rk_3d->DestroyWindow = pScreen->DestroyWindow; pScreen->DestroyWindow = DestroyWindow; /* Wrap the current PostValidateTree function */ // rk_3d->PostValidateTree = pScreen->PostValidateTree; // pScreen->PostValidateTree = PostValidateTree; /* Wrap the current GetImage function */ // rk_3d->GetImage = pScreen->GetImage; // pScreen->GetImage = GetImage; /* Wrap the current DestroyPixmap function */ rk_3d->DestroyPixmap = pScreen->DestroyPixmap; pScreen->DestroyPixmap = DestroyPixmap; rk_3d->ump_fb_secure_id1 = ump_id1; // rk_3d->ump_fb_secure_id2 = ump_id2; rk_3d->drm_fd = drm_fd; rk_3d->ovl_x = 0; rk_3d->ovl_y = 0; rk_3d->ovl_w = 0; rk_3d->ovl_h = 0; // rk_3d->lstatus = ST_INIT; // rk_3d->ovl_cr = FALSE; rk_3d->buf_back = NULL; rk_3d->OvlPg = ERRORL; return; } xf86DrvMsg(pScreen->myNum, X_ERROR, "Rk30MaliDRI2_Init: DRI2ScreenInit failed!\n"); err2: OvlFreeMemPg(pScrn, rk_3d->PMemBuf); err1: free(rk_3d); err0: drmClose(drm_fd); }