/** @file
Usb Debug Port library instance
Copyright (c) 2013 - 2019, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "Usb3DebugPortLibInternal.h"
GUID gUsb3DbgGuid = USB3_DBG_GUID;
/**
Return XHCI MMIO base address.
**/
EFI_PHYSICAL_ADDRESS
GetXhciBaseAddress (
VOID
)
{
UINT8 Bus;
UINT8 Device;
UINT8 Function;
USB3_DEBUG_PORT_CONTROLLER UsbDebugPort;
EFI_PHYSICAL_ADDRESS Address;
UINT32 Low;
UINT32 High;
UsbDebugPort.Controller = GetUsb3DebugPortController();
Bus = UsbDebugPort.PciAddress.Bus;
Device = UsbDebugPort.PciAddress.Device;
Function = UsbDebugPort.PciAddress.Function;
Low = PciRead32 (PCI_LIB_ADDRESS(Bus, Device, Function, PCI_BASE_ADDRESSREG_OFFSET));
High = PciRead32 (PCI_LIB_ADDRESS(Bus, Device, Function, PCI_BASE_ADDRESSREG_OFFSET + 4));
Address = (EFI_PHYSICAL_ADDRESS) (LShiftU64 ((UINT64) High, 32) | Low);
//
// Mask other parts which are not part of base address
//
Address &= XHCI_BASE_ADDRESS_64_BIT_MASK;
return Address;
}
/**
Return XHCI debug instance address.
**/
USB3_DEBUG_PORT_INSTANCE *
GetUsb3DebugPortInstance (
VOID
)
{
USB3_DEBUG_PORT_INSTANCE *Instance;
EFI_PEI_HOB_POINTERS Hob;
EFI_PHYSICAL_ADDRESS XhcMmioBase;
Hob.Raw = GetFirstGuidHob (&gUsb3DbgGuid);
if (Hob.Raw == NULL) {
return NULL;
}
Instance = GET_GUID_HOB_DATA (Hob.Guid);
//
// Update XHCI MMIO base address
//
XhcMmioBase = GetXhciBaseAddress ();
FixUsb3InstanceResource (Instance, XhcMmioBase);
return Instance;
}
/**
Initialize USB3 debug port.
This method invokes various internal functions to facilitate
detection and initialization of USB3 debug port.
@retval RETURN_SUCCESS The serial device was initialized.
**/
RETURN_STATUS
EFIAPI
USB3Initialize (
VOID
)
{
return EFI_SUCCESS;
}
/**
Initialize USB3 debug port.
This method invokes various internal functions to facilitate
detection and initialization of USB3 debug port.
@retval RETURN_SUCCESS The serial device was initialized.
**/
RETURN_STATUS
EFIAPI
USB3InitializeReal (
VOID
)
{
USB3_DEBUG_PORT_INSTANCE UsbDbg;
VOID *DataPtr;
EFI_PEI_HOB_POINTERS Hob;
//
// USB Initilization has to be done only once. So this function should just return when
// it is called more than once.
//
Hob.Raw = GetFirstGuidHob (&gUsb3DbgGuid);
if (Hob.Raw != NULL) {
return RETURN_SUCCESS;
}
//
// Initialize USB debug for PEI at the first time
//
SetMem (&UsbDbg, sizeof(UsbDbg), 0);
UsbDbg.FromHob = TRUE;
DiscoverUsb3DebugPort (&UsbDbg);
if (UsbDbg.DebugSupport) {
InitializeUsb3DebugPort (&UsbDbg);
}
//
// Save Instance into HOB
//
DataPtr = BuildGuidDataHob (
&gUsb3DbgGuid,
(VOID*) &UsbDbg,
sizeof (UsbDbg)
);
if (UsbDbg.DebugSupport) {
SaveUsb3InstanceAddress ((USB3_DEBUG_PORT_INSTANCE *) DataPtr);
}
return RETURN_SUCCESS;
}
/**
Allocate aligned memory for XHC's usage.
@param BufferSize The size, in bytes, of the Buffer.
@return A pointer to the allocated buffer or NULL if allocation fails.
**/
VOID*
AllocateAlignBuffer (
IN UINTN BufferSize
)
{
VOID *Buf;
EFI_PHYSICAL_ADDRESS Address;
CONST EFI_PEI_SERVICES **PeiServices;
EFI_STATUS Status;
VOID *MemoryDiscoveredPpi;
Buf = NULL;
PeiServices = GetPeiServicesTablePointer ();
//
// Make sure the allocated memory is physical memory.
//
Status = (*PeiServices)->LocatePpi (
PeiServices,
&gEfiPeiMemoryDiscoveredPpiGuid,
0,
NULL,
(VOID **) &MemoryDiscoveredPpi
);
if (!EFI_ERROR (Status)) {
Status = (*PeiServices)->AllocatePages (
PeiServices,
EfiACPIMemoryNVS,
EFI_SIZE_TO_PAGES (BufferSize),
&Address
);
if (!EFI_ERROR (Status)) {
Buf = (VOID *)(UINTN) Address;
}
}
return Buf;
}
/**
Check whether AllocatePages in permanent memory is ready.
@retval TRUE AllocatePages in permanent memory is ready.
@retval FALSE AllocatePages in permanent memory is not ready.
**/
BOOLEAN
IsAllocatePagesReady (
VOID
)
{
CONST EFI_PEI_SERVICES **PeiServices;
EFI_STATUS Status;
VOID *MemoryDiscoveredPpi;
PeiServices = GetPeiServicesTablePointer ();
//
// Make sure the allocated memory is physical memory.
//
Status = (*PeiServices)->LocatePpi (
PeiServices,
&gEfiPeiMemoryDiscoveredPpiGuid,
0,
NULL,
(VOID **) &MemoryDiscoveredPpi
);
if (!EFI_ERROR (Status)) {
return TRUE;
}
return FALSE;
}