mirror of https://github.com/acidanthera/audk.git
MdeModulePkg: Skip to manage usb debug port in EDKII EHCI driver if it's used by usb debug port driver
Signed-off-by: Feng Tian <feng.tian@intel.com> Reviewed-by: Jeff Fan <jeff.fan@intel.com> git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13226 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
3e0587010e
commit
09943f5ecc
|
@ -120,6 +120,7 @@ EhcReset (
|
||||||
USB2_HC_DEV *Ehc;
|
USB2_HC_DEV *Ehc;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
UINT32 DbgCtrlStatus;
|
||||||
|
|
||||||
OldTpl = gBS->RaiseTPL (EHC_TPL);
|
OldTpl = gBS->RaiseTPL (EHC_TPL);
|
||||||
Ehc = EHC_FROM_THIS (This);
|
Ehc = EHC_FROM_THIS (This);
|
||||||
|
@ -133,6 +134,14 @@ EhcReset (
|
||||||
//
|
//
|
||||||
// Host Controller must be Halt when Reset it
|
// Host Controller must be Halt when Reset it
|
||||||
//
|
//
|
||||||
|
if (Ehc->DebugPortNum != 0) {
|
||||||
|
DbgCtrlStatus = EhcReadDbgRegister(Ehc, 0);
|
||||||
|
if ((DbgCtrlStatus & (USB_DEBUG_PORT_IN_USE | USB_DEBUG_PORT_OWNER)) == (USB_DEBUG_PORT_IN_USE | USB_DEBUG_PORT_OWNER)) {
|
||||||
|
Status = EFI_SUCCESS;
|
||||||
|
goto ON_EXIT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!EhcIsHalt (Ehc)) {
|
if (!EhcIsHalt (Ehc)) {
|
||||||
Status = EhcHaltHC (Ehc, EHC_GENERIC_TIMEOUT);
|
Status = EhcHaltHC (Ehc, EHC_GENERIC_TIMEOUT);
|
||||||
|
|
||||||
|
@ -323,6 +332,7 @@ EhcGetRootHubPortStatus (
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
UINTN MapSize;
|
UINTN MapSize;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
UINT32 DbgCtrlStatus;
|
||||||
|
|
||||||
if (PortStatus == NULL) {
|
if (PortStatus == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
|
@ -344,6 +354,13 @@ EhcGetRootHubPortStatus (
|
||||||
PortStatus->PortStatus = 0;
|
PortStatus->PortStatus = 0;
|
||||||
PortStatus->PortChangeStatus = 0;
|
PortStatus->PortChangeStatus = 0;
|
||||||
|
|
||||||
|
if ((Ehc->DebugPortNum != 0) && (PortNumber == (Ehc->DebugPortNum - 1))) {
|
||||||
|
DbgCtrlStatus = EhcReadDbgRegister(Ehc, 0);
|
||||||
|
if ((DbgCtrlStatus & (USB_DEBUG_PORT_IN_USE | USB_DEBUG_PORT_OWNER)) == (USB_DEBUG_PORT_IN_USE | USB_DEBUG_PORT_OWNER)) {
|
||||||
|
goto ON_EXIT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
State = EhcReadOpReg (Ehc, Offset);
|
State = EhcReadOpReg (Ehc, Offset);
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -1390,6 +1407,129 @@ ON_EXIT:
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Get the usb debug port related information.
|
||||||
|
|
||||||
|
@param Ehc The EHCI device.
|
||||||
|
|
||||||
|
@retval RETURN_SUCCESS Get debug port number, bar and offset successfully.
|
||||||
|
@retval Others The usb host controller does not supported usb debug port capability.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EhcGetUsbDebugPortInfo (
|
||||||
|
IN USB2_HC_DEV *Ehc
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||||
|
UINT16 PciStatus;
|
||||||
|
UINT8 CapabilityPtr;
|
||||||
|
UINT8 CapabilityId;
|
||||||
|
UINT16 DebugPort;
|
||||||
|
EFI_STATUS Status;
|
||||||
|
|
||||||
|
ASSERT (Ehc->PciIo != NULL);
|
||||||
|
PciIo = Ehc->PciIo;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Detect if the EHCI host controller support Capaility Pointer.
|
||||||
|
//
|
||||||
|
Status = PciIo->Pci.Read (
|
||||||
|
PciIo,
|
||||||
|
EfiPciIoWidthUint8,
|
||||||
|
PCI_PRIMARY_STATUS_OFFSET,
|
||||||
|
sizeof (UINT16),
|
||||||
|
&PciStatus
|
||||||
|
);
|
||||||
|
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((PciStatus & EFI_PCI_STATUS_CAPABILITY) == 0) {
|
||||||
|
//
|
||||||
|
// The Pci Device Doesn't Support Capability Pointer.
|
||||||
|
//
|
||||||
|
return EFI_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Get Pointer To Capability List
|
||||||
|
//
|
||||||
|
Status = PciIo->Pci.Read (
|
||||||
|
PciIo,
|
||||||
|
EfiPciIoWidthUint8,
|
||||||
|
PCI_CAPBILITY_POINTER_OFFSET,
|
||||||
|
1,
|
||||||
|
&CapabilityPtr
|
||||||
|
);
|
||||||
|
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Find Capability ID 0xA, Which Is For Debug Port
|
||||||
|
//
|
||||||
|
while (CapabilityPtr != 0) {
|
||||||
|
Status = PciIo->Pci.Read (
|
||||||
|
PciIo,
|
||||||
|
EfiPciIoWidthUint8,
|
||||||
|
CapabilityPtr,
|
||||||
|
1,
|
||||||
|
&CapabilityId
|
||||||
|
);
|
||||||
|
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CapabilityId == EHC_DEBUG_PORT_CAP_ID) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = PciIo->Pci.Read (
|
||||||
|
PciIo,
|
||||||
|
EfiPciIoWidthUint8,
|
||||||
|
CapabilityPtr + 1,
|
||||||
|
1,
|
||||||
|
&CapabilityPtr
|
||||||
|
);
|
||||||
|
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// No Debug Port Capability Found
|
||||||
|
//
|
||||||
|
if (CapabilityPtr == 0) {
|
||||||
|
return EFI_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Get The Base Address Of Debug Port Register In Debug Port Capability Register
|
||||||
|
//
|
||||||
|
Status = PciIo->Pci.Read (
|
||||||
|
Ehc->PciIo,
|
||||||
|
EfiPciIoWidthUint8,
|
||||||
|
CapabilityPtr + 2,
|
||||||
|
sizeof (UINT16),
|
||||||
|
&DebugPort
|
||||||
|
);
|
||||||
|
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ehc->DebugPortOffset = DebugPort & 0x1FFF;
|
||||||
|
Ehc->DebugPortBarNum = (DebugPort >> 13) - 1;
|
||||||
|
Ehc->DebugPortNum = (UINT8)((Ehc->HcStructParams & 0x00F00000) >> 20);
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Create and initialize a USB2_HC_DEV.
|
Create and initialize a USB2_HC_DEV.
|
||||||
|
@ -1455,6 +1595,8 @@ EhcCreateUsb2Hc (
|
||||||
gBS->FreePool (Ehc);
|
gBS->FreePool (Ehc);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EhcGetUsbDebugPortInfo (Ehc);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Create AsyncRequest Polling Timer
|
// Create AsyncRequest Polling Timer
|
||||||
|
@ -1541,6 +1683,7 @@ EhcDriverBindingStart (
|
||||||
UINTN EhciBusNumber;
|
UINTN EhciBusNumber;
|
||||||
UINTN EhciDeviceNumber;
|
UINTN EhciDeviceNumber;
|
||||||
UINTN EhciFunctionNumber;
|
UINTN EhciFunctionNumber;
|
||||||
|
UINT32 State;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Open the PciIo Protocol, then enable the USB host controller
|
// Open the PciIo Protocol, then enable the USB host controller
|
||||||
|
@ -1727,7 +1870,13 @@ EhcDriverBindingStart (
|
||||||
if (FeaturePcdGet (PcdTurnOffUsbLegacySupport)) {
|
if (FeaturePcdGet (PcdTurnOffUsbLegacySupport)) {
|
||||||
EhcClearLegacySupport (Ehc);
|
EhcClearLegacySupport (Ehc);
|
||||||
}
|
}
|
||||||
EhcResetHC (Ehc, EHC_RESET_TIMEOUT);
|
|
||||||
|
if (Ehc->DebugPortNum != 0) {
|
||||||
|
State = EhcReadDbgRegister(Ehc, 0);
|
||||||
|
if ((State & (USB_DEBUG_PORT_IN_USE | USB_DEBUG_PORT_OWNER)) != (USB_DEBUG_PORT_IN_USE | USB_DEBUG_PORT_OWNER)) {
|
||||||
|
EhcResetHC (Ehc, EHC_RESET_TIMEOUT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Status = EhcInitHC (Ehc);
|
Status = EhcInitHC (Ehc);
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
Provides some data struct used by EHCI controller driver.
|
Provides some data struct used by EHCI controller driver.
|
||||||
|
|
||||||
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
which accompanies this distribution. The full text of the license may be found at
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
|
@ -70,11 +70,18 @@ typedef struct _USB2_HC_DEV USB2_HC_DEV;
|
||||||
#define EHC_SYNC_POLL_INTERVAL (1 * EHC_1_MILLISECOND)
|
#define EHC_SYNC_POLL_INTERVAL (1 * EHC_1_MILLISECOND)
|
||||||
#define EHC_ASYNC_POLL_INTERVAL (50 * 10000U)
|
#define EHC_ASYNC_POLL_INTERVAL (50 * 10000U)
|
||||||
|
|
||||||
|
//
|
||||||
|
// EHCI debug port control status register bit definition
|
||||||
|
//
|
||||||
|
#define USB_DEBUG_PORT_IN_USE BIT10
|
||||||
|
#define USB_DEBUG_PORT_ENABLE BIT28
|
||||||
|
#define USB_DEBUG_PORT_OWNER BIT30
|
||||||
|
|
||||||
//
|
//
|
||||||
// EHC raises TPL to TPL_NOTIFY to serialize all its operations
|
// EHC raises TPL to TPL_NOTIFY to serialize all its operations
|
||||||
// to protect shared data structures.
|
// to protect shared data structures.
|
||||||
//
|
//
|
||||||
#define EHC_TPL TPL_NOTIFY
|
#define EHC_TPL TPL_NOTIFY
|
||||||
|
|
||||||
//
|
//
|
||||||
//Iterate through the doule linked list. NOT delete safe
|
//Iterate through the doule linked list. NOT delete safe
|
||||||
|
@ -157,6 +164,13 @@ struct _USB2_HC_DEV {
|
||||||
// Misc
|
// Misc
|
||||||
//
|
//
|
||||||
EFI_UNICODE_STRING_TABLE *ControllerNameTable;
|
EFI_UNICODE_STRING_TABLE *ControllerNameTable;
|
||||||
|
|
||||||
|
//
|
||||||
|
// EHCI debug port info
|
||||||
|
//
|
||||||
|
UINT16 DebugPortOffset; // The offset of debug port mmio register
|
||||||
|
UINT8 DebugPortBarNum; // The bar number of debug port mmio register
|
||||||
|
UINT8 DebugPortNum; // The port number of usb debug port
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
The EHCI register operation routines.
|
The EHCI register operation routines.
|
||||||
|
|
||||||
Copyright (c) 2007 - 2011, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2007 - 2012, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
which accompanies this distribution. The full text of the license may be found at
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
|
@ -53,6 +53,42 @@ EhcReadCapRegister (
|
||||||
return Data;
|
return Data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Read EHCI debug port register.
|
||||||
|
|
||||||
|
@param Ehc The EHCI device.
|
||||||
|
@param Offset Debug port register offset.
|
||||||
|
|
||||||
|
@return The register content read.
|
||||||
|
@retval If err, return 0xffff.
|
||||||
|
|
||||||
|
**/
|
||||||
|
UINT32
|
||||||
|
EhcReadDbgRegister (
|
||||||
|
IN USB2_HC_DEV *Ehc,
|
||||||
|
IN UINT32 Offset
|
||||||
|
)
|
||||||
|
{
|
||||||
|
UINT32 Data;
|
||||||
|
EFI_STATUS Status;
|
||||||
|
|
||||||
|
Status = Ehc->PciIo->Mem.Read (
|
||||||
|
Ehc->PciIo,
|
||||||
|
EfiPciIoWidthUint32,
|
||||||
|
Ehc->DebugPortBarNum,
|
||||||
|
(UINT64) (Ehc->DebugPortOffset + Offset),
|
||||||
|
1,
|
||||||
|
&Data
|
||||||
|
);
|
||||||
|
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
DEBUG ((EFI_D_ERROR, "EhcReadDbgRegister: Pci Io read error - %r at %d\n", Status, Offset));
|
||||||
|
Data = 0xFFFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Read EHCI Operation register.
|
Read EHCI Operation register.
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
This file contains the definination for host controller register operation routines.
|
This file contains the definination for host controller register operation routines.
|
||||||
|
|
||||||
Copyright (c) 2007 - 2011, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2007 - 2012, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
which accompanies this distribution. The full text of the license may be found at
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
|
@ -89,6 +89,11 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||||
//
|
//
|
||||||
#define EHC_BAR_INDEX 0 // how many bytes away from USB_BASE to 0x10
|
#define EHC_BAR_INDEX 0 // how many bytes away from USB_BASE to 0x10
|
||||||
|
|
||||||
|
//
|
||||||
|
// Debug port capability id
|
||||||
|
//
|
||||||
|
#define EHC_DEBUG_PORT_CAP_ID 0x0A
|
||||||
|
|
||||||
#define EHC_LINK_TERMINATED(Link) (((Link) & 0x01) != 0)
|
#define EHC_LINK_TERMINATED(Link) (((Link) & 0x01) != 0)
|
||||||
|
|
||||||
#define EHC_ADDR(High, QhHw32) \
|
#define EHC_ADDR(High, QhHw32) \
|
||||||
|
@ -131,6 +136,21 @@ EhcReadCapRegister (
|
||||||
IN UINT32 Offset
|
IN UINT32 Offset
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Read EHCI debug port register.
|
||||||
|
|
||||||
|
@param Ehc The EHCI device.
|
||||||
|
@param Offset Debug port register address.
|
||||||
|
|
||||||
|
@return The register content read.
|
||||||
|
@retval If err, return 0xffff.
|
||||||
|
|
||||||
|
**/
|
||||||
|
UINT32
|
||||||
|
EhcReadDbgRegister (
|
||||||
|
IN USB2_HC_DEV *Ehc,
|
||||||
|
IN UINT32 Offset
|
||||||
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Read EHCI Operation register.
|
Read EHCI Operation register.
|
||||||
|
|
Loading…
Reference in New Issue