/** @file PCH xHCI Sx handler implementation. Copyright (c) 2017, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include "PchInitSmm.h" /** xHCI Controller Configurations Prior to Entering S3 **/ VOID PchXhciS3Callback ( VOID ) { UINTN XhciPciMmBase; UINT8 OrgCmdByte; UINT16 OrgPmcs; UINT32 OrgMmioAddr; UINT32 OrgMmioHAddr; UINT32 XhciMmioBase; XhciPciMmBase = MmPciBase ( DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_XHCI, PCI_FUNCTION_NUMBER_PCH_XHCI ); /// /// Save Cmd and XhciBar and Pmcs registers /// OrgCmdByte = MmioRead8 (XhciPciMmBase + PCI_COMMAND_OFFSET); OrgPmcs = MmioRead16 (XhciPciMmBase + R_PCH_XHCI_PWR_CNTL_STS); OrgMmioAddr = MmioRead32 (XhciPciMmBase + R_PCH_XHCI_MEM_BASE) & 0xFFFF0000; OrgMmioHAddr = MmioRead32 (XhciPciMmBase + R_PCH_XHCI_MEM_BASE + 4); /// /// Use the reserved MMIO /// Clear MSE before changing MMIO address /// MmioAnd8 (XhciPciMmBase + PCI_COMMAND_OFFSET, (UINT8)~(EFI_PCI_COMMAND_BUS_MASTER | EFI_PCI_COMMAND_MEMORY_SPACE)); MmioWrite32 (XhciPciMmBase + R_PCH_XHCI_MEM_BASE, (UINT32) mXhciMmioBaseAddr); MmioWrite32 (XhciPciMmBase + R_PCH_XHCI_MEM_BASE + 4, 0); /// /// Set MSE /// MmioOr8 (XhciPciMmBase + PCI_COMMAND_OFFSET, (EFI_PCI_COMMAND_BUS_MASTER | EFI_PCI_COMMAND_MEMORY_SPACE)); XhciMmioBase = (UINT32) mXhciMmioBaseAddr; /// /// Restore Cmd and XhciBar and Pmcs registers /// MmioWrite32 (XhciPciMmBase + R_PCH_XHCI_MEM_BASE + 4, OrgMmioHAddr); MmioWrite32 (XhciPciMmBase + R_PCH_XHCI_MEM_BASE, OrgMmioAddr); MmioWrite8 (XhciPciMmBase + PCI_COMMAND_OFFSET, OrgCmdByte); /// /// Bring device to D3 /// MmioOr8 (XhciPciMmBase + R_PCH_XHCI_PWR_CNTL_STS, (UINT8)(V_PCH_XHCI_PWR_CNTL_STS_PWR_STS_D3)); }