/** @param FileHandle Handle of the file being invoked. @param PeiServices Describes the list of possible PEI Services. @retval EFI_SUCCESS PPI successfully installed. **/ EFI_STATUS EFIAPI EhcPeimEntry ( IN EFI_PEI_FILE_HANDLE FileHandle, IN CONST EFI_PEI_SERVICES **PeiServices ) { PEI_USB_CONTROLLER_PPI *ChipSetUsbControllerPpi; EFI_STATUS Status; UINT8 Index; UINTN ControllerType; UINTN BaseAddress; UINTN MemPages; PEI_USB2_HC_DEV *EhcDev; EFI_PHYSICAL_ADDRESS TempPtr; // // Shadow this PEIM to run from memory // if (!EFI_ERROR (PeiServicesRegisterForShadow (FileHandle))) { return EFI_SUCCESS; } Status = PeiServicesLocatePpi ( &gPeiUsbControllerPpiGuid, 0, NULL, (VOID **) &ChipSetUsbControllerPpi ); if (EFI_ERROR (Status)) { return EFI_UNSUPPORTED; } Index = 0; while (TRUE) { Status = ChipSetUsbControllerPpi->GetUsbController ( (EFI_PEI_SERVICES **) PeiServices, ChipSetUsbControllerPpi, Index, &ControllerType, &BaseAddress ); // // When status is error, meant no controller is found // if (EFI_ERROR (Status)) { break; } // // This PEIM is for UHC type controller. // if (ControllerType != PEI_EHCI_CONTROLLER) { Index++; continue; } MemPages = sizeof (PEI_USB2_HC_DEV) / PAGESIZE + 1; Status = PeiServicesAllocatePages ( EfiBootServicesCode, MemPages, &TempPtr ); if (EFI_ERROR (Status)) { return EFI_OUT_OF_RESOURCES; } ZeroMem((VOID *)(UINTN)TempPtr, MemPages*PAGESIZE); EhcDev = (PEI_USB2_HC_DEV *) ((UINTN) TempPtr); EhcDev->Signature = USB2_HC_DEV_SIGNATURE; EhcDev->UsbHostControllerBaseAddress = (UINT32) BaseAddress; EhcDev->HcStructParams = EhcReadCapRegister (EhcDev, EHC_HCSPARAMS_OFFSET); EhcDev->HcCapParams = EhcReadCapRegister (EhcDev, EHC_HCCPARAMS_OFFSET); EhcDev->CapLen = EhcReadCapRegister (EhcDev, EHC_CAPLENGTH_OFFSET) & 0x0FF; // // Initialize Uhc's hardware // Status = InitializeUsbHC (EhcDev); if (EFI_ERROR (Status)) { return Status; } EhcDev->Usb2HostControllerPpi.ControlTransfer = EhcControlTransfer; EhcDev->Usb2HostControllerPpi.BulkTransfer = EhcBulkTransfer; EhcDev->Usb2HostControllerPpi.GetRootHubPortNumber = EhcGetRootHubPortNumber; EhcDev->Usb2HostControllerPpi.GetRootHubPortStatus = EhcGetRootHubPortStatus; EhcDev->Usb2HostControllerPpi.SetRootHubPortFeature = EhcSetRootHubPortFeature; EhcDev->Usb2HostControllerPpi.ClearRootHubPortFeature = EhcClearRootHubPortFeature; EhcDev->PpiDescriptor.Flags = (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST); EhcDev->PpiDescriptor.Guid = &gPeiUsb2HostControllerPpiGuid; EhcDev->PpiDescriptor.Ppi = &EhcDev->Usb2HostControllerPpi; Status = PeiServicesInstallPpi (&EhcDev->PpiDescriptor); if (EFI_ERROR (Status)) { Index++; continue; } Index++; } return EFI_SUCCESS; }
/** @param FileHandle Handle of the file being invoked. @param PeiServices Describes the list of possible PEI Services. @retval EFI_SUCCESS PPI successfully installed. **/ EFI_STATUS OhcPeimEntry ( IN EFI_PEI_FILE_HANDLE FileHandle, IN CONST EFI_PEI_SERVICES **PeiServices ) { PEI_USB_CONTROLLER_PPI *ChipSetUsbControllerPpi; EFI_STATUS Status; UINT8 Index; UINTN ControllerType; UINTN BaseAddress; UINTN MemPages; USB_OHCI_HC_DEV *Ohc; EFI_PHYSICAL_ADDRESS TempPtr; // // Shadow this PEIM to run from memory // if (!EFI_ERROR (PeiServicesRegisterForShadow (FileHandle))) { return EFI_SUCCESS; } Status = PeiServicesLocatePpi ( &gPeiUsbControllerPpiGuid, 0, NULL, (VOID **) &ChipSetUsbControllerPpi ); if (EFI_ERROR (Status)) { return EFI_UNSUPPORTED; } Index = 0; while (TRUE) { Status = ChipSetUsbControllerPpi->GetUsbController ( (EFI_PEI_SERVICES **) PeiServices, ChipSetUsbControllerPpi, Index, &ControllerType, &BaseAddress ); // // When status is error, meant no controller is found // if (EFI_ERROR (Status)) { break; } // // This PEIM is for OHC type controller. // if (ControllerType != PEI_OHCI_CONTROLLER) { Index++; continue; } MemPages = sizeof (USB_OHCI_HC_DEV) / PAGESIZE + 1; Status = PeiServicesAllocatePages ( EfiBootServicesCode, MemPages, &TempPtr ); if (EFI_ERROR (Status)) { DEBUG ((EFI_D_INFO, "OhcPeimEntry: Fail to allocate buffer for the %dth OHCI ControllerPpi\n", Index)); return EFI_OUT_OF_RESOURCES; } ZeroMem((VOID *)(UINTN)TempPtr, MemPages*PAGESIZE); Ohc = (USB_OHCI_HC_DEV *) ((UINTN) TempPtr); Ohc->Signature = USB_OHCI_HC_DEV_SIGNATURE; Ohc->UsbHostControllerBaseAddress = (UINT32) BaseAddress; // // Initialize Uhc's hardware // Status = InitializeUsbHC ( (EFI_PEI_SERVICES **)PeiServices, Ohc, EFI_USB_HC_RESET_GLOBAL ); if (EFI_ERROR (Status)) { DEBUG ((EFI_D_INFO, "OhcPeimEntry: Fail to init %dth OHCI ControllerPpi\n", Index)); return Status; } // // Control & Bulk transfer services are accessed via their Redirect // routine versions on Quark so that USB DMA transfers do not cause an // IMR violation. // Ohc->UsbHostControllerPpi.ControlTransfer = RedirectOhciControlTransfer; Ohc->UsbHostControllerPpi.BulkTransfer = RedirectOhciBulkTransfer; Ohc->UsbHostControllerPpi.GetRootHubPortNumber = OhciGetRootHubNumOfPorts; Ohc->UsbHostControllerPpi.GetRootHubPortStatus = OhciGetRootHubPortStatus; Ohc->UsbHostControllerPpi.SetRootHubPortFeature = OhciSetRootHubPortFeature; Ohc->UsbHostControllerPpi.ClearRootHubPortFeature = OhciClearRootHubPortFeature; Ohc->PpiDescriptor.Flags = (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST); Ohc->PpiDescriptor.Guid = &gPeiUsbHostControllerPpiGuid; Ohc->PpiDescriptor.Ppi = &Ohc->UsbHostControllerPpi; Status = PeiServicesInstallPpi (&Ohc->PpiDescriptor); if (EFI_ERROR (Status)) { Index++; continue; } Index++; } return EFI_SUCCESS; }