/** @file @copyright Copyright 2012 - 2021 Intel Corporation.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ // // EDK and EDKII have different GUID formats // #include #include #include #include #include #include #include #include #include VOID UpdatePchUsbConfig ( IN PCH_USB_CONFIG *PchUsbConfig, IN SYSTEM_CONFIGURATION *SetupVariables, IN PCH_SETUP *PchRcVariables, IN VOID *Usb20OverCurrentMappings, IN VOID *Usb30OverCurrentMappings, IN VOID *Usb20AfeParams ) /*++ Routine Description: This function performs PCH USB Platform Policy initialzation Arguments: PchUsbConfig Pointer to PCH_USB_CONFIG data buffer SetupVariables Pointer to Setup variable PlatformType PlatformType specified PlatformFlavor PlatformFlavor specified BoardType BoardType specified Returns: --*/ { UINTN PortIndex; #ifdef TESTMENU_FLAG UINT8 Index; #endif EFI_STATUS Status = EFI_SUCCESS; DYNAMIC_SI_LIBARY_PPI *DynamicSiLibraryPpi = NULL; Status = PeiServicesLocatePpi (&gDynamicSiLibraryPpiGuid, 0, NULL, &DynamicSiLibraryPpi); if (EFI_ERROR (Status)) { ASSERT_EFI_ERROR (Status); return; } PchUsbConfig->UsbPrecondition = PchRcVariables->UsbPrecondition; for (PortIndex = 0; PortIndex < DynamicSiLibraryPpi->GetPchXhciMaxUsb2PortNum (); PortIndex++) { if (PchRcVariables->PchUsbHsPort[PortIndex] == 1) { PchUsbConfig->PortUsb20[PortIndex].Enable = TRUE; } else { PchUsbConfig->PortUsb20[PortIndex].Enable = FALSE; } } for (PortIndex = 0; PortIndex < DynamicSiLibraryPpi->GetPchXhciMaxUsb3PortNum (); PortIndex++) { if (PchRcVariables->PchUsbSsPort[PortIndex] == 1) { PchUsbConfig->PortUsb30[PortIndex].Enable = TRUE; } else { PchUsbConfig->PortUsb30[PortIndex].Enable = FALSE; } } for (PortIndex = 0; PortIndex < PCH_H_XHCI_MAX_USB2_PHYSICAL_PORTS; PortIndex++) { PchUsbConfig->PortUsb20[PortIndex].Afe.Petxiset = (UINT8)(((USB2_PHY_PARAMETERS *)Usb20AfeParams)[PortIndex].Petxiset); PchUsbConfig->PortUsb20[PortIndex].Afe.Txiset = (UINT8)(((USB2_PHY_PARAMETERS *)Usb20AfeParams)[PortIndex].Txiset); PchUsbConfig->PortUsb20[PortIndex].Afe.Predeemp = (UINT8)(((USB2_PHY_PARAMETERS *)Usb20AfeParams)[PortIndex].Predeemp); PchUsbConfig->PortUsb20[PortIndex].Afe.Pehalfbit = (UINT8)(((USB2_PHY_PARAMETERS *)Usb20AfeParams)[PortIndex].Pehalfbit); } // // xDCI (USB device) related settings from setup variable // if(PchRcVariables->PchXdciSupport == 1) { PchUsbConfig->XdciConfig.Enable= TRUE; } else { PchUsbConfig->XdciConfig.Enable= FALSE; } #ifdef TESTMENU_FLAG // // Need to clear UsbEPTypeLockPolicy[8] and UsbEPTypeLockPolicy[16] since this is not assign in the setup // PchRcVariables->UsbEPTypeLockPolicy[8] = 0; SetupPchRcVariablesVariables->UsbEPTypeLockPolicy[16] = 0; // // Update USB EP Type Lock Policy Settings // for (Index = 0; Index < 24; Index++) { PchUsbConfig->Usb30EpTypeLockPolicySettings.EPTypeLockPolicy |= (UINT32) (PchRcVariables->UsbEPTypeLockPolicy[Index] << Index); } for (Index = 0; Index < 16; Index++) { PchUsbConfig->Usb30EpTypeLockPolicySettings.EPTypeLockPolicyPortControl1 |= (UINT32) (PchRcVariables->RootPortPolicyControl[Index] << Index * 2); } for (Index = 16; Index < 20; Index++) { PchUsbConfig->Usb30EpTypeLockPolicySettings.EPTypeLockPolicyPortControl2 |= (UINT32) (PchRcVariables->RootPortPolicyControl[Index] << (Index - 16) * 2); } // // Remark: Can be disabled only for debugging process!!! // PchUsbConfig->TstMnuControllerEnabled = PchRcVariables->XhciEnabled; // // SSIC debug mode // PchUsbConfig->TstMnuSsicHalt = PchRcVariables->XhciSsicHalt; #endif // // XHCI USB Over Current Pins disabled, update it based on setup option. // PchUsbConfig->XhciOcMapEnabled = PchRcVariables->XhciOcMapEnabled; // // XHCI Wake On USB configured based on user input through setup option // PchUsbConfig->XhciWakeOnUsb = SetupVariables->XhciWakeOnUsbEnabled; // // XHCI option to disable MSIs // PchUsbConfig->XhciDisMSICapability = PchRcVariables->XhciDisMSICapability; // // Platform Board programming per the layout of each port. // // OC Map for USB2 Ports for (PortIndex=0;PortIndexPortUsb20[PortIndex].OverCurrentPin = (UINT8)((USB_OVERCURRENT_PIN *)Usb20OverCurrentMappings)[PortIndex]; } // OC Map for USB3 Ports for (PortIndex=0;PortIndexPortUsb30[PortIndex].OverCurrentPin = (UINT8)((USB_OVERCURRENT_PIN *)Usb30OverCurrentMappings)[PortIndex]; } }