summaryrefslogtreecommitdiff
path: root/Core/EM/Capsule2_0/Capsule2_0Bds.c
blob: cb3b1df45c03dc615ff161d59a42c1cfd0bc09bf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
//**********************************************************************
//**********************************************************************
//**                                                                  **
//**        (C)Copyright 1985-2012, American Megatrends, Inc.         **
//**                                                                  **
//**                       All Rights Reserved.                       **
//**                                                                  **
//**      5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093        **
//**                                                                  **
//**                       Phone: (770)-246-8600                      **
//**                                                                  **
//**********************************************************************
//**********************************************************************

//**********************************************************************
// $Header: /Alaska/SOURCE/Core/Modules/Capsule2_0/Capsule2_0Bds.c 2     7/31/12 6:19p Artems $
//
// $Revision: 2 $
//
// $Date: 7/31/12 6:19p $
//**********************************************************************
// Revision History
// ----------------
// $Log: /Alaska/SOURCE/Core/Modules/Capsule2_0/Capsule2_0Bds.c $
// 
// 2     7/31/12 6:19p Artems
// [TAG]  		EIP N/A
// [Category]  	Improvement
// [Description]  	Remove Capsule mailbox from NVRAM once capsule is
// processed
// [Files]  		Capsule2_0Bds.c
// 
// 1     5/24/12 4:22p Artems
// [TAG]  		EIP74625
// [Category]  	New Feature
// [Description]  	New Capsule PPI required by latest Intel's MRC code
// [Files]  		Capsule2_0.cif
// Capsule2_0.sdl
// Capsule2_0.mak
// Capsule2_0.c
// Capsule2_0.h
// Capsule2_0Runtime.c
// Capsule2_0Bds.c
// 
//<AMI_FHDR_START>
//----------------------------------------------------------------------
//
// Name:    Capsule2_0Bds.c
//
// Description: Capsule execution implementation
//
//----------------------------------------------------------------------
//<AMI_FHDR_END>

//----------------------------------------------------------------------

#include <Token.h>
#include <AmiDxeLib.h>
#include <AmiHobs.h>
#include <Capsule.h>
#include <Protocol/Capsule.h>


typedef EFI_STATUS (OEM_PROCESS_CAPSULE) (EFI_CAPSULE_HEADER *Capsule);
extern OEM_PROCESS_CAPSULE OEM_PROCESS_CAPSULE_LIST EndOfList;
OEM_PROCESS_CAPSULE* OemProcessCapsuleList[] = { OEM_PROCESS_CAPSULE_LIST NULL };

//<AMI_PHDR_START>
//----------------------------------------------------------------------------
// Procedure:   ProcessCapsule
//
// Description: Retrieve capsule and process it
//
// Input:       
//  IN EFI_HANDLE ImageHandle - Image handle
//  IN EFI_SYSTEM_TABLE *SystemTable - pointer to system table
//
// Output:      EFI_STATUS
//
//----------------------------------------------------------------------------
//<AMI_PHDR_END>
VOID ProcessCapsule(
    VOID
)
{
    static EFI_GUID HobListGuid = HOB_LIST_GUID;
    static EFI_GUID AmiCapsuleHobGuid = AMI_CAPSULE_HOB_GUID;
    static EFI_GUID CapsuleVendorGuid    = EFI_CAPSULE_AMI_GUID;
    EFI_STATUS Status;
    EFI_HOB_HANDOFF_INFO_TABLE *pHit;
    UINTN i;
    EFI_CAPSULE_HEADER *Capsule = NULL;
    AMI_CAPSULE_HOB *CapsuleHob;
    VOID *Save;
    

    pHit = GetEfiConfigurationTable(pST, &HobListGuid);
    if(EFI_ERROR(FindNextHobByGuid(&AmiCapsuleHobGuid, &pHit)))
        return;     //capsule HOB not found

//capsule was found and coalesced, we have to kill mailbox
    Status = pRS->SetVariable (
                 CAPSULE_UPDATE_VAR,  
                 &CapsuleVendorGuid,     
                 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS,  
                 0, 
                 (VOID *) Capsule);
    
    CapsuleHob = (AMI_CAPSULE_HOB *)pHit;
    Capsule = (EFI_CAPSULE_HEADER *)(VOID *)(UINTN)(CapsuleHob->CapsuleData);
    for(i = 0; OemProcessCapsuleList[i] != NULL; i++) {
        Status = OemProcessCapsuleList[i](Capsule);
        if(!EFI_ERROR(Status))
            return;      //capsule is processed by OEM hook
    }

    if(Capsule->Flags & CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE) {
    /* populate capsule via system table, move to runtime memory */
        Status = pBS->AllocatePool(EfiRuntimeServicesData, (UINTN)(CapsuleHob->CapsuleLength), &Save);
        if(EFI_ERROR(Status))
            return;

        MemCpy(Save, (VOID *)(UINTN)(CapsuleHob->CapsuleData), (UINTN)(CapsuleHob->CapsuleLength));
        Status = pBS->InstallConfigurationTable(&(CapsuleHob->CapsuleGuid), Save);
    }
}

//**********************************************************************
//**********************************************************************
//**                                                                  **
//**        (C)Copyright 1985-2012, American Megatrends, Inc.         **
//**                                                                  **
//**                       All Rights Reserved.                       **
//**                                                                  **
//**      5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093        **
//**                                                                  **
//**                       Phone: (770)-246-8600                      **
//**                                                                  **
//**********************************************************************
//**********************************************************************