From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 277F181D4F for ; Tue, 8 Nov 2016 14:39:15 -0800 (PST) Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga102.jf.intel.com with ESMTP; 08 Nov 2016 14:39:14 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.31,611,1473145200"; d="scan'208";a="784120621" Received: from orsmsx103.amr.corp.intel.com ([10.22.225.130]) by FMSMGA003.fm.intel.com with ESMTP; 08 Nov 2016 14:39:14 -0800 Received: from orsmsx158.amr.corp.intel.com (10.22.240.20) by ORSMSX103.amr.corp.intel.com (10.22.225.130) with Microsoft SMTP Server (TLS) id 14.3.248.2; Tue, 8 Nov 2016 14:39:13 -0800 Received: from orsmsx113.amr.corp.intel.com ([169.254.9.250]) by ORSMSX158.amr.corp.intel.com ([10.22.240.20]) with mapi id 14.03.0248.002; Tue, 8 Nov 2016 14:39:12 -0800 From: "Mudusuru, Giri P" To: "Thomaiyar, Richard Marian" , "edk2-devel@lists.01.org" CC: "Ma, Maurice" , "Yao, Jiewen" Thread-Topic: [PATCH] IntelFsp2Pkg: Support to return error status from FSP API done Thread-Index: AQHSOaTv01PxRwpuTki6+x6Kooq6p6DPrcug Date: Tue, 8 Nov 2016 22:39:12 +0000 Message-ID: <4666AEFED60F8E4198B42BB01DCEABDF76F3CAB9@ORSMSX113.amr.corp.intel.com> References: <20161108094525.35036-1-richard.marian.thomaiyar@intel.com> In-Reply-To: <20161108094525.35036-1-richard.marian.thomaiyar@intel.com> Accept-Language: en-US, hi-IN X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.22.254.138] MIME-Version: 1.0 Subject: Re: [PATCH] IntelFsp2Pkg: Support to return error status from FSP API done X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 08 Nov 2016 22:39:15 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Hi Richard, In the below snippet the debug message is based on the API status and will = not be display if the switch stack already happened right? Also since it is= in a do while loop "cannot proceed further" is not necessarily accurate. > - SetFspApiReturnStatus (EFI_SUCCESS); > - > - Pei2LoaderSwitchStack(); > - > + do { > + SetFspApiReturnStatus (Status); > + Pei2LoaderSwitchStack (); > + if (Status !=3D EFI_SUCCESS) { > + DEBUG ((DEBUG_ERROR, "!!!ERROR: FspSiliconInitApi() - [Status: 0x%= 08X] - > Error encountered during previous API and cannot proceed further\n", Stat= us)); > + } > + } while (Status !=3D EFI_SUCCESS); Thanks, -Giri > -----Original Message----- > From: Thomaiyar, Richard Marian > Sent: Tuesday, November 8, 2016 1:45 AM > To: edk2-devel@lists.01.org > Cc: Ma, Maurice ; Yao, Jiewen > ; Mudusuru, Giri P ; > Thomaiyar, Richard Marian > Subject: [PATCH] IntelFsp2Pkg: Support to return error status from FSP AP= I done >=20 > Added FspMemoryInitDone2, FspTempRamExitDone2, FspSiliconInitDone2 > to return error status to Boot Loader for FSP API calls. > To maintain backward compatibility existing functions > (FspMemoryInitDone, FspTempRamExitDone, FspSiliconInitDone) > declaration left untouched. >=20 > Cc: Maurice Ma > Cc: Jiewen Yao > Cc: Giri P Mudusuru > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Richard Thomaiyar > --- > IntelFsp2Pkg/Include/Library/FspPlatformLib.h | 35 +++++ > .../Library/BaseFspPlatformLib/FspPlatformNotify.c | 151 +++++++++++++++= ++- > --- > 2 files changed, 163 insertions(+), 23 deletions(-) >=20 > diff --git a/IntelFsp2Pkg/Include/Library/FspPlatformLib.h > b/IntelFsp2Pkg/Include/Library/FspPlatformLib.h > index 61e77bd..1f39601 100644 > --- a/IntelFsp2Pkg/Include/Library/FspPlatformLib.h > +++ b/IntelFsp2Pkg/Include/Library/FspPlatformLib.h > @@ -93,4 +93,39 @@ FspWaitForNotify ( > VOID > ); >=20 > +/** > + This function transfer control back to BootLoader after FspSiliconInit= . > + > + @param[in] Status return status for the FspSiliconInit. > +**/ > +VOID > +EFIAPI > +FspSiliconInitDone2 ( > + IN EFI_STATUS Status > + ); > + > +/** > + This function returns control to BootLoader after MemoryInitApi. > + > + @param[in] Status return status for the MemoryInitApi. > + @param[in,out] HobListPtr The address of HobList pointer. > +**/ > +VOID > +EFIAPI > +FspMemoryInitDone2 ( > + IN EFI_STATUS Status, > + IN OUT VOID **HobListPtr > + ); > + > +/** > + This function returns control to BootLoader after TempRamExitApi. > + > + @param[in] Status return status for the TempRamExitApi. > +**/ > +VOID > +EFIAPI > +FspTempRamExitDone2 ( > + IN EFI_STATUS Status > + ); > + > #endif > diff --git a/IntelFsp2Pkg/Library/BaseFspPlatformLib/FspPlatformNotify.c > b/IntelFsp2Pkg/Library/BaseFspPlatformLib/FspPlatformNotify.c > index 755e84f..ac1fc1a 100644 > --- a/IntelFsp2Pkg/Library/BaseFspPlatformLib/FspPlatformNotify.c > +++ b/IntelFsp2Pkg/Library/BaseFspPlatformLib/FspPlatformNotify.c > @@ -108,35 +108,56 @@ FspNotificationHandler ( > /** > This function transfer control back to BootLoader after FspSiliconInit= . >=20 > + @param[in] Status return status for the FspSiliconInit. > + > **/ > VOID > EFIAPI > -FspSiliconInitDone ( > - VOID > +FspSiliconInitDone2 ( > + IN EFI_STATUS Status > ) > { > // > + // Convert to FSP EAS defined API return codes > + // > + switch (Status) { > + case EFI_SUCCESS: > + case EFI_INVALID_PARAMETER: > + case EFI_UNSUPPORTED: > + case EFI_DEVICE_ERROR: > + break; > + default: > + DEBUG ((DEBUG_INFO | DEBUG_INIT, "FspSiliconInitApi() Invalid Erro= r - > [Status: 0x%08X]\n", Status)); > + Status =3D EFI_DEVICE_ERROR; // Force to known error. > + break; > + } > + // > // This is the end of the FspSiliconInit API > // Give control back to the boot loader > // > SetFspMeasurePoint (FSP_PERF_ID_API_FSP_SILICON_INIT_EXIT); > - DEBUG ((DEBUG_INFO | DEBUG_INIT, "FspSiliconInitApi() - End\n")); > + DEBUG ((DEBUG_INFO | DEBUG_INIT, "FspSiliconInitApi() - [Status: 0x%08= X] - > End\n", Status)); > PERF_END_EX (&gFspPerformanceDataGuid, "EventRec", NULL, 0, > FSP_STATUS_CODE_SILICON_INIT | FSP_STATUS_CODE_COMMON_CODE | > FSP_STATUS_CODE_API_EXIT); > REPORT_STATUS_CODE (EFI_PROGRESS_CODE, > FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT); > - SetFspApiReturnStatus (EFI_SUCCESS); > - > - Pei2LoaderSwitchStack(); > - > + do { > + SetFspApiReturnStatus (Status); > + Pei2LoaderSwitchStack (); > + if (Status !=3D EFI_SUCCESS) { > + DEBUG ((DEBUG_ERROR, "!!!ERROR: FspSiliconInitApi() - [Status: 0x%= 08X] - > Error encountered during previous API and cannot proceed further\n", Stat= us)); > + } > + } while (Status !=3D EFI_SUCCESS); > } >=20 > /** > This function returns control to BootLoader after MemoryInitApi. >=20 > - @param[in,out] HobListPtr The address of HobList pointer. > + @param[in] Status return status for the MemoryInitApi. > + @param[in,out] HobListPtr The address of HobList pointer, if NULL, wil= l get > value from GetFspApiParameter2 () > **/ > VOID > EFIAPI > -FspMemoryInitDone ( > +FspMemoryInitDone2 ( > + IN EFI_STATUS Status, > IN OUT VOID **HobListPtr > ) > { > @@ -145,15 +166,32 @@ FspMemoryInitDone ( > // Calling use FspMemoryInit API > // Update HOB and return the control directly > // > + if (HobListPtr =3D=3D NULL) { > + HobListPtr =3D (VOID **)GetFspApiParameter2 (); > + } > if (HobListPtr !=3D NULL) { > *HobListPtr =3D (VOID *) GetHobList (); > } > - > + // > + // Convert to FSP EAS defined API return codes > + // > + switch (Status) { > + case EFI_SUCCESS: > + case EFI_INVALID_PARAMETER: > + case EFI_UNSUPPORTED: > + case EFI_DEVICE_ERROR: > + case EFI_OUT_OF_RESOURCES: > + break; > + default: > + DEBUG ((DEBUG_INFO | DEBUG_INIT, "FspMemoryInitApi() Invalid Error > [Status: 0x%08X]\n", Status)); > + Status =3D EFI_DEVICE_ERROR; // Force to known error. > + break; > + } > // > // This is the end of the FspMemoryInit API > // Give control back to the boot loader > // > - DEBUG ((DEBUG_INFO | DEBUG_INIT, "FspMemoryInitApi() - End\n")); > + DEBUG ((DEBUG_INFO | DEBUG_INIT, "FspMemoryInitApi() - [Status: 0x%08X= ] > - End\n", Status)); > SetFspMeasurePoint (FSP_PERF_ID_API_FSP_MEMORY_INIT_EXIT); > FspData =3D GetFspGlobalDataPointer (); > PERF_START_EX(&gFspPerformanceDataGuid, "EventRec", NULL, (FspData- > >PerfData[0] & FSP_PERFORMANCE_DATA_TIMER_MASK), > FSP_STATUS_CODE_TEMP_RAM_INIT | FSP_STATUS_CODE_COMMON_CODE| > FSP_STATUS_CODE_API_ENTRY); > @@ -161,8 +199,13 @@ FspMemoryInitDone ( > PERF_START_EX(&gFspPerformanceDataGuid, "EventRec", NULL, (FspData- > >PerfData[2] & FSP_PERFORMANCE_DATA_TIMER_MASK), > FSP_STATUS_CODE_MEMORY_INIT | FSP_STATUS_CODE_COMMON_CODE | > FSP_STATUS_CODE_API_ENTRY); > PERF_END_EX(&gFspPerformanceDataGuid, "EventRec", NULL, 0, > FSP_STATUS_CODE_MEMORY_INIT | FSP_STATUS_CODE_COMMON_CODE | > FSP_STATUS_CODE_API_EXIT); > REPORT_STATUS_CODE (EFI_PROGRESS_CODE, > FSP_STATUS_CODE_MEMORY_INIT | FSP_STATUS_CODE_COMMON_CODE | > FSP_STATUS_CODE_API_EXIT); > - SetFspApiReturnStatus (EFI_SUCCESS); > - Pei2LoaderSwitchStack (); > + do { > + SetFspApiReturnStatus (Status); > + Pei2LoaderSwitchStack (); > + if (Status !=3D EFI_SUCCESS) { > + DEBUG ((DEBUG_ERROR, "!!!ERROR: FspMemoryInitApi() - [Status: 0x%0= 8X] > - Error encountered during previous API and cannot proceed further\n", St= atus)); > + } > + } while (Status !=3D EFI_SUCCESS); >=20 > // > // The TempRamExitApi is called > @@ -185,25 +228,44 @@ FspMemoryInitDone ( > /** > This function returns control to BootLoader after TempRamExitApi. >=20 > + @param[in] Status return status for the TempRamExitApi. > + > **/ > VOID > EFIAPI > -FspTempRamExitDone ( > - VOID > +FspTempRamExitDone2 ( > + IN EFI_STATUS Status > ) > { > - > + // > + // Convert to FSP EAS defined API return codes > + // > + switch (Status) { > + case EFI_SUCCESS: > + case EFI_INVALID_PARAMETER: > + case EFI_UNSUPPORTED: > + case EFI_DEVICE_ERROR: > + break; > + default: > + DEBUG ((DEBUG_INFO | DEBUG_INIT, "TempRamExitApi() Invalid Error - > [Status: 0x%08X]\n", Status)); > + Status =3D EFI_DEVICE_ERROR; // Force to known error. > + break; > + } > // > // This is the end of the TempRamExit API > // Give control back to the boot loader > // > - DEBUG ((DEBUG_INFO | DEBUG_INIT, "TempRamExitApi() - End\n")); > + DEBUG ((DEBUG_INFO | DEBUG_INIT, "TempRamExitApi() - [Status: 0x%08X] > - End\n", Status)); > SetFspMeasurePoint (FSP_PERF_ID_API_TEMP_RAM_EXIT_EXIT); > PERF_END_EX(&gFspPerformanceDataGuid, "EventRec", NULL, 0, > FSP_STATUS_CODE_TEMP_RAM_EXIT | FSP_STATUS_CODE_COMMON_CODE | > FSP_STATUS_CODE_API_EXIT); > REPORT_STATUS_CODE (EFI_PROGRESS_CODE, > FSP_STATUS_CODE_TEMP_RAM_EXIT | FSP_STATUS_CODE_COMMON_CODE | > FSP_STATUS_CODE_API_EXIT); > - SetFspApiReturnStatus (EFI_SUCCESS); > - Pei2LoaderSwitchStack (); > - > + do { > + SetFspApiReturnStatus (Status); > + Pei2LoaderSwitchStack (); > + if (Status !=3D EFI_SUCCESS) { > + DEBUG ((DEBUG_ERROR, "!!!ERROR: TempRamExitApi() - [Status: 0x%08X= ] - > Error encountered during previous API and cannot proceed further\n", Stat= us)); > + } > + } while (Status !=3D EFI_SUCCESS); > SetPhaseStatusCode (FSP_STATUS_CODE_SILICON_INIT); > SetFspMeasurePoint (FSP_PERF_ID_API_FSP_SILICON_INIT_ENTRY); > PERF_START_EX(&gFspPerformanceDataGuid, "EventRec", NULL, 0, > FSP_STATUS_CODE_SILICON_INIT | FSP_STATUS_CODE_COMMON_CODE | > FSP_STATUS_CODE_API_ENTRY); > @@ -266,9 +328,7 @@ FspWaitForNotify ( > } > } >=20 > - SetFspApiReturnStatus(Status); > DEBUG ((DEBUG_INFO | DEBUG_INIT, "NotifyPhaseApi() - End [Status: > 0x%08X]\n", Status)); > - > SetFspMeasurePoint (FSP_PERF_ID_API_NOTIFY_POST_PCI_EXIT + Count); >=20 > if ((NotificationCount - 1) =3D=3D 0) { > @@ -281,7 +341,13 @@ FspWaitForNotify ( > PERF_END_EX(&gFspPerformanceDataGuid, "EventRec", NULL, 0, > FSP_STATUS_CODE_END_OF_FIRMWARE_NOTIFICATION | > FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT); > REPORT_STATUS_CODE (EFI_PROGRESS_CODE, > FSP_STATUS_CODE_END_OF_FIRMWARE_NOTIFICATION | > FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT); > } > - Pei2LoaderSwitchStack(); > + do { > + SetFspApiReturnStatus(Status); > + Pei2LoaderSwitchStack(); > + if (Status !=3D EFI_SUCCESS) { > + DEBUG ((DEBUG_ERROR, "!!!ERROR: NotifyPhaseApi() [Phase: %08X] - > Failed - [Status: 0x%08X]\n", NotificationValue, Status)); > + } > + } while (Status !=3D EFI_SUCCESS); > } >=20 > // > @@ -290,3 +356,42 @@ FspWaitForNotify ( > // > } >=20 > +/** > + This function transfer control back to BootLoader after FspSiliconInit= . > + > +**/ > +VOID > +EFIAPI > +FspSiliconInitDone ( > + VOID > + ) > +{ > + FspSiliconInitDone2 (EFI_SUCCESS); > +} > + > +/** > + This function returns control to BootLoader after MemoryInitApi. > + > + @param[in,out] HobListPtr The address of HobList pointer. > +**/ > +VOID > +EFIAPI > +FspMemoryInitDone ( > + IN OUT VOID **HobListPtr > + ) > +{ > + FspMemoryInitDone2 (EFI_SUCCESS, HobListPtr); > +} > + > +/** > + This function returns control to BootLoader after TempRamExitApi. > + > +**/ > +VOID > +EFIAPI > +FspTempRamExitDone ( > + VOID > + ) > +{ > + FspTempRamExitDone2 (EFI_SUCCESS); > +} > -- > 2.9.0.windows.1