mirror of https://github.com/acidanthera/audk.git
1. Add "CAPSULE_FLAGS_INITIATE_RESET" flag support.
2. Minor update CapuseUpdate() implementation to align with recent UEFI spec update. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9265 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
6fe852082f
commit
3f42faa73d
|
@ -4,7 +4,7 @@
|
||||||
It installs the Capsule Architectural Protocol defined in PI1.0a to signify
|
It installs the Capsule Architectural Protocol defined in PI1.0a to signify
|
||||||
the capsule runtime services are ready.
|
the capsule runtime services are ready.
|
||||||
|
|
||||||
Copyright (c) 2006 - 2008, Intel Corporation. <BR>
|
Copyright (c) 2006 - 2009, Intel Corporation. <BR>
|
||||||
All rights reserved. This program and the accompanying materials
|
All rights reserved. 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
|
||||||
|
@ -28,6 +28,11 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||||
#include <Library/UefiRuntimeServicesTableLib.h>
|
#include <Library/UefiRuntimeServicesTableLib.h>
|
||||||
#include <Library/UefiRuntimeLib.h>
|
#include <Library/UefiRuntimeLib.h>
|
||||||
|
|
||||||
|
//
|
||||||
|
// Handle for the installation of Capsule Architecture Protocol.
|
||||||
|
//
|
||||||
|
EFI_HANDLE mNewHandle = NULL;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Passes capsules to the firmware with both virtual and physical mapping. Depending on the intended
|
Passes capsules to the firmware with both virtual and physical mapping. Depending on the intended
|
||||||
consumption, the firmware may process the capsule immediately. If the payload should persist
|
consumption, the firmware may process the capsule immediately. If the payload should persist
|
||||||
|
@ -47,8 +52,10 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||||
CAPSULE_FLAGS_PERSIT_ACROSS_RESET is not set, the
|
CAPSULE_FLAGS_PERSIT_ACROSS_RESET is not set, the
|
||||||
capsule has been successfully processed by the firmware.
|
capsule has been successfully processed by the firmware.
|
||||||
@retval EFI_DEVICE_ERROR The capsule update was started, but failed due to a device error.
|
@retval EFI_DEVICE_ERROR The capsule update was started, but failed due to a device error.
|
||||||
@retval EFI_INVALID_PARAMETER CapsuleCount is Zero, or CapsuleImage is not valid.
|
@retval EFI_INVALID_PARAMETER CapsuleSize is NULL, or an incompatible set of flags were
|
||||||
For across reset capsule image, ScatterGatherList is NULL.
|
set in the capsule header.
|
||||||
|
@retval EFI_INVALID_PARAMETER CapsuleCount is Zero.
|
||||||
|
@retval EFI_INVALID_PARAMETER For across reset capsule image, ScatterGatherList is NULL.
|
||||||
@retval EFI_UNSUPPORTED CapsuleImage is not recognized by the firmware.
|
@retval EFI_UNSUPPORTED CapsuleImage is not recognized by the firmware.
|
||||||
|
|
||||||
**/
|
**/
|
||||||
|
@ -64,6 +71,7 @@ UpdateCapsule (
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_CAPSULE_HEADER *CapsuleHeader;
|
EFI_CAPSULE_HEADER *CapsuleHeader;
|
||||||
BOOLEAN NeedReset;
|
BOOLEAN NeedReset;
|
||||||
|
BOOLEAN InitiateReset;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Capsule Count can't be less than one.
|
// Capsule Count can't be less than one.
|
||||||
|
@ -71,7 +79,9 @@ UpdateCapsule (
|
||||||
if (CapsuleCount < 1) {
|
if (CapsuleCount < 1) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
NeedReset = FALSE;
|
NeedReset = FALSE;
|
||||||
|
InitiateReset = FALSE;
|
||||||
CapsuleHeader = NULL;
|
CapsuleHeader = NULL;
|
||||||
|
|
||||||
for (ArrayNumber = 0; ArrayNumber < CapsuleCount; ArrayNumber++) {
|
for (ArrayNumber = 0; ArrayNumber < CapsuleCount; ArrayNumber++) {
|
||||||
|
@ -84,6 +94,13 @@ UpdateCapsule (
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
|
// A capsule which has the CAPSULE_FLAGS_INITIATE_RESET flag must have
|
||||||
|
// CAPSULE_FLAGS_PERSIST_ACROSS_RESET set in its header as well.
|
||||||
|
//
|
||||||
|
if ((CapsuleHeader->Flags & (CAPSULE_FLAGS_PERSIST_ACROSS_RESET | CAPSULE_FLAGS_INITIATE_RESET)) == CAPSULE_FLAGS_INITIATE_RESET) {
|
||||||
|
return EFI_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
//
|
||||||
// Check Capsule image without populate flag by firmware support capsule function
|
// Check Capsule image without populate flag by firmware support capsule function
|
||||||
//
|
//
|
||||||
if (((CapsuleHeader->Flags & CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE) == 0) &&
|
if (((CapsuleHeader->Flags & CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE) == 0) &&
|
||||||
|
@ -93,8 +110,8 @@ UpdateCapsule (
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Walk through all capsules, record whether there is a capsule
|
// Walk through all capsules, record whether there is a capsule needs reset
|
||||||
// needs reset. And then process capsules which has no reset flag directly.
|
// or initiate reset. And then process capsules which has no reset flag directly.
|
||||||
//
|
//
|
||||||
for (ArrayNumber = 0; ArrayNumber < CapsuleCount ; ArrayNumber++) {
|
for (ArrayNumber = 0; ArrayNumber < CapsuleCount ; ArrayNumber++) {
|
||||||
CapsuleHeader = CapsuleHeaderArray[ArrayNumber];
|
CapsuleHeader = CapsuleHeaderArray[ArrayNumber];
|
||||||
|
@ -113,6 +130,9 @@ UpdateCapsule (
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
NeedReset = TRUE;
|
NeedReset = TRUE;
|
||||||
|
if ((CapsuleHeader->Flags & CAPSULE_FLAGS_INITIATE_RESET) != 0) {
|
||||||
|
InitiateReset = TRUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -151,7 +171,14 @@ UpdateCapsule (
|
||||||
sizeof (UINTN),
|
sizeof (UINTN),
|
||||||
(VOID *) &ScatterGatherList
|
(VOID *) &ScatterGatherList
|
||||||
);
|
);
|
||||||
|
if (!EFI_ERROR (Status) && InitiateReset) {
|
||||||
|
//
|
||||||
|
// Firmware that encounters a capsule which has the CAPSULE_FLAGS_INITIATE_RESET Flag set in its header
|
||||||
|
// will initiate a reset of the platform which is compatible with the passed-in capsule request and will
|
||||||
|
// not return back to the caller.
|
||||||
|
//
|
||||||
|
gRT->ResetSystem (EfiResetWarm, EFI_SUCCESS, 0, NULL);
|
||||||
|
}
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -194,7 +221,7 @@ QueryCapsuleCapabilities (
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Check whether input paramter is valid
|
// Check whether input parameter is valid
|
||||||
//
|
//
|
||||||
if ((MaxiumCapsuleSize == NULL) ||(ResetType == NULL)) {
|
if ((MaxiumCapsuleSize == NULL) ||(ResetType == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
|
@ -212,6 +239,13 @@ QueryCapsuleCapabilities (
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
|
// A capsule which has the CAPSULE_FLAGS_INITIATE_RESET flag must have
|
||||||
|
// CAPSULE_FLAGS_PERSIST_ACROSS_RESET set in its header as well.
|
||||||
|
//
|
||||||
|
if ((CapsuleHeader->Flags & (CAPSULE_FLAGS_PERSIST_ACROSS_RESET | CAPSULE_FLAGS_INITIATE_RESET)) == CAPSULE_FLAGS_INITIATE_RESET) {
|
||||||
|
return EFI_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
//
|
||||||
// Check Capsule image without populate flag is supported by firmware
|
// Check Capsule image without populate flag is supported by firmware
|
||||||
//
|
//
|
||||||
if (((CapsuleHeader->Flags & CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE) == 0) &&
|
if (((CapsuleHeader->Flags & CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE) == 0) &&
|
||||||
|
@ -270,7 +304,6 @@ CapsuleServiceInitialize (
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_HANDLE NewHandle;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Install capsule runtime services into UEFI runtime service tables.
|
// Install capsule runtime services into UEFI runtime service tables.
|
||||||
|
@ -282,15 +315,13 @@ CapsuleServiceInitialize (
|
||||||
// Install the Capsule Architectural Protocol on a new handle
|
// Install the Capsule Architectural Protocol on a new handle
|
||||||
// to signify the capsule runtime services are ready.
|
// to signify the capsule runtime services are ready.
|
||||||
//
|
//
|
||||||
NewHandle = NULL;
|
|
||||||
|
|
||||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||||
&NewHandle,
|
&mNewHandle,
|
||||||
&gEfiCapsuleArchProtocolGuid,
|
&gEfiCapsuleArchProtocolGuid,
|
||||||
NULL,
|
NULL,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue