From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 192.55.52.88, mailfrom: ray.ni@intel.com) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by groups.io with SMTP; Wed, 03 Jul 2019 20:26:53 -0700 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 03 Jul 2019 20:26:52 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.63,449,1557212400"; d="scan'208";a="158169686" Received: from fmsmsx106.amr.corp.intel.com ([10.18.124.204]) by orsmga008.jf.intel.com with ESMTP; 03 Jul 2019 20:26:52 -0700 Received: from fmsmsx155.amr.corp.intel.com (10.18.116.71) by FMSMSX106.amr.corp.intel.com (10.18.124.204) with Microsoft SMTP Server (TLS) id 14.3.439.0; Wed, 3 Jul 2019 20:26:51 -0700 Received: from shsmsx151.ccr.corp.intel.com (10.239.6.50) by FMSMSX155.amr.corp.intel.com (10.18.116.71) with Microsoft SMTP Server (TLS) id 14.3.439.0; Wed, 3 Jul 2019 20:26:51 -0700 Received: from shsmsx104.ccr.corp.intel.com ([169.254.5.110]) by SHSMSX151.ccr.corp.intel.com ([169.254.3.55]) with mapi id 14.03.0439.000; Thu, 4 Jul 2019 11:26:49 +0800 From: "Ni, Ray" To: "devel@edk2.groups.io" , "Dong, Eric" CC: Laszlo Ersek Subject: Re: [edk2-devel] [Patch v3 1/2] MdePkg: Add new MM MP Protocol definition. Thread-Topic: [edk2-devel] [Patch v3 1/2] MdePkg: Add new MM MP Protocol definition. Thread-Index: AQHVMUkGwEYdxSM4okmZ2EPHFTBwRaa5zZWA Date: Thu, 4 Jul 2019 03:26:48 +0000 Deferred-Delivery: Thu, 4 Jul 2019 03:26:00 +0000 Message-ID: <734D49CCEBEEF84792F5B80ED585239D5C215426@SHSMSX104.ccr.corp.intel.com> References: <20190703024242.33572-1-eric.dong@intel.com> <20190703024242.33572-2-eric.dong@intel.com> In-Reply-To: <20190703024242.33572-2-eric.dong@intel.com> Accept-Language: en-US, zh-CN X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Return-Path: ray.ni@intel.com Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Reviewed-by: Ray Ni > -----Original Message----- > From: devel@edk2.groups.io On Behalf Of Dong, > Eric > Sent: Wednesday, July 3, 2019 10:43 AM > To: devel@edk2.groups.io > Cc: Ni, Ray ; Laszlo Ersek > Subject: [edk2-devel] [Patch v3 1/2] MdePkg: Add new MM MP Protocol > definition. >=20 > V2 change: > 1. Remove SMM prefix definition which not required by spec. >=20 > V1 changes: > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D1937 >=20 > EFI MM MP Protocol is defined in the PI 1.5 specification. >=20 > The MM MP protocol provides a set of functions to allow execution of > procedures on processors that have entered MM. This protocol has the > following properties: > 1. The caller can invoke execution of a procedure on a processor, other = than > the caller, that has also entered MM. Supports blocking and non-blocking > modes of operation. > 2. The caller can invoke a procedure on multiple processors. Supports > blocking and non-blocking modes of operation. >=20 > Cc: Ray Ni > Cc: Laszlo Ersek > Signed-off-by: Eric Dong > --- > MdePkg/Include/Pi/PiMultiPhase.h | 16 ++ > MdePkg/Include/Protocol/MmMp.h | 333 > +++++++++++++++++++++++++++++++ > MdePkg/MdePkg.dec | 3 + > 3 files changed, 352 insertions(+) > create mode 100644 MdePkg/Include/Protocol/MmMp.h >=20 > diff --git a/MdePkg/Include/Pi/PiMultiPhase.h > b/MdePkg/Include/Pi/PiMultiPhase.h > index eb12527767..a5056799e1 100644 > --- a/MdePkg/Include/Pi/PiMultiPhase.h > +++ b/MdePkg/Include/Pi/PiMultiPhase.h > @@ -176,4 +176,20 @@ VOID > IN OUT VOID *Buffer > ); >=20 > +/** > + The function prototype for invoking a function on an Application Proc= essor. > + > + This definition is used by the UEFI MM MP Serices Protocol. > + > + @param[in] ProcedureArgument The pointer to private data buffer. > + > + @retval EFI_SUCCESS Excutive the procedure successfully > + > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *EFI_AP_PROCEDURE2)( > + IN VOID *ProcedureArgument > +); > + > #endif > diff --git a/MdePkg/Include/Protocol/MmMp.h > b/MdePkg/Include/Protocol/MmMp.h new file mode 100644 index > 0000000000..beace1386c > --- /dev/null > +++ b/MdePkg/Include/Protocol/MmMp.h > @@ -0,0 +1,333 @@ > +/** @file > + EFI MM MP Protocol is defined in the PI 1.5 specification. > + > + The MM MP protocol provides a set of functions to allow execution of > + procedures on processors that have entered MM. This protocol has the > following properties: > + 1. The caller can only invoke execution of a procedure on a processor= , > other than the caller, that > + has also entered MM. > + 2. It is possible to invoke a procedure on multiple processors. Suppo= rts > blocking and non-blocking > + modes of operation. > + > + Copyright (c) 2019, Intel Corporation. All rights reserved.
> + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef _MM_MP_H_ > +#define _MM_MP_H_ > + > +#include > + > +#define EFI_MM_MP_PROTOCOL_GUID \ > + { \ > + 0x5d5450d7, 0x990c, 0x4180, {0xa8, 0x3, 0x8e, 0x63, 0xf0, 0x60, > +0x83, 0x7 } \ > + } > + > +// > +// Revision definition. > +// > +#define EFI_MM_MP_PROTOCOL_REVISION 0x00 > + > +// > +// Attribute flags > +// > +#define EFI_MM_MP_TIMEOUT_SUPPORTED 0x01 > + > +// > +// Completion token > +// > +typedef VOID* MM_COMPLETION; > + > +typedef struct { > + MM_COMPLETION Completion; > + EFI_STATUS Status; > +} MM_DISPATCH_COMPLETION_TOKEN; > + > +typedef struct _EFI_MM_MP_PROTOCOL EFI_MM_MP_PROTOCOL; > + > +/** > + Service to retrieves the number of logical processor in the platform. > + > + @param[in] This The EFI_MM_MP_PROTOCOL instance. > + @param[out] NumberOfProcessors Pointer to the total number of logica= l > processors in the system, > + including the BSP and all APs. > + > + @retval EFI_SUCCESS The number of processors was retrieve= d > successfully > + @retval EFI_INVALID_PARAMETER NumberOfProcessors is NULL > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *EFI_MM_GET_NUMBER_OF_PROCESSORS) ( > + IN CONST EFI_MM_MP_PROTOCOL *This, > + OUT UINTN *NumberOfProcessors > +); > + > + > +/** > + This service allows the caller to invoke a procedure one of the > +application processors (AP). This > + function uses an optional token parameter to support blocking and > +non-blocking modes. If the token > + is passed into the call, the function will operate in a non-blocking > +fashion and the caller can > + check for completion with CheckOnProcedure or WaitForProcedure. > + > + @param[in] This The EFI_MM_MP_PROTOCOL instance= . > + @param[in] Procedure A pointer to the procedure to b= e run on > the designated target > + AP of the system. Type EFI_AP_P= ROCEDURE2 is defined > below in > + related definitions. > + @param[in] CpuNumber The zero-based index of the pro= cessor > number of the target > + AP, on which the code stream is= supposed to run. If the > number > + points to the calling processor= then it will not run the > + supplied code. > + @param[in] TimeoutInMicroseconds Indicates the time limit in > microseconds for this AP to > + finish execution of Procedure, = either for blocking or > + non-blocking mode. Zero means i= nfinity. If the timeout > + expires before this AP returns = from Procedure, then > Procedure > + on the AP is terminated. If the= timeout expires in > blocking > + mode, the call returns EFI_TIME= OUT. If the timeout > expires > + in non-blocking mode, the timeo= ut determined can be > through > + CheckOnProcedure or WaitForProc= edure. > + Note that timeout support is op= tional. Whether an > + implementation supports this fe= ature, can be > determined via > + the Attributes data member. > + @param[in,out] ProcedureArguments Allows the caller to pass a lis= t of > parameters to the code > + that is run by the AP. It is an= optional common mailbox > + between APs and the caller to s= hare information. > + @param[in,out] Token This is parameter is broken int= o two > components: > + 1.Token->Completion is an optio= nal parameter that > allows the > + caller to execute the procedure= in a blocking or non- > blocking > + fashion. If it is NULL the call= is blocking, and the call will > + not return until the AP has com= pleted the procedure. If > the > + token is not NULL, the call wil= l return immediately. The > caller > + can check whether the procedure= has completed with > + CheckOnProcedure or WaitForProc= edure. > + 2.Token->Status The implementat= ion updates the > address pointed > + at by this variable with the st= atus code returned by > Procedure > + when it completes execution on = the target AP, or with > EFI_TIMEOUT > + if the Procedure fails to compl= ete within the optional > timeout. > + The implementation will update = this variable with > EFI_NOT_READY > + prior to starting Procedure on = the target AP. > + @param[in,out] CPUStatus This optional pointer may be us= ed to get > the status code returned > + by Procedure when it completes = execution on the > target AP, or with > + EFI_TIMEOUT if the Procedure fa= ils to complete within > the optional > + timeout. The implementation wil= l update this variable > with > + EFI_NOT_READY prior to starting= Procedure on the > target AP. > + > + @retval EFI_SUCCESS In the blocking case, this indi= cates that > Procedure has completed > + execution on the target AP. > + In the non-blocking case this i= ndicates that the > procedure has > + been successfully scheduled for= execution on the target > AP. > + @retval EFI_INVALID_PARAMETER The input arguments are out of > range. Either the target AP is the > + caller of the function, or the = Procedure or Token is NULL > + @retval EFI_NOT_READY If the target AP is busy execut= ing another > procedure > + @retval EFI_ALREADY_STARTED Token is already in use for ano= ther > procedure > + @retval EFI_TIMEOUT In blocking mode, the timeout e= xpired > before the specified AP > + has finished **/ typedef > +EFI_STATUS (EFIAPI *EFI_MM_DISPATCH_PROCEDURE) ( > + IN CONST EFI_MM_MP_PROTOCOL *This, > + IN EFI_AP_PROCEDURE2 Procedure, > + IN UINTN CpuNumber, > + IN UINTN TimeoutInMicroseconds, > + IN OUT VOID *ProcedureArguments OPTIONAL, > + IN OUT MM_COMPLETION *Token, > + IN OUT EFI_STATUS *CPUStatus > +); > + > +/** > + This service allows the caller to invoke a procedure on all running > +application processors (AP) > + except the caller. This function uses an optional token parameter to > +support blocking and > + nonblocking modes. If the token is passed into the call, the function > +will operate in a non-blocking > + fashion and the caller can check for completion with CheckOnProcedure= or > WaitForProcedure. > + > + It is not necessary for the implementation to run the procedure on ev= ery > processor on the platform. > + Processors that are powered down in such a way that they cannot > + respond to interrupts, may be excluded from the broadcast. > + > + > + @param[in] This The EFI_MM_MP_PROTOCOL instance= . > + @param[in] Procedure A pointer to the code stream to= be run on > the APs that have > + entered MM. Type EFI_AP_PROCEDU= RE is defined > below in related > + definitions. > + @param[in] TimeoutInMicroseconds Indicates the time limit in > microseconds for the APs to finish > + execution of Procedure, either = for blocking or non- > blocking mode. > + Zero means infinity. If the tim= eout expires before all > APs return > + from Procedure, then Procedure = on the failed APs is > terminated. If > + the timeout expires in blocking= mode, the call returns > EFI_TIMEOUT. > + If the timeout expires in non-b= locking mode, the > timeout determined > + can be through CheckOnProcedure= or > WaitForProcedure. > + Note that timeout support is op= tional. Whether an > implementation > + supports this feature can be de= termined via the > Attributes data > + member. > + @param[in,out] ProcedureArguments Allows the caller to pass a lis= t of > parameters to the code > + that is run by the AP. It is an= optional common mailbox > + between APs and the caller to s= hare information. > + @param[in,out] Token This is parameter is broken int= o two > components: > + 1.Token->Completion is an optio= nal parameter that > allows the > + caller to execute the procedure= in a blocking or non- > blocking > + fashion. If it is NULL the call= is blocking, and the call will > + not return until the AP has com= pleted the procedure. If > the > + token is not NULL, the call wil= l return immediately. The > caller > + can check whether the procedure= has completed with > + CheckOnProcedure or WaitForProc= edure. > + 2.Token->Status The implementat= ion updates the > address pointed > + at by this variable with the st= atus code returned by > Procedure > + when it completes execution on = the target AP, or with > EFI_TIMEOUT > + if the Procedure fails to compl= ete within the optional > timeout. > + The implementation will update = this variable with > EFI_NOT_READY > + prior to starting Procedure on = the target AP > + @param[in,out] CPUStatus This optional pointer may be us= ed to get > the individual status > + returned by every AP that parti= cipated in the broadcast. > This > + parameter if used provides the = base address of an array > to hold > + the EFI_STATUS value of each AP= in the system. The size > of the > + array can be ascertained by the > GetNumberOfProcessors function. > + As mentioned above, the broadca= st may not include > every processor > + in the system. Some implementat= ions may exclude > processors that > + have been powered down in such = a way that they are > not responsive > + to interrupts. Additionally the= broadcast excludes the > processor > + which is making the BroadcastPr= ocedure call. For every > excluded > + processor, the array entry must > + contain a value of EFI_NOT_STARTED > + > + @retval EFI_SUCCESS In the blocking case, this indi= cates that > Procedure has completed > + execution on the APs. In the no= n-blocking case this > indicates that > + the procedure has been successf= ully scheduled for > execution on the > + APs. > + @retval EFI_INVALID_PARAMETER Procedure or Token is NULL. > + @retval EFI_NOT_READY If a target AP is busy executin= g another > procedure. > + @retval EFI_TIMEOUT In blocking mode, the timeout e= xpired > before all enabled APs have > + finished. > + @retval EFI_ALREADY_STARTED Before the AP procedure associa= ted > with the Token is finished, the > + same Token cannot be used to di= spatch or broadcast > another procedure. > + > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *EFI_MM_BROADCAST_PROCEDURE) ( > + IN CONST EFI_MM_MP_PROTOCOL *This, > + IN EFI_AP_PROCEDURE2 Procedure, > + IN UINTN TimeoutInMicroseconds, > + IN OUT VOID *ProcedureArguments OPTIONAL, > + IN OUT MM_COMPLETION *Token, > + IN OUT EFI_STATUS *CPUStatus > +); > + > + > +/** > + This service allows the caller to set a startup procedure that will > +be executed when an AP powers > + up from a state where core configuration and context is lost. The > +procedure is execution has the > + following properties: > + 1. The procedure executes before the processor is handed over to the > operating system. > + 2. All processors execute the same startup procedure. > + 3. The procedure may run in parallel with other procedures invoked > +through the functions in this > + protocol, or with processors that are executing an MM handler or runn= ing > in the operating system. > + > + > + @param[in] This The EFI_MM_MP_PROTOCOL instance. > + @param[in] Procedure A pointer to the code stream to = be run on > the designated target AP > + of the system. Type EFI_AP_PROCE= DURE is defined > below in Volume 2 > + with the related definitions of > + EFI_MP_SERVICES_PROTOCOL.Startup= AllAPs. > + If caller may pass a value of NU= LL to deregister any > existing > + startup procedure. > + @param[in,out] ProcedureArguments Allows the caller to pass a list= of > parameters to the code that is > + run by the AP. It is an optional= common mailbox > between APs and > + the caller to share information > + > + @retval EFI_SUCCESS The Procedure has been set succe= ssfully. > + @retval EFI_INVALID_PARAMETER The Procedure is NULL. > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *EFI_MM_SET_STARTUP_PROCEDURE) ( > + IN CONST EFI_MM_MP_PROTOCOL *This, > + IN EFI_AP_PROCEDURE Procedure, > + IN OUT VOID *ProcedureArguments OPTIONAL > +); > + > +/** > + When non-blocking execution of a procedure on an AP is invoked with > +DispatchProcedure, > + via the use of a token, this function can be used to check for comple= tion of > the procedure on the AP. > + The function takes the token that was passed into the > +DispatchProcedure call. If the procedure > + is complete, and therefore it is now possible to run another > +procedure on the same AP, this function > + returns EFI_SUCESS. In this case the status returned by the procedure > +that executed on the AP is > + returned in the token's Status field. If the procedure has not yet > +completed, then this function > + returns EFI_NOT_READY. > + > + When a non-blocking execution of a procedure is invoked with > + BroadcastProcedure, via the use of a token, this function can be used > + to check for completion of the procedure on all the broadcast APs. > + The function takes the token that was passed into the > + BroadcastProcedure call. If the procedure is complete on all > + broadcast APs this function returns EFI_SUCESS. In this case the Stat= us > field in the token passed into the function reflects the overall result = of the > invocation, which may be EFI_SUCCESS, if all executions succeeded, or th= e > first observed failure. > + If the procedure has not yet completed on the broadcast APs, the > + function returns EFI_NOT_READY. > + > + @param[in] This The EFI_MM_MP_PROTOCOL instance. > + @param[in] Token This parameter describes the tok= en that was > passed into > + DispatchProcedure or BroadcastPr= ocedure. > + > + @retval EFI_SUCCESS Procedure has completed. > + @retval EFI_NOT_READY The Procedure has not completed. > + @retval EFI_INVALID_PARAMETER Token or Token->Completion is > NULL > + @retval EFI_NOT_FOUND Token is not currently in use fo= r a non- > blocking call > + > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *EFI_CHECK_FOR_PROCEDURE) ( > + IN CONST EFI_MM_MP_PROTOCOL *This, > + IN MM_COMPLETION Token > +); > + > +/** > + When a non-blocking execution of a procedure on an AP is invoked via > +DispatchProcedure, > + this function will block the caller until the remote procedure has co= mpleted > on the designated AP. > + The non-blocking procedure invocation is identified by the Token > +parameter, which must match the > + token that used when DispatchProcedure was called. Upon completion > +the status returned by > + the procedure that executed on the AP is used to update the token's > Status field. > + > + When a non-blocking execution of a procedure on an AP is invoked via > + BroadcastProcedure this function will block the caller until the > + remote procedure has completed on all of the APs that entered MM. The > + non-blocking procedure invocation is identified by the Token > + parameter, which must match the token that used when > + BroadcastProcedure was called. Upon completion the overall status > + returned by the procedures that executed on the broadcast AP is used t= o > update the token's Status field. The overall status may be EFI_SUCCESS,= if all > executions succeeded, or the first observed failure. > + > + > + @param[in] This The EFI_MM_MP_PROTOCOL instance. > + @param[in] Token This parameter describes the tok= en that was > passed into > + DispatchProcedure or BroadcastPr= ocedure. > + > + @retval EFI_SUCCESS Procedure has completed. > + @retval EFI_INVALID_PARAMETER Token or Token->Completion is > NULL > + @retval EFI_NOT_FOUND Token is not currently in use fo= r a non- > blocking call > + > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *EFI_WAIT_FOR_PROCEDURE) ( > + IN CONST EFI_MM_MP_PROTOCOL *This, > + IN MM_COMPLETION Token > +); > + > + > + > +/// > +/// The MM MP protocol provides a set of functions to allow execution > +of procedures on processors that /// have entered MM. > +/// > +struct _EFI_MM_MP_PROTOCOL { > + UINT32 Revision; > + UINT32 Attributes; > + EFI_MM_GET_NUMBER_OF_PROCESSORS GetNumberOfProcessors; > + EFI_MM_DISPATCH_PROCEDURE DispatchProcedure; > + EFI_MM_BROADCAST_PROCEDURE BroadcastProcedure; > + EFI_MM_SET_STARTUP_PROCEDURE SetStartupProcedure; > + EFI_CHECK_FOR_PROCEDURE CheckForProcedure; > + EFI_WAIT_FOR_PROCEDURE WaitForProcedure; > +}; > + > +extern EFI_GUID gEfiMmMpProtocolGuid; > + > +#endif > diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec index > 6c563375ee..b382efd578 100644 > --- a/MdePkg/MdePkg.dec > +++ b/MdePkg/MdePkg.dec > @@ -1167,6 +1167,9 @@ > # Protocols defined in PI 1.5. > # >=20 > + ## Include/Protocol/MmMp.h > + gEfiMmMpProtocolGuid =3D { 0x5d5450d7, 0x990c, 0x4180, { 0xa8, 0x3, > + 0x8e, 0x63, 0xf0, 0x60, 0x83, 0x7 }} > + > ## Include/Protocol/MmEndOfDxe.h > gEfiMmEndOfDxeProtocolGuid =3D { 0x24e70042, 0xd5c5, 0x4260, { 0x8c, = 0x39, > 0xa, 0xd3, 0xaa, 0x32, 0xe9, 0x3d }} >=20 > -- > 2.21.0.windows.1 >=20 >=20 >=20