OMAPLFB_ERROR OMAPLFBInit(void) { unsigned uiMaxFBDevIDPlusOne = OMAPLFBMaxFBDevIDPlusOne(); unsigned i; unsigned uiDevicesFound = 0; if(OMAPLFBGetLibFuncAddr ("PVRGetDisplayClassJTable", &gpfnGetPVRJTable) != OMAPLFB_OK) { return OMAPLFB_ERROR_INIT_FAILURE; } for(i = uiMaxFBDevIDPlusOne; i-- != 0;) { OMAPLFB_DEVINFO *psDevInfo = OMAPLFBInitDev(i); if (psDevInfo != NULL) { OMAPLFBSetDevInfoPtr(psDevInfo->uiFBDevID, psDevInfo); uiDevicesFound++; } } return (uiDevicesFound != 0) ? OMAPLFB_OK : OMAPLFB_ERROR_INIT_FAILURE; }
OMAP_ERROR OMAPLFBInit(void) { OMAPLFB_DEVINFO *psDevInfo; psDevInfo = GetAnchorPtr(); if (psDevInfo == NULL) { PFN_CMD_PROC pfnCmdProcList[OMAPLFB_COMMAND_COUNT]; IMG_UINT32 aui32SyncCountList[OMAPLFB_COMMAND_COUNT][2]; psDevInfo = (OMAPLFB_DEVINFO *)OMAPLFBAllocKernelMem(sizeof(OMAPLFB_DEVINFO)); if(!psDevInfo) { return (OMAP_ERROR_OUT_OF_MEMORY); } memset(psDevInfo, 0, sizeof(OMAPLFB_DEVINFO)); SetAnchorPtr((void*)psDevInfo); psDevInfo->ulRefCount = 0; if(InitDev(psDevInfo) != OMAP_OK) { return (OMAP_ERROR_INIT_FAILURE); } if(OMAPLFBGetLibFuncAddr ("PVRGetDisplayClassJTable", &pfnGetPVRJTable) != OMAP_OK) { return (OMAP_ERROR_INIT_FAILURE); } if(!(*pfnGetPVRJTable)(&psDevInfo->sPVRJTable)) { return (OMAP_ERROR_INIT_FAILURE); } spin_lock_init(&psDevInfo->sSwapChainLock); psDevInfo->psSwapChain = 0; psDevInfo->bFlushCommands = OMAP_FALSE; psDevInfo->bDeviceSuspended = OMAP_FALSE; psDevInfo->sDisplayInfo.ui32MaxSwapChainBuffers = (IMG_UINT32)(psDevInfo->sFBInfo.ulFBSize / psDevInfo->sFBInfo.ulRoundedBufferSize); if (psDevInfo->sDisplayInfo.ui32MaxSwapChainBuffers == 0) { psDevInfo->sDisplayInfo.ui32MaxSwapChains = 0; psDevInfo->sDisplayInfo.ui32MaxSwapInterval = 0; } else { psDevInfo->sDisplayInfo.ui32MaxSwapChains = 1; psDevInfo->sDisplayInfo.ui32MaxSwapInterval = 3; } psDevInfo->sDisplayInfo.ui32MinSwapInterval = 0; strncpy(psDevInfo->sDisplayInfo.szDisplayName, DISPLAY_DEVICE_NAME, MAX_DISPLAY_NAME_SIZE); psDevInfo->sDisplayFormat.pixelformat = psDevInfo->sFBInfo.ePixelFormat; psDevInfo->sDisplayDim.ui32Width = (IMG_UINT32)psDevInfo->sFBInfo.ulWidth; psDevInfo->sDisplayDim.ui32Height = (IMG_UINT32)psDevInfo->sFBInfo.ulHeight; psDevInfo->sDisplayDim.ui32ByteStride = (IMG_UINT32)psDevInfo->sFBInfo.ulByteStride; DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Maximum number of swap chain buffers: %lu\n", psDevInfo->sDisplayInfo.ui32MaxSwapChainBuffers)); psDevInfo->sSystemBuffer.sSysAddr = psDevInfo->sFBInfo.sSysAddr; psDevInfo->sSystemBuffer.sCPUVAddr = psDevInfo->sFBInfo.sCPUVAddr; psDevInfo->sSystemBuffer.ulBufferSize = psDevInfo->sFBInfo.ulRoundedBufferSize; psDevInfo->sDCJTable.ui32TableSize = sizeof(PVRSRV_DC_SRV2DISP_KMJTABLE); psDevInfo->sDCJTable.pfnOpenDCDevice = OpenDCDevice; psDevInfo->sDCJTable.pfnCloseDCDevice = CloseDCDevice; psDevInfo->sDCJTable.pfnEnumDCFormats = EnumDCFormats; psDevInfo->sDCJTable.pfnEnumDCDims = EnumDCDims; psDevInfo->sDCJTable.pfnGetDCSystemBuffer = GetDCSystemBuffer; psDevInfo->sDCJTable.pfnGetDCInfo = GetDCInfo; psDevInfo->sDCJTable.pfnGetBufferAddr = GetDCBufferAddr; psDevInfo->sDCJTable.pfnCreateDCSwapChain = CreateDCSwapChain; psDevInfo->sDCJTable.pfnDestroyDCSwapChain = DestroyDCSwapChain; psDevInfo->sDCJTable.pfnSetDCDstRect = SetDCDstRect; psDevInfo->sDCJTable.pfnSetDCSrcRect = SetDCSrcRect; psDevInfo->sDCJTable.pfnSetDCDstColourKey = SetDCDstColourKey; psDevInfo->sDCJTable.pfnSetDCSrcColourKey = SetDCSrcColourKey; psDevInfo->sDCJTable.pfnGetDCBuffers = GetDCBuffers; psDevInfo->sDCJTable.pfnSwapToDCBuffer = SwapToDCBuffer; psDevInfo->sDCJTable.pfnSwapToDCSystem = SwapToDCSystem; psDevInfo->sDCJTable.pfnSetDCState = SetDCState; if(psDevInfo->sPVRJTable.pfnPVRSRVRegisterDCDevice ( &psDevInfo->sDCJTable, &psDevInfo->ulDeviceID ) != PVRSRV_OK) { return (OMAP_ERROR_DEVICE_REGISTER_FAILED); } pfnCmdProcList[DC_FLIP_COMMAND] = ProcessFlip; aui32SyncCountList[DC_FLIP_COMMAND][0] = 0; aui32SyncCountList[DC_FLIP_COMMAND][1] = 2; if (psDevInfo->sPVRJTable.pfnPVRSRVRegisterCmdProcList (psDevInfo->ulDeviceID, &pfnCmdProcList[0], aui32SyncCountList, OMAPLFB_COMMAND_COUNT) != PVRSRV_OK) { printk(KERN_WARNING DRIVER_PREFIX ": Can't register callback\n"); return (OMAP_ERROR_CANT_REGISTER_CALLBACK); } } psDevInfo->ulRefCount++; return (OMAP_OK); }