Add missing status code in several modules.

Signed-off-by: Li Elvin <elvin.li@intel.com>
Reviewed-by: Yao Jiewen <jiewen.yao@intel.com>
Reviewed-by: Ni Ruiyu <ruiyu.ni@intel.com>
Reviewed-by: Gao Liming <liming.gao@intel.com>
Reviewed-by: Tian Feng <feng.tian@intel.com>
Reviewed-by: Fan Jeff <jeff.fan@intel.com>


git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13890 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
li-elvin
2012-10-30 04:23:40 +00:00
parent cb38c322f0
commit 37623a5c02
32 changed files with 478 additions and 109 deletions

View File

@ -294,6 +294,15 @@ RegisterAtaDevice (
InitializeListHead (&AtaDevice->AtaTaskList); InitializeListHead (&AtaDevice->AtaTaskList);
InitializeListHead (&AtaDevice->AtaSubTaskList); InitializeListHead (&AtaDevice->AtaSubTaskList);
//
// Report Status Code to indicate the ATA device will be enabled
//
REPORT_STATUS_CODE_WITH_DEVICE_PATH (
EFI_PROGRESS_CODE,
(EFI_IO_BUS_ATA_ATAPI | EFI_IOB_PC_ENABLE),
AtaBusDriverData->ParentDevicePath
);
// //
// Try to identify the ATA device via the ATA pass through command. // Try to identify the ATA device via the ATA pass through command.
// //
@ -719,6 +728,15 @@ AtaBusDriverBindingStart (
return Status; return Status;
} }
//
// Report Status Code to indicate ATA bus starts
//
REPORT_STATUS_CODE_WITH_DEVICE_PATH (
EFI_PROGRESS_CODE,
(EFI_IO_BUS_ATA_ATAPI | EFI_IOB_PC_INIT),
ParentDevicePath
);
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
&gEfiAtaPassThruProtocolGuid, &gEfiAtaPassThruProtocolGuid,
@ -771,6 +789,15 @@ AtaBusDriverBindingStart (
} }
} }
//
// Report Status Code to indicate detecting devices on bus
//
REPORT_STATUS_CODE_WITH_DEVICE_PATH (
EFI_PROGRESS_CODE,
(EFI_IO_BUS_ATA_ATAPI | EFI_IOB_PC_DETECT),
ParentDevicePath
);
if (RemainingDevicePath == NULL) { if (RemainingDevicePath == NULL) {
Port = 0xFFFF; Port = 0xFFFF;
while (TRUE) { while (TRUE) {

View File

@ -38,6 +38,7 @@
#include <Library/DevicePathLib.h> #include <Library/DevicePathLib.h>
#include <Library/UefiRuntimeServicesTableLib.h> #include <Library/UefiRuntimeServicesTableLib.h>
#include <Library/TimerLib.h> #include <Library/TimerLib.h>
#include <Library/ReportStatusCodeLib.h>
#include <IndustryStandard/Atapi.h> #include <IndustryStandard/Atapi.h>

View File

@ -56,6 +56,7 @@
UefiDriverEntryPoint UefiDriverEntryPoint
DebugLib DebugLib
TimerLib TimerLib
ReportStatusCodeLib
[Guids] [Guids]
gEfiDiskInfoIdeInterfaceGuid # CONSUMES ## GUID gEfiDiskInfoIdeInterfaceGuid # CONSUMES ## GUID

View File

@ -185,6 +185,15 @@ ResetAtaDevice (
AtaPassThru = AtaDevice->AtaBusDriverData->AtaPassThru; AtaPassThru = AtaDevice->AtaBusDriverData->AtaPassThru;
//
// Report Status Code to indicate reset happens
//
REPORT_STATUS_CODE_WITH_DEVICE_PATH (
EFI_PROGRESS_CODE,
(EFI_IO_BUS_ATA_ATAPI | EFI_IOB_PC_RESET),
AtaDevice->AtaBusDriverData->ParentDevicePath
);
return AtaPassThru->ResetDevice ( return AtaPassThru->ResetDevice (
AtaPassThru, AtaPassThru,
AtaDevice->Port, AtaDevice->Port,

View File

@ -122,8 +122,20 @@ EhcReset (
EFI_STATUS Status; EFI_STATUS Status;
UINT32 DbgCtrlStatus; UINT32 DbgCtrlStatus;
Ehc = EHC_FROM_THIS (This);
if (Ehc->DevicePath != NULL) {
//
// Report Status Code to indicate reset happens
//
REPORT_STATUS_CODE_WITH_DEVICE_PATH (
EFI_PROGRESS_CODE,
(EFI_IO_BUS_USB | EFI_IOB_PC_RESET),
Ehc->DevicePath
);
}
OldTpl = gBS->RaiseTPL (EHC_TPL); OldTpl = gBS->RaiseTPL (EHC_TPL);
Ehc = EHC_FROM_THIS (This);
switch (Attributes) { switch (Attributes) {
case EFI_USB_HC_RESET_GLOBAL: case EFI_USB_HC_RESET_GLOBAL:
@ -1543,8 +1555,9 @@ EhcGetUsbDebugPortInfo (
**/ **/
USB2_HC_DEV * USB2_HC_DEV *
EhcCreateUsb2Hc ( EhcCreateUsb2Hc (
IN EFI_PCI_IO_PROTOCOL *PciIo, IN EFI_PCI_IO_PROTOCOL *PciIo,
IN UINT64 OriginalPciAttributes IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
IN UINT64 OriginalPciAttributes
) )
{ {
USB2_HC_DEV *Ehc; USB2_HC_DEV *Ehc;
@ -1578,6 +1591,7 @@ EhcCreateUsb2Hc (
Ehc->Usb2Hc.MinorRevision = 0x0; Ehc->Usb2Hc.MinorRevision = 0x0;
Ehc->PciIo = PciIo; Ehc->PciIo = PciIo;
Ehc->DevicePath = DevicePath;
Ehc->OriginalPciAttributes = OriginalPciAttributes; Ehc->OriginalPciAttributes = OriginalPciAttributes;
InitializeListHead (&Ehc->AsyncIntTransfers); InitializeListHead (&Ehc->AsyncIntTransfers);
@ -1684,6 +1698,7 @@ EhcDriverBindingStart (
UINTN EhciDeviceNumber; UINTN EhciDeviceNumber;
UINTN EhciFunctionNumber; UINTN EhciFunctionNumber;
UINT32 State; UINT32 State;
EFI_DEVICE_PATH_PROTOCOL *HcDevicePath;
// //
// Open the PciIo Protocol, then enable the USB host controller // Open the PciIo Protocol, then enable the USB host controller
@ -1701,6 +1716,19 @@ EhcDriverBindingStart (
return Status; return Status;
} }
//
// Open Device Path Protocol for on USB host controller
//
HcDevicePath = NULL;
Status = gBS->OpenProtocol (
Controller,
&gEfiDevicePathProtocolGuid,
(VOID **) &HcDevicePath,
This->DriverBindingHandle,
Controller,
EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
PciAttributesSaved = FALSE; PciAttributesSaved = FALSE;
// //
// Save original PCI attributes // Save original PCI attributes
@ -1842,7 +1870,7 @@ EhcDriverBindingStart (
// //
// Create then install USB2_HC_PROTOCOL // Create then install USB2_HC_PROTOCOL
// //
Ehc = EhcCreateUsb2Hc (PciIo, OriginalPciAttributes); Ehc = EhcCreateUsb2Hc (PciIo, HcDevicePath, OriginalPciAttributes);
if (Ehc == NULL) { if (Ehc == NULL) {
DEBUG ((EFI_D_ERROR, "EhcDriverBindingStart: failed to create USB2_HC\n")); DEBUG ((EFI_D_ERROR, "EhcDriverBindingStart: failed to create USB2_HC\n"));

View File

@ -32,6 +32,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#include <Library/BaseLib.h> #include <Library/BaseLib.h>
#include <Library/MemoryAllocationLib.h> #include <Library/MemoryAllocationLib.h>
#include <Library/PcdLib.h> #include <Library/PcdLib.h>
#include <Library/ReportStatusCodeLib.h>
#include <IndustryStandard/Pci.h> #include <IndustryStandard/Pci.h>
@ -115,6 +116,7 @@ struct _USB2_HC_DEV {
EFI_USB2_HC_PROTOCOL Usb2Hc; EFI_USB2_HC_PROTOCOL Usb2Hc;
EFI_PCI_IO_PROTOCOL *PciIo; EFI_PCI_IO_PROTOCOL *PciIo;
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
UINT64 OriginalPciAttributes; UINT64 OriginalPciAttributes;
USBHC_MEM_POOL *MemPool; USBHC_MEM_POOL *MemPool;

View File

@ -11,7 +11,7 @@
# This way avoids the control transfer on a shared port between EHCI and companion host # This way avoids the control transfer on a shared port between EHCI and companion host
# controller when UHCI gets attached earlier than EHCI and a USB 2.0 device inserts. # controller when UHCI gets attached earlier than EHCI and a USB 2.0 device inserts.
# #
# 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
@ -75,6 +75,7 @@
BaseMemoryLib BaseMemoryLib
DebugLib DebugLib
PcdLib PcdLib
ReportStatusCodeLib
[Guids] [Guids]
gEfiEventExitBootServicesGuid ## PRODUCES ## Event gEfiEventExitBootServicesGuid ## PRODUCES ## Event

View File

@ -8,7 +8,7 @@
PCI Root Bridges. So it means platform needs install PCI Root Bridge IO protocol for each PCI Root Bridges. So it means platform needs install PCI Root Bridge IO protocol for each
PCI Root Bus and install PCI Host Bridge Resource Allocation Protocol. PCI Root Bus and install PCI Host Bridge Resource Allocation Protocol.
Copyright (c) 2006 - 2009, 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
@ -239,7 +239,8 @@ PciBusDriverBindingStart (
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
// //
// Check RemainingDevicePath validation // Check RemainingDevicePath validation
@ -285,6 +286,28 @@ PciBusDriverBindingStart (
gFullEnumeration = (BOOLEAN) ((SearchHostBridgeHandle (Controller) ? FALSE : TRUE)); gFullEnumeration = (BOOLEAN) ((SearchHostBridgeHandle (Controller) ? FALSE : TRUE));
//
// Open Device Path Protocol for PCI root bridge
//
Status = gBS->OpenProtocol (
Controller,
&gEfiDevicePathProtocolGuid,
(VOID **) &ParentDevicePath,
This->DriverBindingHandle,
Controller,
EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
ASSERT_EFI_ERROR (Status);
//
// Report Status Code to indicate PCI bus starts
//
REPORT_STATUS_CODE_WITH_DEVICE_PATH (
EFI_PROGRESS_CODE,
(EFI_IO_BUS_PCI | EFI_IOB_PC_INIT),
ParentDevicePath
);
// //
// Enumerate the entire host bridge // Enumerate the entire host bridge
// After enumeration, a database that records all the device information will be created // After enumeration, a database that records all the device information will be created

View File

@ -1,7 +1,7 @@
/** @file /** @file
PCI eunmeration implementation on entire PCI bus system for PCI Bus module. PCI eunmeration implementation on entire PCI bus system for PCI Bus module.
Copyright (c) 2006 - 2011, 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
@ -2095,6 +2095,14 @@ PciHotPlugRequestNotify (
RootBridgeHandle = Temp->Handle; RootBridgeHandle = Temp->Handle;
if (Operation == EfiPciHotPlugRequestAdd) { if (Operation == EfiPciHotPlugRequestAdd) {
//
// Report Status Code to indicate hot plug happens
//
REPORT_STATUS_CODE_WITH_DEVICE_PATH (
EFI_PROGRESS_CODE,
(EFI_IO_BUS_PCI | EFI_IOB_PC_HOTPLUG),
Temp->DevicePath
);
if (NumberOfChildren != NULL) { if (NumberOfChildren != NULL) {
*NumberOfChildren = 0; *NumberOfChildren = 0;

View File

@ -2,7 +2,7 @@
The UHCI driver model and HC protocol routines. The UHCI driver model and HC protocol routines.
Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR> Copyright (c) 2004 - 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,7 +53,18 @@ Uhci2Reset (
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
Uhc = UHC_FROM_USB2_HC_PROTO (This); Uhc = UHC_FROM_USB2_HC_PROTO (This);
if (Uhc->DevicePath != NULL) {
//
// Report Status Code to indicate reset happens
//
REPORT_STATUS_CODE_WITH_DEVICE_PATH (
EFI_PROGRESS_CODE,
(EFI_IO_BUS_USB | EFI_IOB_PC_RESET),
Uhc->DevicePath
);
}
OldTpl = gBS->RaiseTPL (UHCI_TPL); OldTpl = gBS->RaiseTPL (UHCI_TPL);
@ -1425,8 +1436,9 @@ ON_EXIT:
**/ **/
USB_HC_DEV * USB_HC_DEV *
UhciAllocateDev ( UhciAllocateDev (
IN EFI_PCI_IO_PROTOCOL *PciIo, IN EFI_PCI_IO_PROTOCOL *PciIo,
IN UINT64 OriginalPciAttributes IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
IN UINT64 OriginalPciAttributes
) )
{ {
USB_HC_DEV *Uhc; USB_HC_DEV *Uhc;
@ -1460,6 +1472,7 @@ UhciAllocateDev (
Uhc->Usb2Hc.MinorRevision = 0x1; Uhc->Usb2Hc.MinorRevision = 0x1;
Uhc->PciIo = PciIo; Uhc->PciIo = PciIo;
Uhc->DevicePath = DevicePath;
Uhc->OriginalPciAttributes = OriginalPciAttributes; Uhc->OriginalPciAttributes = OriginalPciAttributes;
Uhc->MemPool = UsbHcInitMemPool (PciIo, TRUE, 0); Uhc->MemPool = UsbHcInitMemPool (PciIo, TRUE, 0);
@ -1622,6 +1635,7 @@ UhciDriverBindingStart (
UINT64 Supports; UINT64 Supports;
UINT64 OriginalPciAttributes; UINT64 OriginalPciAttributes;
BOOLEAN PciAttributesSaved; BOOLEAN PciAttributesSaved;
EFI_DEVICE_PATH_PROTOCOL *HcDevicePath;
// //
// Open PCIIO, then enable the EHC device and turn off emulation // Open PCIIO, then enable the EHC device and turn off emulation
@ -1640,6 +1654,19 @@ UhciDriverBindingStart (
return Status; return Status;
} }
//
// Open Device Path Protocol for on USB host controller
//
HcDevicePath = NULL;
Status = gBS->OpenProtocol (
Controller,
&gEfiDevicePathProtocolGuid,
(VOID **) &HcDevicePath,
This->DriverBindingHandle,
Controller,
EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
PciAttributesSaved = FALSE; PciAttributesSaved = FALSE;
// //
// Save original PCI attributes // Save original PCI attributes
@ -1684,7 +1711,7 @@ UhciDriverBindingStart (
goto CLOSE_PCIIO; goto CLOSE_PCIIO;
} }
Uhc = UhciAllocateDev (PciIo, OriginalPciAttributes); Uhc = UhciAllocateDev (PciIo, HcDevicePath, OriginalPciAttributes);
if (Uhc == NULL) { if (Uhc == NULL) {
Status = EFI_OUT_OF_RESOURCES; Status = EFI_OUT_OF_RESOURCES;

View File

@ -2,7 +2,7 @@
The definition for UHCI driver model and HC protocol routines. The definition for UHCI driver model and HC protocol routines.
Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR> Copyright (c) 2004 - 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
@ -33,6 +33,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#include <Library/BaseLib.h> #include <Library/BaseLib.h>
#include <Library/MemoryAllocationLib.h> #include <Library/MemoryAllocationLib.h>
#include <Library/PcdLib.h> #include <Library/PcdLib.h>
#include <Library/ReportStatusCodeLib.h>
#include <IndustryStandard/Pci.h> #include <IndustryStandard/Pci.h>
@ -112,6 +113,7 @@ struct _USB_HC_DEV {
UINT32 Signature; UINT32 Signature;
EFI_USB2_HC_PROTOCOL Usb2Hc; EFI_USB2_HC_PROTOCOL Usb2Hc;
EFI_PCI_IO_PROTOCOL *PciIo; EFI_PCI_IO_PROTOCOL *PciIo;
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
UINT64 OriginalPciAttributes; UINT64 OriginalPciAttributes;
// //

View File

@ -6,7 +6,7 @@
# It implements the interfaces of monitoring the status of all ports and transferring # It implements the interfaces of monitoring the status of all ports and transferring
# Control, Bulk, Interrupt and Isochronous requests to Usb1.x device # Control, Bulk, Interrupt and Isochronous requests to Usb1.x device
# #
# 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
@ -71,6 +71,7 @@
BaseMemoryLib BaseMemoryLib
DebugLib DebugLib
PcdLib PcdLib
ReportStatusCodeLib
[Guids] [Guids]
gEfiEventExitBootServicesGuid ## PRODUCES ## Event gEfiEventExitBootServicesGuid ## PRODUCES ## Event

View File

@ -140,16 +140,27 @@ XhcReset (
) )
{ {
USB_XHCI_INSTANCE *Xhc; USB_XHCI_INSTANCE *Xhc;
EFI_STATUS Status; EFI_STATUS Status;
EFI_TPL OldTpl; EFI_TPL OldTpl;
OldTpl = gBS->RaiseTPL (XHC_TPL); Xhc = XHC_FROM_THIS (This);
Xhc = XHC_FROM_THIS (This); if (Xhc->DevicePath != NULL) {
//
switch (Attributes) { // Report Status Code to indicate reset happens
case EFI_USB_HC_RESET_GLOBAL: //
// REPORT_STATUS_CODE_WITH_DEVICE_PATH (
EFI_PROGRESS_CODE,
(EFI_IO_BUS_USB | EFI_IOB_PC_RESET),
Xhc->DevicePath
);
}
OldTpl = gBS->RaiseTPL (XHC_TPL);
switch (Attributes) {
case EFI_USB_HC_RESET_GLOBAL:
//
// Flow through, same behavior as Host Controller Reset // Flow through, same behavior as Host Controller Reset
// //
case EFI_USB_HC_RESET_HOST_CONTROLLER: case EFI_USB_HC_RESET_HOST_CONTROLLER:
@ -1678,14 +1689,15 @@ ON_EXIT:
@return The allocated and initialized USB_XHCI_INSTANCE structure if created, @return The allocated and initialized USB_XHCI_INSTANCE structure if created,
otherwise NULL. otherwise NULL.
**/ **/
USB_XHCI_INSTANCE* USB_XHCI_INSTANCE*
XhcCreateUsbHc ( XhcCreateUsbHc (
IN EFI_PCI_IO_PROTOCOL *PciIo, IN EFI_PCI_IO_PROTOCOL *PciIo,
IN UINT64 OriginalPciAttributes IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
) IN UINT64 OriginalPciAttributes
{ )
USB_XHCI_INSTANCE *Xhc; {
USB_XHCI_INSTANCE *Xhc;
EFI_STATUS Status; EFI_STATUS Status;
UINT32 PageSize; UINT32 PageSize;
UINT16 ExtCapReg; UINT16 ExtCapReg;
@ -1698,12 +1710,13 @@ XhcCreateUsbHc (
// //
// Initialize private data structure // Initialize private data structure
// //
Xhc->Signature = XHCI_INSTANCE_SIG; Xhc->Signature = XHCI_INSTANCE_SIG;
Xhc->PciIo = PciIo; Xhc->PciIo = PciIo;
Xhc->OriginalPciAttributes = OriginalPciAttributes; Xhc->DevicePath = DevicePath;
CopyMem (&Xhc->Usb2Hc, &gXhciUsb2HcTemplate, sizeof (EFI_USB2_HC_PROTOCOL)); Xhc->OriginalPciAttributes = OriginalPciAttributes;
CopyMem (&Xhc->Usb2Hc, &gXhciUsb2HcTemplate, sizeof (EFI_USB2_HC_PROTOCOL));
InitializeListHead (&Xhc->AsyncIntTransfers); InitializeListHead (&Xhc->AsyncIntTransfers);
// //
@ -1827,12 +1840,13 @@ XhcDriverBindingStart (
EFI_STATUS Status; EFI_STATUS Status;
EFI_PCI_IO_PROTOCOL *PciIo; EFI_PCI_IO_PROTOCOL *PciIo;
UINT64 Supports; UINT64 Supports;
UINT64 OriginalPciAttributes; UINT64 OriginalPciAttributes;
BOOLEAN PciAttributesSaved; BOOLEAN PciAttributesSaved;
USB_XHCI_INSTANCE *Xhc; USB_XHCI_INSTANCE *Xhc;
EFI_DEVICE_PATH_PROTOCOL *HcDevicePath;
//
// Open the PciIo Protocol, then enable the USB host controller //
// Open the PciIo Protocol, then enable the USB host controller
// //
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
@ -1844,12 +1858,25 @@ XhcDriverBindingStart (
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
PciAttributesSaved = FALSE; //
// // Open Device Path Protocol for on USB host controller
// Save original PCI attributes //
HcDevicePath = NULL;
Status = gBS->OpenProtocol (
Controller,
&gEfiDevicePathProtocolGuid,
(VOID **) &HcDevicePath,
This->DriverBindingHandle,
Controller,
EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
PciAttributesSaved = FALSE;
//
// Save original PCI attributes
// //
Status = PciIo->Attributes ( Status = PciIo->Attributes (
PciIo, PciIo,
@ -1884,13 +1911,13 @@ XhcDriverBindingStart (
goto CLOSE_PCIIO; goto CLOSE_PCIIO;
} }
// //
// Create then install USB2_HC_PROTOCOL // Create then install USB2_HC_PROTOCOL
// //
Xhc = XhcCreateUsbHc (PciIo, OriginalPciAttributes); Xhc = XhcCreateUsbHc (PciIo, HcDevicePath, OriginalPciAttributes);
if (Xhc == NULL) { if (Xhc == NULL) {
DEBUG ((EFI_D_ERROR, "XhcDriverBindingStart: failed to create USB2_HC\n")); DEBUG ((EFI_D_ERROR, "XhcDriverBindingStart: failed to create USB2_HC\n"));
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }

View File

@ -30,6 +30,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#include <Library/MemoryAllocationLib.h> #include <Library/MemoryAllocationLib.h>
#include <Library/UefiLib.h> #include <Library/UefiLib.h>
#include <Library/DebugLib.h> #include <Library/DebugLib.h>
#include <Library/ReportStatusCodeLib.h>
#include <IndustryStandard/Pci.h> #include <IndustryStandard/Pci.h>

View File

@ -6,7 +6,7 @@
# It implements the interfaces of monitoring the status of all ports and transferring # It implements the interfaces of monitoring the status of all ports and transferring
# Control, Bulk, Interrupt and Isochronous requests to those attached usb LS/FS/HS/SS devices. # Control, Bulk, Interrupt and Isochronous requests to those attached usb LS/FS/HS/SS devices.
# #
# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR> # Copyright (c) 2011 - 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
@ -59,6 +59,7 @@
UefiDriverEntryPoint UefiDriverEntryPoint
BaseMemoryLib BaseMemoryLib
DebugLib DebugLib
ReportStatusCodeLib
[Guids] [Guids]
gEfiEventExitBootServicesGuid ## PRODUCES ## Event gEfiEventExitBootServicesGuid ## PRODUCES ## Event

View File

@ -2,7 +2,7 @@
SCSI Bus driver that layers on every SCSI Pass Thru and SCSI Bus driver that layers on every SCSI Pass Thru and
Extended SCSI Pass Thru protocol in the system. Extended SCSI Pass Thru protocol in the system.
Copyright (c) 2006 - 2011, 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
@ -341,6 +341,15 @@ SCSIBusDriverBindingStart (
return DevicePathStatus; return DevicePathStatus;
} }
//
// Report Status Code to indicate SCSI bus starts
//
REPORT_STATUS_CODE_WITH_DEVICE_PATH (
EFI_PROGRESS_CODE,
(EFI_IO_BUS_SCSI | EFI_IOB_PC_INIT),
ParentDevicePath
);
// //
// To keep backward compatibility, UEFI ExtPassThru Protocol is supported as well as // To keep backward compatibility, UEFI ExtPassThru Protocol is supported as well as
// EFI PassThru Protocol. From priority perspective, ExtPassThru Protocol is firstly // EFI PassThru Protocol. From priority perspective, ExtPassThru Protocol is firstly
@ -451,6 +460,15 @@ SCSIBusDriverBindingStart (
ScsiBusDev = SCSI_BUS_CONTROLLER_DEVICE_FROM_THIS (BusIdentify); ScsiBusDev = SCSI_BUS_CONTROLLER_DEVICE_FROM_THIS (BusIdentify);
} }
//
// Report Status Code to indicate detecting devices on bus
//
REPORT_STATUS_CODE_WITH_DEVICE_PATH (
EFI_PROGRESS_CODE,
(EFI_IO_BUS_SCSI | EFI_IOB_PC_DETECT),
ParentDevicePath
);
Lun = 0; Lun = 0;
if (RemainingDevicePath == NULL) { if (RemainingDevicePath == NULL) {
// //
@ -828,6 +846,15 @@ ScsiResetBus (
ScsiIoDevice = SCSI_IO_DEV_FROM_THIS (This); ScsiIoDevice = SCSI_IO_DEV_FROM_THIS (This);
//
// Report Status Code to indicate reset happens
//
REPORT_STATUS_CODE_WITH_DEVICE_PATH (
EFI_PROGRESS_CODE,
(EFI_IO_BUS_ATA_ATAPI | EFI_IOB_PC_RESET),
ScsiIoDevice->ScsiBusDeviceData->DevicePath
);
if (ScsiIoDevice->ExtScsiSupport){ if (ScsiIoDevice->ExtScsiSupport){
return ScsiIoDevice->ExtScsiPassThru->ResetChannel (ScsiIoDevice->ExtScsiPassThru); return ScsiIoDevice->ExtScsiPassThru->ResetChannel (ScsiIoDevice->ExtScsiPassThru);
} else { } else {
@ -857,6 +884,16 @@ ScsiResetDevice (
UINT8 Target[TARGET_MAX_BYTES]; UINT8 Target[TARGET_MAX_BYTES];
ScsiIoDevice = SCSI_IO_DEV_FROM_THIS (This); ScsiIoDevice = SCSI_IO_DEV_FROM_THIS (This);
//
// Report Status Code to indicate reset happens
//
REPORT_STATUS_CODE_WITH_DEVICE_PATH (
EFI_PROGRESS_CODE,
(EFI_IO_BUS_ATA_ATAPI | EFI_IOB_PC_RESET),
ScsiIoDevice->ScsiBusDeviceData->DevicePath
);
CopyMem (Target,&ScsiIoDevice->Pun, TARGET_MAX_BYTES); CopyMem (Target,&ScsiIoDevice->Pun, TARGET_MAX_BYTES);
@ -1121,6 +1158,7 @@ ScsiScanCreateDevice (
} }
ScsiIoDevice->Signature = SCSI_IO_DEV_SIGNATURE; ScsiIoDevice->Signature = SCSI_IO_DEV_SIGNATURE;
ScsiIoDevice->ScsiBusDeviceData = ScsiBusDev;
CopyMem(&ScsiIoDevice->Pun, TargetId, TARGET_MAX_BYTES); CopyMem(&ScsiIoDevice->Pun, TargetId, TARGET_MAX_BYTES);
ScsiIoDevice->Lun = Lun; ScsiIoDevice->Lun = Lun;
@ -1141,6 +1179,15 @@ ScsiScanCreateDevice (
ScsiIoDevice->ScsiIo.ResetDevice = ScsiResetDevice; ScsiIoDevice->ScsiIo.ResetDevice = ScsiResetDevice;
ScsiIoDevice->ScsiIo.ExecuteScsiCommand = ScsiExecuteSCSICommand; ScsiIoDevice->ScsiIo.ExecuteScsiCommand = ScsiExecuteSCSICommand;
//
// Report Status Code here since the new SCSI device will be discovered
//
REPORT_STATUS_CODE_WITH_DEVICE_PATH (
EFI_PROGRESS_CODE,
(EFI_IO_BUS_SCSI | EFI_IOB_PC_ENABLE),
ScsiBusDev->DevicePath
);
if (!DiscoverScsiDevice (ScsiIoDevice)) { if (!DiscoverScsiDevice (ScsiIoDevice)) {
Status = EFI_OUT_OF_RESOURCES; Status = EFI_OUT_OF_RESOURCES;
goto ErrorExit; goto ErrorExit;

View File

@ -1,7 +1,7 @@
/** @file /** @file
Header file for SCSI Bus Driver. Header file for SCSI Bus Driver.
Copyright (c) 2006 - 2011, 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
@ -33,6 +33,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#include <Library/UefiScsiLib.h> #include <Library/UefiScsiLib.h>
#include <Library/UefiBootServicesTableLib.h> #include <Library/UefiBootServicesTableLib.h>
#include <Library/DevicePathLib.h> #include <Library/DevicePathLib.h>
#include <Library/ReportStatusCodeLib.h>
#include <IndustryStandard/Scsi.h> #include <IndustryStandard/Scsi.h>
@ -54,27 +55,10 @@ typedef struct {
VOID *Data2; VOID *Data2;
} SCSI_EVENT_DATA; } SCSI_EVENT_DATA;
typedef struct {
UINT32 Signature;
EFI_HANDLE Handle;
EFI_SCSI_IO_PROTOCOL ScsiIo;
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
BOOLEAN ExtScsiSupport;
EFI_SCSI_PASS_THRU_PROTOCOL *ScsiPassThru;
EFI_EXT_SCSI_PASS_THRU_PROTOCOL *ExtScsiPassThru;
SCSI_TARGET_ID Pun;
UINT64 Lun;
UINT8 ScsiDeviceType;
UINT8 ScsiVersion;
BOOLEAN RemovableDevice;
} SCSI_IO_DEV;
#define SCSI_IO_DEV_FROM_THIS(a) CR (a, SCSI_IO_DEV, ScsiIo, SCSI_IO_DEV_SIGNATURE)
// //
// SCSI Bus Controller device strcuture // SCSI Bus Controller device strcuture
// //
#define SCSI_BUS_DEVICE_SIGNATURE SIGNATURE_32 ('s', 'c', 's', 'i')
// //
// The ScsiBusProtocol is just used to locate ScsiBusDev // The ScsiBusProtocol is just used to locate ScsiBusDev
@ -87,9 +71,6 @@ typedef struct _EFI_SCSI_BUS_PROTOCOL {
UINT64 Reserved; UINT64 Reserved;
} EFI_SCSI_BUS_PROTOCOL; } EFI_SCSI_BUS_PROTOCOL;
#define SCSI_BUS_DEVICE_SIGNATURE SIGNATURE_32 ('s', 'c', 's', 'i')
typedef struct _SCSI_BUS_DEVICE { typedef struct _SCSI_BUS_DEVICE {
UINTN Signature; UINTN Signature;
EFI_SCSI_BUS_PROTOCOL BusIdentify; EFI_SCSI_BUS_PROTOCOL BusIdentify;
@ -101,6 +82,24 @@ typedef struct _SCSI_BUS_DEVICE {
#define SCSI_BUS_CONTROLLER_DEVICE_FROM_THIS(a) CR (a, SCSI_BUS_DEVICE, BusIdentify, SCSI_BUS_DEVICE_SIGNATURE) #define SCSI_BUS_CONTROLLER_DEVICE_FROM_THIS(a) CR (a, SCSI_BUS_DEVICE, BusIdentify, SCSI_BUS_DEVICE_SIGNATURE)
typedef struct {
UINT32 Signature;
EFI_HANDLE Handle;
EFI_SCSI_IO_PROTOCOL ScsiIo;
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
BOOLEAN ExtScsiSupport;
EFI_SCSI_PASS_THRU_PROTOCOL *ScsiPassThru;
EFI_EXT_SCSI_PASS_THRU_PROTOCOL *ExtScsiPassThru;
SCSI_BUS_DEVICE *ScsiBusDeviceData;
SCSI_TARGET_ID Pun;
UINT64 Lun;
UINT8 ScsiDeviceType;
UINT8 ScsiVersion;
BOOLEAN RemovableDevice;
} SCSI_IO_DEV;
#define SCSI_IO_DEV_FROM_THIS(a) CR (a, SCSI_IO_DEV, ScsiIo, SCSI_IO_DEV_SIGNATURE)
// //
// Global Variables // Global Variables
// //

View File

@ -4,7 +4,7 @@
# each of them. After this the driver installs the Device Path Protocol and SCSI I/O Protocol on # each of them. After this the driver installs the Device Path Protocol and SCSI I/O Protocol on
# these handles. # these handles.
# #
# 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
@ -55,6 +55,7 @@
UefiDriverEntryPoint UefiDriverEntryPoint
DebugLib DebugLib
MemoryAllocationLib MemoryAllocationLib
ReportStatusCodeLib
[Protocols] [Protocols]

View File

@ -2,7 +2,7 @@
Usb Bus Driver Binding and Bus IO Protocol. Usb Bus Driver Binding and Bus IO Protocol.
Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR> Copyright (c) 2004 - 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
@ -1018,7 +1018,16 @@ UsbBusBuildProtocol (
RootIf->Signature = USB_INTERFACE_SIGNATURE; RootIf->Signature = USB_INTERFACE_SIGNATURE;
RootIf->Device = RootHub; RootIf->Device = RootHub;
RootIf->DevicePath = UsbBus->DevicePath; RootIf->DevicePath = UsbBus->DevicePath;
//
// Report Status Code here since we will enumerate the USB devices
//
REPORT_STATUS_CODE_WITH_DEVICE_PATH (
EFI_PROGRESS_CODE,
(EFI_IO_BUS_USB | EFI_IOB_PC_DETECT),
UsbBus->DevicePath
);
Status = mUsbRootHubApi.Init (RootIf); Status = mUsbRootHubApi.Init (RootIf);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
@ -1265,6 +1274,26 @@ UsbBusControllerDriverStart (
{ {
EFI_USB_BUS_PROTOCOL *UsbBusId; EFI_USB_BUS_PROTOCOL *UsbBusId;
EFI_STATUS Status; EFI_STATUS Status;
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
Status = gBS->OpenProtocol (
Controller,
&gEfiDevicePathProtocolGuid,
(VOID **) &ParentDevicePath,
This->DriverBindingHandle,
Controller,
EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
ASSERT_EFI_ERROR (Status);
//
// Report Status Code here since we will initialize the host controller
//
REPORT_STATUS_CODE_WITH_DEVICE_PATH (
EFI_PROGRESS_CODE,
(EFI_IO_BUS_USB | EFI_IOB_PC_INIT),
ParentDevicePath
);
// //
// Locate the USB bus protocol, if it is found, USB bus // Locate the USB bus protocol, if it is found, USB bus

View File

@ -803,6 +803,14 @@ UsbEnumerateNewDev (
goto ON_ERROR; goto ON_ERROR;
} }
//
// Report Status Code to indicate USB device has been detected by hotplug
//
REPORT_STATUS_CODE_WITH_DEVICE_PATH (
EFI_PROGRESS_CODE,
(EFI_IO_BUS_USB | EFI_IOB_PC_HOTPLUG),
Bus->DevicePath
);
return EFI_SUCCESS; return EFI_SUCCESS;
ON_ERROR: ON_ERROR:

View File

@ -244,12 +244,25 @@ USBKeyboardDriverBindingStart (
if (!Found) { if (!Found) {
// //
// Report Status Code to indicate that there is no USB keyboard
//
REPORT_STATUS_CODE (
EFI_ERROR_CODE | EFI_ERROR_MINOR,
(EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_NOT_DETECTED)
);
//
// No interrupt endpoint found, then return unsupported. // No interrupt endpoint found, then return unsupported.
// //
Status = EFI_UNSUPPORTED; Status = EFI_UNSUPPORTED;
goto ErrorExit; goto ErrorExit;
} }
REPORT_STATUS_CODE_WITH_DEVICE_PATH (
EFI_PROGRESS_CODE,
(EFI_PERIPHERAL_KEYBOARD | EFI_P_PC_DETECTED),
UsbKeyboardDevice->DevicePath
);
UsbKeyboardDevice->Signature = USB_KB_DEV_SIGNATURE; UsbKeyboardDevice->Signature = USB_KB_DEV_SIGNATURE;
UsbKeyboardDevice->SimpleInput.Reset = USBKeyboardReset; UsbKeyboardDevice->SimpleInput.Reset = USBKeyboardReset;
UsbKeyboardDevice->SimpleInput.ReadKeyStroke = USBKeyboardReadKeyStroke; UsbKeyboardDevice->SimpleInput.ReadKeyStroke = USBKeyboardReadKeyStroke;

View File

@ -188,6 +188,16 @@ USBMouseAbsolutePointerDriverBindingStart (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto ErrorExit; goto ErrorExit;
} }
//
// Report Status Code here since USB mouse will be detected next.
//
REPORT_STATUS_CODE_WITH_DEVICE_PATH (
EFI_PROGRESS_CODE,
(EFI_PERIPHERAL_MOUSE | EFI_P_PC_PRESENCE_DETECT),
UsbMouseDevice->DevicePath
);
// //
// Get interface & endpoint descriptor // Get interface & endpoint descriptor
// //
@ -221,12 +231,28 @@ USBMouseAbsolutePointerDriverBindingStart (
if (!Found) { if (!Found) {
// //
// Report Status Code to indicate that there is no USB mouse
//
REPORT_STATUS_CODE (
EFI_ERROR_CODE | EFI_ERROR_MINOR,,
(EFI_PERIPHERAL_MOUSE | EFI_P_EC_NOT_DETECTED)
);
//
// No interrupt endpoint found, then return unsupported. // No interrupt endpoint found, then return unsupported.
// //
Status = EFI_UNSUPPORTED; Status = EFI_UNSUPPORTED;
goto ErrorExit; goto ErrorExit;
} }
//
// Report Status Code here since USB mouse has be detected.
//
REPORT_STATUS_CODE_WITH_DEVICE_PATH (
EFI_PROGRESS_CODE,
(EFI_PERIPHERAL_MOUSE | EFI_P_PC_DETECTED),
UsbMouseDevice->DevicePath
);
Status = InitializeUsbMouseDevice (UsbMouseAbsolutePointerDevice); Status = InitializeUsbMouseDevice (UsbMouseAbsolutePointerDevice);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
// //

View File

@ -188,6 +188,16 @@ USBMouseDriverBindingStart (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto ErrorExit; goto ErrorExit;
} }
//
// Report Status Code here since USB mouse will be detected next.
//
REPORT_STATUS_CODE_WITH_DEVICE_PATH (
EFI_PROGRESS_CODE,
(EFI_PERIPHERAL_MOUSE | EFI_P_PC_PRESENCE_DETECT),
UsbMouseDevice->DevicePath
);
// //
// Get interface & endpoint descriptor // Get interface & endpoint descriptor
// //
@ -221,12 +231,28 @@ USBMouseDriverBindingStart (
if (!Found) { if (!Found) {
// //
// Report Status Code to indicate that there is no USB mouse
//
REPORT_STATUS_CODE (
EFI_ERROR_CODE | EFI_ERROR_MINOR,
(EFI_PERIPHERAL_MOUSE | EFI_P_EC_NOT_DETECTED)
);
//
// No interrupt endpoint found, then return unsupported. // No interrupt endpoint found, then return unsupported.
// //
Status = EFI_UNSUPPORTED; Status = EFI_UNSUPPORTED;
goto ErrorExit; goto ErrorExit;
} }
//
// Report Status Code here since USB mouse has be detected.
//
REPORT_STATUS_CODE_WITH_DEVICE_PATH (
EFI_PROGRESS_CODE,
(EFI_PERIPHERAL_MOUSE | EFI_P_PC_DETECTED),
UsbMouseDevice->DevicePath
);
Status = InitializeUsbMouseDevice (UsbMouseDevice); Status = InitializeUsbMouseDevice (UsbMouseDevice);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
// //

View File

@ -448,7 +448,17 @@ DxeMain (
// //
// Assert if the Architectural Protocols are not present. // Assert if the Architectural Protocols are not present.
// //
ASSERT_EFI_ERROR (CoreAllEfiServicesAvailable ()); Status = CoreAllEfiServicesAvailable ();
if (EFI_ERROR(Status)) {
//
// Report Status code that some Architectural Protocols are not present.
//
REPORT_STATUS_CODE (
EFI_ERROR_CODE | EFI_ERROR_MAJOR,
(EFI_SOFTWARE_DXE_CORE | EFI_SW_DXE_CORE_EC_NO_ARCH)
);
}
ASSERT_EFI_ERROR (Status);
// //
// Report Status code before transfer control to BDS // Report Status code before transfer control to BDS

View File

@ -2,7 +2,7 @@
Last PEIM. Last PEIM.
Responsibility of this module is to load the DXE Core from a Firmware Volume. Responsibility of this module is to load the DXE Core from a Firmware Volume.
Copyright (c) 2006 - 2011, 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
@ -221,25 +221,49 @@ DxeLoadCore (
NULL, NULL,
(VOID **) &S3Resume (VOID **) &S3Resume
); );
if (EFI_ERROR (Status)) {
//
// Report Status code that S3Resume PPI can not be found
//
REPORT_STATUS_CODE (
EFI_ERROR_CODE | EFI_ERROR_MAJOR,
(EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_EC_S3_RESUME_PPI_NOT_FOUND)
);
}
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
Status = S3Resume->S3RestoreConfig2 (S3Resume); Status = S3Resume->S3RestoreConfig2 (S3Resume);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
} else if (BootMode == BOOT_IN_RECOVERY_MODE) { } else if (BootMode == BOOT_IN_RECOVERY_MODE) {
REPORT_STATUS_CODE (EFI_PROGRESS_CODE, (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_PC_RECOVERY_BEGIN));
Status = PeiServicesLocatePpi ( Status = PeiServicesLocatePpi (
&gEfiPeiRecoveryModulePpiGuid, &gEfiPeiRecoveryModulePpiGuid,
0, 0,
NULL, NULL,
(VOID **) &PeiRecovery (VOID **) &PeiRecovery
); );
//
// Report Status code the failure of locating Recovery PPI
//
REPORT_STATUS_CODE (
EFI_ERROR_CODE | EFI_ERROR_MAJOR,
(EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_EC_RECOVERY_PPI_NOT_FOUND)
);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
REPORT_STATUS_CODE (EFI_PROGRESS_CODE, (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_PC_CAPSULE_LOAD));
Status = PeiRecovery->LoadRecoveryCapsule (PeiServices, PeiRecovery); Status = PeiRecovery->LoadRecoveryCapsule (PeiServices, PeiRecovery);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "Load Recovery Capsule Failed.(Status = %r)\n", Status)); DEBUG ((DEBUG_ERROR, "Load Recovery Capsule Failed.(Status = %r)\n", Status));
//
// Report Status code that S3Resume PPI can not be found
//
REPORT_STATUS_CODE (
EFI_ERROR_CODE | EFI_ERROR_MAJOR,
(EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_EC_NO_RECOVERY_CAPSULE)
);
CpuDeadLoop (); CpuDeadLoop ();
} }
REPORT_STATUS_CODE (EFI_PROGRESS_CODE, (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_PC_CAPSULE_START));
// //
// Now should have a HOB with the DXE core // Now should have a HOB with the DXE core
// //

View File

@ -48,6 +48,13 @@ PeiResetSystem (
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
return ResetPpi->ResetSystem (PeiServices); return ResetPpi->ResetSystem (PeiServices);
} }
//
// Report Status Code that Reset PPI is not available
//
REPORT_STATUS_CODE (
EFI_ERROR_CODE | EFI_ERROR_MINOR,
(EFI_SOFTWARE_PEI_CORE | EFI_SW_PS_EC_RESET_NOT_AVAILABLE)
);
return EFI_NOT_AVAILABLE_YET; return EFI_NOT_AVAILABLE_YET;
} }

View File

@ -35,7 +35,7 @@ Revision History:
Table now contains an item named CalculateCrc32. Table now contains an item named CalculateCrc32.
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
@ -279,6 +279,11 @@ RuntimeDriverSetVirtualAddressMap (
// //
REPORT_STATUS_CODE (EFI_PROGRESS_CODE, (EFI_SOFTWARE_EFI_RUNTIME_SERVICE | EFI_SW_RS_PC_SET_VIRTUAL_ADDRESS_MAP)); REPORT_STATUS_CODE (EFI_PROGRESS_CODE, (EFI_SOFTWARE_EFI_RUNTIME_SERVICE | EFI_SW_RS_PC_SET_VIRTUAL_ADDRESS_MAP));
//
// Report Status Code here since EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE event will be signaled.
//
REPORT_STATUS_CODE (EFI_PROGRESS_CODE, (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_PC_VIRTUAL_ADDRESS_CHANGE_EVENT));
// //
// Signal all the EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE events. // Signal all the EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE events.
// All runtime events are stored in a list in Runtime AP. // All runtime events are stored in a list in Runtime AP.

View File

@ -1,7 +1,7 @@
/** @file /** @file
Definitions for data structures used in S3 resume. Definitions for data structures used in S3 resume.
Copyright (c) 2011, Intel Corporation. All rights reserved.<BR> Copyright (c) 2011 - 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 are licensed and made available under the terms and conditions
@ -22,6 +22,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#define SMM_S3_RESUME_SMM_32 SIGNATURE_64 ('S','M','M','S','3','_','3','2') #define SMM_S3_RESUME_SMM_32 SIGNATURE_64 ('S','M','M','S','3','_','3','2')
#define SMM_S3_RESUME_SMM_64 SIGNATURE_64 ('S','M','M','S','3','_','6','4') #define SMM_S3_RESUME_SMM_64 SIGNATURE_64 ('S','M','M','S','3','_','6','4')
#pragma pack(1)
typedef struct { typedef struct {
UINT64 Signature; UINT64 Signature;
EFI_PHYSICAL_ADDRESS SmmS3ResumeEntryPoint; EFI_PHYSICAL_ADDRESS SmmS3ResumeEntryPoint;
@ -50,12 +52,15 @@ typedef struct {
typedef struct { typedef struct {
UINT16 ReturnCs; UINT16 ReturnCs;
UINT64 ReturnStatus;
EFI_PHYSICAL_ADDRESS ReturnEntryPoint; EFI_PHYSICAL_ADDRESS ReturnEntryPoint;
EFI_PHYSICAL_ADDRESS ReturnStackPointer; EFI_PHYSICAL_ADDRESS ReturnStackPointer;
EFI_PHYSICAL_ADDRESS AsmTransferControl; EFI_PHYSICAL_ADDRESS AsmTransferControl;
IA32_DESCRIPTOR Idtr; IA32_DESCRIPTOR Idtr;
} PEI_S3_RESUME_STATE; } PEI_S3_RESUME_STATE;
#pragma pack()
#define EFI_ACPI_S3_CONTEXT_GUID \ #define EFI_ACPI_S3_CONTEXT_GUID \
{ \ { \
0xef98d3a, 0x3e33, 0x497a, {0xa4, 0x1, 0x77, 0xbe, 0x3e, 0xb7, 0x4f, 0x38} \ 0xef98d3a, 0x3e33, 0x497a, {0xa4, 0x1, 0x77, 0xbe, 0x3e, 0xb7, 0x4f, 0x38} \

View File

@ -68,9 +68,12 @@ S3BootScriptExecutorEntryFunction (
// for that parameter. // for that parameter.
// //
Status = S3BootScriptExecute (); Status = S3BootScriptExecute ();
if (EFI_ERROR (Status)) {
return Status; //
} // Need report status back to S3ResumePeim.
// If boot script execution is failed, S3ResumePeim wil report the error status code.
//
PeiS3ResumeState->ReturnStatus = (UINT64)(UINTN)Status;
AsmWbinvd (); AsmWbinvd ();
@ -79,13 +82,6 @@ S3BootScriptExecutorEntryFunction (
// //
Facs = (EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *) ((UINTN) (AcpiS3Context->AcpiFacsTable)); Facs = (EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *) ((UINTN) (AcpiS3Context->AcpiFacsTable));
if ((Facs == NULL) ||
(Facs->Signature != EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE) ||
((Facs->FirmwareWakingVector == 0) && (Facs->XFirmwareWakingVector == 0)) ) {
CpuDeadLoop();
return EFI_INVALID_PARAMETER;
}
// //
// We need turn back to S3Resume - install boot script done ppi and report status code on S3resume. // We need turn back to S3Resume - install boot script done ppi and report status code on S3resume.
// //
@ -97,12 +93,16 @@ S3BootScriptExecutorEntryFunction (
DEBUG ((EFI_D_ERROR, "Call AsmDisablePaging64() to return to S3 Resume in PEI Phase\n")); DEBUG ((EFI_D_ERROR, "Call AsmDisablePaging64() to return to S3 Resume in PEI Phase\n"));
PeiS3ResumeState->AsmTransferControl = (EFI_PHYSICAL_ADDRESS)(UINTN)AsmTransferControl32; PeiS3ResumeState->AsmTransferControl = (EFI_PHYSICAL_ADDRESS)(UINTN)AsmTransferControl32;
// if ((Facs != NULL) &&
// more step needed - because relative address is handled differently between X64 and IA32. (Facs->Signature == EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE) &&
// (Facs->FirmwareWakingVector != 0) ) {
AsmTransferControl16Address = (UINTN)AsmTransferControl16; //
AsmFixAddress16 = (UINT32)AsmTransferControl16Address; // more step needed - because relative address is handled differently between X64 and IA32.
AsmJmpAddr32 = (UINT32)((Facs->FirmwareWakingVector & 0xF) | ((Facs->FirmwareWakingVector & 0xFFFF0) << 12)); //
AsmTransferControl16Address = (UINTN)AsmTransferControl16;
AsmFixAddress16 = (UINT32)AsmTransferControl16Address;
AsmJmpAddr32 = (UINT32)((Facs->FirmwareWakingVector & 0xF) | ((Facs->FirmwareWakingVector & 0xFFFF0) << 12));
}
AsmDisablePaging64 ( AsmDisablePaging64 (
PeiS3ResumeState->ReturnCs, PeiS3ResumeState->ReturnCs,
@ -132,7 +132,10 @@ S3BootScriptExecutorEntryFunction (
CpuDeadLoop(); CpuDeadLoop();
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
//
// S3ResumePeim does not provide a way to jump back to itself, so resume to OS here directly
//
if (Facs->XFirmwareWakingVector != 0) { if (Facs->XFirmwareWakingVector != 0) {
// //
// Switch to native waking vector // Switch to native waking vector

View File

@ -104,6 +104,11 @@ ResetSystem (
EFI_STATUS Status; EFI_STATUS Status;
UINTN Size; UINTN Size;
UINTN CapsuleDataPtr; UINTN CapsuleDataPtr;
//
// Indicate reset system runtime service is called.
//
REPORT_STATUS_CODE (EFI_PROGRESS_CODE, (EFI_SOFTWARE_EFI_RUNTIME_SERVICE | EFI_SW_RS_PC_RESET_SYSTEM));
switch (ResetType) { switch (ResetType) {
case EfiResetWarm: case EfiResetWarm:

View File

@ -30,6 +30,7 @@
#include <Library/UefiRuntimeLib.h> #include <Library/UefiRuntimeLib.h>
#include <Library/UefiRuntimeServicesTableLib.h> #include <Library/UefiRuntimeServicesTableLib.h>
#include <Library/ResetSystemLib.h> #include <Library/ResetSystemLib.h>
#include <Library/ReportStatusCodeLib.h>
/** /**
The driver's entry point. The driver's entry point.

View File

@ -3,7 +3,7 @@
# #
# This driver implements Reset Architectural Protocol. # This driver implements Reset Architectural Protocol.
# #
# 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 are # This program and the accompanying materials are
# licensed and made available under the terms and conditions of the BSD License # licensed and made available under the terms and conditions of the BSD License
@ -48,6 +48,7 @@
UefiLib UefiLib
DebugLib DebugLib
BaseLib BaseLib
ReportStatusCodeLib
[Guids] [Guids]