1 /** @file
2 
3   Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
4 
5 
6   This program and the accompanying materials are licensed and made available under
7 
8   the terms and conditions of the BSD License that accompanies this distribution.
9 
10   The full text of the license may be found at
11 
12   http://opensource.org/licenses/bsd-license.php.
13 
14 
15 
16   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
17 
18   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
19 
20 
21 
22 
23 Module Name:
24 
25 
26   MonoStatusCode.c
27 
28 Abstract:
29 
30   PEIM to provide the status code functionality, to aid in system debug.
31   It includes output to 0x80 port and/or to serial port.
32   This PEIM is monolithic. Different platform should provide different library.
33 
34 --*/
35 
36 #include "MonoStatusCode.h"
37 #include "PlatformStatusCode.h"
38 #define CMOS_EFI_DEBUG              0x14
39 
40 //
41 // Module globals
42 //
43 EFI_PEI_PROGRESS_CODE_PPI     mStatusCodePpi = { PlatformReportStatusCode };
44 
45 EFI_PEI_PPI_DESCRIPTOR  mPpiListStatusCode = {
46   (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
47   &gEfiPeiStatusCodePpiGuid,
48   &mStatusCodePpi
49 };
50 
51 //
52 // Function implemenations
53 //
54 
55 /**
TranslateDxeStatusCodeToPeiStatusCode(IN EFI_STATUS_CODE_TYPE CodeType,IN EFI_STATUS_CODE_VALUE Value,IN UINT32 Instance,IN EFI_GUID * CallerId,IN EFI_STATUS_CODE_DATA * Data OPTIONAL)56   Translate from a DXE status code interface into a PEI-callable
57   interface, making the PEI the least common denominator..
58 
59   Same as DXE ReportStatusCode RT service
60 
61 
62 **/
63 EFI_STATUS
64 EFIAPI
65 TranslateDxeStatusCodeToPeiStatusCode (
66   IN EFI_STATUS_CODE_TYPE     CodeType,
67   IN EFI_STATUS_CODE_VALUE    Value,
68   IN UINT32                   Instance,
69   IN EFI_GUID                 * CallerId,
70   IN EFI_STATUS_CODE_DATA     * Data OPTIONAL
71   )
72 {
73   return PlatformReportStatusCode (NULL, CodeType, Value, Instance, CallerId, Data);
74 }
75 
76 /**
77   Build a hob describing the status code listener that has been installed.
78   This will be used by DXE code until a runtime status code listener is
79   installed.
InitializeDxeReportStatusCode(IN const EFI_PEI_SERVICES ** PeiServices)80 
81   @param PeiServices      General purpose services available to every PEIM.
82 
83   @retval Status          EFI_SUCCESS if the interface could be successfully
84                           installed
85 
86 **/
87 EFI_STATUS
88 EFIAPI
89 InitializeDxeReportStatusCode (
90   IN const EFI_PEI_SERVICES       **PeiServices
91   )
92 {
93   EFI_STATUS  Status = EFI_UNSUPPORTED;
94 
95   VOID        *Instance;
96 
97   VOID        *Result;
98 
99   Instance = (VOID *) (UINTN) TranslateDxeStatusCodeToPeiStatusCode;
100 
101   Result = BuildGuidDataHob (
102              &gEfiStatusCodeRuntimeProtocolGuid,
103              &Instance,
104              sizeof (VOID *)
105              );
106   if (Result != NULL) {
107     Status = EFI_SUCCESS;
108   }
109   return Status;
110 }
111 
112 /**
113   Initialize the platform status codes and publish the platform status code
114   PPI.
InitializeMonoStatusCode(IN EFI_FFS_FILE_HEADER * FfsHeader,IN CONST EFI_PEI_SERVICES ** PeiServices)115 
116   @param  FfsHeader      FV this PEIM was loaded from.
117   @param  PeiServices    General purpose services available to every PEIM.
118 
119   @retval Status         EFI_SUCCESS
120 
121 **/
122 VOID
123 EFIAPI
124 InitializeMonoStatusCode (
125   IN EFI_FFS_FILE_HEADER       *FfsHeader,
126   IN CONST EFI_PEI_SERVICES          **PeiServices
127   )
128 {
129   EFI_STATUS  Status;
130 
131   //
132   // Initialize status code listeners.
133   //
134   PlatformInitializeStatusCode (FfsHeader, PeiServices);
135 
136   //
137   // Publish the status code capability to other modules
138   //
139   Status = (*PeiServices)->InstallPpi (PeiServices, &mPpiListStatusCode);
140 
141   ASSERT_EFI_ERROR (Status);
142 
143   DEBUG ((DEBUG_ERROR, "\nMono Status Code PEIM Loaded\n"));
144 
145   return ;
146 }
147